1. Home
  2. Integrations
  3. Clay

Verify emails in Clay

Add one HTTP API column to a Clay table and every row gets a live mailbox check from SimpleVerifier, with an action field (send, send_with_care, retry_later or do_not_send). Keep only action = send before rows reach your sequencer. Catch-all addresses are never marked valid.

Setup

  1. Create an API key at simpleverifier.com/api-keys. It starts with sv_live_. API access comes with selected paid plans; a key on a plan without it gets a 402 that says so.
  2. In your Clay table, click Add column, search for HTTP API and choose it.
  3. Set the method to GET and the endpoint to https://simpleverifier.com/api/v1/verify?email=/Email, inserting your email column where /Email appears.
  4. Add a header named Authorization with the value Bearer followed by your key. Clay stores it as an account credential, so it is not repeated per column.
  5. Run the column on a few rows first. Each call can take up to about 30 seconds on a slow mail server, so keep auto-run off until you have checked the output.
  6. Add action from the result as its own column, then a formula or run condition {{SV action}} == "send" so only confirmed mailboxes reach your sequencer. Keep reason and reason_code beside each row for the why.

The HTTP API column, field by field

In Clay, click Add enrichment, choose HTTP API and open the Configure tab. Clay references a column with a forward slash, so /Email inserts each row’s value; rename it to match your column.

MethodGET
Endpointhttps://simpleverifier.com/api/v1/verify
Query string parametersemail = /Email
HeadersA saved header account with Authorization = Bearer sv_live_... (Clay encrypts it at workspace level)
Field paths to returnstatus, reason, action, risk, likely_invented, reason_code
Rate limitRequest limit 100, Duration (ms) 60000
Run conditionOnly run if /Email is not empty

Click Test on one row first, then ten, then the table. The same request from a terminal:

curl "https://simpleverifier.com/api/v1/[email protected]" \
  -H "Authorization: Bearer $SIMPLEVERIFIER_KEY"

What comes back

Every answered check carries four decision fields with a fixed shape and no null: action, risk, likely_invented and reason_code. They are never more hopeful than status: only valid gives action: "send", and a catch-all address is always risky, never valid. A confirmed mailbox:

{
  "email": "[email protected]",
  "status": "valid",
  "reason": "Mailbox exists",
  "send_advice": "safe",
  "reason_detail": "The mail server confirmed this mailbox exists.",
  "mailbox_probed": true,
  "action": "send",
  "risk": "low",
  "likely_invented": false,
  "reason_code": "mailbox_exists"
}

A catch-all domain, where no SMTP check can confirm the mailbox:

{
  "email": "[email protected]",
  "status": "risky",
  "reason": "Accepts all addresses",
  "send_advice": "care",
  "catch_all_confidence": "higher",
  "mailbox_probed": true,
  "action": "send_with_care",
  "risk": "medium",
  "likely_invented": false,
  "reason_code": "catch_all"
}

An address that looks made up, on a domain with no mail server (handy for catching AI-written or guessed emails in a waterfall):

{
  "email": "[email protected]",
  "status": "invalid",
  "reason": "No mail server",
  "send_advice": "do_not_send",
  "mailbox_probed": false,
  "action": "do_not_send",
  "risk": "high",
  "likely_invented": true,
  "reason_code": "no_mx"
}

The full field list and every reason_code are in the API docs. Codes are stable; treat a code you do not recognise like other and go by action.

Keep only the rows to send

In the HTTP API column’s output, add action as its own column (call it SV action). Then add a formula column, or a run condition on your push-to-sequencer column, with this JavaScript expression (Clay evaluates run conditions as expressions that return true or false):

{{SV action}} == "send"

If you would rather read straight from the HTTP API column (named Verify email here), use {{Verify email}}.action == "send". Filter the table view on that formula column to see only sendable rows. Test the expression on a few rows: Clay’s formula editor can also write it for you from “only run if SV action is send”.

actionWhenIn Clay
sendMailbox confirmed (status valid)Push to the main campaign.
send_with_careCatch-all, role inbox, provider hides statusPush to a separate, capped campaign, or skip.
retry_laterServer refused, timed out or blocked the checkRe-run the column on these rows later.
do_not_sendMailbox not found, no mail server, disposable, bad formatDo not push. Try the next finder in your waterfall.

Rate limits and speed

Each API key can make 120 calls a minute. Past that the API answers 429 with a Retry-After header. Setting Clay to 100 requests per 60,000 ms leaves headroom; give each table or tool its own key if several share one. At that rate 1,000 rows take at least 10 minutes, and longer when mail servers are slow: one check can take up to about 30 seconds. For tens of thousands of rows, export a CSV and upload it on the verify page; list jobs average about 30 rows a minute over a day, shared by all customers. Confirmed results are cached for 14 days, so re-running a recent table is quick.

Which plans include API access

PlanPriceAPI calls
Pro$39/mo10,000 a month included, then $1.50 per 1,000 on monthly billing
Business$99/mo100,000 a month included, then $1.00 per 1,000 on monthly billing
Agency$249/mo300,000 a month included, then $1.00 per 1,000 on monthly billing
Starter$9/moNo API access (CSV verification in the dashboard)

On yearly billing the included calls are a fixed monthly quota. A key on a plan without API access gets a 402 that says so. Details on pricing. The longer walkthrough, with routing for risky rows and phone checks, is in how to verify emails in Clay.

Using the result

Route on the status field: valid means the mail server confirmed the mailbox, risky means delivery could not be confirmed (catch-all domain, role address, provider that hides mailbox status), invalid means it will bounce or is a throwaway address. Keep risky out of cold sequences unless you accept the bounce risk.

Full endpoint reference, error codes and an OpenAPI file are in the API docs. For lists of thousands of addresses, upload a CSV on the verify page instead.

Comparing tools? See email verifiers for Clay compared, with prices checked on each vendor’s site.

Common questions

Which plans include API access for Clay?
API access comes with Pro, Business and Agency, listed on the pricing page; Starter covers CSV verification only. A key on a plan without API access gets a 402 that says so. Each key can make 120 calls a minute.
Is there a native SimpleVerifier provider in Clay?
Not yet. Today you connect it with Clay's HTTP API column, which works with any REST API and a Bearer key.
What does it cost per row in Clay?
The HTTP API column calls our API with your own key, so each row uses one API call from your SimpleVerifier plan (included calls, then the per-1,000 rate on monthly billing). Check Clay's current pricing for what it charges, if anything, to run an HTTP API column on your Clay plan.
Are catch-all emails returned as valid?
No. A catch-all address is always status risky with action send_with_care, never valid, because the server accepts every address and an SMTP check cannot confirm the mailbox.
How fast can I call it?
Up to 120 calls a minute per API key. Set Clay's rate limit below it; on a 429 the Retry-After header says how long to wait.

All integrations · Pricing

Clean your next list before it bounces

100 free email checks when you sign in with Google, no card. Then monthly plans from $9, or one flat price with fair use, never cut off.

100 free checks, no card Cancel anytime Secure payment by Stripe