Statement2Sheet
Bank statement API

Statement PDFs in. Reconciled transactions out.

For bookkeeping software, accounting firms and lenders. Upload a PDF, get structured JSON with a reconciliation result on every statement — or ready-made XLSX, CSV, QBO and OFX files.

Test keys are free and return sample results; live keys use your credits.

curl https://statement-to-sheet.com/v1/statements \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: 8e0f..." \
  -F [email protected]
# → webhook statement.completed to your endpoints (Developers → Webhooks), or poll GET /v1/statements/{id}

curl https://statement-to-sheet.com/v1/statements/stm_7f3c.../transactions \
  -H "Authorization: Bearer sk_test_..."

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/statementsUpload a PDF
GET/v1/statements/{id}Status, summary, reconciliation
GET/v1/statements/{id}/transactionsRows with per-row status
PATCH/v1/statements/{id}/transactionsSubmit corrections
GET/v1/statements/{id}/export?format=xlsx, csv, ofx, qbo
POST/v1/statements/{id}/retryRetry a failed statement
POST/v1/statements/{id}/account-typeParse again as another account type
DELETE/v1/statements/{id}Delete now
GET/v1/usageCredits 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.