Errors
One error envelope, typed by error_class.
Every non-2xx response uses the same JSON envelope:
{
"error": "no registered parser detected this source",
"error_class": "ParseError",
"format_version": null,
"marker_coverage": null
}Branch on error_class, not the human error string. marker_coverage is populated only for EmptyStatementError.
Status codes
| Status | Meaning |
|---|---|
200 | Success: ParseResponse JSON or CSV bytes, redacted bytes from /v1/redact, or an IntegrityReport from /v1/inspect |
401 | Missing, invalid, or revoked key (AuthError) |
402 | Subscription inactive (subscription_inactive), or a free cap reached on a route with no sample (free_limit_reached) |
403 | The key or token is not allowed on this route (admin routes only) |
413 | File over 50 MB (PayloadTooLarge) |
422 | Parse failure: see error_class below |
500 | Internal engine error |
error_class (the 422 cases)
error_class | What happened | What to do |
|---|---|---|
EncryptedSourceError | The PDF is password-protected | Remove the password, re-upload |
EmptyStatementError | Parsed clean, zero rows. High marker_coverage ≈ truly empty; low ≈ silent layout drift | Check the statement; if wrong, file an issue |
LayoutDriftError | Bank detected, but the layout changed | File an issue with a redacted sample |
ReconciliationError | A totals or running-balance check failed, or the statement carried evidence for neither | Likely format drift. File an issue |
removed_parameter | A field this API no longer takes. redact=true on /v1/parse or /v1/parse/jobs (redaction is POST /v1/redact) | Send the file to the new route |
ResourceLimitError | The file took too long or too much memory to read and was stopped. Never a partial result | Send the original bank export, not an edited or re-saved copy |
ParseError | No supported bank detected, or a non-statement PDF | Confirm the bank is supported |
Format drift on a supported bank is fixed within 48h (see Banks).