Website Contact Scraper & Company Enrichment (Tech Stack)
Pricing
from $3.00 / 1,000 enriched domains
Website Contact Scraper & Company Enrichment (Tech Stack)
Website contact scraper and company enrichment. Turns company domains into data from each company's own website: generic contact emails (info@, sales@), schema.org phone, social profiles, name, description, tech stack, languages and logo, one row per domain. Respects robots.txt; no people data.
Pricing
from $3.00 / 1,000 enriched domains
Rating
0.0
(0)
Developer
FedSignals Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Website contact scraper and company enrichment in one Actor. Give it a list of company domains and it reads each company's own website: the homepage plus a few same-site pages (contact, about, imprint) and robots.txt. It returns one clean row per domain: company name, description, social profiles (LinkedIn company page, X, Facebook, Instagram, YouTube, GitHub, TikTok), generic contact emails (info@, sales@, support@, hello@ ...), the main phone number from schema.org, the detected tech stack (CMS, e-commerce platform, analytics, CDN, frameworks ...), languages, schema.org organization data, logo, redirects and HTTP status.
It's built for lead enrichment, CRM clean-up, market and technographic research, and agency prospecting. It uses plain HTTP with no browser, so it's fast and cheap.
Privacy by design. The Actor collects company data only:
- Only generic role addresses on the company's own domain are returned (info@, sales@, support@, hello@, press@, careers@ ...). Anything that looks like a personal address (
john.smith@,jsmith@) is dropped. - A phone is returned only when the site publishes it as the organization's main or customer-service line in schema.org structured data.
- No people names. schema.org
Personnodes (founders, authors, employees) are never read, and LinkedIn personal/in/profiles are never returned.
Polite crawling. robots.txt is fetched and respected for every page, including the target of a cross-domain redirect, and Crawl-delay is honoured. If robots.txt answers with a server error, the site is treated as disallowed (RFC 9309). The crawler identifies itself as FedSignalsBot with a contact address. At most 1 + maxExtraPages pages are read per site.
Example input
{"domains": ["zapier.com", "https://www.cloudflare.com/", "tartinebakery.com", "linear.app"],"techStack": true,"maxExtraPages": 3}
Domains, URLs or www. hosts are all accepted. Duplicates are removed.
Example output
{"domain": "zapier.com", "status": "ok", "httpStatus": 200,"finalUrl": "https://zapier.com/", "redirectedToOtherDomain": false, "https": true, "responseTimeMs": 188,"companyName": "Zapier", "companyNameSource": "schema.org","description": "Build and scale AI workflows and agents across 9,000+ apps with Zapier...","language": "en", "languages": ["en", "de", "es", "fr", "ja"],"emails": [], "phone": null,"linkedinUrl": "https://linkedin.com/company/zapier", "twitterUrl": "https://x.com/zapier","facebookUrl": "https://facebook.com/ZapierApp", "instagramUrl": "https://instagram.com/zapier","youtubeUrl": "https://youtube.com/@ZapierApp", "githubUrl": "https://github.com/zapier","logoUrl": "https://res.cloudinary.com/zapier-media/image/upload/f_png,h_224/v1757453971/Zapier_Logo_yjhvbo","technologies": ["Amazon Cloudfront", "Contentful", "OneTrust", "HTTP/3", "Amazon Web Services", "Vercel", "HSTS"],"techCategories": ["CDN", "CMS", "Cookie compliance", "Miscellaneous", "PaaS", "Security"],"server": "Vercel","schemaOrg": {"type": "Organization", "name": "Zapier", "legalName": "Zapier Inc", "foundingDate": "2011","addressLocality": "San Francisco", "addressRegion": "CA", "addressCountry": "US", "sameAs": ["..."]},"robotsTxt": "found", "pagesFetched": ["https://zapier.com/"], "checkedAt": "2026-10-29T17:49:10Z"}
Smaller businesses publish more: for example tartinebakery.com returned info@tartinebakery.com and press@tartinebakery.com, and warbyparker.com returned its main line from schema.org.
Every row has the same fields, with null or empty values when the site doesn't publish something. The full list is on the Output tab. Each row has a status:
| status | meaning | charged? |
|---|---|---|
ok | website read and enriched | yes |
blocked_by_robots | robots.txt disallows the homepage for this crawler | no |
bot_challenge | the homepage answered with a bot check, maintenance or placeholder page | no |
http_error | 4xx/5xx on the homepage (403/429 usually mean bot protection) | no |
unreachable | DNS, TLS or connection failure | no |
not_html / error | not a web page, too many redirects or a timeout | no |
Live test results (Oct 29, 2026)
A local run against 42 domains (41 real companies and organisations of different sizes, plus one non-existent domain) finished in 20 seconds:
- 34 enriched (
ok) · 4http_error(one 403 and three 429 bot-protection responses) · 2bot_challenge· 1blocked_by_robots(that site's robots.txt disallows all unknown crawlers) · 1unreachable(the fake domain). - Of the 34 enriched: company name 32, description 33, language 34, at least one social profile 30 (LinkedIn company page 24), logo 29, schema.org organization data 19, tech stack detected 34 (median 5.5 technologies), generic email 9 (11 addresses, such as
info@,support@,hello@,press@andmedia@), schema.org main phone 1. - 77 pages read in total, with a median homepage response time of 244 ms.
Large brands rarely put an email address on their website. You'll get far more emails and phone numbers from small and local businesses, which usually do.
Use cases
- Lead enrichment. Add socials, a generic inbox, description and tech stack to a list of company domains.
- Technographic prospecting. Find sites running Shopify, WordPress, HubSpot, Webflow, Stripe and so on.
- CRM hygiene. Detect dead domains, redirects to other companies (acquisitions and rebrands) and missing HTTPS.
- Market research. Compare the stacks and languages of a whole industry list.
Input options
domains: domains or URLs.techStack: detect technologies (default on).maxExtraPages(0-5, default 3): extra same-site pages to read (contact, about, imprint).maxEmails(default 10).maxItems: 0 means no limit.maxConcurrency(default 8): sites processed in parallel.delayBetweenPagesSec(minimum 0.5, default 1): delay between pages of the same site.timeoutSec(default 20): per-request timeout. Each domain has a hard limit of 120 s.
Known limits
- Static HTML only. No JavaScript is executed. Technologies, links and emails that appear only after client-side rendering are missed, and single-page apps may return little.
- Bot protection. Sites behind aggressive bot protection (Akamai, Cloudflare challenges, DataDome, PerimeterX) answer 403/429 or a challenge page. These are reported and not charged. The Actor doesn't try to bypass them.
- Tech fingerprints come from the last MIT-licensed release of the open-source Wappalyzer dataset (v6.10.54, January 2023), with 2,805 technologies. Technologies launched since then aren't recognised, and detections are pattern-based, so treat them as indicators rather than proof. Each pattern is time-limited, so a pathological page can't stall the run.
- Emails. Only generic role addresses on the company's own domain are returned. Many sites publish none, or only a contact form.
- Phone comes only from schema.org structured data, never from free text.
- Company name comes from schema.org,
og:site_nameor the page title. It can be a slogan-like title, or empty when none of these are present.
Licenses
The technology fingerprints and categories come from the Wappalyzer project's MIT-licensed release 6.10.54 (Copyright 2008 Wappalyzer). The original MIT license text ships with the Actor in src/data/LICENSE-wappalyzer.txt.
How much does it cost?
Pay per event: you pay only for the events below plus Apify's $0.00005 run-start fee. Platform compute is included in the price.
- $3 per 1,000 enriched domains ($0.003 per domain with
status: "ok"). - Free: domains that are blocked, unreachable, bot-protected or failing.
Real examples from our test runs:
- Quick-start input (5 domains): 5 × $0.003 = about $0.015.
- 1,000 domains: $3, minus any domains that are blocked, unreachable or bot-protected, which are free.
- Our 42-domain test: 34 enriched, 8 free = about $0.10.
Use maxItems and Apify's per-run spending limit to cap spend; the Actor stops cleanly when the limit is reached.
Dates, time zones and currency
checkedAtis ISO 8601 in UTC (Z).
Other languages and regions
Works on public websites in any country and language; language and languages come from the page's own language tags, e.g. de or pt-BR.
Also searched as: enriquecimiento de empresas, datos de sitios web (ES) · enriquecimento de empresas, dados de sites (PT) · enrichissement d'entreprises (FR) · Firmendaten-Anreicherung (DE).
FAQ
Does it return personal emails or employee names?
No. Only generic role addresses on the company's own domain (info@, sales@...) are kept. People names are never read.
Does it respect robots.txt?
Yes, for every page, including redirect targets, and it honours Crawl-delay.
Why did a domain return bot_challenge or http_error?
Some sites block automated requests. Those rows are returned with the status and are not charged.
How current is the tech detection?
It uses the last MIT-licensed Wappalyzer fingerprint release (6.10.54, January 2023). Technologies launched later may not be recognised.
Reliability
Measured on Apify as of Oct 29, 2026: 2 of 2 of our own test runs succeeded (100%), with a median run time of 16 seconds (longest 25 s) on small test inputs. It is a small sample from a new Actor; we will update it as runs accumulate. Local tests: 42 domains in 20 seconds (34 enriched, 8 blocked or unreachable and returned for free); median page response 244 ms.
Use it from AI agents (MCP)
Add this Actor as a tool in Claude Desktop, Cursor or any MCP client through the Apify MCP server:
{"mcpServers": {"company-website-enricher": {"url": "https://mcp.apify.com?tools=fedsignals/company-website-enricher","headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }}}}
Use it from code (API)
One call runs the Actor and returns the dataset items. maxTotalChargeUsd caps what the run can charge.
Python:
import requestsitems = requests.post("https://api.apify.com/v2/acts/fedsignals~company-website-enricher/run-sync-get-dataset-items",params={"maxTotalChargeUsd": 1},headers={"Authorization": "Bearer YOUR_APIFY_TOKEN"},json={"domains": ["stripe.com", "basecamp.com", "patagonia.com", "hetzner.com", "ghost.org"]},timeout=300,).json()print(len(items), "items")
JavaScript (Node 18+):
const res = await fetch("https://api.apify.com/v2/acts/fedsignals~company-website-enricher/run-sync-get-dataset-items?maxTotalChargeUsd=1",{method: "POST",headers: { Authorization: "Bearer YOUR_APIFY_TOKEN", "Content-Type": "application/json" },body: JSON.stringify({"domains": ["stripe.com", "basecamp.com", "patagonia.com", "hetzner.com", "ghost.org"]}),});const items = await res.json();console.log(items.length, "items");
Related FedSignals Actors
- Lever & Ashby Jobs Scraper: Career Site Job Feed: jobs straight from company career sites
- SEC Form D Scraper: EDGAR Startup Funding Rounds: new private funding rounds from SEC Form D filings
- PDF, DOCX & PPTX to Markdown Converter for AI & RAG: PDF, Word and PowerPoint to AI-ready Markdown
Feedback
Found a bug or need a filter or source? Open an issue on the Issues tab or email fedsignals.alerts@gmail.com.
This Actor is not affiliated with or endorsed by Wappalyzer or any of the websites it reads.