Retrieve the Payout object for the bank deposit you want to reconcile: GET /v1/payouts/{payout_id} — note 'amount', 'arrival_date', and 'status'.
List all balance transactions that belong to that payout: GET /v1/balance_transactions?payout={payout_id}&limit=100, paginating with the 'starting_after' cursor until you have exhausted all pages.
For each balance transaction, inspect 'type' (charge, refund, dispute, fee, adjustment, payout), 'amount', 'fee', and 'net'; 'net' is what actually contributes to the payout.
Sum all 'net' values across the balance transactions — this must equal the payout 'amount'. Any discrepancy indicates a missing page, a timing edge case, or a reserve hold.
For charges, the balance transaction's 'source' field is the Charge ID; join back to your orders database on that ID to produce a per-order reconciliation report.
To get the live balance at any moment, call GET /v1/balance which returns 'available' (payable now) and 'pending' (still within the rolling settlement window) broken out by currency.
Known gotchas
Stripe can batch multiple payouts into one bank transfer (automatic payout schedule) or split a single payout period into multiple bank entries; always reconcile at the Payout ID level, not by date or amount alone.
Connect platforms see separate balance transaction scopes per connected account; you must pass the 'Stripe-Account' header or use the account-scoped client to fetch sub-account transactions.
Negative balance transactions (disputes, refunds) may arrive days after the related charge's payout has already settled, creating reconciliation gaps if you only look at a single payout window.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp