Getting started
Send your first document to Arkrel and get verified data back, in three requests.
Your businesses
One login can belong to several businesses. Use the business switcher in the app header to create a business or switch into one. Each has separate books, reports, billing, email-in addresses, API keys, share links and bank connections. Each business buys its own Catch-Up year with 12 months of access, or Autopilot. The free allowance is one statement per person across every business.
API keys always act for the business where they were created. Switching the app does not change an API key. Firms can create a business for each client under one login and switch between them.
1. Get an API key
Create one in Dashboard, under API keys. It's shown once; copy it somewhere safe. Every request authenticates with Authorization: Bearer <key>.
2. Upload a document
POST to /v1/documents as multipart form data, or JSON with a base64 payload. Set document_type if you know it (invoice, receipt, purchase_order, bank_statement, delivery_note); otherwise pass a schema_id for a custom schema. Always send an Idempotency-Key so a retried request can never create a duplicate document.
curl -X POST https://arkrel.com/v1/documents \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-F "file=@invoice.pdf" \
-F "document_type=invoice"Every organization also gets a per-org email-in address (in Dashboard, under Upload) that skips the API entirely: forward or attach a PDF and it queues the same way. The plain address has no way to say what kind of document is attached, so it defaults to invoice; add a tag with + to set it instead, e.g. yourorg-ab12cd+bank@in.arkrel.com for a bank statement (also +receipt, +purchase_order, +delivery_note). An unrecognized tag is ignored, not rejected: the document still queues, typed the same as the plain address.
Sending the same file again to the same address is ignored: byte-identical content under the same tag never creates a second document. Sending it with a different tag, like +bank, runs a new extraction as that type and counts its pages, exactly like uploading the same file twice through the API with a different document_type. To correct a document's type without a second extraction, delete it and re-upload with the right type instead of resending it under a new tag.
3. Wait for a terminal state
The response is a Document in queued status. Poll GET /v1/documents/{id}, or register a webhook instead of polling (see Webhooks). Every document reaches one of four terminal states, always with a deadline:
curl https://arkrel.com/v1/documents/$DOCUMENT_ID \
-H "Authorization: Bearer $API_KEY"
# status moves: queued -> processing -> succeeded | partial | needs_review | failedsucceeded: every check passedpartial: extracted, but one or more checks failed (seereasons)needs_review: extraction was not confident enough to check automaticallyfailed: could not be processed at all (seereasons)
4. Get the result
GET /v1/documents/{id}/result returns fields, tables, checks and page info as JSON, or add ?format=csv / ?format=xlsx for a file download. See Document types & checks for exactly what runs on each document type, and the full shape in the API reference.
CSV, XLSX, and bank-format document exports require a paid consumer plan, an active Catch-Up purchase or AppSumo code, or usable developer API page credits. Accounts with none return 402 EXPORT_LOCKED. The same rule applies in the app. Expired, revoked, or depleted credits do not unlock exports. JSON extraction remains available.
CSV exports every non-empty table. A single table keeps its existing CSV layout. Multiple tables share one file with a leading table column and all table columns in first-seen order; missing values are blank. A source column named table becomes table (source). If that source header exists, we try table (source) (2), then table (source) (3), and so on until the name is unused. Both columns keep their values. After formula neutralization, duplicate headers receive numbered suffixes starting at (2), skipping existing final headers. Single-table CSV bytes are unchanged. API CSV includes document fields only when all tables are empty. With two or more tables, XLSX gives each non-empty table its own sheet and keeps document fields in a Fields sheet. Table sheet names have invalid characters, surrounding whitespace, and boundary apostrophes removed. Final names are limited to 31 characters and made unique without regard to case, including reserved Fields and History names; empty names use Table N. A single-table or fields-only workbook keeps its Result sheet as before.
Catch-Up includes 12 months of access from payment settlement and a 30-day money-back guarantee. Billing shows the deadline once that date is confirmed, or the guarantee wording while confirmation is pending. The app usage response exposes this as nullable payment_settled_atin catchup_purchases. Purchase record time is not a substitute.