Skip to content

Error Codes

All API errors return a consistent JSON structure:

{
"error": {
"code": "ERROR_CODE",
"message": "Human-readable description",
"details": {},
"suggestion": "Actionable next step"
}
}
FieldTypeDescription
codestringMachine-readable error code (use this for programmatic handling)
messagestringHuman-readable description
detailsobject?Additional context (varies by error)
suggestionstring?Actionable hint for resolving the error
CodeHTTPDescription
UNAUTHORIZED401Missing or invalid authentication
INVALID_API_KEY401API key not found or malformed
API_KEY_REVOKED401API key has been revoked
INVALID_CREDENTIALS401Wrong password (legacy auth)
EMAIL_NOT_VERIFIED403Email must be verified before using paid endpoints
INSUFFICIENT_SCOPE403OAuth token lacks required scope
FORBIDDEN403Action not permitted
ACCOUNT_DELETED403Account has been deleted
ACCOUNT_DISABLED403Account has been disabled by admin
CodeHTTPDescription
INSUFFICIENT_CREDITS402Not enough credits for this operation
PAYMENT_FAILED402Payment processing failed
CodeHTTPDescription
VALIDATION_ERROR400Request body, query, or path params failed validation
JURISDICTION_NOT_SUPPORTED400Jurisdiction code is not recognized or not active
TOO_MANY_JURISDICTIONS400Search requested too many jurisdictions
INVALID_VERIFICATION_CODE400OTP code is incorrect
VERIFICATION_CODE_EXPIRED400OTP code has expired (15-minute window)
TERMS_NOT_ACCEPTED422Must accept terms of service
CodeHTTPDescription
NOT_FOUND404Generic resource not found
ENTITY_NOT_FOUND404Entity ID does not exist
JOB_NOT_FOUND404Job ID does not exist
CodeHTTPDescription
RATE_LIMIT_EXCEEDED429Too many requests — check details.retry_after_seconds
CodeHTTPDescription
EMAIL_ALREADY_EXISTS409Email is already registered
ALREADY_REFUNDED409Job has already been refunded
CodeHTTPDescription
DATA_SOURCE_UNAVAILABLE503The official data source is temporarily unavailable
DATA_SOURCE_TIMEOUT504The official data source did not respond in time
INTERNAL_ERROR500Unexpected server error
{
"error": {
"code": "INSUFFICIENT_CREDITS",
"message": "Insufficient credits. Required: 15, available: 3.",
"details": {
"required": 15,
"available": 3
},
"suggestion": "Purchase more credits via POST /v1/billing/purchase. Check available packages at GET /v1/billing."
}
}
{
"error": {
"code": "JURISDICTION_NOT_SUPPORTED",
"message": "Jurisdiction 'us-ca' is not supported.",
"details": {
"provided": "us-ca",
"suggestions": ["us-co", "us-ct"]
},
"suggestion": "Use GET /v1/jurisdictions for valid codes or GET /v1/config for the full list."
}
}
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded",
"details": {
"retry_after_seconds": 45
},
"suggestion": "Retry after 45 seconds. Check X-RateLimit-Reset header for exact reset time."
}
}
{
"error": {
"code": "VALIDATION_ERROR",
"message": "body/entity_name: Required",
"suggestion": "Check the request body, query parameters, or path parameters against the API schema at GET /reference."
}
}