Skip to navigation

Get a bank statement

View as Markdown

Poll this after uploading a PDF with extraction enabled — the terminal states are completed and failed, and extraction_error explains the latter.

Authentication

AuthorizationBearer

JWT issued via POST /api/v1/auth/sign_in. Used by mobile and SPA clients. Revoked tokens are rejected.

OR
AuthorizationBearer

Lucanto API key. Two prefixes:

  • lct_pat_<random><checksum> — personal access token (owner: User)
  • lct_live_<random><checksum> — workspace token, live data

Issue keys at /settings/api_keys (personal) or /:workspace_id/settings/api_keys (workspace). Plaintext token is shown once and never again.

Path parameters

workspace_idlongRequired>=1
Workspace ID. The numeric ID shown in your URLs.
idlong or stringRequired

Bank statement ID. Either the numeric id or the public_id (bst_…).

Response

OK
idlong
public_idstringRead-onlyformat: "^[a-z]+_[0-7][0-9a-hjkmnp-tv-z]{25}$"

Stable public identifier of this record. Never changes once assigned. Its prefix names the entity: doc_ document (invoice, proforma, credit note, quote, sales order), exp_ expense, cnt_ contact, prj_ project, ba_ bank account or cash register, txn_ transaction, lon_ loan, bst_ bank statement. Accepted in place of the numeric id in this resource’s path parameters and in request fields that reference it (customer_id, bank_account_id, …).

bank_account_idlong
file_typeenum
Allowed values:
sourceenum

psd2 — downloaded by a bank connection. manual — uploaded, whether through the app or this API.

Allowed values:
extraction_statusenum

AI extraction state, PDF only. manual means no extraction was ever requested — the normal terminal state for an archived PDF and for every XML statement, whose transactions come from parsing, not AI.

Allowed values:
created_atdatetime
updated_atdatetime
bank_accountobjectOptional

Slim embed of the owning account — identity only, no balances.

period_fromdate or nullOptional
First day covered by the statement. Read from the camt.053 header for XML, supplied by the caller for PDF, null when neither applies.
period_todate or nullOptional

Last day covered by the statement. Same semantics as period_from.

original_filenamestring or nullOptional
extraction_skipped_reasonenum or nullOptional

Why AI extraction was not run on an uploaded PDF. quota means extraction was omitted because AI extraction quota was exhausted (the statement was archived unread). null when extraction ran, was explicitly turned off (extract: false), or for XML statements.

Allowed values:
extraction_errorstring or nullOptional
Why extraction failed
extraction_completed_atdatetime or nullOptional
transactions_createdinteger or nullOptional

Transactions this statement produced. Populated on import; 0 for an archived PDF until extraction completes.

transactions_skippedinteger or nullOptional
Rows recognised as already present and therefore not duplicated.
entry_countsmap from strings to integersOptional

Rows in the AI-extraction staging area, grouped by status, e.g. {"imported": 42, "pending": 3}.

Only PDF statements that went through extraction have these — an extracted PDF stages its rows for review before they become transactions. XML statements are always {}: camt.053 parsing creates transactions directly, with no staging step, so transactions_created / transactions_skipped is where an XML import reports itself.

reconciliation_modeenum or nullOptional

What the statement is for. import — its rows become transactions. compare — the account already receives its transactions from the bank (PSD2), so the statement only checks the sync: see comparison. null — not decided yet.

Allowed values:
comparisonobject or nullOptional

null unless reconciliation_mode is compare. Computed from the account’s state at request time. An XML statement’s matched count and the transactions it claims come from its comparison, stored when the file was read; only the split of its unmatched rows by the sync coverage (missing, awaiting_bank, fetchable, before_sync) is recomputed.

Errors

401
Unauthorized Error
402
Payment Required Error
403
Forbidden Error
404
Not Found Error
429
Too Many Requests Error