Keencrest guides

Clay: find a contact email per row with the Run Apify Actor action

By Keencrest · 2026-11-01

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

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:

SiteSecondsResult
appier.com3.6email
sitemaps.org3.8no contact page
notion.so3.8no email
plausible.io4.0no email
mozilla.org5.1email
freee.co.jp5.8no email
sakura.ad.jp7.1no email
gogoro.com7.4no email
personio.de18.4429 rate limit, free
basecamp.com20.1email

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.

Use your own Apify API token in Clay's connection, never in a shared table.

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

All Keencrest guides