Skip to main content

Error Codes

All API errors return a consistent JSON structure:

{
"error": "Bad Request",
"message": "customer_id is required",
"status": 400
}

HTTP Status Codes

StatusTitleDescriptionRecovery
400Bad RequestThe request body is invalid or missing required fieldsCheck the request body against the API schema. Ensure all required fields are present and correctly typed.
401UnauthorizedThe API key is missing, invalid, or the X-Tenant-ID header is missingVerify your API key is correct and active. Check that the Authorization header uses the Bearer prefix and the X-Tenant-ID header contains a valid UUID.
403ForbiddenThe API key doesn't have permission for this operationCheck that your API key has the required scope. Sandbox keys cannot access production endpoints.
404Not FoundThe requested resource doesn't existVerify the resource ID is correct. The profile, signal, or rule may have been deleted or belong to a different tenant.
409ConflictThe request conflicts with the current resource stateCheck the current status. Some operations are only valid in certain states (e.g., signal review requires ACTIVE status).
429Rate LimitedToo many requests — you've exceeded the rate limitImplement exponential backoff. Check the Retry-After header for when to retry. See Rate Limits.
500Internal Server ErrorAn unexpected error occurred on the serverRetry the request with exponential backoff. If the error persists, contact support.

Error Codes

CodeDescriptionExample messageHTTP Status
VALIDATION_ERRORRequest body validation failedcustomer_id is required400
PROFILE_NOT_FOUNDElder profile does not existprofile not found404
SIGNAL_NOT_FOUNDExploitation signal does not existsignal not found404
RULE_NOT_FOUNDDetection rule does not existrule not found404
BASELINE_NOT_FOUNDBehavioral baseline does not existbaseline not found404
BATCH_RUN_NOT_FOUNDBatch run does not existbatch run not found404
INVALID_STATEOperation not valid in current statesignal status must be CONFIRMED or DISMISSED409
INVALID_STATUS_TRANSITIONInvalid profile status transitioncannot transition from DECEASED to ACTIVE409
RATE_LIMIT_EXCEEDEDToo many requestsRate limit exceeded. Please retry after the reset time.429
TENANT_NOT_FOUNDTenant ID is invalidmissing tenant ID401
INVALID_ENROLLMENT_REASONInvalid enrollment reason providedinvalid enrollment_reason400
INVALID_SIGNAL_CATEGORYInvalid signal categoryinvalid signal_category400
INVALID_RULE_TYPEInvalid rule typeinvalid rule_type400
INVALID_SEVERITYInvalid severity levelinvalid severity400
INVALID_WEIGHTRule weight out of rangeweight must be between 0 and 1400

Common error scenarios

Missing X-Tenant-ID header

{
"error": "Unauthorized",
"message": "missing tenant ID",
"status": 401
}

Fix: Add the X-Tenant-ID header with your tenant UUID to every request.

Invalid profile ID

{
"error": "Bad Request",
"message": "invalid profile ID",
"status": 400
}

Fix: Ensure the profile ID is a valid UUID. Profile IDs are returned when you create a profile.

Invalid review status

{
"error": "Bad Request",
"message": "status must be CONFIRMED or DISMISSED",
"status": 400
}

Fix: When reviewing a signal, the status must be either CONFIRMED or DISMISSED.

Missing required fields on profile creation

{
"error": "Bad Request",
"message": "customer_name is required",
"status": 400
}

Fix: Ensure customer_id, customer_name, date_of_birth, and enrollment_reason are all provided.

Best practices

  • Retry with backoff — For 429 and 5xx errors, implement exponential backoff starting at 1 second
  • Check status before operations — Call GET /profiles/{id} to check the current state before performing actions
  • Validate locally first — Validate required fields and enum values client-side before sending API requests
  • Handle idempotently — Use the profile id or customer_id to track enrollments and avoid duplicates
  • Use sandbox for testing — Use test customer name patterns in sandbox for deterministic results