Rightshold™ Sign up

Answers · bookkeeping

How do I reconcile an AI agent's spend against the bank feed at month end?

Last updated

TL;DR: Treat it as a two-sided match. On one side are the agent's spend records: one signed authorize_spend receipt per purchase, with amount, currency, merchant domain, category, time and your own reference. On the other side are the bank or card feed lines for the month. Match by your reference first, then by amount, currency, merchant and a date window, and label every line on both sides. Bank lines with no allow receipt are the ones that matter most, because that money left outside the agent's guardrails. So is any bank line that matches a deny receipt. Receipts with no bank line are usually timing (captured next month), a cancelled order or another payment rail. Amount differences usually come from tips, partial or over-captures, fees or currency conversion. Verify every receipt free with verify_spend_authorization, hash the finished reconciliation file, and record that hash with record_ai_run so the month's result can't be quietly rewritten later. This page is about month-end bank matching. Reconciling a single payment before replaying a run, and exporting a period pack for an auditor, are covered on separate pages.

What should I check, step by step?

1. Make authorize_spend the step before every agent payment and set reference to something that will show up on the payment side too, such as your order number, invoice number or the payment provider's id (up to 120 characters). Keep every spa_ receipt id the agent gets back, allows and denies.

  1. At month end, pull the agent's side: every receipt id for the month, each fetched with GET /v1/spend/authorizations/{id} (amount_minor, currency, merchant_domain, category, reference, decision, issued_at) and checked with verify_spend_authorization.
  2. Pull the bank side for the same account or card: the bank feed lines (QuickBooks Online For review, Xero statement lines) or the card issuer's transactions. Note that QuickBooks Online doesn't download pending transactions, so late-month card purchases may only appear in the next month's feed.
  3. Match in passes. First by reference or provider id. Then by exact amount and currency within a short date window and a merchant descriptor that fits the merchant_domain. Then one-to-many, for orders split across several charges or several purchases settled as one line.
  4. Label every line: matched; bank line with no receipt; bank line matching a deny receipt; receipt with no bank line; amount differs. Never force a match to clear a line.
  5. Escalate bank lines with no allow receipt and bank lines matching a deny receipt the same day. Pause the agent's spend, check which key or card was used, and decide whether to revoke.
  6. Carry receipts with no bank line forward as timing items with a review date, and clear them against next month's feed. Card captures normally land within 24 hours, but hotels, airlines and car rental companies can capture up to 31 days after authorization.
  7. Export the finished reconciliation (one row per line with its label and both ids), compute its SHA-256, record it with record_ai_run, and give the file and the receipt id to your accountant. Fix later findings with a new reconciliation version, not an edit to the old file.

Why does AI agent spend need a two-sided match against the bank feed?

Matching bank lines only to bookkeeping entries tells you the books agree with the bank. It doesn't tell you whether each payment was one the agent was allowed to make. A spend record per purchase, made before the payment, is what lets you answer that.

How do I match AI agent spend receipts to bank lines when amounts and dates differ?

Reference first: if the agent put your order number or the provider's payment id in reference, the match is exact. Put the same value in the payment's metadata or memo so it reaches the feed where the rail allows it.

How do I give my accountant a signed month-end reconciliation of AI agent spend?

verify_spend_authorization is free and needs no key: send the receipt id and it answers whether the receipt is genuine, on record and an allow. Run it on every receipt in the month, so a pasted or edited receipt doesn't clear a bank line.

How do I ask Rightshold about this (free, no key)?

Add the MCP server https://www.rightshold.com/mcp to Claude, Cursor, ChatGPT, Grok or VS Code, then ask: “Record a signed receipt for my October agent-spend reconciliation: the SHA-256 of the reconciliation CSV and the counts of matched lines, bank lines with no receipt, receipts with no bank line and amount differences.”

One-click setup

{
  "tool": "record_ai_run",
  "arguments": {
    "model": "<agent or script that ran the reconciliation>",
    "provider": "<runtime or framework>",
    "output_sha256": "<sha256 of the reconciliation CSV>",
    "params": {
      "period": "2026-10",
      "credential_id": "crd_YOUR_AGENT_CREDENTIAL",
      "matched": 41,
      "bank_no_receipt": 1,
      "receipt_no_bank": 2,
      "amount_differs": 3,
      "deny_with_bank_line": 0
    },
    "ran_at": "2026-11-02T14:00:00Z"
  }
}

Rightshold doesn't connect to your bank, card issuer, QuickBooks or Xero, and it never holds or moves money. It signs spend decisions and the reconciliation hash you send. Pulling the bank feed, matching lines and deciding what each difference means are steps you and your accountant run. Not accounting, tax, audit or legal advice.

What are the sources?

Related

Not legal advice. JSON · Markdown · All answers

Get a free API key in one call

No card and no email needed. 100 free credits; the license and policy checks stay free without a key.

curl -s -X POST https://www.rightshold.com/v1/accounts/signup -H "Content-Type: application/json" -d '{"accept_terms":true}'
export RIGHTSHOLD_API_KEY=rs_...   # the api_key from the reply (shown once)
curl -s https://www.rightshold.com/v1/licenses/check -H "Authorization: Bearer $RIGHTSHOLD_API_KEY" \
  -H "Content-Type: application/json" -d '{"license":"MIT","intended_use":{"commercial_use":true}}'