Create a test token
Test-mode tokens use the same endpoints, validation, idempotency, webhooks, and error envelope as live tokens.
Developers
Upload files, poll status, receive signed webhooks, and read normalized fields with request IDs, idempotency, test-mode tokens, and an OpenAPI contract built into the workflow.
API lifecycle
Uploads are asynchronous and idempotent. Completed documents return normalized fields; blocked or failed documents return context your integration can route or show to support.
curl -X POST "https://www.exdata.app/api/v1/documents" \ -H "Authorization: Bearer $EXDATA_API_TOKEN" \ -H "Idempotency-Key: invoice-upload-001" \ -F "file=@invoice.pdf" \ -F "locale=en" \ -F "custom_types[]=invoice"
{
"status": "completed",
"mode": "live",
"is_e_invoice": true,
"extractions": {
"type": {
"value": "invoice",
"candidates": ["invoice"]
},
"document_number": {
"value": "RE-2026-1048",
"candidates": ["RE-2026-1048"]
},
"sender_name": {
"value": "Meyer Supply GmbH",
"candidates": ["Meyer Supply"]
},
"recipient_name": {
"value": "Northwind Operations Ltd.",
"candidates": ["Northwind Operations"]
},
"payment_due_date": {
"value": "2026-06-14",
"candidates": ["14.06.2026"]
},
"net_amount": {
"value": "1079.50",
"candidates": ["1,079.50"]
},
"tax_breakdowns": {
"value": [
{
"taxable_amount": "1079.50",
"tax_amount": "205.10",
"tax_rate": "19.00",
"tax_collection_mechanism": "seller_collected"
}
],
"candidates": ["VAT 19% 205.10"]
},
"gross_amount": {
"value": "1284.60",
"candidates": ["EUR 1,284.60"]
},
"currency": {
"value": "EUR",
"candidates": ["EUR"]
},
"iban": {
"value": "DE89370400440532013000",
"candidates": ["DE89 3704 0044 0532 0130 00"]
}
},
"latest_extraction_run": {
"schema_version": "2026-05-17",
"normalization_version": "base:2026-05-10"
}
}
Integration path
Test-mode tokens use the same endpoints, validation, idempotency, webhooks, and error envelope as live tokens.
Use representative PDFs, custom labels, locale, and idempotency keys so retries do not create duplicate work.
Switch to live tokens when polling, webhooks, error handling, and downstream mapping have been exercised safely.
After launch
When a document fails, is blocked, or extracts differently than expected, the integration should have machine-readable context and a human-readable workspace path.
Docs