Skip to main content
Every non-2xx response is the same compact RFC 9457 problem object (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’s type 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 Retry column is authoritative; don’t infer retryability from the status code. Two 4xxs below retry differently than their status suggests.
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

It says only that Klint does not track this resource. It never says that the post or account is absent from Instagram. Don’t let an agent conclude “this post doesn’t exist” from a not-tracked.

Retrying 429s

The Retry-After header is authoritative. Wait that long. Do not guess:
For 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 one KlintApiError 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.