Migrate from Hunter (email verifier)
This guide maps the Hunter API v2 Email Verifier and Account endpoints to the Tomba Email Verifier. Hunter's Domain Search, Email Finder, and enrichment endpoints are covered in Migrate from Hunter (email finder). 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 a verification 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 /email-verifier | GET /v1/email-verifier | |
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.
Parameter mapping
| Hunter | Tomba | Notes |
|---|---|---|
email | email | Required. A malformed address returns 422 params_invalid instead of a result. |
Response field mapping
Tomba nests the checks in data.email and returns the sources in data.sources. Field definitions are in Email verifier response.
| Hunter | Tomba | Notes |
|---|---|---|
data.status | data.email.status | See Status mapping. |
data.result | data.email.result | |
data.score | data.email.score | Computed differently. |
data.email | data.email.email | An empty string when the domain is disposable. |
data.regexp | data.email.regex | |
data.gibberish, disposable, webmail, accept_all, block | data.email.gibberish, .disposable, .webmail, .accept_all, .block | |
data.mx_records | data.email.mx_check | Tomba's data.email.mx.records lists the MX hosts. |
data.smtp_check | data.email.status is valid | Tomba's smtp_check field only mirrors mx_check. Don't read it as a mailbox result. |
data.smtp_server | No equivalent | Tomba's smtp_server also mirrors mx_check. |
data.verification | No equivalent | |
data.sources[] | data.sources[] | domain is website_url. |
Status mapping
Hunter status | Tomba status | Tomba result |
|---|---|---|
valid | valid | deliverable |
invalid | invalid | undeliverable |
accept_all | accept_all | risky |
webmail | The mailbox result, with webmail: true | Depends on the status |
disposable | disposable | Empty string |
unknown | unknown | risky |
Tomba has no webmail status: it checks webmail addresses like any other and sets the webmail field. Compare status case-insensitively. Each value is defined in Status values.
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. |
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. |
202 verification in progress | Not returned | Remove the polling loop. |
222 SMTP server error | 408 proxy_error | Retry later. |
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 Email Verifier lists from its dashboard, and its API endpoint takes one address per request. Tomba runs lists through the API as verifier bulk jobs: send a JSON list of addresses or a CSV file. See Email verifier.
Each job is created, launched, polled, and downloaded as CSV; see Lifecycle. A job is charged when you first download its results; see Billing.
Tomba's single-request endpoint never returns 202, so remove the retry loop you use for Hunter's Email Verifier.
Code example
This function replaces a call to Hunter's Email Verifier and returns Hunter's field names. 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 and read the verifier fields under
data.email. - Handle webmail addresses through the
webmailfield, comparestatuscase-insensitively, and stop readingsmtp_checkas a mailbox result. - Swap error handling:
402replaces Hunter's429,429replaces Hunter's403,408replaces222, anderrorsis an object, not an array. - Remove the
202polling loop. - Move list processing to
verifierbulk jobs. - Verify the same sample of addresses with both services and compare the results before you switch production traffic.