How to Filter a Clay Table to Valid Emails Only (Before You Send)
To filter a Clay table to valid emails only, add the verification result as a column and keep rows where action is send. Only a confirmed mailbox gets that value. This is a setup with Clay's HTTP API enrichment and your own SimpleVerifier key, not a native Clay action. The Clay integration page has the column configuration; this post covers what to do with the answer.
Step 1: return the right fields
In the HTTP API column's field paths, keep status, reason, action and reason_code. For one row the API returns:
{ "status": "valid", "reason": "Mailbox exists", "action": "send", "risk": "low", "reason_code": "mailbox_exists" }
Map each field to its own column so you can filter on it. The step-by-step column build is in how to verify emails in Clay.
Step 2: filter on action
| action | Typical reason | Keep for the main campaign |
|---|---|---|
| send | Mailbox exists | Yes |
| send_with_care | Accepts all addresses, Role-based address | No, side campaign |
| retry_later | Server would not confirm | No, run again later |
| do_not_send | Mailbox not found, Disposable address | No |
Create a view filtered to action is send. That view is the list you push or export. Keeping the filter as a view means new rows join it automatically once they are verified.
Step 3: gate the push column too
A filtered view hides rows but does not stop a column from running on them. Add a run condition to the push or export step: only run if action is send. Without it, a column set to run on every row will still act on the ones the view hides.
Step 4: keep the other rows
Do not delete anything. Make two more views:
- Care:
actionissend_with_care. Catch-all and role addresses. See what to do with catch-all rows. - Retry:
actionisretry_later. See re-running unconfirmed rows.
Invalid rows stay in the table as a record of why a lead was skipped. Our guide to suppression lists covers keeping them out of future imports.
Why not filter on status alone
status is valid, risky or invalid. Filtering on valid works, but a risky row can be a catch-all you may want to test or a server that simply did not answer. Action separates those. Risky is never invalid: it means delivery could not be confirmed.
What a filter cannot do
- It reflects the mailbox on the day it was checked. Re-run the column on an old table.
- Valid does not mean the person will read it, or that the inbox has room.
- A catch-all domain accepts every address, so no check can confirm a single mailbox there. It is never returned as valid.
- It does not change what Clay or your sequencer charges you for a row.
Next step
Once the view is clean, the cost of the check is one API call a row on your SimpleVerifier plan. See pricing for the calls each plan includes and the API docs for every field.
Common questions
How do I filter a Clay table to valid emails only?
Add the verification result as its own column, then filter or run the next column on action equal to send. Only a confirmed mailbox gets action send, so the filter drops catch-all, role, unconfirmed and invalid rows.
Should I filter on status or on action?
Action is simpler. Status has three values (valid, risky, invalid) and risky mixes cases that need different handling. Action has four: send, send_with_care, retry_later and do_not_send.
Is this a native Clay action?
No. It is a setup with Clay's HTTP API enrichment column and your own SimpleVerifier API key. There is no native SimpleVerifier action in Clay yet.
Should the filtered-out rows be deleted?
No. Keep them. Send_with_care rows can go to a smaller campaign, and retry_later rows should be checked again later.
Does a valid result guarantee delivery?
No. It means the mailbox existed when it was checked. The inbox can still be full, and people leave jobs, so check again if the table is old.
Check your list before you send
Real mailbox checks over SMTP, and nothing is sent to the address. Sign in with Google and your first 100 email checks are free, no card. Plans for bigger lists are on the pricing page.