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.