Use filtrat inside a Clay table to verify emails or find work emails, row by row. You add an HTTP API column that calls filtrat with your API key. There are three ways to set it up: the ready-made template, a prompt Clay turns into the column, or by hand.
Before you start
Open API → Clay in the app. Create a key there (name it Clay) or pick one. The page shows the endpoint, header, body and prompt for the action you choose, already filled in with your key.
A new key starts with ak_ and is shown in full only right after you create it. If you pick an older key, replace the prefix shown in the snippets with your full key.
Fastest: the ready-made template
The filtrat Clay template has both columns set up with the right settings. Copy it into your workspace, replace YOUR_API_KEY in the column's header with your key, and run it on a few rows.
Or let Clay build the column
- In your Clay table, add an HTTP API column.
- On API → Clay, choose Verify email or Find email, then press Copy Clay prompt.
- Paste it into the column's Generate tab and let Clay create the request.
- Check the settings in Recommended column settings were applied, then run the column on a few rows.
The prompt includes the timeout, retries and rate limit, but Clay doesn't always apply them. Check them in the column's settings before a big run.
Or set it up by hand: verify emails
Your table needs a column with email addresses, named Email.
- Add an HTTP API column.
- Set the method to
POSTand the URL tohttps://api.filtrat.io/v1/verify/email. - Add a header
Authorizationwith the valueBearer, a space, and your key. - Paste the body below.
/Emailrefers to your Email column; map it if your column has another name. - Apply the recommended settings, then run the column on a few rows.
{
"email": "/Email",
"resolve_catchall": true,
"skip_cache": false
}Send resolve_catchall as the boolean true, not the text "true". From the response, add these fields as columns:
| Field | Column |
|---|---|
$.status | Status: verified, invalid, catchall, risky or unknown |
$.diagnosis | Why, when the address isn't verified |
$.domain_intelligence.catch_all | Whether the domain is catch-all |
$.domain_intelligence.mx_provider | The domain's mail provider |
Or set it up by hand: find emails
Your table needs First Name, Last Name and Domain columns, and optionally Company. Use the same steps with the URL https://api.filtrat.io/v1/finder/search and this body:
{
"first_name": "/First Name",
"last_name": "/Last Name",
"domain_or_url": "/Domain",
"company_name": "/Company"
}company_name is optional, but include it if you have it: it finds 10–15% more emails when the website's domain doesn't receive mail. If your table has no Company column, remove that line. domain_or_url takes a domain (acme.com) or a website URL.
Add $.found_email, $.status (found or not_found) and $.confidence as columns.
Column settings
| Setting | Value |
|---|---|
| Response timeout | 90,000 ms (90 seconds) |
| Retry on failure | On |
| Max retries | 2 |
| Status codes to retry | 429, 502, 503, 504 |
| Rate limit | 60 requests per 60,000 ms |
Clay's default timeout is far too short for filtrat. Resolving a catch-all address can take up to 60 seconds, so set the timeout to 90 seconds or rows will fail.
What it costs
The same as in the app: 1 per verified or invalid result, 5 more when a catch-all is resolved, 20 per email found (25 when it needed catch-all resolution). Catch-all, risky, unknown and not-found results are free, and a row whose request failed isn't charged at all.
Finding an email behind a catch-all domain with resolve_catchall on (the default) costs 5 on top of the found email: 20 + 5 = 25. The 25 are held when the request starts. If the email isn't found, they're all given back, so a not-found costs nothing. If the email is found on a domain that didn't need resolution, the extra 5 are given back and you pay 20.
Re-running a column on rows that already have a result is free when the result is stored:
- Find column: a row that already found an email gets the saved result back for free.
- Verify column: an address checked in the last 180 days gets the stored result back for free, as long as the body keeps
"skip_cache": false. This holds withresolve_catchall: truetoo: a catch-all resolved earlier comes back free. Only a catch-all that was never resolved is resolved now and charged 5.
Set skip_cache to true only when you want a fresh check: it ignores the stored result and charges for the new one.
Rows timing out or failing
- Check the timeout is 90,000 ms.
- Check retries are on, with the four status codes above.
- Rerun only the failed rows.
More causes and fixes: Rows timing out or failing. Still stuck? Email support@filtrat.io with your Clay table URL and which setup you used.