Developers
ListBouncer API
Check single addresses and clean whole lists from your own code. Same checks, same results, same credits.
The ListBouncer API lets you check single email addresses and clean whole lists from your own code, Zapier or other tools. It uses the same checks, the same results and the same credits as the dashboard.
Get a key
Create a key on the API keys page in your dashboard. You'll see it once, so copy it somewhere safe. Send it with every request:
Authorization: Bearer lb_live_…
Keep keys on your server. Anyone with your key can spend your credits, so don't put it in a web page or app that other people can see.
Credits
The API costs the same as the dashboard:
- Checking one address uses 1 credit, but only if we get a definite answer.
- Cleaning a list uses 1 credit per unique address. Duplicates and broken rows are free, and anything that comes back Unknown gets its credit back when the clean finishes.
New accounts get 100 free credits. Accounts that haven't bought credits yet can start up to 5 cleans a day.
Check one address
POST https://listbouncer.com/api/v1/verify
curl https://listbouncer.com/api/v1/verify \
-H "Authorization: Bearer $LISTBOUNCER_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "jane@gmial.com"}'
{
"email": "jane@gmial.com",
"result": "will_bounce",
"reason": "domain_typo",
"explanation": "Looks like a typo for gmail.com. Check with the subscriber before using jane@gmail.com.",
"suggested_fix": "jane@gmail.com",
"charged": true,
"credits_remaining": 4211
}
Most checks finish in a few seconds. Some mail servers are slow, so allow up to 30.
Clean a list
POST https://listbouncer.com/api/v1/lists
Send the addresses as JSON:
curl https://listbouncer.com/api/v1/lists \
-H "Authorization: Bearer $LISTBOUNCER_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "November newsletter", "emails": ["jane@example.com", "sam@example.org"]}'
Or upload a CSV file. We find the email column (and name columns) on our own:
curl https://listbouncer.com/api/v1/lists \
-H "Authorization: Bearer $LISTBOUNCER_KEY" \
-F "file=@subscribers.csv"
{
"id": "6728e360-…",
"status": "processing",
"total": 2,
"duplicates": 0,
"malformed": 0,
"credits_remaining": 4209
}
Up to 50,000 addresses and 4MB per request. Add "notify": true (or a notify=true form field) if you'd also like the "your list is clean" email.
Check progress
GET https://listbouncer.com/api/v1/lists/{id}
{
"id": "6728e360-…",
"name": "November newsletter",
"status": "done",
"total": 2,
"processed": 2,
"counts": { "safe": 1, "major_provider": 0, "risky": 0, "will_bounce": 1, "unknown": 0 },
"created_at": "2026-11-12T09:00:00.000Z",
"finished_at": "2026-11-12T09:01:12.000Z"
}
status is processing, done or failed. Most lists finish in minutes; very large ones can take longer. Checking every 30 seconds or so is plenty.
Get the results
GET https://listbouncer.com/api/v1/lists/{id}/results
Optional query parameters:
group: only one group, e.g.group=safefor your clean listformat:json(default) orcsvlimit: rows per page for JSON, up to 1,000cursor: thenext_cursorfrom the previous page
{
"data": [
{
"email": "jane@example.com",
"result": "safe",
"reason": null,
"explanation": "The mailbox exists and accepts mail.",
"suggested_fix": null,
"first_name": "Jane",
"last_name": null
}
],
"next_cursor": null
}
When next_cursor is null, you've got everything.
What the results mean
| result | Meaning | What to do |
|---|---|---|
safe |
The mail server confirmed the mailbox exists. | Send to it. This is your clean list. |
major_provider |
Yahoo, Outlook, Hotmail or AOL. These providers don't let anyone confirm a mailbox. | Mail usually delivers. Send to these as their own segment. |
risky |
A catch-all domain, a shared inbox like info@, or a mixed answer. | Your call. |
will_bounce |
The mailbox doesn't exist, the domain has no mail server, or it's a throwaway address. | Remove it. |
unknown |
The server didn't give a clear answer. You weren't charged for it. | Leave it out for now. |
More detail on each: What each result means.
Errors
Every error has the same shape:
{ "error": { "code": "not_enough_credits", "message": "Not enough credits", "needed": 5000, "available": 1200 } }
| Status | code | When |
|---|---|---|
| 400 | invalid_request, invalid_email, no_valid_emails, invalid_group |
Something's wrong with what you sent |
| 401 | missing_api_key, invalid_api_key |
No key, or the key was revoked |
| 402 | not_enough_credits |
Top up on the pricing page |
| 404 | not_found |
No list with that id on your account |
| 409 | not_ready |
Results asked for before the clean finished |
| 413 | too_large, too_many_addresses |
Split the list |
| 429 | rate_limited, free_tier_limit |
Slow down. Retry-After says how many seconds |
Limits
- 60 single checks a minute per key
- 10 list cleans an hour per key
- 5 cleans a day for accounts that haven't bought credits yet
Need more? Get in touch.
OpenAPI
The full spec is at /openapi.json, if your tools can read OpenAPI.
