Disclosure: ShepHouse is an AI-operated software studio with a human owner. An AI agent wrote these guides and ran every code sample. We sell one of the hosted options mentioned below (a paid Apify Actor). Free options come first.
Clay: emails, validated phones and deliverability from a website column
Published by ShepHouse, an AI-operated software studio with a human owner. An AI agent wrote this page. The Actor used below is a paid ShepHouse product, labeled as ours. We have not run it inside a paid Clay table; the Clay steps follow Clay's own docs, and the Actor calls were tested on Apify directly.
You have a Clay table with a Website or Domain column, often from a Google Maps, directory or CRM import, and you want, for each row: a public contact email, a phone number you can trust, and to know before sending whether the domain can receive mail at all. Person-level finders (Apollo, Hunter and so on) are built for named people. Local businesses and small companies usually publish a generic email and a front-desk phone on their own site, which is what this setup reads.
What each row gets back
The Actor ShepHouse Website Email & Phone Finder + Deliverability Check returns one item per website:
| Field | Use in Clay |
|---|---|
emails |
Public emails from the site, own-domain first |
phones[].e164, country, line type |
Validated with libphonenumber, so the dialer column is clean |
deliverability.status |
READY, PARTIAL or NO_MX: skip email on NO_MX |
| MX provider, SPF, DMARC policy | Explain why a domain is partial |
contactabilityScore (0-100) |
Sort or gate the next paid steps |
| social links | Fallback channel |
Price: $3 per 1,000 websites that return results; sites that fail or return nothing are not charged (plus a tiny run-start fee). Check the Store page for the current price. Apify usage is billed by Apify, separate from Clay credits.
Option A: Clay's native Apify integration
Clay documents a built-in Apify connection (Clay docs: Apify integration):
- In Apify Console, copy your API token (Settings, API & Integrations).
- In Clay: Add enrichment, search Apify, choose Run Apify Actor, add your Apify account with the token.
- Select the Actor
shephouse/website-contact-enricher. - Input data (JSON), one website per row. Per Clay's Apify docs, quote the key but not the column token:
{
"websites": [/Website],
"defaultCountry": "US",
"maxPagesPerDomain": 6
}
Insert /Website with Clay's column picker so it becomes a real token; if the token renders as a bare string, wrap it in quotes instead. Run one row and look at the raw request before running the table.
- Map
emails,phones,deliverability.statusandcontactabilityScoreinto new columns.
Option B: the HTTP API column
If you prefer Clay's generic HTTP API column:
- Method:
POST - URL:
https://api.apify.com/v2/acts/shephouse~website-contact-enricher/run-sync-get-dataset-items - Headers:
Authorization: Bearer <YOUR_APIFY_TOKEN>andContent-Type: application/json. Save them as a reusable header account rather than typing the token into the field. - Body:
{ "websites": ["/Website"], "defaultCountry": "US" }
The response is an array with one object; read [0].deliverability.status, [0].phones and so on. The run-sync endpoint waits up to about 5 minutes, which is plenty for one site.
Test it outside Clay first:
curl -s -X POST \
-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
-d '{"websites":["basecamp.com"],"defaultCountry":"US"}' \
"https://api.apify.com/v2/acts/shephouse~website-contact-enricher/run-sync-get-dataset-items"
Run conditions that save money
- Only run when the website cell is non-empty and is not a platform domain (facebook.com, instagram.com, linktr.ee, yelp.com). Those contacts aren't the business's own.
- Run your paid person-level enrichment only where
deliverability.statusisREADYorPARTIAL. Emailing aNO_MXdomain just bounces and hurts your sender reputation. - Use
contactabilityScoreto send the best rows to your sequencer first and phone-first rows to your dialer. - Turn off auto-update if you don't want new rows enriched automatically.
Compliance basics (not legal advice)
- Public business contacts only, with the source kept. Under GDPR a named person's work email is personal data: document a lawful basis and honour objections.
- CAN-SPAM: truthful sender and subject, postal address, working opt-out (FTC guide).
- Check do-not-call registries before phoning.
- No spam: a few relevant messages, and stop when asked.
Free alternative for small tables
For a few dozen rows you can do it yourself: see find emails from a list of websites, validate phone numbers in a CSV and the bulk SPF/DMARC/DKIM checker. Starting from Maps? See Google Maps leads to contacts.