error.code in your client
rather than parsing the human-readable message.
Response envelope
Error-code catalog
Clients pinned to an
API-Version before 2026-10-09 receive 422 instead of 400 in three cases: a request body or parameter that fails schema validation; a VALIDATION_ERROR the API returned as 422 before that version — a rejected /platform write (list categories and members, ecosystem limits and scopes), a filter key without value lookup on /reference/filters/{key}/values, or ecosystem_id filters nested too deep; and a FILTER_PARSE_ERROR from a filter that is being saved (a list created from a filter, an ecosystem scope). Branch on code, which is the same in every version.
Common scenarios
Invalid filter expression
Invalid enum value
Enum filters (round_type, preferred_round, investor_type, article_type) accept a
closed, case-insensitive value set. An unknown value returns 400 rather than an empty
result — discover valid values via /reference/filters/{key}/values.
Missing required header
The API requiresAuthorization on every authenticated request. API-key
requests additionally require X-Client-Id set to the key’s client_id. The
status code depends on which header is missing:
- Missing
Authorization→401 UNAUTHORIZED - Missing
X-Client-Idon an API-key request →400 VALIDATION_ERROR
Expired token
After youraccess_token expires (default 24h):
Query timeout
A heavy aggregate or unfiltered list query may exceed the 15-second execution budget:limit) or switch to a purpose-built
aggregate endpoint instead of paging through raw entities.
Cloudflare edge blocks
Cloudflare sits in front of the API and can reject a request before it reaches the API. An edge block returns403 with an HTML body
(content-type: text/html) instead of the JSON error envelope; the API itself
always answers with JSON. Two edge blocks to know about:
- Banned
User-Agent: some default HTTP-client signatures, notably Python’surllib(Python-urllib/3.x), are blocked even when the request is otherwise valid. The HTML body containserror code: 1010. - Missing
Authorization: a request without anAuthorizationheader gets a browser challenge page (“Just a moment…”, with acf-mitigated: challengeresponse header) instead of the API’s401.
User-Agent header identifying your
integration, for example my-app/1.0. Clients such as cURL, python-requests,
Node.js fetch, and Go are not affected. Fix the second by always sending the
Authorization header, even on exploratory requests.
Handling errors
Switch onerror.code — it’s stable across API versions. Messages may change for clarity.
Endpoint-specific errors
Each endpoint may return a subset of these codes plus endpoint-specific ones. See the API Reference overview for the catalog per endpoint.Further reading
Authentication
Handle token expiry, missing scopes, and credential rotation in production.
Rate limits
Respond to
429 errors with the correct retry behavior.