# Website Social Links Finder: Company Profiles API (`rowcraft/website-social-links-finder`) Actor

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.

- **URL**: https://apify.com/rowcraft/website-social-links-finder.md
- **Developed by:** [Rowcraft](https://apify.com/rowcraft) (community)
- **Categories:** Lead generation, Social media, Marketing
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 website profiles

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Website Social Links Finder: Company Profiles API

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](https://api.apify.com/v2/key-value-stores/7hbQFQdGq61v2OZ2h/records/website-social-links-finder-input.png)

### 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

| Field | What it does |
|---|---|
| `websites` | Domains (`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. |
| `extraPages` | `whenFew` (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. |
| `maxItems` | Stop after this many delivered rows. 0 = the whole list. |
| `onlyNew`, `stateName` | Deliver a website only the first time, then skip it in later runs with the same state name |
| `notifyUrl`, `notifyWhenEmpty` | A webhook that receives one message when the run ends; see **Automation** below |
| `requestIntervalMs` | Pause between requests, default 1000 ms, minimum 250 ms |

Example: three websites, one row each.

```json
{
  "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.

```json
{
  "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.

| Field | Type | Example |
|---|---|---|
| `id` | string | wordpress.org |
| `domain` | string | wordpress.org |
| `inputUrl` | string | wordpress.org |
| `url` | string | `https://wordpress.org/` |
| `statusCode` | integer | 200 |
| `siteTitle` | string | Blog Tool, Publishing Platform, and CMS – WordPress.org |
| `language` | string | en-US |
| `siteName` | string | WordPress.org |
| `organizationName` | string | WordPress |
| `logoUrl` | string | `https://s.w.org/style/images/about/WordPress-logotype-wmark.png` |
| `faviconUrl` | string | `https://s.w.org/images/wmark.png` |
| `appleTouchIconUrl` | string | `https://s.w.org/images/wmark.png` |
| `ogImageUrl` | string | `https://wordpress.org/files/2024/04/wordpress-homepage-ogimage-2024…` |
| `themeColor` | string | #00979d |
| `linkedinUrl` | string | `https://www.linkedin.com/company/wordpress` |
| `facebookUrl` | string | `https://www.facebook.com/WordPress` |
| `instagramUrl` | string | `https://www.instagram.com/wordpress/` |
| `xUrl` | string | `https://x.com/WordPress` |
| `youtubeUrl` | string | `https://www.youtube.com/wordpress` |
| `tiktokUrl` | string | `https://www.tiktok.com/@wordpress` |
| `pinterestUrl` | string | `https://www.pinterest.com/acmeshop/` |
| `githubUrl` | string | `https://github.com/arduino` |
| `telegramUrl` | string | `https://t.me/acmeshop` |
| `whatsappUrl` | string | `https://wa.me/message/ABCDEFGHIJKLM` |
| `networks` | string | linkedin, facebook, instagram, x, youtube, tiktok |
| `socialLinkCount` | integer | 6 |
| `socialLinks` | array | \[{"network": "github", "url": "https://github.com/apify", "source":… |
| `pagesRead` | integer | 1 |
| `checkedAt` | string | 2026-10-19T07:33:19.158Z |

#### Example rows

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

```json
[
  {
    "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](https://api.apify.com/v2/key-value-stores/7hbQFQdGq61v2OZ2h/records/website-social-links-finder-results.png)

#### How the profile links are chosen

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:

| Network | Kept | Dropped |
|---|---|---|
| LinkedIn | `/company/`, `/school/` and `/showcase/` pages | `/in/` and `/pub/` member pages, share links, feed and sales links |
| Facebook | a 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 |
| Instagram | `instagram.com/name` | posts, reels, stories, explore and tag pages |
| X | `x.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 |
| TikTok | `tiktok.com/@name` | video links |
| Pinterest | `pinterest.com/name` (any country domain) | pins, search and the pin-it button |
| GitHub | `github.com/name` and `github.com/orgs/name` | repositories and product pages |
| Telegram | `t.me/name`, the web preview of a channel, `+` and `joinchat` invites | share links, stickers, bot and proxy links |
| WhatsApp | `wa.me/message/…` and `wa.me/qr/…` business links, channels and group invites | every 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 plan | Price per 1,000 rows | Price 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):

- [Social media profiles of open source project websites](https://apify.com/rowcraft/website-social-links-finder/examples/social-media-profiles-of-open-source-projects)
- [Instagram, Facebook and TikTok pages of online store brands](https://apify.com/rowcraft/website-social-links-finder/examples/social-profiles-of-online-store-brands)

### 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:

- [Ashby Jobs Scraper – Job Postings with Salary Ranges](https://apify.com/rowcraft/ashby-jobs-scraper) — Job postings from Ashby job boards (jobs.ashbyhq.com) by company: title, department, team, locations with country, employment and workplace type, published salary range, full text.
- [Broken Link Checker – Find 404s and Dead Links API](https://apify.com/rowcraft/broken-link-checker) — Pay per crawled page, not per link: crawl a site within robots.txt and check every link on each page for 404s, 5xx errors, DNS and TLS failures and redirects.
- [Bulk Image Downloader API: Save Page Images with Sizes](https://apify.com/rowcraft/bulk-image-downloader) — Download the images of any web pages, or direct image links, into a key-value store with width, height, format, size and a download link per file.
- [Career Site Jobs Scraper: Greenhouse, Lever, Ashby, Workday](https://apify.com/rowcraft/career-site-jobs-scraper) — Job listings from the career pages of the companies you choose on Greenhouse, Lever, Ashby, Workday, Workable, Personio, Recruitee, Teamtailor and Gem, in one run and one format: title, locations, department, salary when published, full text.
- [Chrome Web Store Scraper: Users, Ratings & Versions](https://apify.com/rowcraft/chrome-web-store-scraper) — Reads public Chrome Web Store listing pages with no login, no proxy and no personal data: users, rating, category, version, update date, permissions and company developers.
- [Domain Email and DNS Checker API: MX, SPF, DMARC, Providers](https://apify.com/rowcraft/domain-email-dns-checker) — Find which email provider, sending services and DNS host each domain uses, from public DNS records only.
- [SIRENE France Company Scraper: SIREN, NAF, Revenue, Status](https://apify.com/rowcraft/france-company-register) — French companies from the official Recherche d'entreprises API (INSEE SIRENE + INPI): SIREN and SIRET, legal form, NAF activity, head-office address, employee band, revenue and net income, labels, creation date and VAT number.
- [France Fuel Prices Scraper – Official Open Data by Station](https://apify.com/rowcraft/france-fuel-prices-scraper) — Current fuel prices at every French station, straight from the official open-data feed (Licence Ouverte 2.0): gazole, SP95, SP98, E10, E85 and GPLc, each with its update time.
- [Gem Jobs Scraper – Job Board Listings from jobs.gem.com](https://apify.com/rowcraft/gem-jobs-scraper) — Job listings from Gem job boards (jobs.gem.com) by company: title, department, offices with country, employment type, remote, hybrid or on-site, requisition ID, publication date and full ad text, from the public Gem Job Board API.
- [Google Play Apps Scraper: App Details, Installs, Ratings](https://apify.com/rowcraft/google-play-apps-scraper) — Public Google Play app details as flat rows: installs, rating, number of ratings, price, version, last update, minimum Android, ads and in-app purchases.
- [Greenhouse Jobs Scraper – Job Listings by Company Board](https://apify.com/rowcraft/greenhouse-jobs-scraper) — Job listings from Greenhouse job boards by company: title, departments, offices, publication date, full ad text, published pay ranges.
- [Hacker News Scraper API: Top, New, Best, Ask, Show Stories](https://apify.com/rowcraft/hacker-news-scraper) — Read Hacker News stories from the official Firebase API: top, new, best, Ask HN, Show HN and job lists with score, comments, domain and age.
- [Himalayas Jobs Scraper: Remote Jobs API with Salaries](https://apify.com/rowcraft/himalayas-jobs-scraper) — Remote jobs from Himalayas through its public jobs API: title, company, salary range, seniority, categories, the countries and time zones open to candidates, full description and job link.
- [Image to Text OCR API: Extract Text from Images in Bulk](https://apify.com/rowcraft/image-ocr-text-extractor) — Read the text in images given by link or found on web pages, with a local OCR engine and no third-party API.
- [KRS Poland Companies Scraper: Register Data, PKD, Status](https://apify.com/rowcraft/krs-poland-companies) — Polish companies from the official KRS register API of the Ministry of Justice: name, KRS, NIP and REGON numbers, legal form, status, address, PKD activity codes, share capital, branches and registration dates.
- [LEI Records Scraper: Legal Entity Identifier Lookup API](https://apify.com/rowcraft/lei-records-scraper) — Legal Entity Identifier (LEI) records from the Global LEI Index, read through the public GLEIF API: legal name, legal form, register number, addresses, status, renewal date and parent companies.
- [Lever Jobs Scraper – Job Postings from jobs.lever.co](https://apify.com/rowcraft/lever-jobs-scraper) — Job postings from Lever career pages (jobs.lever.co) by company: title, team, department, location, commitment, workplace type, salary range when published, description, requirements and benefits.
- [Lighthouse Audit API: Core Web Vitals and Performance Scores](https://apify.com/rowcraft/lighthouse-performance-audit) — Run Lighthouse on any public page and get Performance, Accessibility, Best Practices and SEO scores, lab Core Web Vitals and the biggest savings.
- [Norway Company Register Scraper: Brønnøysund Business Data](https://apify.com/rowcraft/norway-company-register-scraper) — Norwegian companies from the Central Coordinating Register for Legal Entities (Brønnøysund, NLOD open data): organisation number, legal form, industry, employees, share capital, addresses, website, VAT and bankruptcy status.
- [PDF Text Extractor: Text, Pages and Metadata from PDF Links](https://apify.com/rowcraft/pdf-text-extractor) — Get the text of every PDF you link, page by page, with page count, language and word count.
- [Personio Jobs Scraper: Job Listings, Salaries, Departments](https://apify.com/rowcraft/personio-jobs-scraper) — Job ads from any company's Personio careers feed: title, department, office, employment type, schedule, seniority, salary when published, keywords and the full description in the language you choose.
- [Platsbanken Scraper: Sweden Jobs, Employers, Org Numbers](https://apify.com/rowcraft/platsbanken-jobs-scraper) — Every job ad on Platsbanken (Arbetsförmedlingen) from the official JobTech API: headline, employer and organisation number, occupation codes, municipality, coordinates, salary type, deadline and full text.
- [Recruitee Jobs Scraper – Job Listings by Company Career Site](https://apify.com/rowcraft/recruitee-jobs-scraper) — Job listings from Recruitee career sites by company: title, department, locations with country, employment type, remote flag, published salary and full text, one request per company.
- [Remote Jobs Aggregator API: RemoteOK, WeWorkRemotely, Jobicy](https://apify.com/rowcraft/remote-jobs-aggregator) — Remote jobs from RemoteOK, We Work Remotely and Jobicy in one clean list, read from their official feeds and APIs, merged without duplicates.
- [Robots.txt and AI Crawler Access Checker API](https://apify.com/rowcraft/robots-ai-crawler-checker) — Check which AI and search crawlers a website lets in: GPTBot, ClaudeBot, PerplexityBot, Google-Extended and more, read from robots.txt by the RFC 9309 rules.
- [RSS Feed Finder and Reader – Blog and News Article API](https://apify.com/rowcraft/rss-feed-finder-reader) — Find the RSS, Atom and JSON feeds of any website and read their newest articles, from a domain name alone.
- [SEO Audit Tool: Titles, Meta Tags, Headings and Links API](https://apify.com/rowcraft/seo-audit-tool) — Audit the on-page SEO of any list of pages or websites: titles, meta descriptions, headings, canonicals, indexing, links, images and structured data, with a score and the issues found per page.
- [Shopify Products Scraper: Store Catalog Export to JSON, CSV](https://apify.com/rowcraft/shopify-products-scraper) — Products from any Shopify store's public catalog: title, vendor, type, tags, description, variants with price, compare-at price, SKU and stock, images, options, store currency.
- [Sitemap URL Extractor: Every Page with Last-Modified Dates](https://apify.com/rowcraft/sitemap-url-extractor) — Get every page a site lists in its sitemaps, with last-modified dates, from robots.txt through sitemap indexes and .gz files.
- [SSL Certificate and Security Headers Checker API](https://apify.com/rowcraft/ssl-security-headers-checker) — Check the TLS certificate and the HTTP security headers of every domain in one run, with an A+ to F grade and the exact issues to fix.
- [Store Products Scraper – Shopify, WooCommerce, VTEX](https://apify.com/rowcraft/store-products-scraper) — Export the product catalogue of any Shopify, WooCommerce or VTEX store from its public catalogue endpoint: title, brand, prices, discounts, stock, categories, images and links, one row per product, the same columns on every platform.
- [Structured Data Extractor: JSON-LD, Schema.org, Open Graph](https://apify.com/rowcraft/structured-data-extractor) — Pull the schema.org JSON-LD, Microdata, RDFa and Open Graph of any page list into flat rows: types, product price, availability, ratings, organization, breadcrumbs, with validation issues.
- [Teamtailor Jobs Scraper – Career Site Jobs by Company](https://apify.com/rowcraft/teamtailor-jobs-scraper) — Job listings from Teamtailor career sites by company: title, department, role, locations with city and country, remote or hybrid status, publication date and full ad text, from the official job feed.
- [TED Tenders Scraper: EU Public Procurement Notices API](https://apify.com/rowcraft/ted-tenders-scraper) — EU public procurement notices from TED (Tenders Electronic Daily), the official EU tenders portal, through its public Search API: title, buyer, country, CPV codes, values, deadlines, lots and document links.
- [UK Companies House Scraper: Company Search & Profiles API](https://apify.com/rowcraft/uk-companies-house-scraper) — UK companies from the official Companies House API with your free key: search by name, status, type, SIC code, date or location, or look up company numbers.
- [UK Tenders Scraper: Find a Tender + Contracts Finder API](https://apify.com/rowcraft/uk-tenders-scraper) — UK public procurement notices from Find a Tender and Contracts Finder, the official UK government portals, through their open OCDS APIs: title, buyer, region, CPV codes, values, deadlines, notice type and links.
- [Bulk URL Status and Redirect Chain Checker API](https://apify.com/rowcraft/url-status-redirect-checker) — Check the status code, redirect chain, canonical and indexing signals of every URL in a list, with the final destination and a loop flag.
- [Video Frame Extractor: Thumbnails and Frames from Video URLs](https://apify.com/rowcraft/video-frame-extractor) — Extract JPG, PNG or WebP frames from direct video links (MP4, WebM, MOV, MKV, OGV): evenly spaced, every N seconds, at exact times or at scene changes.
- [VTEX Products Scraper – Public Catalog Export](https://apify.com/rowcraft/vtex-products-scraper) — Export the catalogue of any VTEX store (Auchan, Chedraui and thousands of retailers in Europe and Latin America) from its public search endpoint: title, brand, EAN, prices, list prices, stock, categories, specifications and images, one row per product.
- [Website Intelligence API: Tech, Social, SSL, DNS Profile](https://apify.com/rowcraft/website-intelligence-profiler) — One row per domain with the whole website profile: technologies, social profile links, logo and brand assets, SSL expiry, DNS and mail providers, sitemap size, robots.txt and llms.txt.
- [Website to Markdown Extractor: Clean Text for LLMs and RAG](https://apify.com/rowcraft/website-markdown-extractor) — Turn a list of web page addresses into clean Markdown and plain text for LLMs and RAG: the main content only, with headings, links, images and tables.
- [Website Screenshot API: Full-Page PNG, JPEG and PDF Captures](https://apify.com/rowcraft/website-screenshot-api) — Capture full-page or viewport screenshots of any public web page as PNG, JPEG or WebP, with an optional A4 PDF.
- [Website Tech Stack Detector – Technology Lookup API](https://apify.com/rowcraft/website-tech-stack-detector) — Find the technologies behind a list of websites: CMS, e-commerce platform, analytics, tag managers, ad pixels, consent tools, chat, CDN and payments, from one polite home-page request per domain.
- [WooCommerce Products Scraper – Store API Export](https://apify.com/rowcraft/woocommerce-products-scraper) — Export every product of a WooCommerce store through its public Store API: title, SKU, prices and sale prices, stock, categories, tags, attributes, ratings, images and links, one row per product.
- [Workable Jobs Scraper: Job Listings from Career Pages](https://apify.com/rowcraft/workable-jobs-scraper) — Job listings from any company's Workable career page: title, department, location, remote or on-site, employment type, description, requirements, benefits and salary when published.
- [Workday Jobs Scraper – Jobs from myworkdayjobs.com Sites](https://apify.com/rowcraft/workday-jobs-scraper) — Job listings from Workday career sites (myworkdayjobs.com) by company: title, locations, country, posting date, time type, requisition ID and the full description.

### 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.

# Changelog

This Actor's version history is a separate document: https://apify.com/rowcraft/website-social-links-finder/changelog.md

# Actor input Schema

## `websites` (type: `array`):

Websites to check, one per line: a domain (example.com) or the address of the page to read (https://example.com/contact). A bare domain means its home page. One row per website; duplicates and invalid entries are skipped and never charged.

## `extraPages` (type: `string`):

Profile links are often only in the footer or on the contact page. "When the first page shows few profiles" reads up to two more pages of the same website (a contact page and an about page that the first page links to) when fewer than three networks were found. "Always" reads them for every website; "Never" reads one page only.

## `maxItems` (type: `integer`):

Stop after this many rows are delivered. 0 = the whole list.

## `onlyNew` (type: `boolean`):

Remember the rows already delivered to you (in a key-value store in your Apify account) and deliver only rows that appeared since the last run with the same state key. The first run delivers everything that matches; later runs cost only the new rows. Ideal for schedules.

## `stateName` (type: `string`):

Name of the memory used by "Only new rows". Use a different name for each schedule or search (for example `stockholm-python`) so they do not share one memory.

## `notifyUrl` (type: `string`):

A webhook address that receives one JSON POST with the number of new rows and links to the dataset: a Slack or Discord incoming webhook, a Make, n8n or Zapier catch hook, or your own endpoint. The message is also in the `text` (Slack) and `content` (Discord) fields.

## `notifyWhenEmpty` (type: `boolean`):

By default the notification is sent only when at least one row was delivered.

## `requestIntervalMs` (type: `integer`):

Default 1000 ms (one request per second). Each website takes two to four requests: robots.txt, the page, and up to two more pages when contact and about pages are read. Minimum 250.

## Actor input object example

```json
{
  "websites": [
    "wordpress.org",
    "blender.org",
    "arduino.cc"
  ],
  "extraPages": "whenFew",
  "maxItems": 0,
  "onlyNew": false,
  "stateName": "default",
  "notifyWhenEmpty": false,
  "requestIntervalMs": 1000
}
```

# Actor output Schema

## `results` (type: `string`):

One row per website with its profile links and brand assets, in the default dataset (JSON, CSV, Excel and other formats via the dataset API).

## `runSummary` (type: `string`):

Counts, how many websites showed profile links, warnings and why the run stopped (RUN_SUMMARY record in the default key-value store).

## `coverage` (type: `string`):

One line per website you asked for: ok, blocked, robots_disallowed, not_found, error, already_delivered or not_checked, with the reason (COVERAGE record).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "websites": [
        "wordpress.org",
        "blender.org",
        "arduino.cc"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("rowcraft/website-social-links-finder").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "websites": [
        "wordpress.org",
        "blender.org",
        "arduino.cc",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("rowcraft/website-social-links-finder").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "websites": [
    "wordpress.org",
    "blender.org",
    "arduino.cc"
  ]
}' |
apify call rowcraft/website-social-links-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rowcraft/website-social-links-finder"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1bdqb5nNSMMrW1ae6/builds/aBnlo5w9NPGhMd5zL/openapi.json
