Migrate from BounceBan
This guide maps the BounceBan v1 API (single verification, status polling, bulk tasks, and account) to the Tomba Email Verifier and bulk verifier jobs. BounceBan API behavior checked on 2026-09-29 against the BounceBan API 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 to the first request.
Endpoint mapping
Replace the host api.bounceban.com (and api-waterfall.bounceban.com) with api.tomba.io.
| BounceBan | Tomba |
|---|---|
GET /v1/verify/single | GET /v1/email-verifier |
GET /v1/verify/single on the waterfall host | GET /v1/email-verifier |
GET /v1/verify/single/status | No equivalent. The first response is final. |
POST /v1/verify/bulk, POST /v1/verify/bulk/file | POST /v1/bulk/verifier, then PUT /v1/bulk/verifier/{id} to launch |
GET /v1/verify/bulk/status | GET /v1/bulk/verifier/{id}/progress |
GET /v1/verify/bulk/dump, POST /v1/verify/bulk/export | GET /v1/bulk/verifier/{id}/download (CSV) |
POST /v1/verify/bulk/emails | No equivalent. Download the job's CSV. |
POST /v1/verify/bulk/destroy | DELETE /v1/bulk/verifier/{id}/delete |
GET /v1/account | GET /v1/me |
Authentication changes
BounceBan reads the key from the Authorization header. Tomba needs two headers, X-Tomba-Key and X-Tomba-Secret:
Code
Tomba API keys expire; plan their rotation with Key expiry.
Parameter mapping
| BounceBan | Tomba | Notes |
|---|---|---|
email | email | Required. A malformed address returns 422 params_invalid instead of a result. |
url | webhook_url | Tomba still returns the result in the response, and also posts it to your URL when the result qualifies. See Per-request callbacks. |
mode | No equivalent | |
disable_catchall_verify | No equivalent | |
timeout (waterfall host) | No equivalent | Set the timeout in your HTTP client. |
id (status endpoint) | No equivalent |
Response field mapping
BounceBan returns a flat object. Tomba nests the checks in data.email and lists the public pages where the address appears in data.sources. Field definitions are in Email verifier response.
| BounceBan | Tomba | Notes |
|---|---|---|
id | No equivalent | |
status | No equivalent | Tomba has no verifying or queue state. |
try_again_at | No equivalent | |
email | data.email.email | An empty string when the domain is disposable. |
result | data.email.result, data.email.status | See Status mapping. |
score | data.email.score | Computed differently. Recalibrate any threshold you apply to it. |
is_disposable | data.email.disposable | |
is_accept_all | data.email.accept_all | |
is_role | No equivalent | |
is_free | data.email.webmail | |
mx_records | data.email.mx.records | data.email.mx_check is true when the domain has MX records. |
smtp_provider | data.email.smtp_provider | |
mode | No equivalent | |
verify_at | No equivalent | |
credits_consumed, credits_remaining | X-Verify-Remaining header, GET /v1/me | See Check usage. |
Tomba also returns block, greylisted, gibberish, regex, smtp_check, and whois, which have no BounceBan counterpart.
Status mapping
BounceBan result | Tomba status | Tomba result |
|---|---|---|
deliverable | valid | deliverable |
risky | accept_all | risky |
undeliverable | invalid | undeliverable |
unknown | unknown | risky |
Reported with is_disposable: true | disposable | Empty string |
Branch on status, not result: Tomba's unknown status carries the result risky, and a disposable address has an empty result. Compare status case-insensitively. Each value is defined in Status values.
Error mapping
| BounceBan | Tomba | What to do |
|---|---|---|
400 invalid parameter | 422 params_invalid | Fix the parameter named in the message. |
401 missing or invalid 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 insufficient credits | 402 quota_exceeded | Wait for your usage window to renew or add credits. |
405 account blocked | 401 or 403 authentication_failed | Contact support. |
408 waterfall timeout | 408 proxy_error | The mailbox check failed. Retry later. |
429 rate limited | 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 list. |
500 | 500 api_error | Retry with backoff. |
Error responses don't consume credits. Every type is listed in Errors.
Bulk and async jobs
Tomba answers a single verification synchronously, so remove any polling of /v1/verify/single/status. For lists, run a bulk job of type verifier:
| BounceBan step | Tomba step |
|---|---|
Create a task with emails or a CSV file | POST /v1/bulk/verifier with name and a newline-separated list, or a CSV file. Send BounceBan's email_column as email_field_index: both are zero-based. |
| Task starts on creation | Launch it: PUT /v1/bulk/verifier/{id} |
GET /v1/verify/bulk/status, or the bulk.task_finished webhook | Poll GET /v1/bulk/verifier/{id}/progress until status is completed, or set webhook_url to receive a bulk.completed event. |
| Dump or export results | GET /v1/bulk/verifier/{id}/download?file=full. file=valid returns only valid rows. |
Code
The launch, progress, and download requests are shown in Lifecycle. Row limits and daily job limits are in Limits, and a job is charged when you first download its results; see Billing.
Code example
This function verifies one address with Tomba and returns it in BounceBan's shape, so code that reads BounceBan results keeps working. 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 ofAuthorization. - Point single verifications at
GET https://api.tomba.io/v1/email-verifierand remove status polling andtry_again_athandling. - Read results from
data.emailand translate them with the status mapping, comparingstatuscase-insensitively. - Handle
402where you handled403, retry429afterRetry-After, and drop addresses that return451. - Replace bulk tasks with
verifierjobs: create, launch, poll/progress, and download the CSV. Sendemail_columnasemail_field_index. - Verify the same sample list with both services and compare the mapped results before you switch production traffic.