Docs menu
Reference

Errors and HTTP status codes

Every error the API returns, by endpoint and HTTP status, listed from the OpenAPI file. Errors are JSON, { "error": "CODE", "message": "…" }: branch on error, never on message.

Last updated

Format

  • The HTTP status says what kind of problem it is; error says which one. message is for people and can change.
  • A body that is not valid JSON gets 400 BAD_REQUEST; a body over 1 MB gets 413 PAYLOAD_TOO_LARGE.
  • 402 QUOTA_EXCEEDED also carries used, limit and resetsAt.
  • 429 carries Retry-After in seconds. See Rate limits and quotas.

Errors by endpoint

EndpointHTTP statuserrorWhen
POST /api/v1/verify400BAD_REQUEST, INVALID_IPemail missing, empty or not a string; an ip that is not an IP address; or a body that is not valid JSON.
POST /api/v1/verify401UNAUTHORIZED, INVALID_API_KEY, EXPIRED_API_KEY, ORGANIZATION_NOT_FOUNDNo X-Api-Key header, or an unknown, revoked or expired key.
POST /api/v1/verify402QUOTA_EXCEEDEDThe monthly quota is used up. Test requests of an account over its quota get this too (they are still not counted).
POST /api/v1/verify403TENANT_SUSPENDEDEither a BLOCKED screening with X-Response-Mode: http-status (the body is the screening result), or TENANT_SUSPENDED.
POST /api/v1/verify429RATE_LIMIT_EXCEEDED, TEST_LIMITRATE_LIMIT_EXCEEDED: the per-minute limit (your plan's; 300 for test keys). TEST_LIMIT: 10,000 test requests per account per UTC day; Retry-After is the time to the next UTC midnight.
POST /api/v1/verify500VERIFICATION_ERROR, PERSISTENCE_FAILURE, AUTH_ERRORThe screening failed or could not be stored. Your integration decides whether to fail open or closed.
POST /api/v1/verify503DATABASE_ERRORThe key could not be checked right now. Try again.
POST /api/v1/check400BAD_REQUESTNo email, or a body that is not valid JSON.
POST /api/v1/check401INVALID_SITE_KEYNo site key, or an unknown or revoked one.
POST /api/v1/check402QUOTA_EXCEEDEDThe monthly quota is used up (no token is issued).
POST /api/v1/check403ORIGIN_NOT_ALLOWEDThe Origin is missing or not one of the site key's domains.
POST /api/v1/check429RATE_LIMIT_EXCEEDED, TEST_LIMITA per-minute limit, or (test site key) the daily test limit.
POST /api/v1/check500VERIFICATION_ERROR, PERSISTENCE_FAILUREThe check failed. inlineshield.js then lets the form submit (fail open).
POST /api/v1/siteverify400BAD_REQUESTNo email, or (without the rate-limit headers) a body that is not valid JSON.
POST /api/v1/siteverify401UNAUTHORIZED, INVALID_API_KEY, EXPIRED_API_KEY, ORGANIZATION_NOT_FOUNDNo X-Api-Key header, or an unknown, revoked or expired key.
POST /api/v1/siteverify403TENANT_SUSPENDEDThe account is suspended.
POST /api/v1/siteverify429RATE_LIMIT_EXCEEDEDThe per-minute limit of this key.
POST /api/v1/siteverify500VERIFICATION_ERROR, AUTH_ERRORInternal error.
POST /api/v1/siteverify503DATABASE_ERRORThe key could not be checked right now. Try again.
GET /api/v1/reviews/{reviewId}401UNAUTHORIZED, INVALID_API_KEY, EXPIRED_API_KEY, ORGANIZATION_NOT_FOUNDNo X-Api-Key header, or an unknown, revoked or expired key.
GET /api/v1/reviews/{reviewId}403TENANT_SUSPENDEDThe account is suspended.
GET /api/v1/reviews/{reviewId}404NOT_FOUNDNo such review in this account.
GET /api/v1/reviews/{reviewId}429RATE_LIMIT_EXCEEDEDMore than 60 requests per minute with this key.
GET /api/v1/reviews/{reviewId}500REVIEW_ERROR, AUTH_ERRORInternal error.
GET /api/v1/reviews/{reviewId}503DATABASE_ERRORThe key could not be checked right now. Try again.
POST /api/v1/feedback400BAD_REQUESTNot exactly one of requestId or token, a bad outcome, category or note, or (without the rate-limit headers) a body that is not valid JSON.
POST /api/v1/feedback401UNAUTHORIZED, INVALID_API_KEY, EXPIRED_API_KEY, ORGANIZATION_NOT_FOUNDNo X-Api-Key header, or an unknown, revoked or expired key.
POST /api/v1/feedback403TENANT_SUSPENDEDThe account is suspended.
POST /api/v1/feedback404NOT_FOUNDNo such screening in this account.
POST /api/v1/feedback422SCREENING_TOO_OLDThe screening is more than 180 days old.
POST /api/v1/feedback429RATE_LIMIT_EXCEEDEDThe per-minute limit of this key.
POST /api/v1/feedback500FEEDBACK_ERROR, AUTH_ERRORInternal error.
POST /api/v1/feedback503DATABASE_ERRORThe key could not be checked right now. Try again.
GET /api/v1/health503–Degraded.

siteverify: success false

/siteverify answers token problems with HTTP 200 and { "success": false, "error": "…" }, not with an error status:

  • NO_TOKEN: no token was sent.
  • INVALID_TOKEN: not a token of this account.
  • EXPIRED_TOKEN: older than 10 minutes.
  • TOKEN_ALREADY_USED: redeemed before.
  • EMAIL_MISMATCH: issued for another email.
  • QUOTA_EXCEEDED: no token was sent and the account is over its quota.

What to do

StatusTypical causeYour code
400A missing or malformed field.Fix the request; do not retry it unchanged.
401No key, or an unknown, revoked or expired key.Fix the configuration. Treat the sign-up as unchecked.
402The account is over its monthly quota.Treat as unavailable until the next UTC month or an upgrade.
403A suspended account, an Origin not on the site key, or a BLOCKED screening in http-status mode.Read error.
404, 422An unknown id, or a screening too old for feedback.Do not retry.
429A per-minute limit, or the daily test-mode cap.Wait for Retry-After.
500, 503A temporary failure.Treat as unavailable; retry later if you queue checks.