Skip to main content

Error Codes

All errors return a consistent JSON format:

{
"error": "Human-readable error message",
"code": "ERROR_CODE",
"details": []
}

HTTP Status Codes​

StatusMeaningWhen It Occurs
200OKRequest succeeded
202AcceptedAsync job started (enrichment)
400Bad RequestInvalid request parameters
401UnauthorizedAuthentication failed
403ForbiddenAccess denied
404Not FoundResource doesn't exist
429Too Many RequestsRate limit exceeded
500Internal ErrorServer-side error
503Service UnavailableFeature temporarily disabled

Error Code Reference​

Authentication & Authorization​

CodeStatusDescriptionSolution
AUTHENTICATION_FAILED401API key missing, invalid, or revokedCheck Authorization: Bearer YOUR_KEY header; verify key is active in Dashboard > API Keys
NO_TEAM403User not associated with a teamContact support
NO_API_KEY400No active API key foundCreate a key in Dashboard > API Keys

Validation​

CodeStatusDescriptionSolution
VALIDATION_ERROR400Request body failed validationCheck the details array for specific field errors
INVALID_REQUEST400Request body is not valid JSONValidate JSON syntax; ensure Content-Type: application/json

Rate Limiting​

CodeStatusDescriptionSolution
RATE_LIMIT_EXCEEDED429Plan rate limit exceededWait for Retry-After header value, then retry. See Rate Limits

Rate limit responses include extra fields:

{
"code": "RATE_LIMIT_EXCEEDED",
"limit": 100,
"remaining": 0,
"reset": 1705320000,
"retryAfter": 3600
}

Resources​

CodeStatusDescriptionSolution
JOB_NOT_FOUND404Job doesn't exist or belongs to another teamVerify the jobId from the original /enrich response
NOT_FOUND404Resource doesn't existCheck the resource ID

Bulk Enrichment​

CodeStatusDescriptionSolution
NO_VALID_DOMAINS400All provided domains failed validationUse valid formats: stripe.com, www.stripe.com, https://stripe.com
BULK_DISABLED503Bulk imports temporarily disabledTry again later or use single enrichment
QUEUE_FAILED500Failed to queue domainsRetry the request; contact support with batchId if persistent

Server​

CodeStatusDescriptionSolution
INTERNAL_ERROR500Unexpected server errorRetry with backoff; check status.veraenrich.com
INVALID_STATUS500Job in unexpected stateRetry fetching job status; contact support with job ID

Error Handling Best Practices​

  • 4xx errors — Don't retry. Fix the request (check auth, validation, resource IDs).
  • 429 errors — Wait for the Retry-After header value, then retry. See Rate Limits.
  • 5xx errors — Retry with exponential backoff (1s, 2s, 4s...). Check status.veraenrich.com if persistent.
const response = await fetch(url, options);

if (!response.ok) {
const error = await response.json();

switch (true) {
case response.status === 429:
// Rate limited — wait and retry
const retryAfter = response.headers.get('Retry-After') || '60';
await new Promise(r => setTimeout(r, parseInt(retryAfter) * 1000));
break;
case response.status >= 500:
// Server error — retry with exponential backoff
break;
default:
// Client error (4xx) — don't retry, fix the request
throw new Error(`${error.code}: ${error.error}`);
}
}

For complete retry patterns with backoff, see Rate Limits.