jVerify an email list before you send to it
Cleans an email list, verifies every address with Bouncer, and splits it into send, review and remove lists with a reason for each.
Outcome
A send list of the deliverable addresses, with the columns the list came with, ready to import into your sending tool.
A review list of the risky and unknown addresses, each with Bouncer's reason and flags.
A remove list of the undeliverable addresses and the malformed rows, each with the reason it was dropped.
A summary of how many addresses landed in each list and the credits the run used.
How it works
Clean the list, by Your agent
Read
email_list, trim spaces, lowercase each address and drop exact duplicates, keeping the first row of each. Move rows with no address or no@and domain straight to the remove list with the reason malformed. Tell the user how many unique addresses remain and that verifying them costs up to that many credits; stop if it is more thanmax_credits. Keep the unique addresses and each one's original row.
BSubmit the batch, by Create a verification batch by Bouncer
After the user approves the cost, send the unique addresses as one batch, or as batches of 10,000 when there are more than that. Keep each
batchId.
BWait for it to finish, by Check a verification batch's status by Bouncer
Check each batch about every 10 seconds, with
with-stats=true, until its status is completed. Keep each batch's stats andcredits.
BDownload the results, by Download a verification batch's results by Bouncer
Download every batch with
downloadset to all. Keep each address'sstatus,reason,score,toxicity, anyretryAfter, and thedomain.acceptAll,domain.disposable,account.roleandaccount.fullMailboxflags (each yes, no or unknown).
BRetry the greylisted ones, by Verify an email address by Bouncer
For each unknown address that came back with a
retryAfter, wait until that time and verify it once more; skip this step when none did. Keep the new result in place of the old one.Sort the list, by Your agent
Put deliverable addresses on the send list. Put risky and unknown addresses on the review list, except that risky addresses with
domain.acceptAllyes, and neitheraccount.fullMailboxnordomain.disposableyes, go on the send list whenkeep_catch_allis yes. Put undeliverable addresses on the remove list. Join each address back to its original row and add columns for status, reason, score and the four flags.Hand over the lists, by Your agent
Give the user the send, review and remove lists as CSV files, and a table of how many addresses are in each, the most common reasons on the review and remove lists, and the credits all batches used.
You'll be asked for
The list to verify, as a CSV or pasted rows, and the column that holds the email address
e.g. q4-webinar-leads.csv, column Email
The most credits this run may spend
e.g. 5000
Whether risky addresses on catch-all domains go to the send list instead of review
e.g. no
verify-email-list-before-sending.mdView markdown
Verify an email list before you send to it
Cleans an email list, verifies every address with Bouncer, and splits it into send, review and remove lists with a reason for each.
Set up the tools below, then run the steps in order for the user, carrying each step's results into the next. The run is done when the user has the outcome below.
Outcome
- A send list of the deliverable addresses, with the columns the list came with, ready to import into your sending tool.
- A review list of the risky and unknown addresses, each with Bouncer's reason and flags.
- A remove list of the undeliverable addresses and the malformed rows, each with the reason it was dropped.
- A summary of how many addresses landed in each list and the credits the run used.
Inputs
Ask the user for these before you start.
email_list: the list to verify, as a CSV or pasted rows, and the column that holds the email address, e.g. q4-webinar-leads.csv, column Emailmax_credits: the most credits this run may spend, e.g. 5000keep_catch_all: whether risky addresses on catch-all domains go to the send list instead of review, e.g. no
Set up
Bouncer (tool:bouncer/create-verification-batch, tool:bouncer/check-batch-status, tool:bouncer/get-batch-results, tool:bouncer/verify-email)
Use the first option your agent supports.
Notes:
- Create a verification batch: Send
[{"email": "…"}]. Batches of 1,000 to 10,000 are recommended, and an account's batches run one after another. Returns402when credits run short. Poll the batch's status, then download its results. - Check a verification batch's status: Poll about every 10 seconds until
statusiscompleted.creditsis filled in only once the batch completes. - Download a verification batch's results: Wait until the batch's status is
completed.downloadis all, deliverable, risky, undeliverable or unknown. Returns JSON, or CSV withAccept: text/csv. - Verify an email address: Costs 1 credit; unknown results are free. Answers within 10 seconds by default (
timeoutraises it, up to 30). A greylisted address returnsretryAfter: verify it again after that time. Limited to 1,000 requests a minute.
MCP (official, remote)
Add this server to your agent's MCP settings, then sign in when asked.
{ "mcpServers": { "bouncer": { "url": "https://api.usebouncer.com/mcp" } } }
- Create a verification batch: call the MCP tool
create_batch - Check a verification batch's status: call the MCP tool
check_batch_status - Download a verification batch's results: call the MCP tool
get_batch_results - Verify an email address: call the MCP tool
verify_email
API (official)
- Base URL: https://api.usebouncer.com
- Create a verification batch:
POST /v1.1/email/verify/batch - Check a verification batch's status:
GET /v1.1/email/verify/batch/{batchId} - Download a verification batch's results:
GET /v1.1/email/verify/batch/{batchId}/download - Verify an email address:
GET /v1.1/email/verify - Auth: send the header
x-api-key: $BOUNCER_API_KEY - Get a key: https://app.usebouncer.com
Note: Create the key in the app's API section. Batch jobs run one after another per account, so a 100,000-address batch delays the next one.
Before step 1, confirm access with the cheapest read-only call, like a list or a search. Never send or change anything to test access.
Steps
- Clean the list yourself. Read
email_list, trim spaces, lowercase each address and drop exact duplicates, keeping the first row of each. Move rows with no address or no@and domain straight to the remove list with the reason malformed. Tell the user how many unique addresses remain and that verifying them costs up to that many credits; stop if it is more thanmax_credits. Keep the unique addresses and each one's original row. - Submit the batch with Create a verification batch (Bouncer). After the user approves the cost, send the unique addresses as one batch, or as batches of 10,000 when there are more than that. Keep each
batchId. - Wait for it to finish with Check a verification batch's status (Bouncer). Check each batch about every 10 seconds, with
with-stats=true, until its status is completed. Keep each batch's stats andcredits. - Download the results with Download a verification batch's results (Bouncer). Download every batch with
downloadset to all. Keep each address'sstatus,reason,score,toxicity, anyretryAfter, and thedomain.acceptAll,domain.disposable,account.roleandaccount.fullMailboxflags (each yes, no or unknown). - Retry the greylisted ones with Verify an email address (Bouncer). For each unknown address that came back with a
retryAfter, wait until that time and verify it once more; skip this step when none did. Keep the new result in place of the old one. - Sort the list yourself. Put deliverable addresses on the send list. Put risky and unknown addresses on the review list, except that risky addresses with
domain.acceptAllyes, and neitheraccount.fullMailboxnordomain.disposableyes, go on the send list whenkeep_catch_allis yes. Put undeliverable addresses on the remove list. Join each address back to its original row and add columns for status, reason, score and the four flags. - Hand over the lists yourself. Give the user the send, review and remove lists as CSV files, and a table of how many addresses are in each, the most common reasons on the review and remove lists, and the credits all batches used.
Notes
Bouncer charges 1 credit per address and nothing for duplicates within a batch or for unknown results, so the cost in step 1 is an upper bound.
Bouncer marks an address risky when its domain accepts all mail (catch-all), its mailbox is full or it is disposable. keep_catch_all lets catch-all addresses through while full and disposable ones wait for review. Role accounts such as info@ stay on the send list when deliverable; filter on the account.role column if your sending tool or policy excludes them.
The lists are only as clean as the day they were checked. Verify again before a send to a list that is more than a few months old.
Rules
- Use only the services set up above. The read-only calls they need, like listing ids or polling for results, are fine.
- Ask the user before anything that sends messages, costs money, or changes data, and say how many records it touches. One approval covers a batch the user has seen.
- Never print API keys.