Skip to main content
When a request fails, the Dealroom API returns a JSON envelope with a consistent shape and an HTTP status code. Error codes are stable strings — switch on 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 requires Authorization 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-Id on an API-key request → 400 VALIDATION_ERROR

Expired token

After your access_token expires (default 24h):
Refresh the token via the OAuth2 client-credentials flow. See the Quickstart for the token request and Authentication for production caching guidance.

Query timeout

A heavy aggregate or unfiltered list query may exceed the 15-second execution budget:
Narrow the query (add filters, reduce 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 returns 403 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’s urllib (Python-urllib/3.x), are blocked even when the request is otherwise valid. The HTML body contains error code: 1010.
  • Missing Authorization: a request without an Authorization header gets a browser challenge page (“Just a moment…”, with a cf-mitigated: challenge response header) instead of the API’s 401.
Fix the first by setting an explicit 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 on error.code — it’s stable across API versions. Messages may change for clarity.
Treat the message field as informative, not contractual. Always switch on code.

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.