Contact enrichment turns a person ID or social handle into verified email addresses and phone numbers. You can enrich contacts one at a time for immediate results, or submit large batches asynchronously and poll for completion. Before running a large enrichment job, a pre-flight estimate endpoint tells you exactly how many credits the request will consume.Documentation Index
Fetch the complete documentation index at: https://docs.thehog.ai/llms.txt
Use this file to discover all available pages before exploring further.
Endpoint overview
| Endpoint | Method | What it does |
|---|---|---|
/api/people/enrich | POST | Enrich one or more contacts with email and phone |
/api/people/enrich/estimate | POST | Pre-flight credit and latency estimate |
/api/operations/:id | GET | Poll the status of an async enrichment job |
Enrichment request
Input modes
You can identify who to enrich in two ways — use whichever you have available:- By person IDs
- By platform identities
Pass person
id values from a previous people search. Each object in the people array takes a single id field.Request fields
| Field | Type | Default | Description |
|---|---|---|---|
people | PersonIdentifier[] | — | Person IDs to enrich (use this or identities) |
identities | PlatformIdentity[] | — | Platform handles to resolve and enrich |
asyncPreferred | boolean | true | false → sync response (HTTP 200); true → async job (HTTP 202) |
maxEmailProviderAttempts | number | 2 | Waterfall depth for email lookup: 1–2. Lower = cheaper, less coverage |
maxPhoneProviderAttempts | number | 3 | Waterfall depth for phone lookup: 1–3. Lower = cheaper, less coverage |
projectId | string | — | Optional project context |
Examples
Responses
Sync enrichment (HTTP 200)
WhenasyncPreferred is false, you get an immediate response with enriched data.
Async accepted (HTTP 202)
WhenasyncPreferred is true (the default), you receive a job reference immediately.
GET /api/operations/:id until status is "succeeded". The enriched records are in result.people.
Pre-flight estimate response
Enriched person fields
| Field | Type | Description |
|---|---|---|
id | string | Enrichment record ID |
canonicalPersonId | string | The underlying person ID (matches search results) |
fullName | string | Person’s full name |
title | string | Job title |
companyName | string | Current employer |
location | string | Location |
emailStatus | string | "available", "not_found", or "error" |
phoneStatus | string | "available", "not_found", or "error" |
emails | array | List of { email, emailType, isVerified } objects |
phoneNumbers | array | List of { phoneNumber, phoneType, isVerified } objects |
fromCache | boolean | true when the result was served from cache without hitting providers |
message | string | Optional note when data is unavailable or partial |
Controlling cost vs. coverage
The waterfall depth parameters let you trade off between credit spend and data coverage:maxEmailProviderAttempts
Set to
1 to use only the first email provider. Set to 2 (default) to try a second provider when the first returns no result. More attempts = higher coverage, higher cost.maxPhoneProviderAttempts
Set to
1–3. Each additional attempt queries a different phone data provider. The default (3) maximizes coverage; 1 minimizes spend when phone numbers are a lower priority.