Clay: find a contact email per row with the Run Apify Actor action
Clay is a separate product and this Actor is not made or endorsed by Clay. Clay has a native action that runs an Apify Actor with your own Apify account, once per table row. This guide gives the input for the Website Contact Details Scraper in that shape. The guide Find emails from a website list in Clay with an HTTP API column covers the same job through Clay's HTTP column.
Not tested inside Clay. We have no Clay account, so the action's menus are described from Clay's public documentation and may have moved. What we did run is the Actor with exactly this input, ten times, one website per call, on Apify's cloud.
The input
Pick the Actor datagleaner/website-contact-details-scraper and use this JSON body, with the row's website in the website value:
{"perRow": true, "website": "acme.example"}
The website input accepts a bare domain such as acme.example or a full address, and adds https:// itself, so a Website column can go in as it is. startUrls still works but needs a full address starting with https:// (a bare domain there is rejected with a 400 before anything runs). If both are given, website wins and startUrls is ignored.
What perRow does
- Reads the home page and the contact page only, with no browser fallback and no people extraction.
- Gives each site 25 seconds, so a slow site returns an answer instead of holding a table row.
- Returns one flat row. Map these columns:
bestEmail,emails(list of strings),phones(list of strings),contactPageUrl, plusstatusandfailureReason. - Changes nothing else: robots.txt, bot challenges, site terms, EU and UK role-only addresses and the
.dkrule apply as in a normal run. With more than one website in a run,perRowis ignored.
Measured on 10 sites
One call per site on 2026-11-02, from a script, not from Clay. Seconds from request to response, including the Actor start:
| Site | Seconds | Result |
|---|---|---|
| appier.com | 3.6 | |
| sitemaps.org | 3.8 | no contact page |
| notion.so | 3.8 | no email |
| plausible.io | 4.0 | no email |
| mozilla.org | 5.1 | |
| freee.co.jp | 5.8 | no email |
| sakura.ad.jp | 7.1 | no email |
| gogoro.com | 7.4 | no email |
| personio.de | 18.4 | 429 rate limit, free |
| basecamp.com | 20.1 |
Median 5.5 seconds. 3 of 10 returned an email: a home-plus-contact read finds fewer than the default 8-page crawl, so rows that come back with no email are the ones to run again as a full crawl (next section).
Chain a second column for the misses
A perRow row whose failureReason is no_email_found or no_contact_found carries one extra field, retryHint, with the value retry_full_crawl. It is free and absent on every other row. In Clay, add a second Run Apify Actor column for the same Actor and set it to run only when the first column's retryHint equals retry_full_crawl. Send the row's website with no perRow:
{"website": "acme.example"}
That column does the full crawl (8 pages by default, with the browser fallback). Billing is the same rule: US$0.002 only when it finds a bestEmail. Not tested inside Clay; the field and the second call are verified against the Actor only.
What it costs
US$0.002 per row that returns a bestEmail, nothing for the others; the 10 calls billed 3 events, US$0.006. Platform usage was about US$0.0004 per row (US$0.0054 for all 10). Clay's own credits for the action are Clay's pricing and not covered here. Set a spending limit on the Apify side too.
Try it: Website Contact Details Scraper on Apify. $0.002 per site with an email, nothing for sites without. The Apify free plan includes monthly credit, so a test run costs nothing out of pocket.
Related guides
- Find emails from a website list in Clay with an HTTP API column
- Find emails from a list of websites in n8n with Apify
- Find emails from a website list in Make (formerly Integromat)
- Find emails from a company website in Zapier with Webhooks
- Find emails from a website list in Google Sheets (Apps Script)
- Find emails from company websites in Airtable (automation script)