<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://doc.cheap/docs/changelog/feed.xml</id>
  <title>doc.cheap — changelog</title>
  <subtitle>Changes to the document-recognition API and its documentation.</subtitle>
  <link rel="self" type="application/atom+xml" href="https://doc.cheap/docs/changelog/feed.xml"/>
  <link rel="alternate" type="text/html" href="https://doc.cheap/docs/changelog"/>
  <updated>2026-09-17T00:00:00Z</updated>
  <entry>
    <id>https://doc.cheap/docs/changelog/2026-09#2026-09-17-1-0-0-the-first-production-release</id>
    <title>1.0.0, the first production release</title>
    <link rel="alternate" type="text/html" href="https://doc.cheap/docs/changelog/2026-09#2026-09-17-1-0-0-the-first-production-release"/>
    <published>2026-09-17T00:00:00Z</published>
    <updated>2026-09-17T00:00:00Z</updated>
    <summary type="text">The document-recognition API, at version 1.

Recognition. POST /v1/scans takes one image as base64 and returns the
extracted data in the same response. The call is synchronous: no job to poll,
no callback to register. Passports, identity cards, travel documents and
driving licences are read off the printed page, the machine-readable zone and a
barcode where one is printed.

One response shape. Eight groups — meta, document, holder, fields,
mrz, images, quality and authenticity — described key by key on
the response. Every key is present; an absent value is
null and an absent collection is empty. meta.schema_version is &quot;1.0&quot;.

Fields in every script. Every field the engine reads is re-keyed to a
stable vocabulary and published once per language, resolved from 418 assigned
language identifiers. A document printed in two scripts carries both spellings,
neither chosen for you.

The machine-readable zone, verbatim. mrz is a verdict with the zone
beside it: the lines exactly as read, and one unbroken text a check-digit
routine takes unchanged.

Result images. Seven crops, each capped by height — 250 px for the document
crop, 100 px for the rest — returned by the call that produced them and never
stored.

Billing. One credit is one US cent, charged only for a recognition that
produced data. A credit is reserved before the engine runs and settled after.
GET /v1/usage reports the balance and the period&apos;s counters.

Retention is the caller&apos;s choice. retain_hours decides how long a result
stays readable through GET /v1/scans/{id}; 0 writes nothing down at all.

Safe retries. An Idempotency-Key on a scan request returns the first
result instead of running and charging again.

Errors. One error shape everywhere, 21 stable codes, each with a page of
its own at /errors/&lt;code&gt; that every error body links to.

Three ways in. The public sandbox key sk_sandbox_public recognizes real
documents without an account; a registered account&apos;s own sandbox key answers
from a fixed specimen; a live key bills.</summary>
  </entry>
</feed>
