Migrate from Hunter (email finder)
This guide maps the Hunter API v2 Domain Search, Email Finder, Email Count, Account, and People, Companies, and Combined enrichment endpoints to Tomba. Hunter's Email Verifier is covered in Migrate from Hunter (email verifier). Hunter API behavior checked on 2026-09-29 against the Hunter API v2 reference.
Before you begin
- Get your API key (
ta_…) and secret (ts_…); see Authentication. - Check what each endpoint costs in Credit costs and your plan's throttling in Limits by plan.
- Set your HTTP client timeout to at least 180 seconds. Tomba returns the finished result in the response.
Endpoint mapping
Replace the base URL https://api.hunter.io/v2 with https://api.tomba.io/v1.
| Hunter | Tomba | Notes |
|---|---|---|
GET /domain-search | GET /v1/domain-search | See Domain search. |
GET /email-finder | GET /v1/email-finder | See Email finder. |
GET /email-finder with linkedin_handle | GET /v1/linkedin | |
GET /email-count | GET /v1/email-count | |
GET /people/find | GET /v1/people/find | |
GET /companies/find | GET /v1/companies/find | |
GET /combined/find | GET /v1/combined/find | |
GET /account | GET /v1/me | See Check usage. |
Authentication changes
Hunter accepts the key as the api_key parameter, the X-API-KEY header, or a bearer token. Tomba needs two headers, X-Tomba-Key and X-Tomba-Secret, and doesn't accept credentials in the query string:
Code
Tomba API keys expire; plan their rotation with Key expiry.
Domain search
Parameters
| Hunter | Tomba | Notes |
|---|---|---|
domain | domain | |
company | company | |
limit | limit | Tomba accepts a fixed set of values; see the API reference. The cost depends on limit; see Credit costs. |
offset | page | Tomba pages start at 1: page = offset / limit + 1. |
type | type | |
department | department | Comma-separated in both APIs, but the department names differ. The values are in the API reference. |
location with a country | country | A two-letter country code. Continent, region, state, and city filters have no equivalent. |
seniority, verification_status | No equivalent | Each result carries seniority and verification.status; filter the results in your code. |
decision_maker, required_field, job_titles | No equivalent | |
aggregations | No equivalent | Use GET /v1/email-count for counts by department and seniority. |
Response fields
| Hunter | Tomba | Notes |
|---|---|---|
data.domain | data.organization.website_url | |
data.organization | data.organization.organization | |
data.pattern | data.organization.pattern | |
data.accept_all, data.disposable, data.webmail | data.organization.accept_all, .disposable, .webmail | |
data.linked_domains | No equivalent | |
data.emails[].value | data.emails[].email | |
data.emails[].confidence | data.emails[].score | Computed differently. Recalibrate any threshold you apply to it. |
data.emails[].type, first_name, last_name, position, seniority, department | Same names | Department values differ. |
data.emails[].twitter, linkedin | Same names | Tomba returns full profile URLs; Hunter returns the Twitter handle. |
data.emails[].phone_number | data.emails[].phone_number | A boolean in Tomba. Request numbers with enrich_mobile=true, at an extra cost. |
data.emails[].position_raw, decision_maker | No equivalent | |
data.emails[].verification | data.emails[].verification | Same date and status keys. |
data.emails[].sources[].domain | data.emails[].sources[].website_url | uri, extracted_on, last_seen_on, and still_on_page keep their names. |
meta.results | meta.total | |
meta.limit, meta.offset | meta.pageSize, meta.current | meta.current is the page number. meta.total_pages gives the page count. |
meta.results_approximate | No equivalent |
Tomba also returns company details in data.organization, such as industries, company_size, location, and social_links.
Email finder
Parameters
| Hunter | Tomba | Notes |
|---|---|---|
domain | domain | Tomba returns 400 unknown_record for a disposable or webmail domain. |
company | company | |
first_name, last_name | first_name, last_name | |
full_name | full_name | |
linkedin_handle | url on GET /v1/linkedin | Send the profile URL. |
max_duration | No equivalent | Set the timeout in your HTTP client. |
Response fields
| Hunter | Tomba | Notes |
|---|---|---|
data.email | data.email | null when no address is found; the status is still 200. |
data.first_name, last_name, position, company, accept_all | Same names | |
data.score | data.score | Computed differently. |
data.domain | data.website_url | |
data.twitter | data.twitter | A full URL in Tomba. |
data.linkedin_url | data.linkedin | |
data.phone_number | data.phone_number | A boolean in Tomba. |
data.verification | data.verification | Same date and status keys. Tomba can also return invalid, or null when the address hasn't been verified; see Status values. |
data.sources[] | data.sources[] | domain is website_url. |
meta.params | No equivalent |
Tomba also returns full_name, pattern, department, type, country, and gender.
Email count and enrichment
| Hunter | Tomba | Notes |
|---|---|---|
Email Count domain, type | domain, type | Tomba doesn't accept company here. |
Email Count data.total, personal_emails, generic_emails, department, seniority | Same paths | The department keys differ; see Email count. |
People email | email | Tomba doesn't accept linkedin_handle. |
Companies domain | domain | |
clearbit_format | No equivalent | Tomba's enrichment responses always use the Clearbit-style shape; see Enrichment. |
404 when nothing is found | 200 with an errors body, type not_found | Check the body for errors. |
Error mapping
Hunter returns errors as an array of {id, code, details}. Tomba returns a single errors object with type, message, and code. The meaning of 403 and 429 also changes:
| Hunter | Tomba | What to do |
|---|---|---|
400 wrong_params or another invalid_* id | 422 params_invalid | Fix the parameter named in the message. |
400 invalid_domain | 400 unknown_record for a disposable or webmail domain | Use a company domain. |
401 no valid 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. |
403 rate limit reached | 429 rate_limit | Retry after the Retry-After delay; see Handle 429 responses. |
429 usage limit reached | 402 quota_exceeded | Wait for your usage window to renew or add credits. |
429 restricted_account | 401 authentication_failed | Contact support. |
451 claimed_email | 451 claimed_email | Same meaning. Remove the address from your data. |
5xx | 500 api_error | Retry with backoff. |
Error responses don't consume credits. Every type is listed in Errors.
Bulk and async jobs
Hunter runs bulk Domain Search and Email Finder lists from its dashboard, and its API endpoints take one item per request. Tomba runs lists through the API as bulk jobs:
| Hunter task | Tomba bulk type |
|---|---|
| Domain Search over many domains | search: a JSON list of domains. See Domain search. |
| Email Finder over a list of people | finder: a CSV file with name and company columns. See Email finder. |
Each job is created, launched, polled, and downloaded as CSV; see Lifecycle. A job is charged when you first download its results; see Billing.
Code example
This function replaces a call to Hunter's Email Finder and returns Hunter's field names, or null when no address is found. 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 ofapi_key,X-API-KEY, or a bearer token. - Change the base URL, convert
offsettopage, sendlinkedin_handlelookups to/v1/linkedin, and filter results in code where Tomba has no filter. - Update response parsing:
valuebecomesemail, sourcedomainbecomeswebsite_url, and the domain search company fields move underdata.organization. - Swap error handling:
402replaces Hunter's429,429replaces Hunter's403, anderrorsis an object, not an array. - Move list processing to bulk jobs.
- Run the same sample of domains and people through both services and compare the results before you switch production traffic.