Website Contact & Tech Stack Scraper - Company Enrichment avatar

Website Contact & Tech Stack Scraper - Company Enrichment

Pricing

$5.00 / 1,000 domain enricheds

Go to Apify Store
Website Contact & Tech Stack Scraper - Company Enrichment

Website Contact & Tech Stack Scraper - Company Enrichment

Give it a list of company domains. Get back emails, phone numbers, social profiles, the tech stack, and the company's ATS careers board - one clean row per domain. Obeys robots.txt.

Pricing

$5.00 / 1,000 domain enricheds

Rating

0.0

(0)

Developer

Pablo D

Pablo D

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Share

Website Contact & Tech Stack Scraper — company enrichment from a domain

Paste a list of company domains. Get back one clean row per company: email addresses, phone numbers, social profiles, the technologies the site runs on, and — uniquely — which ATS the company recruits with and its board token.

It reads only public pages and it obeys robots.txt by default.

What it does

InputA list of domains or URLs (apify.com, https://example.com/about)
OutputOne dataset row per domain — contacts, socials, tech stack, ATS board, page meta
PagesHomepage plus up to N ranked contact/about/careers/imprint pages
Speed~1–3 s per domain at 4 pages; 5 domains in parallel by default

Use cases

  • Lead enrichment — turn a list of domains from a CRM export into contactable rows.
  • Sales qualification by tech stack — find every prospect running Shopify, HubSpot or Next.js.
  • Recruiting-tech mapping — the atsProvider / atsToken fields tell you which companies use Greenhouse, Lever, Ashby, Workable, Personio, Workday and eight others. Feed atsToken straight into an ATS job-board scraper to pull their live openings.
  • Data hygiene — check that the contact details on a list of company sites are still live.

Input

{
"domains": ["apify.com", "https://ashbyhq.com", "stripe.com"],
"maxPagesPerDomain": 4,
"extract": ["emails", "phones", "socials", "techStack", "atsBoard", "meta"],
"respectRobotsTxt": true,
"requestDelaySeconds": 1,
"concurrency": 5,
"excludeGenericEmails": true
}

maxPagesPerDomain: 1 is homepage-only — the fastest and cheapest setting, and often enough for tech stack and socials. Contact details usually need 3–5.

Output

{
"domain": "ashbyhq.com",
"finalUrl": "https://www.ashbyhq.com/",
"companyName": "Ashby",
"title": "Ashby | All-in-one recruiting software",
"description": "Ashby helps ambitious teams...",
"language": "en",
"generator": null,
"emails": ["support@ashbyhq.com"],
"otherEmails": [],
"phones": [],
"linkedin": "https://www.linkedin.com/company/ashbyhq",
"twitter": "https://twitter.com/ashbyhq",
"facebook": null,
"instagram": null,
"youtube": null,
"github": null,
"tiktok": null,
"techStack": ["Google Fonts", "Next.js", "React", "Sentry"],
"atsProvider": "ashby",
"atsToken": "ashby",
"atsBoardUrl": "https://jobs.ashbyhq.com/ashby",
"pagesCrawled": ["https://www.ashbyhq.com/", "https://www.ashbyhq.com/about"],
"pagesSkippedByRobots": [],
"status": "ok",
"error": null,
"scrapedAt": "2026-09-10T10:44:12.001000+00:00"
}

emails holds addresses on the company's own domain; anything else found on the page (an agency address, a documentation example) goes to otherEmails, so your outreach list is not polluted by someone else's inbox.

status is one of:

StatusMeaning
okPages loaded and something was extracted
no_dataPages loaded but nothing matched (common on JS-only or markdown-served sites)
blocked_by_robotsEvery candidate URL is disallowed by the site's robots.txt — nothing was fetched
failedSite unreachable; the reason is in error

By default every input domain produces exactly one row, so the output lines up 1:1 with your input list — and dead domains are billed like any other result. Turn Include unreachable domains in the output off and only domains that actually loaded are pushed, so you do not pay for dead ones. RUN_SUMMARY always reports the full status counts either way.

RUN_SUMMARY in the key-value store records status counts, unparseable entries, and whether robots.txt was respected.

What is detected

  • Tech stack — 40+ signatures: WordPress, Shopify, Wix, Squarespace, Webflow, Next.js, Nuxt, React, Vue, Angular, Svelte, HubSpot, Segment, Intercom, Drift, Zendesk, Stripe, PayPal, Cloudflare, GA4, GTM, Meta Pixel, LinkedIn Insight, Hotjar, Plausible, Matomo, Sentry, Algolia, Contentful, Sanity, Mailchimp, Klaviyo, Calendly, Typeform, Bootstrap, Tailwind, jQuery and more.
  • ATS boards — Greenhouse, Lever, Ashby, Workable, Personio, Recruitee, Teamtailor, SmartRecruiters, BambooHR, Workday, Breezy, Join, Jobvite.
  • Socials — LinkedIn, X/Twitter, Facebook, Instagram, YouTube, GitHub, TikTok.

Honest limitations

  • No JavaScript rendering. Pages are fetched as HTML. A site that renders its contact details entirely client-side will return fewer emails — the tech-stack and ATS detection still works, because those come from the script tags. If you need rendered DOM, use a browser-based crawler instead.
  • Tech-stack detection is signature-based, so it finds what is visible in the HTML. It will miss server-side technology, and a stale script tag can produce a false positive.
  • Contact details on the public web are usually role addresses (info@, sales@). This Actor does not guess or pattern-generate personal addresses, and it does not verify that an address is deliverable.
  • robots.txt is respected by default. On sites that disallow the paths where contacts live, this Actor will return less than a scraper that ignores robots.txt. Skipped URLs are listed in pagesSkippedByRobots so you can see exactly what happened. You can turn the check off, but then it is on you.
  • Personal data. Email addresses and phone numbers can be personal data under the GDPR and similar laws. You are the controller of anything you collect here; have a lawful basis, and honour deletion requests.
  • Cloudflare-protected sites return 403 to datacenter IPs. In a 25-domain test, 3 large consumer sites (doordash.com, kickstarter.com, coinbase.com) returned HTTP 403. Enable Apify Proxy for those, or accept the gap.
  • Coverage measured on that same 25-domain test: 22/25 loaded, 22 gave a tech stack, 20 a LinkedIn page, 13 an email address, 9 an ATS board, 2 a phone number. Most B2B sites route contact through a form rather than publishing an address — this Actor reports what is there, it does not invent it.

Politeness

Requests to any single site are serialised with your delay, and the delay is raised automatically if the site's robots.txt sets a longer Crawl-delay. Parallelism happens across different domains, never within one. robots.txt is fetched once per host per run.

Changelog

See CHANGELOG.md.

Support

Found a bug, or need a field this Actor does not return yet? Open an issue on the Actor's Issues tab, or email pablodevigoalertas@gmail.com. Issues are read first.