Skip to content

Error codes

All error responses share the same JSON shape:

{
"detail": "Human-readable description of the error."
}

For validation errors (422), detail is an array of field-level messages:

{
"detail": [
{
"loc": ["body", "nominee_email"],
"msg": "value is not a valid email address",
"type": "value_error.email"
}
]
}
CodeMeaningCommon causes
200 OKRequest succeeded
201 CreatedResource createdPOST endpoints that create records
400 Bad RequestInvalid inputMissing required field, malformed body, invalid OTP
401 UnauthorizedAuthentication failedExpired token, invalid API key
403 ForbiddenAccess deniedWrong tenant, request origin not in allowed domains, token mismatch
404 Not FoundResource not foundUnknown userId, bannerId, collection_point_id
409 ConflictState conflictConsent already completed, nominee limit reached
410 GoneResource expiredConsent link already used or expired
422 Unprocessable EntityValidation errorRequest body fails schema validation
429 Too Many RequestsRate limit exceededToo many SDK requests from the same IP + org within the window. See Rate limits.
500 Internal Server ErrorServer errorUnexpected failure — contact support if persistent
503 Service UnavailableDependency failureOTP provider (MSG91), JWT service, or S3 temporarily unavailable

When the rate limit is exceeded the response includes headers to help you back off:

HTTP/1.1 429 Too Many Requests
Retry-After: 42
X-RateLimit-Limit: 200
X-RateLimit-Window: 60

Wait for Retry-After seconds before retrying. See Rate limits for the full policy.

A 403 Forbidden with detail: "Origin not allowed" means the domain or bundle ID making the request is not listed under Settings → API Settings → Allowed Domains. Add the origin and retry.