TL;DR: POST identity hints, get back enriched fields. Same waterfall, same credit model, programmatic. Most usage looks like { email: "..." } → { phone, linkedin_url, work_email, company }.
Endpoint
POST /enrichment
Headers:
Authorization: Bearer <UNSTUCK_API_KEY>
Content-Type: application/json
Body:
{
"email": "person@company.com",
"linkedin_url": "https://linkedin.com/in/...",
"company_domain": "company.com",
"channels": ["work_email", "personal_email", "phone", "linkedin_url"]
}
At least one identity hint required. channels is optional — defaults to all four contact channels.
Identity-only mode
Sometimes you have a name + company and want to discover an email:
POST /enrichment/discover
Body:
{
"first_name": "Chloe",
"last_name": "Walker",
"company_domain": "westmarkrobotics.com"
}
Returns the same response shape. Discovery is slower (the waterfall has to find the contact, not just confirm it) and costs more credits per success.
Response
{
"record_id": "lead_abc123",
"channels": {
"work_email": {
"value": "chloe.walker@westmarkrobotics.com",
"source": "Provider A",
"confidence": 0.94,
"enriched_at": "2026-05-26T14:30:00Z"
},
"phone": null,
"linkedin_url": {
"value": "https://linkedin.com/in/chloewalker",
"source": "Provider C",
"confidence": 0.88,
"enriched_at": "2026-05-26T14:30:00Z"
}
},
"credits_used": 5
}
null channels mean the waterfall ran but no provider returned a usable value. Per-channel metadata includes source, confidence, and timestamp.
Account enrichment
For company-level firmographics:
POST /enrichment/account
Body:
{
"domain": "westmarkrobotics.com"
}
Response:
{
"account_id": "acc_xyz789",
"fields": {
"industry": "Robotics / Hardware",
"employee_count": 240,
"revenue_band": "$50M-$100M",
"founded_year": 2018,
"hq_country": "UK",
"hq_city": "Bristol",
"tech_stack": ["Snowflake", "Okta", "Datadog"],
"funding_stage": "Series C",
"last_funding_date": "2025-09-15",
"total_raised_usd": 87000000
}
}
Bulk enrichment
For higher-volume work:
POST /enrichment/bulk
Body:
{
"records": [
{ "email": "..." },
{ "linkedin_url": "..." },
...
],
"channels": ["work_email"]
}
Up to 100 records per request. Returns an array of per-record results. Credit cost is summed across all successful enrichments.
Bulk-bulk (>100 records) is done via the bulk action UI on Leads / Accounts rather than via API — to respect rate limits and offer in-app progress tracking.
Idempotency
The single-record endpoint is idempotent on (identity, channels). Re-requesting the same record + channels returns cached values; no credits charged. Pass force: true to bypass the cache.
Verification webhook (reverse direction)
Some workspaces want to verify enriched emails before sending outbound. Configure a verification webhook in Settings → API & Webhooks → Enrichment verification. Unstuck POSTs each enriched email to your verification service; the service responds with valid: true/false. Invalid emails are marked verified: false on the record and excluded from audience destination pushes.
Rate limits
- 100 requests per minute per workspace (single-record endpoint)
- 20 requests per minute (bulk endpoint, max 100 records per request)
- 10,000 total requests per day per workspace