NewThe detectors that scored perfect collapsed the hardest under attack.

Errors

Every error body carries a stable machine-readable code alongside the human-readable error message. Branch on code, not on the message text or the HTTP status alone (one status can map to more than one code).

Two things are deliberately not errors: owning every item in a selection (a 200 with subset_exhausted: true on /items?exclude_owned=true) and re-downloading an item you already own (a 200 with charged: false). Neither returns an error code.

StatusCodeMeaning
400invalid_paramAn unknown value for a fixed dimension; the response gives param + allowed.
400invalid_cursorThe cursor passed for keyset paging is malformed or expired.
400ambiguous_benchmarkBenchmark omitted while the key sees more than one; the response lists available.
400unsupported_filterA filter combination the endpoint cannot serve (e.g. exclude_owned combined with an attribute-backed filter).
401unauthorizedMissing, invalid, or revoked API key. Copy a current key from the portal.
402insufficient_creditsOut of credits (live tier). Top up in the portal.
403forbidden_tierKey not permitted for this item (e.g. a test key requesting a live-tier item).
403forbidden_scopeThe item is outside this key's content scope (a scoped/siloed key requested content it may not pull).
404not_foundItem not found (or not visible to this key).
404unknown_benchmarkThe requested benchmark id does not exist for this key; the response lists available.
429rate_limitedPer-key rate limit exceeded.
500server_errorUnexpected server error.
503service_unconfiguredThe API is temporarily not configured to serve; retry shortly.