Developers

API reference

Verify one address in real time, or send a whole list as a batch. All requests use HTTPS and return JSON. API keys are issued from your dashboard when accounts open.

Authentication

Send your API key as a bearer token in the Authorization header on every request. Keep keys on your server. Never put them in browser code or mobile apps.

Authorization: Bearer YOUR_API_KEY

The base URL for every endpoint is https://api.bouncebell.com/v1.

Verify one address

GET https://api.bouncebell.com/v1/verify

ParameterRequiredDescription
emailYesThe address to check. URL-encode it.
timeoutNoSeconds to wait for the mail server, from 3 to 30. Default 10. If time runs out, the status is unknown and no credit is used.

Example

curl "https://api.bouncebell.com/v1/verify?email=priya%40acme-foods.example" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "email": "priya@acme-foods.example",
  "status": "valid",
  "reason": "mailbox_exists",
  "domain": "acme-foods.example",
  "mx_record": "mx1.acme-foods.example",
  "disposable": false,
  "role": false,
  "free_provider": false,
  "did_you_mean": null,
  "checked_at": "2026-10-30T09:30:12Z",
  "credits_used": 1
}

Result fields

FieldTypeDescription
emailstringThe address as you sent it.
statusstringThe verdict. See statuses.
reasonstringWhy we reached the verdict, for example mailbox_not_found or no_mx_record.
domainstringThe domain part, in lower case.
mx_recordstring or nullThe mail server with the highest priority.
disposablebooleanTrue if the domain is a temporary inbox service.
rolebooleanTrue for shared inboxes such as info@ or support@.
free_providerbooleanTrue for free mailbox providers such as Gmail.
did_you_meanstring or nullA corrected address when the domain looks like a typo.
checked_atstringWhen the check ran, in ISO 8601 UTC.
credits_usedinteger1, or 0 when the status is unknown.

Statuses

StatusMeaningSuggested action
validThe mailbox exists and accepts mail.Send
invalidThe address, domain or mailbox does not exist.Remove
disposableA temporary inbox service.Remove
catch_allThe domain accepts all addresses, so the mailbox cannot be confirmed.Review
roleA shared inbox that exists.Review
unknownThe mail server did not give an answer in time. Not charged.Retry later

Batches

Send up to 100,000 addresses in one request. The batch runs in the background; poll for its status or give a callback_url and we will call it when the batch is finished.

Create a batch

POST https://api.bouncebell.com/v1/batches

curl -X POST "https://api.bouncebell.com/v1/batches" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "October import", "emails": ["a@example.com", "b@example.com"],
       "callback_url": "https://yourapp.example/hooks/bouncebell"}'
{ "id": "bat_8f2k1q", "status": "queued", "total": 2 }

Check progress

GET https://api.bouncebell.com/v1/batches/{id}

{ "id": "bat_8f2k1q", "status": "running", "total": 2, "done": 1 }

Download results

GET https://api.bouncebell.com/v1/batches/{id}/results

Returns JSON by default. Add ?format=csv for a CSV file. Each row has the same fields as a single check.

Credits

GET https://api.bouncebell.com/v1/credits

{ "monthly_remaining": 8420, "payg_remaining": 25000, "renews_at": "2026-11-30" }

Errors and limits

Errors return a JSON body with an error code and a readable message.

HTTP codeErrorWhat to do
400bad_requestA parameter is missing or wrong. Read the message.
401invalid_keyCheck the key is correct and has not been revoked.
402no_creditsBuy credits or wait for your monthly renewal.
429rate_limitedSlow down. Wait for the seconds in the Retry-After header.
500server_errorRetry with a short delay. If it continues, contact support.

Single checks are limited to 20 requests per second per key. Ask us if you need more.