Changelog

A public log of API changes. Additive, backward-compatible changes (new optional fields); breaking changes are flagged explicitly — existing integrations keep working unchanged.

2026-06-30 — Multi-provider OCR (BYOK)

Breaking. The OCR stage now takes ocr.{provider, model, providerKey} (was ocr.mistralApiKey). Choose any supported provider — Mistral is the default (mistral-ocr-latest). model is required. New OCR error markers (provider_auth_failed, provider_key_required, rate_limited, ocr_timeout, ocr_backend_*, too_many_pages) replace mistral_key_required.

2026-06-26 — Idempotency keys

POST /v1/jobs accepts idempotencyKey. Retrying with the same key and identical parameters returns the original job; the same key with different parameters returns 400.

2026-06-24 — job completion webhooks

  • New webhookUrl and webhookSecret fields (both optional) on job creation. webhookUrl is an absolute http/https endpoint; the service POSTs it once with a JSON body (job_id, account_id, status, finished_at) when the job reaches a terminal status. webhookSecret is an HMAC secret: when set, each request includes X-Hotdoc-Timestamp and X-Hotdoc-Signature headers (sha256=hex(hmac_sha256(secret, "<ts>.<body>"))). Both fields are accepted as input only and never appear in responses. Retry policy: up to 6 attempts with delays 1 m / 5 m / 15 m / 30 m / 30 m. See “Webhooks” for details.

2026-06-24 — structure-aware chunking and configurable chunk size

  • Structure-aware text chunking. Long recognized text is now cut along the boundaries of its format’s structure (Markdown / HTML / XML / plain): tables are not torn mid-row (a table’s header is repeated in each chunk), and section-heading context is preserved. The previous behavior (chunks as separate llm[] rows keyed by chunkIndex / chunkTotal) is unchanged — the service still does not merge chunks.
  • New neural.chunkBudgetTokens field (optional) on job creation — per-chunk token budget for your model’s context window; range 160002000000, defaults to the service’s conservative value. The response echoes the actual effective budget.
  • New ocr[].outputFormat field in the job result — the format of the recognized text (markdown / html / xml / plain).