Content-Type: application/problem+json). Klint trims it to the fields an agent acts on:
There is no separate
code, docs_url, or is_retriable field. The type URI is both the identifier you branch on and the link to its docs. Retry guidance lives in the catalog below and in the Retry-After header. A validation-failed response adds an errors[] array. Each entry names the issue’s pointer, reason, and correction. See what gets rejected for the canonical examples, including candidates suggestions on unknown classification IDs.
The catalog
Each row’stype is the absolute URI https://api.tryklint.ai/problems/<slug>. The slug shown below is its last path segment and the name the docs use. Branch on the full type string.
The catalog may gain types before contract freeze and is deliberately non-exhaustive at the edges. If you hit an undocumented error, report it with its
request_id.not-tracked deserves a careful read
not-tracked.
Retrying 429s
Retry-After header is authoritative. Wait that long. Do not guess:
503/504, use the same loop with exponential backoff when the response has no Retry-After header. Never auto-retry 4xxs other than 429. They fail identically until the request changes.
Across surfaces
The SDK throws oneKlintApiError that carries the typed problem object. Branch on problem.type. MCP tool failures preserve the complete problem object as structured data. The CLI prints a summary and, in JSON mode, writes the exact problem object to stderr. No surface invents its own error dialect.