Reconciliation
Verify that your ledger balances match your bank statements. DayZero uses AI to parse statements and deterministic matching to suggest transaction pairs.
How It Works
- Upload a bank statement (PDF, CSV, or Excel) for a ledger and statement period
- AI parses the statement into structured transaction lines
- Matching engine pairs statement lines with ledger transactions in that period
- Review suggested matches — approve, reject, or match manually
- Complete the reconciliation to lock it and mark the transactions reconciled
| Status | Meaning |
|---|---|
pending |
Created, processing not started yet |
processing |
Parsing the statement and running matching |
ai_matched |
Suggestions ready for review |
in_review |
A user is approving/rejecting matches |
completed |
Locked; matched transactions flagged reconciled |
failed |
Processing failed — POST …/start retries it |
Create a Reconciliation
From File Upload
The ledger and statement period are query parameters; the file is the multipart body:
curl -X POST "https://api.ondayzero.com/api/v1/reconciliations/upload?ledger_id=BANK_LEDGER_UUID&start_date=2026-03-01&end_date=2026-03-31&opening_balance=1250000&closing_balance=1387550" \
-H "Authorization: Bearer dz_your_token_here" \
-H "x-business-id: YOUR_BUSINESS_ID" \
-F "file=@statement.pdf"ledger_id, start_date and end_date are required. opening_balance / closing_balance are in cents and let DayZero validate the reconciliation before completion; when the parser finds balances on the statement itself, those are stored too. Files up to 50 MB are accepted. Processing starts automatically unless you pass auto_start=false.
From an Uploaded S3 Key
If the statement was already uploaded (see File Uploads):
curl -X POST "https://api.ondayzero.com/api/v1/reconciliations" \
-H "Authorization: Bearer dz_your_token_here" \
-H "x-business-id: YOUR_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"ledger_id": "BANK_LEDGER_UUID",
"start_date": "2026-03-01",
"end_date": "2026-03-31",
"source_type": "manual",
"statement_s3_key": "statements/march-2026.pdf",
"statement_filename": "march-2026.pdf",
"opening_balance": 1250000,
"closing_balance": 1387550
}'source_type is manual (uploaded statement — statement_s3_key required) or plaid (reconcile against the synced bank feed for the period, no file needed).
Review Matches
Poll GET /api/v1/reconciliations/{reconciliation_id} until status is ai_matched. The response lists statement lines with their suggested ledger transactions and confidence scores.
# Approve one match (one statement line ↔ one or more ledger transactions)
curl -X POST "https://api.ondayzero.com/api/v1/reconciliations/{reconciliation_id}/matches/approve" \
-H "Authorization: Bearer dz_your_token_here" \
-H "x-business-id: YOUR_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{"statement_txn_id": "STATEMENT_LINE_ID", "ledger_txn_ids": ["TRANSACTION_UUID"]}'
# Approve everything the engine is confident about
curl -X POST "https://api.ondayzero.com/api/v1/reconciliations/{reconciliation_id}/matches/bulk-approve" \
-H "Authorization: Bearer dz_your_token_here" \
-H "x-business-id: YOUR_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{"min_confidence": 0.9}'…/matches/reject and …/matches/bulk-reject discard suggestions; approving with your own ledger_txn_ids creates a manual match. POST …/explain-matches asks the AI to explain why each pair was suggested.
Check the Balance
curl "https://api.ondayzero.com/api/v1/reconciliations/{reconciliation_id}/balance" \
-H "Authorization: Bearer dz_your_token_here" \
-H "x-business-id: YOUR_BUSINESS_ID"Reports whether opening balance + net matched transactions = closing balance, and the difference if not.
Complete a Reconciliation
After reviewing matches:
curl -X POST "https://api.ondayzero.com/api/v1/reconciliations/{reconciliation_id}/complete" \
-H "Authorization: Bearer dz_your_token_here" \
-H "x-business-id: YOUR_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{"skip_balance_check": false}'Completion validates the balance (pass "skip_balance_check": true to override), locks the reconciliation, and marks matched transactions as reconciled. GET …/pdf downloads the reconciliation report once completed.
List Reconciliations
curl "https://api.ondayzero.com/api/v1/reconciliations?status=in_review&limit=20" \
-H "Authorization: Bearer dz_your_token_here" \
-H "x-business-id: YOUR_BUSINESS_ID"This endpoint uses limit / offset paging rather than cursors.