Waafir
Platform API (/v1)

Error codes

A refused request usually answers with a JSON body carrying a human-readable error and a machine-readable code:

{ "error": "This access token is not scoped to this dataroom", "code": "PAT_DATAROOM_SCOPE" }

Branch on code when it is present, not on error, because the message is written for people and may be reworded. Some refusals carry no code at all, such as certain 404 responses, so fall back to the HTTP status. Some errors add fields, such as fieldErrors on a validation failure. The HTTP status column lists the statuses the code is known to arrive with. Varies means the status is set by the endpoint.

The list below is generated from the platform's route tree. It is the known minimum, not an exhaustive list: it includes the codes the authentication layer and the scanned gate helpers produce and the codes written directly in handlers. Codes returned by other helpers a handler calls do not appear here. Each endpoint on the endpoints page lists its own known codes. Handle an unlisted code by its HTTP status.

CodeHTTP statusMeaning
ADDON_NOT_PURCHASEDVariesThe endpoint needs an add-on the organisation has not purchased, such as portfolio monitoring.
AI_BUDGET_UNAVAILABLE503AI spend accounting is temporarily unavailable, so the request was refused rather than run unmetered. Retry shortly.
AI_DAILY_BUDGET_EXCEEDED429The organisation's daily AI spend cap has been reached. Retry after the daily budget resets.
ai_disabled403AI features are turned off for this organisation.
BAD_REQUEST400The request was malformed. The usual causes are an unknown query parameter on an endpoint that rejects them, or an invalid value.
CHECK_VIOLATIONVariesThe submitted row breaks a data invariant, such as an amount outside its allowed range. fieldErrors names the field.
COMMIT_FAILEDVariesThe import could not be committed in its current state. Check its status before retrying.
CONFLICTVariesThe request conflicts with the resource's current state. A typical cause is creating something that already exists.
FILE_NOT_FOUNDVariesNo such file, or none the caller can see.
FORBIDDEN403The caller is authenticated but lacks the role, or the data room access, that this endpoint requires. See Required role on the endpoint.
GRANTEE_NOT_FOUNDVariesThe user or group the grant names does not exist in this organisation.
GRANTEE_NOT_IN_DATAROOMVariesThe grantee has no access to this data room, so a file-level grant inside it would have no effect.
ID_CONFLICTVariesA record with this caller-supplied id already exists. Ids are chosen by the caller and must be unique.
IDEMPOTENCY_CONFLICTVariesThis idempotency key was already used with a different request. Reuse a key only to retry the identical request.
IDEMPOTENCY_KEY_REUSEDVariesThis idempotency key already started an import. The response's importId identifies it, so poll that import instead of starting another.
INVALID_BODYVariesThe request body is missing, is not valid JSON, or does not match the expected shape.
INVALID_STATUS_TRANSITIONVariesThe requested status change is not allowed from the record's current status.
IP_BLOCKED403The organisation has an IP allowlist, and the request came from an address outside it.
MFA_CHALLENGE_REQUIRED403The organisation enforces two-factor authentication and this session has not completed a challenge.
MFA_SETUP_REQUIRED403The organisation enforces two-factor authentication and the user has not enrolled.
NOT_FOUNDVariesNo such resource, or none the caller can see.
ORG_NOT_FOUNDVariesThe caller's organisation could not be found.
ORGANIZATION_REQUIREDVariesThe credential is not attached to an organisation, so an organisation-scoped read has nothing to answer about.
PAID_PLAN_REQUIRED402The organisation's plan does not include this capability.
PAT_DATAROOM_SCOPE403The token is restricted to specific data rooms. Either this data room is not one of them, or the endpoint is organisation-wide and cannot be called with a data-room-restricted token.
PAT_ROLE_CEILING403The token carries a role ceiling below the role this endpoint requires. The effective role is the lower of the user's live role and the token's ceiling.
PAT_SCOPE_INSUFFICIENT403The token's scope is below what the endpoint needs. A read token cannot call a write endpoint, for example. Issue a token with a higher scope.
PORTFOLIO_NOT_FOUNDVariesThe referenced portfolio does not exist in this organisation.
RATE_LIMITED429Too many requests from this identity. Back off and retry. The endpoint's per-minute ceiling is listed where it declares one.
REFERENCED_ENTITY_NOT_FOUNDVariesThe body references another record, such as a loan or borrower, by an id that does not exist in this organisation.
SESSION_EXPIRED401A browser session timed out under the organisation's session policy. Sign in again.
UNAUTHORIZED401, 403, 404, 429, 503The request could not be authenticated or admitted. At 401 the token is missing, unknown, expired or revoked. At 403 or 404 the resource is outside what the caller can reach; an id in another organisation is treated as not found, so a response does not confirm another tenant's data. At 429 or 503 authentication itself is throttled or temporarily unavailable, so retry with backoff.
UNKNOWN_EXPORT_TYPEVariesThe export type requested is not one this endpoint produces.
UNKNOWN_KINDVariesThe import kind is not one this endpoint accepts. The response's allowed lists the valid values.
VALIDATION_FAILEDVariesOne or more fields failed validation. The response's fieldErrors names each field and the reason.