Skip to content

All errors share one shape — status is always false, error_code is stable and machine-readable:

{
"status": false,
"error_code": "UNAUTHORIZED",
"description": "Human-readable message"
}

Match on error_code, never on description (wording may change).

HTTPCodeWhen
401UNAUTHORIZEDMissing or unrecognized credentials
401INVALID_TOKENJWT invalid, malformed or revoked
401TOKEN_EXPIREDJWT past expiry
401INVALID_API_KEYAPI key not found or hash mismatch
401API_KEY_INACTIVEAPI key disabled
401API_KEY_EXPIREDAPI key expired
401INVALID_CREDENTIALSWrong username/password
401USER_NOT_ACTIVEAccount suspended or inactive
401IP_NOT_ALLOWEDClient IP not in the allowed list
401SIGNATURE_REQUIREDKey requires HMAC but signature headers missing
401INVALID_SIGNATUREHMAC signature failed verification
403FORBIDDENAuthenticated, but route or permission denied
403NO_SMS_ACCESSSMS not configured on the account
403CONFIG_ERRORCredentials incomplete — contact support
403CROSS_TENANT_WORKSPACEX-Workspace-ID names a workspace you don’t own (or deleted)
403NO_MAIN_WORKSPACENo live main workspace — contact support
403WORKSPACE_NOT_AVAILABLETarget workspace deleted — use a live workspace
HTTPCodeWhen
400INVALID_BODYMalformed JSON body
400INVALID_PARAMSInvalid query or path parameters
400INVALID_TOMissing/empty recipients
400INVALID_MESSAGEMissing/empty message
400INVALID_SENDERMissing/empty sender_id
400TOO_MANY_RECIPIENTSOver 100 recipients
400INVALID_WORKSPACE_HEADERX-Workspace-ID is not a positive integer
402INSUFFICIENT_BALANCEBalance too low — body includes cost breakdown
HTTPCodeWhen
429RATE_LIMIT_EXCEEDEDPer-account rate limit hit
429TOO_MANY_ATTEMPTSLogin/2FA brute-force limit (includes Retry-After)

Details and recommended client behavior: rate limits.

HTTPCodeWhen
404NOT_FOUNDMessage or resource not found
500INTERNAL_ERRORServer-side error
500DB_ERRORSend request could not be queued — atomic rollback, safe to retry
  • Retry 429 (after a delay) and 500 DB_ERROR (idempotent by design). Do not blind-retry 4xx — fix the request instead.
  • Alert on 402 INSUFFICIENT_BALANCE and credit_blocked from balance before campaigns stall.
  • Re-authenticate on 401 TOKEN_EXPIRED / INVALID_TOKEN if using JWT.
  • Log error_code + description + the request ID from your HTTP client for support escalations.