Last updated: 11 November 2026
A Claude Code skill is a folder of instructions and supporting files. After cloning, install with cp -r scraping-skills/skills/website-contact-page-email-and-phone-crawler ~/.claude/skills/ and export APIFY_TOKEN=your_apify_token. This skill returns public emails, phones and social profile links per website. A first run of 2 rows costs about $0.40 on Apify's Free plan, plus compute.
Disclosure: I maintain the free MIT workflow and skill repos linked below. Scraping runs a public Apify Actor on your own Apify account as paid usage, and this article was drafted with AI help, with every field, setting and price checked against the repo files and the Actor's pricing.
The email is already on the website, but your prospect list is still in a browser tab. You need contact records without opening each site's contact, about and team pages yourself.
What does this Claude Code skill return?
The Website Contact Page Email & Phone Crawler collects public contact details into one normalized record per site. That gives you a website-level result to inspect or use for lead generation.
These are the fields to start with:
| Your next task | Relevant output fields |
|---|---|
| Identify the website and company |
websiteUrl, companyName, companyNameSource
|
| Review email contacts |
emails, primaryEmail, roleEmails, namedEmails, emailDetails
|
| Review telephone contacts |
phones, primaryPhone, phoneDetails
|
| Find other contact routes |
socialLinks, socialProfiles, address, contactPageUrl, contactForms
|
| Check crawl coverage |
pagesCrawled, pagesCrawledUrls, maxDepthReached
|
| Investigate missing results |
status, failureReason, error, skippedByRobots, browserUsed
|
The output also includes type and crawledAt. Keep websiteUrl when moving records into your own prospect list. It is the supplied deduplication key, and it keeps the contact details associated with their website.
What belongs in a skill folder?
The featured folder is named website-contact-page-email-and-phone-crawler. Its layout is:
website-contact-page-email-and-phone-crawler/
SKILL.md
references/example-input.json
references/input-schema.json
references/output-fields.json
scripts/run.mjs
SKILL.md gives Claude the instructions. The reference files provide the example input, accepted input schema and output field names. scripts/run.mjs is the runnable entry point you can also invoke directly.
When changing a setting, consult references/input-schema.json. When choosing fields for the result, consult references/output-fields.json. This keeps your request tied to the actual input and output contract.
How do you install it in Claude Code?
- Clone the skills repository.
git clone https://github.com/bolvein-firex/scraping-skills
- Create Claude's skills directory and copy the featured folder into it.
mkdir -p ~/.claude/skills
cp -r scraping-skills/skills/website-contact-page-email-and-phone-crawler ~/.claude/skills/
- Get your API token from Apify's integrations settings. Replace the placeholder below, then set it in the shell you use for Claude Code.
export APIFY_TOKEN=your_apify_token
- Ask Claude to use the installed skill with its example input. A concrete request is:
Use the Website Contact Page Email & Phone Crawler with
references/example-input.json. ReturnwebsiteUrl,status,companyName,primaryEmail,primaryPhoneandcontactPageUrl, and show anyfailureReasonorerror.
The workflow and skill files are free under MIT. Executing the scraping job uses your Apify account and its available credit.
How does Claude pick this skill from your request?
Claude Code matches your request to the description in SKILL.md's front matter, then follows the skill's steps. That description names the job phrases and output fields.
Describe the job in those terms: crawl website contact pages and return public emails, phone numbers and social profile links. Including fields such as primaryEmail and primaryPhone also makes the result you want explicit.
If a broad request leaves the intended skill unclear, name Website Contact Page Email & Phone Crawler directly, as in the setup prompt.
What does the worked example actually send?
The starter input is:
{
"urls": [
"https://apify.com",
"https://n8n.io"
],
"maxPagesPerSite": 10
}
urls is the required input. It accepts full URLs or bare domains and removes duplicates. This example supplies the websites directly and caps fetching at 10 pages per website with maxPagesPerSite.
The crawler prioritizes contact, about, team and imprint pages. With the default smartPrioritise enabled, it also queues contact-like links ahead of other internal links. The default useSitemap setting helps find contact and about pages that are absent from homepage links.
For the returned records, start by reading websiteUrl and status. Then inspect emails, phones, socialProfiles and contactForms. Use primaryEmail and primaryPhone when you want the primary contact fields, while retaining the broader fields for review.
Check pagesCrawledUrls alongside contactPageUrl to understand the coverage. This is an input-to-output walkthrough, not a captured execution. Actual addresses, phone numbers and company names depend on what the sites expose.
Can you run it without an agent?
Yes. With the folder installed and APIFY_TOKEN set, use either command verbatim:
node ~/.claude/skills/website-contact-page-email-and-phone-crawler/scripts/run.mjs # uses references/example-input.json
node ~/.claude/skills/website-contact-page-email-and-phone-crawler/scripts/run.mjs input.json # or your own input file
The first command uses the bundled example. For the second, save the starter JSON as input.json, then edit urls for your own websites. You can use the same input whether you ask Claude to invoke the skill or call the runner yourself.
What does a first try cost?
Keep the Actor's default memory of 4096 MB, or 4 GB. The skill does not override it. On the Free tier, the start event costs $0.10 per GB, making the start charge $0.40. Each result adds $0.00099.
| Usage | Total Actor fees before compute |
|---|---|
| First run, 2 rows | About $0.40 |
| Daily 2-row run for 30 days | $12.06 |
Apify platform usage, including compute, is billed on top. There is no fixed compute price in this estimate. Paid tiers have lower start-event and per-result prices. The Free plan includes $5.00 in credit. See Apify pricing when budgeting beyond the starter run.
FAQ
Why can a website return no contact details?
Review status, failureReason, error and skippedByRobots. The default respectRobotsTxt setting skips disallowed pages. With onlyWithContacts left at its default false, sites without contacts are retained.
What happens when contacts require JavaScript?
With renderFallback enabled by default, the Actor renders up to two pages in a headless browser if plain HTML contains no email or phone. Check browserUsed in the output.
How do you exclude personal email addresses?
Set includeNamedEmails to false. It defaults to true. Turning it off keeps role addresses instead of named personal addresses.
How are local phone numbers interpreted?
defaultCountry accepts an ISO country code for numbers without an international prefix. Its default is empty, which infers the country from the website domain.
What should you change when sites rate-limit requests?
Lower maxSitesConcurrency, which defaults to 3. maxConcurrency separately controls parallel page fetching within the same website and defaults to 5.
Featured skill · Skills repo · Matching n8n docs page · YouTube channel
Top comments (0)