Reconciled, not guessed
Every response carries the reconciliation and a status per row. Statements that don't add up come back as needs_review, never as success.
Webhooks
Signed with HMAC-SHA256, retried with backoff. Or poll — your choice.
Sandbox
Test keys return fixed succeeded, needs_review and rejected sample results, so you can build your status handling before going live.
Zero retention option
Set retention=none and the PDF is deleted as soon as it's parsed (a failed one is kept for a retry, for the standard retention period). Data stays in Canada.
The response
Synthetic response excerpt. Amounts are decimal strings or null; account numbers are masked in JSON summaries.
{
"id": "stm_7f3c...",
"status": "succeeded",
"account_type": "chequing",
"bank": "RBC",
"currency": "CAD",
"period": { "start": "2026-09-01", "end": "2026-09-30" },
"opening_balance": "5234.22",
"closing_balance": "7944.55",
"reconciliation": { "status": "pass", "diff": "0.00" },
"transaction_count": 12,
"needs_review_count": 0
}Statuses
- succeeded
- Reconciled, no rows need review
- needs_review
- Result available; some rows, or the whole statement, need a check
- rejected
- Scanned, encrypted or unsupported — not charged
- failed
- Our error — retry for free
Endpoints
| POST | /v1/statements | Upload a PDF |
| GET | /v1/statements/{id} | Status, summary, reconciliation |
| GET | /v1/statements/{id}/transactions | Rows with per-row status |
| PATCH | /v1/statements/{id}/transactions | Submit corrections |
| GET | /v1/statements/{id}/export?format= | xlsx, csv, ofx, qbo |
| POST | /v1/statements/{id}/retry | Retry a failed statement |
| POST | /v1/statements/{id}/account-type | Parse again as another account type |
| DELETE | /v1/statements/{id} | Delete now |
| GET | /v1/usage | Credits used and remaining |
Start in the sandbox today
Test keys are free. Live calls use the same credits as the website. A DPA is available for business customers.