Skip to content

Developers

An extraction API developers can operate.

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

Designed for retries, queues, and support tickets.

Uploads are asynchronous and idempotent. Completed documents return normalized fields; blocked or failed documents return context your integration can route or show to support.

Upload
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"
Result
{
  "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

Build against production behavior before spending live credits.

1

Create a test token

Test-mode tokens use the same endpoints, validation, idempotency, webhooks, and error envelope as live tokens.

2

Upload representative files

Use representative PDFs, custom labels, locale, and idempotency keys so retries do not create duplicate work.

3

Move to live tokens

Switch to live tokens when polling, webhooks, error handling, and downstream mapping have been exercised safely.

After launch

Operational details are exposed instead of hidden.

When a document fails, is blocked, or extracts differently than expected, the integration should have machine-readable context and a human-readable workspace path.

Request IDs
Every API response carries a request ID so support can connect a customer report to the exact request.
Signed webhook headers
Webhook deliveries include event, delivery, timestamp, and signature headers for receiver verification.
Machine-readable errors
Errors include a message, code, and request ID so integrations can handle retries and support paths cleanly.
OpenAPI contract
The v1 API contract is published and validated so SDKs, internal clients, and docs stay aligned.
Rate limits and backoff
Token and account-level limits protect the service while giving integrations a clear retry model.

Docs

Start with the quickstart, then wire polling or webhooks.