Migrate from the Clearbit Person API
This guide maps Clearbit's Person API (GET https://person.clearbit.com/v2/people/find) to Tomba's GET /v1/people/find, which returns a Clearbit-style person object. Clearbit behavior checked on 2026-09-29 against the last public Clearbit API reference (September 2024).
Before you begin
- Get your API key (
ta_…) and secret (ts_…); see Authentication. - Check what a lookup costs in Credit costs and your plan's throttling in Limits by plan.
- Read Migrate from Clearbit for the changes shared by every Clearbit endpoint.
Endpoint mapping
| Clearbit | Tomba |
|---|---|
GET https://person.clearbit.com/v2/people/find?email= | GET https://api.tomba.io/v1/people/find?email= |
GET https://person-stream.clearbit.com/v2/people/find?email= | GET https://api.tomba.io/v1/people/find?email= |
POST https://person.clearbit.com/v1/people/{id}/flag | POST /v1/flag with flag_type email |
Authentication changes
Clearbit takes the key as the basic auth username or as a bearer token. Tomba needs two headers, X-Tomba-Key and X-Tomba-Secret:
Code
Tomba API keys expire; plan their rotation with Key expiry.
Parameter mapping
| Clearbit | Tomba | Notes |
|---|---|---|
email | email | Required. |
webhook_url | webhook_url | Tomba still returns the person in the response, and also posts a copy when a person is found. See Per-request callbacks. |
webhook_id | No equivalent | |
given_name, family_name, ip_address, location, company, company_domain, linkedin, twitter, facebook | No equivalent | Tomba matches on the email address only. |
subscribe, suppression | No equivalent | |
API-Version header | No equivalent |
Response field mapping
Tomba returns the person in data and the address you looked up in meta.email. Every field in Clearbit's reference is listed below; "Always null" means Tomba returns the key but never fills it. Field definitions are in Enrichment.
| Clearbit | Tomba | Notes |
|---|---|---|
id | No equivalent | |
name.fullName, givenName, familyName | Same paths in data | |
email, indexedAt | Same paths | |
location | data.location | The two-letter country code, not the city, state, and country. |
geo.country, geo.countryCode | Same paths | |
geo.city, state, stateCode, lat, lng | Same paths | Always null. |
timeZone, utcOffset, bio, site, avatar | Same paths | Always null. |
employment.domain, name, title | Same paths | |
employment.role | data.employment.role | Tomba's department names, which differ from Clearbit's roles: for example hr, not human_resources. |
employment.subRole, seniority | Same paths | Always null. |
linkedin.handle | data.linkedin.handle | A full profile URL, not Clearbit's in/… path. |
twitter.handle | data.twitter.handle | A full profile URL, not a username. |
twitter.id, bio, followers, following, statuses, favorites, location, site, avatar | Same paths | Always null. |
facebook.handle, github.*, gravatar.* | Same paths | Always null. |
googleplus.handle | No equivalent | |
fuzzy, activeAt, inactiveAt | Same paths | Always null. |
emailProvider | data.emailProvider | Always null. Tomba doesn't look up webmail addresses; see Error mapping. |
phone | data.phone | A boolean: true when Tomba has a phone number for the person. Get the number from GET /v1/phone-finder. |
Tomba also returns data.gender and data.verification.
Status mapping
Clearbit's Person API has no deliverability status. Tomba adds data.verification, with the date and status of the address's last verification. The status uses the verifier's values, described in Status values, and is null when the address hasn't been verified. Compare it case-insensitively.
Error mapping
| Clearbit | Tomba | What to do |
|---|---|---|
202 lookup queued | Not returned | Remove the retry-on-202 logic. |
404 person not found | 200 with an errors object: type not_found, code 404 | Check the body for errors, not only the status. Tomba also returns this when it knows the address but not the person's name. |
422 validation error | 422 params_invalid for a malformed address. A disposable or webmail address returns 200 with an errors object: type params_invalid, code 422. | Send a work address. |
401 invalid API key | 400 authentication_failed (missing or malformed), 400 api_key_expired, 401 authentication_failed (wrong key or secret) | Check both headers; rotate an expired key. |
402 over quota | 402 quota_exceeded | Wait for your usage window to renew or add credits. |
429 rate limit | 429 rate_limit | Retry after the Retry-After delay; see Handle 429 responses. |
| No equivalent | 451 claimed_email | The owner of the address asked Tomba to stop processing it. Remove it from your data. |
50X | 500 api_error | Retry with backoff. |
Error responses don't consume credits. Every type is listed in Errors.
Bulk and async jobs
Tomba answers every person lookup synchronously, so remove 202 retries. A webhook_url callback carries the same JSON as the response, without Clearbit's id, type, and status wrapper, and isn't signed.
To enrich a list of addresses, run a bulk job of type enrich with a newline-separated list:
Code
Launch the job, poll its progress, and download the results as CSV, as shown in Lifecycle. The CSV has Tomba's email enrichment columns, not Clearbit's JSON shape. A job is charged when you first download its results; see Billing.
Code example
This function replaces a Person API lookup. It returns the Clearbit-style person object, or null when Tomba has no record. It needs Node.js 18 or later.
Code
Cutover checklist
- Store the Tomba key and secret as
TOMBA_API_KEYandTOMBA_SECRET_KEY, and send them asX-Tomba-KeyandX-Tomba-Secretinstead of basic auth or a bearer token. - Call
https://api.tomba.io/v1/people/findwith the email address only, and read the person fromdata. - Treat a
200response with anerrorsobject as not found, and remove202retries. - Update code that depends on fields Tomba formats differently (
location,employment.role,linkedin.handle,twitter.handle,phone) or leavesnull. - Handle
402, retry429afterRetry-After, and remove addresses that return451. - Look up the same sample of addresses with both services and compare the fields you use before you switch production traffic.