The initial public contract
- Added
POST /v1/extract(sync, up to 20 pages),POST /v1/jobsandGET /v1/jobs/:id(async, results by polling or webhooks),POST /v1/uploadsfor staged documents up to 50 MiB, andGET /v1/health. One error shape with stable codes. Full reference at /docs. - Added
Every
"present"field carriesgrounding:"verified"when the value ink itself was located within the cited region,"cited"when an anchor is attached but the value was not confirmed there,"ungrounded"when no accepted span exists. Docs. - Added
Idempotency-KeyonPOST /v1/extractandPOST /v1/jobs: a retried request replays the stored response for 24 hours instead of running twice; a reused key with a different body returns 409idempotency_key_conflict. Docs. - Added
Webhook deliveries are signed per the Standard Webhooks scheme:
webhook-id,webhook-timestampandwebhook-signatureheaders overid.timestamp.body, withwhsec_secrets. Secrets rotate from the dashboard, with 24 hours of dual-signing so a receiver on the old secret keeps working while it switches. Docs. - Added
Every response carries an
x-request-idheader; the same id appears aserror.request_idin error bodies andmeta.request_idin results. For an async job, the 202 body, the result and the webhook delivery carry one id. Docs. - Added
Every response carries a
velrim-versionheader naming the contract version, currently2026-08-10. The promise it anchors is on Versioning and deprecation. - Added
@velrim/sdk(npm) andvelrim(PyPI): Zod/Pydantic models or plain JSON Schema, automatic retries with backoff andRetry-After, per-request idempotency keys,verifyWebhook/verify_webhookfor deliveries, andrequest_idon errors and job handles. - Added
The enforced limits, documented exactly: 20 MiB inline and 50 MiB staged, the 20-page sync cap, rate limits including the free-account tier, the webhook retry schedule and 24-hour result retention.