Migrate from Clearout
This guide maps the Clearout API v2 email verification endpoints (instant verify, bulk verify, and available credits) to the Tomba Email Verifier and bulk verifier jobs. Clearout API behavior checked on 2026-09-30 against the Clearout 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.
Endpoint mapping
Replace the base URL https://api.clearout.io/v2 with https://api.tomba.io/v1. Clearout shows the base URL for your account's region under Developer, Reference in its app; replace that one if it differs.
| Clearout | Tomba |
|---|---|
POST /email_verify/instant | GET /v1/email-verifier |
POST /email_verify/bulk | POST /v1/bulk/verifier, then PUT /v1/bulk/verifier/{id} to launch |
GET /email_verify/bulk/progress_status | GET /v1/bulk/verifier/{id}/progress |
POST /download/result | GET /v1/bulk/verifier/{id}/download |
POST /email_verify/list/remove | DELETE /v1/bulk/verifier/{id}/delete |
POST /email_verify/list/cancel | No equivalent |
POST /email_verify/list | GET /v1/bulk/verifier |
GET /email_verify/getcredits | GET /v1/me |
Clearout's single-check endpoints (/email/verify/catchall, /disposable, /business, /free, /role, /gibberish) have no separate Tomba endpoints. The Email Verifier response carries accept_all, disposable, webmail, and gibberish for every address.
Authentication changes
Clearout reads an API token from the Authorization header. Tomba needs two headers, X-Tomba-Key and X-Tomba-Secret:
Code
Tomba takes the address as a query parameter on a GET request, not in a JSON body. Tomba API keys expire; plan their rotation with Key expiry.
Parameter mapping
| Clearout | Tomba | Notes |
|---|---|---|
Authorization header | X-Tomba-Key and X-Tomba-Secret headers | |
email | email | Required. A malformed address returns 422 params_invalid instead of a result. |
timeout | No equivalent | Set the timeout in your HTTP client. |
response=flat | No equivalent | Read the checks from data.email. |
Bulk file | file | CSV only, sent with the content type text/csv. Convert XLSX files first. Also send name. |
| Email column found by its header | email_field_index | Zero-based, and optional when the header names the column, such as email. |
Bulk optimize | No equivalent | |
Bulk ignore_duplicate_file | No equivalent | |
list_id | {id} in the path |
Response field mapping
Clearout returns the result in data. 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.
| Clearout | Tomba | Notes |
|---|---|---|
status (top level) | HTTP status code | See Error mapping. |
data.email_address | data.email.email | An empty string when the domain is disposable. |
data.status | data.email.status, data.email.result | See Status mapping. |
data.safe_to_send | data.email.result | The closest field; see Result values. |
data.sub_status.code, data.sub_status.desc | No equivalent | Tomba reports greylisted, block, and mx_check as separate fields. |
data.disposable | data.email.disposable | A boolean instead of "yes" or "no". |
data.free | data.email.webmail | A boolean instead of "yes" or "no". |
data.gibberish | data.email.gibberish | A boolean instead of "yes" or "no". |
data.role | No equivalent | |
data.detail_info.mx_record | data.email.mx.records | An array of MX host names instead of one string. |
data.detail_info.smtp_provider | data.email.smtp_provider | |
data.detail_info.account, .domain | No equivalent | Split the address at @. |
data.suggested_email_address | No equivalent | |
data.bounce_type | No equivalent | |
data.verified_on, data.time_taken | No equivalent | |
data.profile | No equivalent | |
error.code, error.message | errors.type, errors.message | See Error mapping. |
Tomba also returns score, accept_all, block, greylisted, regex, and whois, which have no field in Clearout's instant verify response. Read your remaining balance from the X-Verify-Remaining header or GET /v1/me; see Check usage.
Status mapping
Clearout documents four primary statuses. Its API returns them in data.status; the example response shows valid in lower case, so compare case-insensitively.
| Clearout status | Tomba status | Tomba result |
|---|---|---|
| Valid | valid | deliverable |
| Invalid | invalid | undeliverable |
Invalid, sub-status 400 (syntax error) | No status. The request fails with 422 params_invalid. | |
| Catch All | accept_all | risky |
| Unknown | unknown | risky |
Any status with disposable: "yes" | disposable | Empty string |
Tomba reports a disposable domain as its own status rather than as a flag next to a mailbox result. Compare status case-insensitively. Each value is defined in Status values.
Error mapping
Both APIs signal failures with HTTP status codes. Clearout's error body is {"status": …, "error": {"code", "message"}}; Tomba's is an errors object with type, message, and code.
| Clearout | Tomba | What to do |
|---|---|---|
400 Bad Request | 422 params_invalid | Fix the parameter named in the message. |
401 Unauthorized | 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 with code 1002, 1028, or 1031 | 402 quota_exceeded on single requests | For bulk jobs, the balance is checked at the first download instead; see Billing. |
429 with code 1030 | 429 rate_limit | Retry after the Retry-After delay, not x-ratelimit-reset; see Handle 429 responses. |
Code 1001 (too many bulk requests) | 429 rate_limit (running job limit) | Wait for a running job to finish; see Limits. |
Code 1004 (no email column found) | 422 params_invalid | Name the header email, or send email_field_index. |
415 Invalid Content Type | No equivalent | Tomba's single check is a GET request with no body. |
500, 503 | 500 api_error | Retry with backoff. |
524 Request Timeout | No equivalent | Tomba returns the final result; keep the client timeout at 180 seconds or more. |
| No equivalent | 408 proxy_error | The mailbox check failed. Retry later. |
| No equivalent | 451 claimed_email | The owner of the address asked Tomba to stop processing it. Remove it from your list. |
Error responses don't consume credits. Every type is listed in Errors.
Bulk and async jobs
| Clearout | Tomba |
|---|---|
POST /email_verify/bulk with a CSV or XLSX file | POST /v1/bulk/verifier with name and a CSV file, or a newline-separated list of addresses |
| Verification is queued on upload | Launch the job: PUT /v1/bulk/verifier/{id} |
Poll progress_status for progress_status and percentile | Poll GET /v1/bulk/verifier/{id}/progress for status and progress until status is completed |
The email_verifier.bulk.completed webhook | webhook_url, which receives a signed bulk.completed event. See Bulk job events. |
POST /download/result returns a file URL in data.url | GET /v1/bulk/verifier/{id}/download?file=full returns the CSV itself |
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 replaces a call to /email_verify/instant and returns Clearout's field names for the values Tomba supplies. 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 theAuthorizationheader. - Change instant verification from a
POSTwith a JSON body toGET https://api.tomba.io/v1/email-verifier?email=, droptimeout, and set a client timeout of at least 180 seconds. - Swap error handling:
422for bad parameters,402for credits,429withRetry-After, and408and451as new cases. - Translate
statuswith the status mapping, comparing it case-insensitively, and readdisposable,webmail, andgibberishas booleans. - Replace bulk uploads with
verifierbulk jobs: convert XLSX to CSV, launch, receive thewebhook_urlevent instead of the webhook, and download the CSV. - Verify the same sample list with both services and compare the mapped results before you switch production traffic.