Every endpoint returns a consistent JSON structure. This page documents the shared envelope, types, and error codes that apply across all endpoints.
Response envelope
Every response uses a consistent JSON envelope with five top-level fields:
success
boolean
true if the request was processed successfullydata
object
| null
null on error or when no data is returned)errorobjectShow child attributesHide child attributes
code
string
API_KEY_MISSING, API_KEY_MALFORMED, VALIDATION_ERROR, PAGINATION_LIMIT_EXCEEDED)message
string
details
object
null when success is true.
Tip
Include metadata.requestId from error responses when contacting support – it speeds up troubleshooting.
quotasobjectShow child attributesHide child attributes
creditsConsumed
number
workspaceobjectShow child attributesHide child attributes
id
string
hasUnlimitedCredits
boolean
allowDailyOvercost
boolean
creditsobjectShow child attributesHide child attributes
total
number
used
number
left
number
dailyLimitobjectShow child attributesHide child attributes
limit
number
used
number
left
number
nextReset
string
| null
null when no daily limit is configured.
minuteRateLimitobjectShow child attributesHide child attributes
limit
number
used
number
left
number
nextReset
string
| null
keyobjectShow child attributesHide child attributes
id
string
dailyLimitobjectShow child attributesHide child attributes
limit
number
used
number
left
number
nextReset
string
| null
null when no daily limit is configured.
minuteRateLimitobjectShow child attributesHide child attributes
limit
number
used
number
left
number
nextReset
string
| null
The key field is null when the request is made from the dashboard (no API key).
When authentication or quota context is unavailable (e.g. invalid API key), quotas may be omitted.
metadataobjectShow child attributesHide child attributes
requestId
string
executionTimeMs
number
updatedAt
string
Shared types
Some types are reused across multiple endpoints. They are documented here once to avoid repetition – individual endpoint pages reference them by name.
start
string
| null
end
string
| null
Error codes
| Status | Description |
|---|---|
400 |
Invalid JSON body or legacy V1/RC endpoint validation (VALIDATION_ERROR) |
401 |
Missing, malformed, invalid, or expired API key |
402 |
No credits left, purchase more to continue. The free /check endpoints return NO_CREDITS |
403 |
Workspace disabled (WORKSPACE_DISABLED) or API key lacks permission |
404 |
Data not found |
422 |
V2 schema/validation error, INVALID_LINKEDIN_URL, disposable email domain, or missing webhook URL on async endpoints |
422 |
PAGINATION_LIMIT_EXCEEDED on search endpoints when company-search page exceeds 50, or perPage exceeds 100 on people or company search. Details: { "field": "page", "max": 50 } or { "field": "perPage", "max": 100 } |
429 |
Rate limit exceeded , wait and retry after nextReset |
451 |
Data Subject Blocked , the profile has been removed per GDPR/CCPA data subject request |
5xx |
Temporary upstream or platform issue , retry with backoff |
Tip
For 429 errors, read the quotas.workspace.minuteRateLimit.nextReset field and retry after that timestamp.
Tip
For 5xx errors, use exponential backoff starting at 1 second.
WORKSPACE_DISABLED is 403 for both dashboard and API-key authentication. INVALID_LINKEDIN_URL is 422 on both V1 and V2. VALIDATION_ERROR remains route-sensitive: legacy V1/RC routes return 400, while V2 routes return 422.
Note
For async endpoints, the initial response is a standard V2 acknowledgement containing a webhookId. Most async endpoints support polling or a webhook callback; the Contact Email Finder uses the webhook flow and delivers an email array or an error code in its callback. Webhook callback payloads do not use the full V2 envelope.