How to Extract Social Profiles from Domains in Bulk (2026)
Find Twitter/X, LinkedIn, Instagram, YouTube, and 15 more social profiles across thousands of domains — one row per profile with handle and source, no API key.
You have a list of company domains and you need their social channels — Twitter/X, LinkedIn, Instagram, YouTube, the lot — for outreach, CRM enrichment, or competitor mapping. There is no single social API that hands you a company’s profiles across every platform; each network gates its own data behind auth and rate limits. But the companies already publish these links themselves, in the footer, the header, and the structured data of their own homepages. This guide covers how to harvest those links across thousands of domains at once, what the extraction actually reads, and where the misses come from.
What data is worth extracting
The output model is one row per social profile found on one domain — so a single well-connected company can produce 5, 10, or 15+ rows. Each row carries:
domain— the domain that was scanned.pageUrl— the actual URL fetched, after redirects.platform— the social platform name (e.g.Twitter / X,LinkedIn,Instagram).profileUrl— the full URL of the social profile page.handle— the username or handle parsed straight from the profile URL, ready for outreach tools.foundIn— where the link was discovered:html-link,json-ld, ormeta-tag.linkText— the visible text or title of the link element (for HTML links; null otherwise).homepageTitle— the homepagetitletag.totalProfilesFound— how many unique profiles the domain has, repeated on every row so you can group or pivot.scanLatencyMsandextractedAt— fetch time and an ISO 8601 timestamp.
Because domain, homepageTitle, and totalProfilesFound are identical across all rows from the same site, grouping by domain reconstructs the full per-company profile set instantly.
How the extraction actually works
There is no social media API involved. The actor fetches each domain’s homepage over a plain HTTP GET (adding https:// if missing) and finds links three ways:
- HTML links — scans
a hrefanchors in the page markup, where footer and header social icons live. - JSON-LD
sameAs— reads thesameAsarray in structured data, the schema.org convention for declaring an entity’s social profiles. - Meta tags — inspects
twitter:siteandtwitter:creatormeta tags.
It detects 19 platforms: Twitter/X, LinkedIn (company, personal, and school variants), Facebook, Instagram, YouTube, TikTok, GitHub, Discord, Reddit, Medium, Twitch, Pinterest, WhatsApp, Telegram, Bluesky, Threads, Mastodon, and Snapchat. The handle is parsed from the URL path using platform-specific patterns — twitter.com/<handle>, linkedin.com/company/<handle> — and platforms with multiple URL shapes (YouTube @handle vs /channel/ vs /c/) are all handled. Duplicate profile URLs on the same domain are removed, and same-domain plus known non-social hosts are excluded.
A batch of company domains:
{
"urls": ["stripe.com", "github.com", "figma.com", "notion.so"],
"maxConcurrency": 20,
"proxyConfiguration": { "useApifyProxy": true }
}
A larger lead-gen list at higher concurrency:
{
"urls": [
"shopify.com", "vercel.com", "linear.app", "airtable.com",
"cloudflare.com", "mongodb.com", "atlassian.com", "hubspot.com"
],
"maxConcurrency": 50,
"proxyConfiguration": { "useApifyProxy": true }
}
The input fields: urls (array of domains or URLs, one per entry — bare stripe.com or full https://stripe.com both work), maxConcurrency (parallel fetches, default 20, up to 100), and proxyConfiguration (datacenter Apify Proxy by default, recommended for large lists).
▶ Open the Bulk Social Profile Extractor on Apify — paste a list of domains and get one row per social profile, with platform, URL, and handle. Fast HTTP, no browser, no API key.
The access reality
This is a fast, cheap extraction because it is pure HTML fetch plus regex — but that architecture defines exactly what it can and cannot see:
- It does not execute JavaScript. The actor reads raw static HTML. Most company homepages put social links in the static footer or menu, so they are found. But if a site is a JavaScript SPA (React, Next.js) that injects links at runtime, the static HTML has nothing to match and the domain comes back with
totalProfilesFound: "0". For those, a headless-browser scraper is the right tool. - Concurrency is a rate-limit tradeoff. Higher
maxConcurrencyis faster on large lists but can trip rate limiting; routing through Apify Proxy (datacenter by default) is why proxy support is recommended for big runs. - Scan the homepage, not deep pages. Social links almost always live on the homepage header/footer. Pointing the actor at a deep article URL usually yields fewer or no profiles.
- A zero-result domain is often a rendering problem, not an absence. If a company obviously has social channels but returns zero, suspect a JS-rendered homepage rather than a missing footer.
Volume scales cleanly: you can process thousands of domains per run, and because a single domain yields multiple rows, a list of 100 companies easily produces 500–1,000+ profile rows.
Example output
One profile row from a stripe.com scan:
{
"domain": "stripe.com",
"pageUrl": "https://stripe.com/",
"platform": "Twitter / X",
"profileUrl": "https://twitter.com/stripe",
"handle": "stripe",
"foundIn": "html-link",
"linkText": "@stripe",
"homepageTitle": "Stripe | Financial Infrastructure for the Internet",
"totalProfilesFound": "8",
"scanLatencyMs": "342",
"extractedAt": "2026-07-06T12:00:00.000Z"
}
That same domain produces one row per profile — Twitter/X, LinkedIn, Instagram, YouTube, GitHub, and more — each sharing the domain, homepageTitle, and totalProfilesFound of 8.
Use cases
- Lead generation & sales prospecting — extract social profiles from a list of company websites to find the right outreach channels.
- CRM & data enrichment — append Twitter/X, LinkedIn, Instagram, and YouTube URLs to CRM records and company databases in bulk.
- Competitor research — map competitors’ social presence by scanning their domains and clustering by
platform. - Brand monitoring & verification — confirm that acquired brands or partner sites link to the correct, active profiles.
- Marketing audits — verify every property in a brand portfolio links to its live channels; catch broken or outdated footer links.
- Influencer discovery — scan niche blogrolls and resource pages to surface creators on specific platforms.
- Per-platform list building — filter by
platformto build dedicated LinkedIn-company, Twitter/X, or Instagram lead lists.
Who uses it: sales and lead-gen teams building outreach lists, growth marketers and agencies, SDRs and RevOps enriching CRMs, competitive-intelligence and brand-monitoring teams, recruiters sourcing company channels, and data journalists mapping social footprints at scale.
Cost and effort: build vs. managed
Building this yourself means writing a concurrent fetcher, then three separate extractors — anchor-tag parsing, JSON-LD sameAs parsing, and meta-tag inspection — plus per-platform handle regexes for 19 networks (including the annoying multi-shape ones like LinkedIn’s company/personal/school and YouTube’s three URL formats), dedup logic, and a proxy layer so large lists do not get rate-limited. It is a real project, and most of the maintenance is keeping the handle patterns current as platforms change URL structures.
The actor is pay-per-result at a low per-row rate, and since a domain yields multiple rows, you get dense output per dollar. A 100-company enrichment run producing several hundred profile rows costs a few cents. Feed domains in from your CRM, run it, and write the profiles back out — it slots into Make, n8n, or Zapier pipelines directly.
Common pitfalls
- SPAs return zero — that is the JavaScript, not the tool. If a domain with obvious social channels comes back empty, it is almost certainly a JS-rendered homepage. Route those to a headless-browser contact scraper.
- Everything is stringified.
totalProfilesFoundandscanLatencyMscome back as strings for schema consistency; cast before you sort or sum. - Handle patterns vary by platform. The
handleis parsed from the URL, so a nonstandard profile URL can yield an unexpected handle — spot-check LinkedIn and YouTube handles if you are feeding them into automation. - Group by domain to rebuild the set. No single row is “the company”; the per-company view is the group of rows sharing a
domain. - Point at homepages. Deep pages rarely carry the full social footer — scan the root domain.
- Publicly-published links, but your compliance. The actor only reads links sites publish themselves; using the data is still subject to each site’s terms and laws like GDPR.
Wrapping up
Companies already advertise their social channels on their own homepages — the work is fetching thousands of them in parallel and reliably parsing links out of HTML, JSON-LD, and meta tags across 19 platforms. A managed extractor turns a domain list into a grouped, deduplicated, handle-parsed profile dataset ready for outreach or enrichment, and it does it without a single social API key.
▶ Run the Bulk Social Profile Extractor on Apify — one run turns a list of domains into hundreds of social profile rows with platform, URL, and handle. No API key, no login, export to CSV or JSON. Start on Apify’s free monthly credit.
Related guides
How to Scrape IMDb Movies, TV Ratings & Reviews in 2026
Search IMDb by genre, year, rating and votes, then pull title details, cast, episodes and user reviews via IMDb's own GraphQL — no API key, no browser.
How to Scrape MyAnimeList Anime & Manga Ratings 2026
Pull MyAnimeList anime and manga data — ratings, rankings, seasonal charts, characters and recommendations — via the free Jikan API. No key, no OAuth needed.
How to Scrape Mastodon Posts & Hashtags at Scale in 2026
Pull public Mastodon posts by hashtag, timeline or account: content, engagement stats, media URLs and account data. No API key, no login, any instance.