Publieke API · 2026-09-01

Documentverwerking, afgerekend per pagina.

Upload een bestand, start een taak en haal het resultaat op. OCR met echte coördinaten, conversie, compressie, samenvoegen, splitsen, paginabewerkingen, beveiliging en zwartlakken draaien op dezelfde workers als de editor. Bearer-API-sleutels, JSON, ondertekende webhooks en een gratis sandbox.

€19/monthinclusief btw2.000 pagina'sinbegrepen per maand€0.015per extra credit (OCR: 3/pagina)

Snel beginnen

Maak onder Account → API-sleutels een sleutel. Kies Sandbox voor een kosteloze dxk_test_-sleutel of Live voor dxk_live_. Upload daarna een bestand, maak een taak, controleer de status en download het resultaat.

# 1. Upload
curl -s https://docaxo.com/api/v1/files \
  -H "Authorization: Bearer $DOCAXO_API_KEY" \
  -F "[email protected]"
# → {"id":"f_…","object":"file","page_count":3,"status":"ready",…}

# 2. Start a job (safe to retry thanks to Idempotency-Key)
curl -s https://docaxo.com/api/v1/jobs \
  -H "Authorization: Bearer $DOCAXO_API_KEY" \
  -H "Idempotency-Key: order-42-ocr" \
  -H "Content-Type: application/json" \
  -d "{\"operation\":\"ocr\",\"file_id\":\"$FILE_ID\",\"options\":{\"mode\":\"base\"}}"
# → 202 {"id":"…","status":"queued","credits":{"billed":true,"pages_estimated":3},…}

# 3. Poll, then download
curl -s "https://docaxo.com/api/v1/jobs/$JOB_ID" -H "Authorization: Bearer $DOCAXO_API_KEY"
curl -sL "https://docaxo.com/api/v1/jobs/$JOB_ID/result?format=json" \
  -H "Authorization: Bearer $DOCAXO_API_KEY" -o blocks.json

Gebruik voor pushmeldingen een webhook en wacht op job.succeeded. De machineleesbare specificatie staat op /api/v1/openapi.json.

Authenticatie

Stuur de sleutel als Bearer-token: Authorization: Bearer dxk_live_…. Browsercookies worden op /api/v1 niet geaccepteerd. Het voorvoegsel bepaalt de modus: dxk_test_ voor sandbox en dxk_live_ voor liveverwerking en facturering.

  • Live-sleutels vereisen API Starter; sandbox werkt bij elk abonnement.
  • Scopes zijn documents:read, documents:write, jobs:read, jobs:write, usage:read en webhooks:manage.
  • Draai sleutels via Account en bewaar ze nooit in clientcode.

Bestanden

Upload met POST /api/v1/files als multipartveld file. De respons bevat een file_id. Vraag metadata op met GET /api/v1/files/:id en verwijder met DELETE /api/v1/files/:id. Bestanden zijn strikt gescheiden per account en modus.

Taken en bewerkingen

Maak een asynchrone taak met POST /api/v1/jobs, een ongewijzigde technische operation, invoerbestand-ID's en opties. Controleer GET /api/v1/jobs/:id totdat de status succeeded, failed of cancelled is en download via het geretourneerde resultaatendpoint.

Ondersteunde operation-identifiers: ocr searchable_pdf convert compress merge split rotate reorder delete_pages protect unlock redact.

Idempotentie

Stuur bij muterende verzoeken een unieke Idempotency-Key. Een herhaling met dezelfde body retourneert dezelfde respons; dezelfde sleutel met andere invoer geeft 409 idempotency_conflict.

POST /api/v1/jobs
Idempotency-Key: order-42-ocr        # ≤ 255 chars, scoped to the API key, kept 24h

# first call  → 202 + job
# retry       → 202 + the *same* job, header Idempotent-Replayed: true
# same key, different body → 422 idempotency_key_reused
# key still in flight      → 409 idempotency_in_progress

Webhooks

Registreer een HTTPS-endpoint om taakstatussen te ontvangen. Beschikbare events: job.succeeded job.failed job.cancelled file.expired webhook.test. Verifieer altijd de HMAC-handtekening op de ongewijzigde requestbytes en voorkom replay met tijdstempel en event-ID.

Voorbeeld-event
POST https://example.com/docaxo
Docaxo-Event: job.succeeded
Docaxo-Signature: t=1757700000,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd
Content-Type: application/json

{
  "id": "evt_01J7…",
  "object": "event",
  "type": "job.succeeded",
  "api_version": "2026-09-01",
  "livemode": true,
  "created_at": "2026-09-12T18:00:00+00:00",
  "data": {
    "object": {
      "id": "…", "object": "job", "operation": "ocr", "status": "succeeded",
      "metadata": { "order": "42" },
      "result": { "download_url": "https://docaxo.com/api/v1/jobs/…/result", "pages_processed": 3 }
    }
  }
}

Handtekening verifiëren

import { createHmac, timingSafeEqual } from "node:crypto";

export function verifyDocaxoSignature(rawBody, header, secret, toleranceSeconds = 300) {
  const parts = Object.fromEntries(header.split(",").map((kv) => kv.split("=")));
  const t = Number(parts.t);
  if (!parts.v1 || !Number.isFinite(t)) return false;
  if (Math.abs(Date.now() / 1000 - t) > toleranceSeconds) return false; // replay window
  const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
  return expected.length === parts.v1.length && timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}

// Express: app.post("/docaxo", express.raw({ type: "application/json" }), (req, res) => {
//   if (!verifyDocaxoSignature(req.body.toString("utf8"), req.get("Docaxo-Signature"), process.env.WHSEC)) return res.sendStatus(400);
//   const event = JSON.parse(req.body); … ; res.sendStatus(200);
// });

Nieuwe pogingen

Een niet-succesvolle 2xx-respons wordt opnieuw geprobeerd volgens 1m → 5m → 30m → 2h → 12h. Verwerking aan jouw kant moet daarom idempotent zijn.

Rate limits

Limieten gelden per API-sleutel en abonnement. De responsheaders tonen limiet, resterend aantal en resetmoment. Bij overschrijding volgt 429 rate_limited met Retry-After.

HeaderBetekenis
X-RateLimit-LimitToegestane verzoeken per minuut voor deze sleutel
X-RateLimit-RemainingResterende verzoeken in het huidige venster
X-RateLimit-ResetSeconden totdat de bucket opnieuw wordt gevuld
Retry-AfterAlleen bij 429 — aantal seconden wachten
X-Request-IdElke respons; vermeld dit bij ondersteuning
Idempotent-Replayed`true` wanneer een opgeslagen idempotente respons is teruggegeven
X-Docaxo-Sandbox`true` bij downloads van sandboxresultaten
429-respons
HTTP/1.1 429 Too Many Requests
Retry-After: 3
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 3

{"error":{"type":"rate_limit_error","code":"rate_limited",…}}

Fouten

Fouten hebben een stabiele JSON-envelope met machineleesbare error.code, een bericht, request-ID en optionele details. Vertaal alleen het bericht in je UI; programmeer tegen de identifier.

  • 401 authentication_requiredGeen Bearer-API-sleutel meegestuurd; cookies worden hier niet geaccepteerd.
  • 401 invalid_api_keyOnbekende, ingetrokken of verlopen sleutel.
  • 403 plan_requiredLive-sleutels vereisen API Starter; upgrade_url verwijst naar checkout.
  • 403 insufficient_scopeDe sleutel mist de scope die dit endpoint vereist.
  • 403 mode_mismatchHet object hoort bij de andere modus (live ↔ test).
  • 422 validation_errorOngeldige body of parameters; param noemt het betrokken veld.
  • 422 operation_unsupportedVoor deze bewerking of dit doel bestaat geen echte workerhandler.
  • 422 invalid_optionsOpties zijn ongeldig voor de gekozen bewerking.
  • 415 unsupported_file_typeContent-type wordt niet geaccepteerd of past niet bij de bytes.
  • 413 file_too_largeDe upload overschrijdt de maximale grootte.
  • 409 file_not_readyDe vooraf ondertekende upload is nog niet afgerond.
  • 422 page_limit_exceededDe taak bevat meer pagina's dan het abonnement toestaat.
  • 402 insufficient_creditsOnvoldoende credits en meerverbruik is niet beschikbaar.
  • 402 spending_cap_reachedDe taak zou de bestedingslimiet overschrijden.
  • 429 concurrency_limitTe veel taken in wachtrij of uitvoering; probeer opnieuw nadat er een is afgerond.
  • 429 rate_limitedDe tokenbucket is leeg; respecteer Retry-After.
  • 422 idempotency_key_reusedDezelfde Idempotency-Key is met een andere requestbody gebruikt.
  • 409 idempotency_in_progressHet oorspronkelijke verzoek met deze sleutel wordt nog verwerkt.
  • 404 not_foundGeen bestand, taak of webhook voor dit account en deze modus gevonden.
  • 409 job_not_finishedHet resultaat is opgevraagd voordat de taak was voltooid.
  • 409 no_downloadable_resultDe taak heeft geen downloadbare uitvoer opgeleverd.
  • 404 result_expiredHet resultaatobject is na de bewaartermijn verwijderd.
  • 501 presigned_unavailableVooraf ondertekende URL's vereisen de S3-store; gebruik multipartupload.
  • 502 webhook_delivery_failedJe endpoint heeft het testevent geweigerd.
  • 503 queue_unavailableDe taakwachtrij is onbereikbaar; opnieuw proberen met dezelfde Idempotency-Key is veilig.
  • 500 internal_errorFout aan onze kant; vermeld request_id bij een melding.

Prijzen en credits

API Starter kost €19/month per maand inclusief 2.000 credits. Extra gebruik kost €0.015 per credit. Normale documentpagina's kosten één credit; OCR kost 3 credits per pagina. Stel een bestedingslimiet in via Facturering.

Bekijk alle prijzen →

Sandbox en live

dxk_test_-sleutels maken afzonderlijke sandboxbestanden, taken en webhooks en brengen niets in rekening. Resultaten zijn deterministische testuitvoer. dxk_live_-sleutels verwerken echte documenten. Objecten kunnen nooit tussen beide modi worden gelezen.

Endpointreferentie

MethodePadSamenvattingScope
POST/api/v1/filesUpload via multipart of vraag een vooraf ondertekende upload-URL aandocuments:write
GET/api/v1/filesBestanden weergevendocuments:read
GET/api/v1/files/{file_id}Bestand ophalendocuments:read
POST/api/v1/files/{file_id}/completeVooraf ondertekende upload afrondendocuments:write
DELETE/api/v1/files/{file_id}Bestand verwijderendocuments:write
POST/api/v1/jobsTaak maken (ondersteunt Idempotency-Key)jobs:write
GET/api/v1/jobsTaken weergeven (filterbaar op status)jobs:read
GET/api/v1/jobs/{job_id}Taak ophalenjobs:read
POST/api/v1/jobs/{job_id}/cancelTaak in wachtrij of uitvoering annulerenjobs:write
GET/api/v1/jobs/{job_id}/resultResultaat downloaden (format=download | json | url)jobs:read
POST/api/v1/webhooksWebhookendpoint maken (geheim wordt één keer getoond)webhooks:manage
GET/api/v1/webhooksWebhookendpoints weergevenwebhooks:manage
GET/api/v1/webhooks/{webhook_id}Webhookendpoint ophalenwebhooks:manage
PATCH/api/v1/webhooks/{webhook_id}URL, events of enabled bijwerkenwebhooks:manage
DELETE/api/v1/webhooks/{webhook_id}Webhookendpoint verwijderenwebhooks:manage
POST/api/v1/webhooks/{webhook_id}/testNu een ondertekend webhook.test-event sturenwebhooks:manage
GET/api/v1/webhooks/{webhook_id}/deliveriesAfleverlogboekwebhooks:manage
GET/api/v1/accountAccount, abonnement, sleutel en limietenany
GET/api/v1/usageCredits, meerverbruik en grootboek voor deze periodeusage:read
GET/api/v1/operationsBewerkingscatalogusany
GET/api/v1/errorsReferentie van foutcodesnone
GET/api/v1/pricingPrijzen en limietennone
GET/api/v1/openapi.jsonDeze API als OpenAPI 3.1none

Statische lijst — de live specificatie staat op https://docaxo.com/api/v1/openapi.json en Swagger UI op https://docaxo.com/api/v1/docs.

DOCAXO API — documentatie