Website Social Links Finder: Company Profiles API avatar

Website Social Links Finder: Company Profiles API

Pricing

from $1.20 / 1,000 website profiles

Go to Apify Store
Website Social Links Finder: Company Profiles API

Website Social Links Finder: Company Profiles API

Get the official social media profiles of any company website: LinkedIn page, Facebook, Instagram, X, YouTube, TikTok and more, plus logo, favicon and share image. No personal profiles, no e-mails, one row per site, robots.txt obeyed.

Pricing

from $1.20 / 1,000 website profiles

Rating

0.0

(0)

Developer

Rowcraft

Rowcraft

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Share

Find the official social media profiles of a website: the company LinkedIn page, Facebook page, Instagram, X, YouTube, TikTok, Pinterest, GitHub, Telegram and WhatsApp business links that the site itself shows, plus its brand assets: logo, favicon, share image, theme colour and site name. Give the actor a list of domains or page addresses; it reads each site politely and returns one row per website, as JSON, CSV or Excel, with one column per network and a full list of every profile link and where on the page it was found.

Only company profiles are collected. Personal links (LinkedIn member pages, share buttons, mailto, phone and WhatsApp number links) are dropped before anything is saved, so the rows hold no e-mail addresses, phone numbers or names of people.

Input form of Website Social Links Finder: Company Profiles API

What you get

One row per website:

  • Identity: the domain, the address you gave, the address of the first page read after redirects, the HTTP status, the page title and the declared language
  • Ten network columns, each a single profile address or null: linkedinUrl (company, school or showcase page), facebookUrl, instagramUrl, xUrl (X, formerly Twitter), youtubeUrl, tiktokUrl, pinterestUrl, githubUrl, telegramUrl and whatsappUrl
  • Every profile link found: socialLinks, a list with the network, the address, where it sat on the page (schema, meta, footer, header or page) and the page it was found on, so a site with two Instagram accounts gives both
  • Brand assets: siteName, organizationName, logoUrl, faviconUrl, appleTouchIconUrl, ogImageUrl (the share image) and themeColor
  • Counts: networks (the networks found, as a short text for filters), socialLinkCount and pagesRead

The run also writes a COVERAGE record with one line per website you asked for (ok, blocked, robots_disallowed, not_found, error, already_delivered or not_checked, with the reason and the extra pages read) and a RUN_SUMMARY with counts: how many websites showed profile links, how many showed none, and how many sites carry each network.

Why this actor

  • Company profiles only. The rules drop LinkedIn member pages, share and intent buttons, YouTube /user/ links and every link that carries a phone number, so the result is a list of organisation accounts, not a contact list.
  • Brand assets in the same row. The logo, favicon, share image, theme colour and site name come from the same page read, so a CRM, a directory or a mock-up gets the profile links and the visual identity in one step.
  • Reads where the links really are. Footer and header links, the sameAs list of the organisation in the page data, the twitter:site and article:publisher tags and rel="me" links all count. When the first page shows fewer than three networks, the actor also reads the contact page and the about page that the first page links to, because many sites keep their profile links there.
  • The source of every link is shown. Page data and meta tags rank first, then the footer, then the header, then the rest of the page, and the column for each network holds the best-ranked link, while socialLinks keeps all of them.
  • Pay only for websites read. Websites behind an anti-bot page, disallowed by robots.txt, not found, invalid or repeated in your list are never charged. A website that was read and shows no profile link is delivered with empty fields, because that is a true answer.
  • No request to any social network. The actor reads the site you give, nothing else. Profiles are never opened, followed or checked.
  • Polite by design. robots.txt is read and obeyed first, one request per second by default, no proxies, no CAPTCHA solving.

How to use it

  1. Open the Actor and paste your domains or page addresses into Websites, one per line. A column copied from a spreadsheet works, and so do entries separated by commas.
  2. For a first try keep the list short, or set Maximum websites delivered to a small number.
  3. Leave Also read contact and about pages on the default (when the first page shows few profiles), or choose Always for the most complete result or Never for the fastest one.
  4. Click Start. The status line shows progress; the run stops cleanly at your maximum or at the charge limit you set in the run options.
  5. Open the Dataset tab: the Overview, All networks and Brand assets views show the main columns. Download JSON, CSV, Excel, XML or HTML, or send the rows to Google Sheets, Slack, Make, n8n or Zapier with the Integrations tab.
  6. Open the COVERAGE record in the key-value store to see which websites could not be read and why.
  7. To keep a list of sites up to date, run it on a schedule with Only new rows since the last run turned on: a website is delivered, and charged, only the first time.

Input

FieldWhat it does
websitesDomains (example.com) or page addresses (https://example.com/contact), one per line. A bare domain means its home page; an address means that page. One row per website, up to 100,000 per run.
extraPageswhenFew (default): read up to two more pages of the same website, a contact page and an about page that the first page links to, when the first page shows fewer than three networks. always: read them for every website. never: read the first page only.
maxItemsStop after this many delivered rows. 0 = the whole list.
onlyNew, stateNameDeliver a website only the first time, then skip it in later runs with the same state name
notifyUrl, notifyWhenEmptyA webhook that receives one message when the run ends; see Automation below
requestIntervalMsPause between requests, default 1000 ms, minimum 250 ms

Example: three websites, one row each.

{
"websites": ["wordpress.org", "blender.org", "arduino.cc"]
}

Example: a list of company sites, contact and about pages always read, with a Slack message when the run ends.

{
"websites": ["company-one.com", "company-two.com", "https://company-three.com/contact"],
"extraPages": "always",
"notifyUrl": "https://hooks.slack.com/services/..."
}

Output

29 fields per row. Empty values are null, never missing, so CSV and Excel columns are stable.

FieldTypeExample
idstringwordpress.org
domainstringwordpress.org
inputUrlstringwordpress.org
urlstringhttps://wordpress.org/
statusCodeinteger200
siteTitlestringBlog Tool, Publishing Platform, and CMS – WordPress.org
languagestringen-US
siteNamestringWordPress.org
organizationNamestringWordPress
logoUrlstringhttps://s.w.org/style/images/about/WordPress-logotype-wmark.png
faviconUrlstringhttps://s.w.org/images/wmark.png
appleTouchIconUrlstringhttps://s.w.org/images/wmark.png
ogImageUrlstringhttps://wordpress.org/files/2024/04/wordpress-homepage-ogimage-2024…
themeColorstring#00979d
linkedinUrlstringhttps://www.linkedin.com/company/wordpress
facebookUrlstringhttps://www.facebook.com/WordPress
instagramUrlstringhttps://www.instagram.com/wordpress/
xUrlstringhttps://x.com/WordPress
youtubeUrlstringhttps://www.youtube.com/wordpress
tiktokUrlstringhttps://www.tiktok.com/@wordpress
pinterestUrlstringhttps://www.pinterest.com/acmeshop/
githubUrlstringhttps://github.com/arduino
telegramUrlstringhttps://t.me/acmeshop
whatsappUrlstringhttps://wa.me/message/ABCDEFGHIJKLM
networksstringlinkedin, facebook, instagram, x, youtube, tiktok
socialLinkCountinteger6
socialLinksarray[{"network": "github", "url": "https://github.com/apify", "source":…
pagesReadinteger1
checkedAtstring2026-10-19T07:33:19.158Z

Example rows

Two real rows from a run (long texts shortened here, complete in the dataset):

[
{
"id": "wordpress.org",
"domain": "wordpress.org",
"inputUrl": "wordpress.org",
"url": "https://wordpress.org/",
"statusCode": 200,
"siteTitle": "Blog Tool, Publishing Platform, and CMS – WordPress.org",
"language": "en-US",
"siteName": "WordPress.org",
"organizationName": "WordPress",
"logoUrl": "https://s.w.org/style/images/about/WordPress-logotype-wmark.png",
"faviconUrl": "https://s.w.org/images/wmark.png",
"appleTouchIconUrl": "https://s.w.org/images/wmark.png",
"ogImageUrl": "https://wordpress.org/files/2024/04/wordpress-homepage-ogimage-202404.png",
"themeColor": null,
"linkedinUrl": "https://www.linkedin.com/company/wordpress",
"facebookUrl": "https://www.facebook.com/WordPress",
"instagramUrl": "https://www.instagram.com/wordpress/",
"xUrl": "https://x.com/WordPress",
"youtubeUrl": "https://www.youtube.com/wordpress",
"tiktokUrl": "https://www.tiktok.com/@wordpress",
"pinterestUrl": null,
"githubUrl": null,
"telegramUrl": null,
"whatsappUrl": null,
"networks": "linkedin, facebook, instagram, x, youtube, tiktok",
"socialLinkCount": 6,
"socialLinks": [
{
"network": "linkedin",
"url": "https://www.linkedin.com/company/wordpress",
"source": "footer",
"foundOnUrl": "https://wordpress.org/"
},
{
"network": "facebook",
"url": "https://www.facebook.com/WordPress",
"source": "schema",
"foundOnUrl": "https://wordpress.org/"
},
{
"network": "instagram",
"url": "https://www.instagram.com/wordpress/",
"source": "footer",
"foundOnUrl": "https://wordpress.org/"
},
"… 3 more"
],
"pagesRead": 1,
"checkedAt": "2026-10-19T07:51:56.942Z"
},
{
"id": "arduino.cc",
"domain": "arduino.cc",
"inputUrl": "arduino.cc",
"url": "https://www.arduino.cc/",
"statusCode": 200,
"siteTitle": "Arduino - Home",
"language": "en",
"siteName": "Arduino",
"organizationName": "Arduino",
"logoUrl": "https://www.arduino.cc/images/logo.jpg",
"faviconUrl": "https://cdn.arduino.cc/header-footer/prod/assets/favicon-arduino/favicon.ico",
"appleTouchIconUrl": null,
"ogImageUrl": "https://www.datocms-assets.com/150482/1742470244-logo.png",
"themeColor": "#00979d",
"linkedinUrl": "https://www.linkedin.com/company/arduino",
"facebookUrl": "https://www.facebook.com/official.arduino",
"instagramUrl": "https://www.instagram.com/arduino.cc/",
"xUrl": "https://x.com/arduino",
"youtubeUrl": null,
"tiktokUrl": null,
"pinterestUrl": null,
"githubUrl": "https://github.com/arduino",
"telegramUrl": null,
"whatsappUrl": null,
"networks": "linkedin, facebook, instagram, x, github",
"socialLinkCount": 5,
"socialLinks": [
{
"network": "linkedin",
"url": "https://www.linkedin.com/company/arduino",
"source": "schema",
"foundOnUrl": "https://www.arduino.cc/"
},
{
"network": "facebook",
"url": "https://www.facebook.com/official.arduino",
"source": "schema",
"foundOnUrl": "https://www.arduino.cc/"
},
{
"network": "instagram",
"url": "https://www.instagram.com/arduino.cc/",
"source": "schema",
"foundOnUrl": "https://www.arduino.cc/"
},
"… 2 more"
],
"pagesRead": 1,
"checkedAt": "2026-10-19T07:52:06.473Z"
}
]

Results can be downloaded as JSON, CSV, Excel, XML or HTML from the Dataset tab, or read through the Apify API.

Results of Website Social Links Finder: Company Profiles API in the Apify dataset view

The actor looks at every link of the page and keeps a link only when it is the profile of an account on one of the ten networks. The shapes it accepts and the shapes it drops:

NetworkKeptDropped
LinkedIn/company/, /school/ and /showcase/ pages/in/ and /pub/ member pages, share links, feed and sales links
Facebooka page by name, profile.php?id= and /pages/Name/ID addresses, a page's about tab/people/ pages, posts, photos, events, groups, share, dialog and plugin links
Instagraminstagram.com/nameposts, reels, stories, explore and tag pages
Xx.com/name and twitter.com/name, follow buttons (intent/follow?screen_name=)tweets, lists, share and tweet buttons, home?status= links
YouTube@handle, /channel/, /c/ and plain channel names/user/ links, videos, playlists, embeds, shorts, youtu.be links
TikToktiktok.com/@namevideo links
Pinterestpinterest.com/name (any country domain)pins, search and the pin-it button
GitHubgithub.com/name and github.com/orgs/namerepositories and product pages
Telegramt.me/name, the web preview of a channel, + and joinchat invitesshare links, stickers, bot and proxy links
WhatsAppwa.me/message/… and wa.me/qr/… business links, channels and group invitesevery link that contains a phone number: wa.me/<number>, wa.me/c/<number>, api.whatsapp.com/send?phone=

The shortened fb.me and instagr.am addresses are read as Facebook and Instagram. Links to other networks, to Wikipedia, to rating sites and to the site's own pages are ignored.

Where on the page a link sits matters, because team pages, author boxes and partner lists link to accounts that are not the organisation's:

  • Always used: links in the footer and the header, the sameAs list of the organization in the page data, the twitter:site and article:publisher tags and rel="me" links.
  • Body of the first page: used only when the page shows fewer than three accounts of that network. Three or more different accounts of one network in the body text are taken for a team, partner or directory list and left out.
  • Contact and about pages: only the footer, the header, the page data and the meta tags are used, never the body text, because those pages often list team members with their own accounts.

Brand assets, where each one comes from

  • siteName: the og:site_name tag, else the name of the organization in the page data, else the name of the website there, else the application-name tag. organizationName is the organization name in the page data alone.
  • logoUrl: the logo in the organization's page data, else the og:logo tag, else the first image whose class, id, alt text or file name says "logo" in the page header (partner, client and sponsor logo strips are skipped). A logo drawn inline as SVG code has no address, so the column is null.
  • faviconUrl: the largest icon the page declares with rel="icon"; appleTouchIconUrl is the largest apple-touch-icon. Nothing is guessed: a site that declares no icon gets null.
  • ogImageUrl: the og:image tag, else twitter:image. themeColor: the theme-color tag.

Pricing

Pay per result. You pay for each website read and delivered to your dataset, nothing else: no subscription, no minimum, no charge for websites that could not be read (anti-bot page, robots.txt, not found, errors), for invalid or repeated entries, or for websites skipped by Only new rows because they were delivered before. A website that was read and shows no profile link is delivered, with null columns, and counted as one result.

Your Apify planPrice per 1,000 rowsPrice per row
Free plan$1.80$0.0018
Starter plan$1.55$0.00155
Scale plan$1.40$0.0014
Business plan and above$1.20$0.0012

Example: 1,000 websites cost $1.80 on the Free plan and $1.20 on the Business plan. Platform usage of the run (compute and storage) is included in that price and is not billed to you separately; the actor runs in 256 MB and spends most of its time waiting between requests. A start event of $0.00005 is charged once per run (Apify default). Cap your spend: set Maximum total charge in the run options. The actor stops cleanly when the cap is reached and you keep everything delivered until then. The run summary (RUN_SUMMARY in the key-value store) says why a run stopped.

Automation: only new rows, notifications, schedules

Only new rows since the last run. Turn on onlyNew and the actor remembers every website it delivered to you (in a key-value store named rowcraft-website-social-links-finder-state in your Apify account). The next run with the same stateName skips those websites before reading them, so you pay only for websites that are new in your list. The first run delivers every website it can read. Use a different stateName for each list so they keep separate memories. Because a website is delivered only once, delete the state record, or use a new stateName, when you want to read the same websites again.

Notification when the run ends. Put a webhook address in notifyUrl and the actor sends one JSON POST with the number of delivered rows, links to the dataset (JSON and CSV) and the run. It works with Slack and Discord incoming webhooks (the message is in text and content), with Make, n8n and Zapier catch hooks, and with your own endpoint. By default it is sent only when at least one row was delivered; notifyWhenEmpty sends it every time.

Schedules. Create a schedule in Apify Console (daily, weekly, monthly or cron) with onlyNew on and a list that grows, and each run enriches only the new websites.

Integrations. Send the results to Make, n8n, Zapier, Google Sheets, Slack, Google Drive, Airtable or any webhook from the Integrations tab of the Actor, with no code.

API, SDKs and AI agents. Every run is available through the Apify API and the official JavaScript and Python clients; the Actor can also be called by AI agents through the Apify MCP server. The example input in the API tab is a working call.

Use cases

  • CRM and lead-list enrichment: add the company LinkedIn, Facebook and Instagram pages to a list of company domains, then use them for account research, ad audiences or outreach planning.
  • Business directories and marketplaces: fill the profile, logo and social links of listed companies from their own sites instead of asking each company to type them in.
  • Brand and competitor monitoring: keep the official accounts of a set of brands in one table, with the logo and theme colour next to them.
  • Social listening setup: build the list of accounts to follow for a market, a customer list or a set of suppliers, from the sites those companies run.
  • Media and agency work: collect the logos, share images and profile links of the companies in a report, a pitch or a press list.
  • Quality checks: find the websites of a portfolio that show no social profile at all, or that link to a different Facebook page than the one on file.

Ready-made examples, each with the input filled in (open one and press Start, or save it as your own task):

What this actor does not do

  • Collect contacts: no e-mail addresses, phone numbers or names of people, no personal profiles, and no mailto:, tel: or sms: links.
  • Visit social networks: it never opens a profile, so it does not check that an account exists, count followers or read posts.
  • Crawl a website: at most the page you give plus a contact page and an about page that it links to, and never a guessed address, a sitemap or the whole site.
  • Run JavaScript, log in, accept cookie banners, use proxies or solve CAPTCHAs: websites that answer with an anti-bot page are reported as blocked and not charged, and links that a page adds only with JavaScript are not seen.
  • Tell a company account from a personal one on networks that use plain names (Instagram, Telegram, GitHub, Facebook): it returns the account that the company's own website links as its profile.

Limits and fair use

  • One request per second by default (minimum 250 ms). A website takes two to four requests: robots.txt, the first page and up to two more pages. In our test runs that came to about two to five seconds per website, roughly 1,000 websites an hour.
  • What is in the HTML only. The actor reads the page as the server sends it, without running JavaScript. A footer that a script adds after the page loads is not seen, and such a site comes back as a row with empty network columns.
  • Anti-bot pages. Websites behind a bot challenge (Cloudflare, Akamai, DataDome and similar) are reported as blocked and not charged. After 10 blocked websites in a row the run stops and says why in the run summary, because the rest of the list would most likely be blocked too.
  • robots.txt is obeyed for every address the visit touches, including redirect targets and the contact and about pages. If robots.txt disallows the page you gave, the website is robots_disallowed; if it disallows only the contact page, that page is skipped and the row is still delivered. If robots.txt answers with a server error the site is not read, as the robots.txt standard (RFC 9309) requires.
  • Page size: the first 3 MB of a page are read; larger pages are cut there and counted in the run summary.
  • Up to 100,000 websites per run. The run stops 90 seconds before its timeout with the summary, the coverage and the Only new rows memory saved; for long lists raise the timeout or split the list.

Data source and licence

The data is what each website sends to every visitor: the HTML of the page you give and, when contact and about pages are read, of those pages. The actor reads each page once, as a browser does on a first visit, after checking robots.txt, and keeps only the addresses of the profile links, the brand asset addresses and a few short texts (page title, site name, language). Page text, images and e-mail or phone details are not stored or delivered. The images themselves are not downloaded: logoUrl, faviconUrl and ogImageUrl are addresses, and the rights to the images stay with the site that owns them.

The page data that the actor reads follows the public schema.org vocabulary (Organization, sameAs, logo) and the Open Graph tags (og:site_name, og:image).

Rowcraft is independent: this actor is not provided, endorsed or authorised by the websites it reads or by the social networks and companies it names. Product names and trademarks belong to their owners and are used only to say which network a link points to.

Privacy: no personal data

Rowcraft actors are built not to collect personal data:

  • Only the pages you give, and at most two more pages of the same website, are read; the row holds addresses of company profiles, brand asset addresses, the page title, the site name and the language.
  • Links with a person behind them are dropped: LinkedIn member pages, YouTube /user/ pages, WhatsApp links that contain a phone number, mailto:, tel: and sms: links, and share buttons. The data of people named in the page data of a site (founders, contact points, e-mail and phone fields) is never read.
  • An e-mail address or phone number inside the page title or the site name is removed, and a link that would contain one is left out.
  • The actor sends no cookies, fills no forms and never logs in.

You are responsible for using the data in line with the law that applies to you.

Other Rowcraft actors

All Rowcraft actors read official or public sources, deliver flat rows without personal data and support only-new runs and notifications:

FAQ

Which networks does it find? LinkedIn (company, school and showcase pages), Facebook, Instagram, X (Twitter), YouTube, TikTok, Pinterest, GitHub, Telegram and WhatsApp business links, each in its own column, and all of them in socialLinks.

Does it visit the social networks? No. It reads the website you give and takes the links from its HTML. It never opens a profile, so the result says what the site links to, not whether the account is active.

Which links are left out? Everything that is not an organisation account: LinkedIn member pages (/in/), posts, photos and events, share and tweet buttons, YouTube /user/ links, mailto:, tel: and sms: links, and WhatsApp links that contain a phone number. The table "How the profile links are chosen" lists the exact shapes.

Why does a profile I can see on the website not appear? The actor reads the HTML of the page, without running JavaScript. A footer or icon bar that a script builds after the page loads is not in that HTML. The profile may also be on a page other than the first page, the contact page and the about page, or sit in the body text of a contact or about page, which is never used: set Also read contact and about pages to Always, or give the address of the page that shows the links as the first page.

Why does a row have no profile links at all? The website was read, but its HTML shows none of the accepted profile links: it has no social accounts, links only to share buttons, builds its footer with JavaScript, or sits behind a plain page without links. That is a real answer and is delivered, and charged, as one row. Websites that could not be read are not delivered and not charged.

Why is the result empty? Every website in the list could not be read, or was skipped. The COVERAGE record gives the reason per website: an anti-bot page (blocked), robots.txt (robots_disallowed), no website at that address (not_found), an invalid entry or a connection problem (error), or a website delivered in an earlier run with Only new rows on (already_delivered). Nothing is charged for those, apart from the start event.

Is it legal? The actor reads the public pages of a website the way a visitor does, obeys robots.txt and collects company profile addresses, not personal data or page content. Whether and how you may use the results (for example for marketing or outreach) depends on the law that applies to you.

Does it collect personal data? No personal data: no e-mail addresses, phone numbers, people's names or personal profile links. See the Privacy section.

Do I pay for websites that block the actor? No. Blocked, robots-disallowed, not found and invalid entries are never charged, and neither are duplicates in your list or websites skipped by Only new rows.

What if a site links two Facebook pages or two Instagram accounts? The column holds the best-ranked link (page data and meta tags first, then the footer, the header and the rest of the page, in reading order), and socialLinks lists both with their source, so you can choose.

Can I give full URLs instead of domains? Yes. A domain means its home page; a full address means that page is read first, for example a /contact or /about page that you know shows the links. The row is identified by the domain, so two addresses on the same domain count as one website.

Does it return the e-mail address or phone number of the company? No, on purpose. Rowcraft actors deliver no contact details.

How does Only new rows work here? The actor remembers the domain of each website delivered to you. The next run with the same state name skips those websites before reading them, so a growing list costs only its new entries.

Support and reviews

Problems, missing fields, questions: open an issue on the Issues tab of this Actor. We answer within one working day and fix confirmed bugs in the next release; the changelog lists every change.

If this Actor saved you time, a short review on its page helps other users find it and helps us keep improving it.