Errors
There is one error envelope for every 4xx and 5xx. Agents branch on code; humans read
message; you write one parse path. No 3xx ever carries an error body.
The envelope
Section titled “The envelope”{ "error": { "type": "invalid_request", "code": "ambiguous", "message": "12 titles match \"office\". Pass a slug: or steam: identifier.", "docsUrl": "https://docs.doesitarm.com/api/errors/#ambiguous", "suggestions": [{ "slug": "microsoft-office", "title": "Microsoft Office", "score": 0.82 }], "requestId": "req_01J5K6Q8Z9" }}type— coarse family:invalid_request,rate_limited,auth,server. (ambiguousis acode, sent undertype: invalid_request.)code— the precise branch (closed set below). Branch on this.message— human-readable; names the offending field where relevant.docsUrl/upgradeUrl— where to read more, or how to unblock.suggestions— present onambiguous: candidates to re-query with.requestId— quote it to support.
The full table
Section titled “The full table”| Case | HTTP | type | code | What to do |
|---|---|---|---|---|
| Unknown title | 200 | — | — | Not an error. You get a Verdict with status: "unknown"; read alternatives. |
| Ambiguous lookup | 409 | invalid_request | ambiguous | Pick from suggestions[]; re-query with a slug:/steam: id. |
| Invalid parameter | 422 | invalid_request | invalid_param | Fix the field message names (e.g. a bad chip). |
| Auth required | 401 | auth | auth_required | Add an API key (paid-only route). |
| Auth invalid | 401 | auth | auth_invalid | Rotate the key — bad, revoked, or expired. |
| Forbidden (tier) | 403 | auth | plan_required | Upgrade; docsUrl → pricing. |
| Rate limited | 429 | rate_limited | rate_limited | Wait Retry-After, or upgrade via upgradeUrl. |
| Server error | 5xx | server | internal | Retry with backoff; quote requestId. |
Worked example — ambiguous lookup (409) {#ambiguous}
Section titled “Worked example — ambiguous lookup (409) {#ambiguous}”A bare name with several strong matches doesn’t guess — it asks you to disambiguate:
curl https://api.doesitarm.com/v1/verdicts/officeHTTP/1.1 409 ConflictContent-Type: application/json{ "error": { "type": "invalid_request", "code": "ambiguous", "message": "12 titles match \"office\". Pass a slug: or steam: identifier.", "docsUrl": "https://docs.doesitarm.com/api/errors/#ambiguous", "suggestions": [{ "slug": "microsoft-office", "title": "Microsoft Office", "score": 0.82 }], "requestId": "req_01J5K6Q8Z9" }}Re-query with one of the suggestions: GET /v1/verdicts/slug:microsoft-office. The other
worked example — a 429 and the upgrade path — lives on Rate limits.