# Company Socials (Crosswalk) (`publicrecords/company-social-profile-finder`) Actor

Company socials from a website or name — LinkedIn, Instagram, Facebook, X, TikTok, YouTube & more. Platform-verified. Enrich Maps & CRM leads. Orgs only.

- **URL**: https://apify.com/publicrecords/company-social-profile-finder.md
- **Developed by:** [Marc M](https://apify.com/publicrecords) (community)
- **Categories:** Lead generation, Social media, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Company Social Profiles & LinkedIn Finder — verified identity resolver

**Find a company's LinkedIn, Instagram, Facebook, X, TikTok, YouTube, GitHub, Google Maps and registry ids from its website or name. Every link verified from the platform side, with a confidence score and the evidence. One stable `canonicalId` to join any data on.**

Paste a domain, a profile URL, or a company name. Enrich a Google Maps, jobs or company-scraper dataset in one field. First lookups of well-known companies are free and instant.

Organizations and places only. Never people. Never guesses.

***

### Three ways in

**1. One company** — one input, one company. Use a domain (`query: "hubspot.com"`), a social handle (`ig:shopify`), a profile URL (`https://www.linkedin.com/company/stripe`), a ticker (`ticker:NET`), or a local name (`"Acme Plumbing, Toronto"`). Those are alternate *input shapes*, each resolving its own company — HubSpot ≠ Shopify ≠ Acme Plumbing. Compact output by default: a few hundred bytes, perfect for agents and Zapier steps.

**2. A list** — `queries` (up to 5,000). Export as CSV; identifiers land in columns.

**3. Another Actor's dataset** — `inputDatasetId` from any Google Maps, LinkedIn jobs or company scraper run. The website field is auto-detected, every original field passes through, and the result is attached as `crosswalk`. This is the fastest way to add LinkedIn and social ids to a lead list you already have.

### What people use it for

**Find a company's LinkedIn page from its website.** Give the domain; get the LinkedIn company URL only if LinkedIn's page points back at that domain. No name-search look-alikes, no subsidiaries by accident.

**Find a company's Instagram, Facebook, X, TikTok and YouTube from its website.** Corporate versus brand accounts are separated by evidence; each handle says whether the platform confirmed it.

**Company name to website and official profiles.** "Acme Plumbing, Toronto" → the place, its website, its verified profiles; ambiguous names return candidates, never a guess.

**Enrich Google Maps leads with LinkedIn and social profiles.** Point it at a Google Maps Scraper dataset; every row comes back with a verified identity block.

**Company identity resolution API for AI agents.** One `resolve` call before every other tool call, one stable `canonicalId` to join everything on, compact output that fits a tool-call turn.

### What comes back

```json
{ "type": "entity", "canonicalId": "org_3f0d…", "name": "HubSpot", "domain": "hubspot.com",
  "verificationLevel": "confirmed", "confidentLinks": 7, "confirmedLinks": 5,
  "identifiers": {
    "linkedin":  { "id": "company/hubspot", "url": "…", "confidence": 0.99, "verified": true },
    "instagram": { "id": "hubspot",         "url": "…", "confidence": 0.99, "verified": true },
    "facebook":  { "id": "hubspot",         "url": "…", "confidence": 0.99, "verified": true },
    "youtube":   { "id": "user/HubSpot",    "url": "…", "confidence": 0.99, "verified": true },
    "x":         { "id": "hubspot",         "url": "…", "confidence": 0.93, "verified": false },
    "tiktok":    { "id": "hubspot",         "url": "…", "confidence": 0.93, "verified": false },
    "wikidata":  { "id": "Q5926631",        "url": "…", "confidence": 0.99, "verified": true } },
  "declaredOnly": { "app_store": "1107711722", "google_play": "com.hubspot.android" },
  "registry": { "ticker": "HUBS", "sec_cik": "1404655" },
  "cache": "miss", "resolvedAt": "2026-09-17T15:26:34Z" }
```

`verified: true` means the platform itself points back at the company (a website field or outbound link). `confidence` is the belief the link is correct; treat ≥ 0.8 as usable. Set `outputFormat: full` for the evidence trail behind every link. `declaredOnly` holds links the company publishes that can't be verified from the platform side (Crunchbase, Glassdoor, Indeed, app stores); never counted, never billed.

**Company names.** Names resolve automatically only when exactly one candidate is unambiguous (an exact match with an official website, or a clear gap over the next). Otherwise you get a free `candidates` row: ranked organizations with their evidence and a `resolveWith` domain. Local businesses are found through Google Maps in the default mode.

**Change alerts.** Re-resolve a company you already know (`forceRefresh`, or `mode: reverify` on a schedule) and you get `identity_change` rows: `domain_changed`, `handle_changed`, `handle_added`, `handle_dropped`, `name_changed`, `place_changed`, `registry_added`. Route them to Slack or your CRM with a webhook.

### How links are verified

| `probeMode` | What happens |
|---|---|
| `auto` (default) | Free public endpoints where a platform serves them: GitHub, Wikidata, YouTube, LinkedIn, X, TikTok, Bluesky, Telegram, Yelp, Trustpilot. Instagram and Facebook are confirmed through the official Apify Store Actors under your account (a fraction of a cent per profile), capped by `actorProbesPerEntity` (2) and `actorProbesPerRun` (200). |
| `direct` | Free endpoints only; Instagram/Facebook links reported `not_attempted`. |
| `actors` | Every platform through Store Actors. |
| `declared` | Website only. |

Two declared sources: the organization's own website (schema.org, `rel=me`, meta tags, header/footer links) and Wikidata's human-curated profile properties for that website. When a site can't be read (blocked, JavaScript-only, robots-denied), Wikidata alone can still resolve it.

Confidence: schema.org `sameAs` or a Wikidata property starts at 0.85, a footer link at 0.75, a body link at 0.55. Platform confirmation via a website field or outbound link → 0.98; a bio mention → 0.90. A platform pointing elsewhere → 0.30, or an alternate domain when the site's declaration is strong and names agree. Name disagreement −0.20. Several candidates on one platform with no `sameAs` → capped at 0.70.

### Reliability contract

Every output is a verified fact with evidence or a typed diagnostic saying why not. Never a guess, never a silent empty dataset, never a charge for nothing, never a changed id. Confident-link precision is gated at ≥ 0.97 on a human-verified truth set for every release. Health checks run hourly; your graph is re-verified on a rolling schedule. Full text: `RELIABILITY.md`.

### Pricing

Pay per event. **Cache hits are free**, and the graph is pre-seeded with well-known companies, so most first lookups cost nothing. `entity-resolved` is charged for a fresh resolution with at least one confident link; `identity-change` per change event. Diagnostics, candidate lists, refused queries, health checks, exports and purges are never billed. Instagram/Facebook confirmations bill the Store Actor's price to your account. See `PRICING.md`.

### Use it from anywhere

MCP: add `https://mcp.apify.com?tools=publicrecords/company-social-profile-finder` to Claude, Cursor or any MCP client. Google Sheets `=CROSSWALK(A2, "linkedin")`, n8n, Zapier/Make, LangChain and CrewAI tools: see `integrations/`. Free web checker: `site/index.html`. Quickstart with curl, Node and Python: `QUICKSTART.md`.

### Operations built in

`mode: healthcheck` (hourly, fails on degradation), `mode: reverify` (daily rotating slices), `mode: seed` (pre-resolve lists, SEC, Wikidata), `mode: export`, `mode: forget` (full purge), `mode: buildSecIndex`.

### Frequently asked

**How do I find a company's LinkedIn page from its website?** Give Crosswalk the domain. It reads the profiles the company declares on its site and in Wikidata, then checks that the LinkedIn company page points back at the domain. You get the id, a confidence score and the evidence.

**How do I find a company's Instagram or Facebook page from its website?** Same input. Instagram and Facebook don't serve profiles to anonymous readers, so Crosswalk confirms them through the official Apify Store Actors under your account, a fraction of a cent per profile.

**Can I search by company name?** Yes, optionally with a city ("Acme Plumbing, Toronto"). A name resolves automatically only when one candidate is unambiguous; otherwise you get a free ranked list of candidates with evidence and pick one.

**How do I add LinkedIn and social ids to a Google Maps lead list?** Pass the Maps run's dataset id in `inputDatasetId`. The website column is auto-detected, every original column passes through, and the verified identity block is attached to each row.

**What is a canonicalId?** A stable id for the organization that never changes, even across a domain move. Join any scraper's output on it.

**Does it return people?** No. Person profiles and personal websites are refused. Organizations and places only.

**Is it an API? An MCP tool?** Both. Call it from the Apify API in any language, or add `https://mcp.apify.com?tools=publicrecords/company-social-profile-finder` to Claude, Cursor or any MCP client and your agent gets a `resolve company` tool with compact output.

**What does it cost?** Pay per resolved organization; cache hits are free and the graph is pre-seeded with well-known companies, so most first lookups cost nothing. Diagnostics and candidate lists are never billed.

**How accurate is it?** Every link carries confidence and evidence. Confident-link precision is measured weekly against an independent, human-curated truth set and gated at 0.97 per release. See `RELIABILITY.md`.

**What changes can it alert me to?** Domain moves, handle changes, new or dropped profiles, renames (rebrands), address changes, registry ids, and organizations whose website has gone dark.

### Works with

Google Maps Scraper, Google Maps Reviews Scraper, LinkedIn Jobs Scraper, LinkedIn Company Scraper, Instagram Profile Scraper, Facebook Pages Scraper, TikTok Profile Scraper, Website Content Crawler, any company or lead scraper on the Store, Google Sheets, n8n, Make, Zapier, Clay, LangChain, CrewAI, Claude, Cursor (MCP).

### Frequently asked

**Is this a LinkedIn scraper?** No. It reads what a company publishes about itself and confirms each profile from the platform's public page. It never logs in anywhere.

**Does it find people?** No. Person profiles and personal websites are refused at four independent layers.

**What if a company has several Instagram accounts?** All are returned; the one the site declares most strongly is primary and the rest are alternates with their own confidence.

**How accurate is it?** Every link carries confidence and evidence; confident-link precision is measured against an independent human-curated truth set and gated at 0.97 per release. Platform-confirmed links (`verified: true`) are the ones to rely on for automation.

**Can I use it in Google Sheets / n8n / Zapier / an AI agent?** Yes, see `integrations/`: a `=CROSSWALK()` function, an n8n workflow, a Zapier recipe, LangChain and CrewAI tools, and an MCP server URL.

**What does it cost for a 2,000-company list?** Cache hits are free; fresh resolutions are charged per organization; see `PRICING.md` for worked examples.

### Policies

`DATA_POLICY.md` (no people, no logins, no circumvention, role emails only, robots.txt honored on company sites), `SLO.md`, `TERMS.md`.

# Changelog

This Actor's version history is a separate document: https://apify.com/publicrecords/company-social-profile-finder/changelog.md

# Actor input Schema

## `query` (type: `string`):

One identifier or company name (for agents, Zapier/Make steps, quick checks). Output defaults to compact for a single query.

## `mode` (type: `string`):

resolve: resolve the queries (default). healthcheck: run the canary set and FAIL the run on degradation (schedule hourly; wire an alert to run failure). reverify: re-resolve slice k of n of the graph with change events (schedule daily). export: dump the whole graph to the dataset (no charges). forget: purge the organizations in forgetIds. buildSecIndex: build the SEC ticker/CIK ↔ domain index used to enrich public companies (run monthly). seed: pre-resolve organizations (list / SEC / Wikidata) so first-touch lookups are free cache hits.

## `queries` (type: `array`):

One per line. A website domain (acme.com), any organization or profile URL (https://www.instagram.com/acme, https://www.linkedin.com/company/acme), a prefixed handle (ig:acme, x:acme, tiktok:acme, yt:@acme, fb:acme, gh:acme), a Google Maps place ID (ChIJ…), an SEC CIK/ticker (cik:320193, ticker:NET), an LEI — or a company name, optionally with a location ("Acme Plumbing, Toronto"). Names resolve only when exactly one candidate is unambiguous; otherwise you get a ranked `candidates` row (free) to pick from. Organizations and places only — people are refused.

## `inputDatasetId` (type: `string`):

ID of any dataset — a Google Maps, LinkedIn jobs or company-scraper run, or an uploaded CSV. Each row's website field is resolved and the result is attached to the row as `crosswalk`; all original fields pass through. Leave `queries` empty when using this.

## `domainField` (type: `string`):

Auto-detected (website, websiteUrl, companyUrl, url, domain, homepage…) when empty.

## `maxRows` (type: `integer`):

Maximum number of dataset rows to enrich in one run when inputDatasetId is set.

## `outputFormat` (type: `string`):

auto (default): compact for a single `query`, full for batches and datasets. compact: flat record with ids, urls, confidence and a verified flag — best for tool calls and spreadsheets. full: complete record with the evidence trail per link.

## `probeMode` (type: `string`):

auto (default): confirm every platform. Free public endpoints where a platform serves them (GitHub, Wikidata, YouTube, LinkedIn, X, TikTok, Bluesky, Telegram, Yelp, Trustpilot); Instagram and Facebook are confirmed through the official Store Actors under your account (a fraction of a cent per profile, capped by the budgets below). direct: free endpoints only; Instagram/Facebook links are reported as not\_attempted. actors: confirm every platform through Store Actors. declared: read the organization's website only.

## `actorProbesPerEntity` (type: `integer`):

Cap on Store-Actor confirmations per organization (auto/actors modes). Instagram + Facebook = 2.

## `actorProbesPerRun` (type: `integer`):

Hard cap on Store-Actor confirmations for the whole run; beyond it, links are reported as not\_attempted. Keeps sub-run spend predictable.

## `maxProbesPerEntity` (type: `integer`):

Upper bound on reverse-confirmation requests made for one organization. Keeps cost predictable in actors mode.

## `cacheTtlDays` (type: `integer`):

A cached record younger than this is returned without re-resolving (billed as a cache hit). Set 0 to always re-resolve.

## `forceRefresh` (type: `boolean`):

Ignore the cache and re-resolve every query. Identity-change events are still computed against the cached record.

## `emitChangeEvents` (type: `boolean`):

When a re-resolved organization differs from its cached record (new domain, moved handle, closed place, rebrand), push an identity\_change row.

## `graphStoreName` (type: `string`):

Named key-value store that holds the identity graph. Leave the default so every run compounds the same graph.

## `sharedGraphStoreId` (type: `string`):

ID of the publisher's public, pre-seeded graph store. Reads fall through to it, so well-known companies are free cache hits. Defaults to the store the publisher configured; leave empty unless you run your own fork.

## `confidentThreshold` (type: `number`):

Links at or above this confidence count as confident. Links below are still returned, flagged low confidence, and never charged.

## `probeActors` (type: `object`):

Only used when a Store Actor confirms a platform (auto/actors). Maps a platform key to the Actor and how to read its output. Defaults (apify/instagram-profile-scraper, apify/facebook-pages-scraper, harvestapi/linkedin-company, clockworks/tiktok-profile-scraper, apidojo/twitter-user-scraper, compass/crawler-google-places) live in src/platforms.js; override here without a code change. Shape: { "instagram": { "actorId": "...", "input": { "usernames": \["{{id}}"] }, "externalUrlField": \["externalUrl","externalUrls"], "nameField": "fullName", "bioField": "biography" } }

## `proxyConfiguration` (type: `object`):

Proxy for website and direct-probe requests. Residential is rarely needed; the hub method reads the organization's own site.

## `requestTimeoutSecs` (type: `integer`):

HTTP request timeout in seconds for website and platform fetches.

## `maxConcurrency` (type: `integer`):

Maximum number of organizations resolved in parallel.

## `renderFallbackActor` (type: `string`):

For JavaScript-only websites. A Store Actor that returns rendered HTML in an `html` field for a `url` input (e.g. apify/web-fetch). Sub-runs bill to you. Leave empty to diagnose JS-only sites instead.

## `seedTimeoutSecs` (type: `integer`):

One slow organization never stalls the run; abandoned queries get a `seed_timeout` diagnostic and are not charged.

## `perHostPerSecond` (type: `number`):

Maximum requests per second to any single host (politeness limiter).

## `respectRobots` (type: `boolean`):

When a site's robots.txt disallows reading, Crosswalk reports `website_robots_denied` instead of reading it.

## `reverifySlice` (type: `integer`):

reverify mode only. Which slice (0..slices-1) to re-resolve today. Schedule with a rotating value or use a daily task per slice.

## `reverifySlices` (type: `integer`):

How many deterministic slices to partition the graph into for reverify mode.

## `reverifyLimit` (type: `integer`):

Maximum number of organizations to re-verify in one run.

## `forgetIds` (type: `array`):

forget mode only. Domains, platform URLs or org\_… ids. Removes the record, its history and all indexes.

## `probeConcurrency` (type: `integer`):

How many platform probes to run in parallel for one organization.

## `seedSource` (type: `string`):

seed mode only. list = seedDomains; sec = domains from the SEC index; wikidata = organizations with an official website (paged, resumable).

## `seedDomains` (type: `array`):

Explicit list of domains to seed when seedSource is list.

## `seedLimit` (type: `integer`):

Maximum number of organizations to seed in one run.

## `wikidataDeclared` (type: `boolean`):

Wikidata's human-curated social properties for the organization whose official website is this domain are added as declared links (0.85) and still platform-verified. Independent of the website, so JS-only footers and robots-denied sites still resolve.

## Actor input object example

```json
{
  "mode": "resolve",
  "queries": [
    "apify.com",
    "https://www.instagram.com/apifytech"
  ],
  "maxRows": 5000,
  "outputFormat": "auto",
  "probeMode": "auto",
  "actorProbesPerEntity": 2,
  "actorProbesPerRun": 200,
  "maxProbesPerEntity": 8,
  "cacheTtlDays": 30,
  "forceRefresh": false,
  "emitChangeEvents": true,
  "graphStoreName": "crosswalk-graph",
  "confidentThreshold": 0.8,
  "probeActors": {},
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "requestTimeoutSecs": 20,
  "maxConcurrency": 5,
  "seedTimeoutSecs": 120,
  "perHostPerSecond": 2,
  "respectRobots": true,
  "reverifySlice": 0,
  "reverifySlices": 30,
  "reverifyLimit": 500,
  "forgetIds": [],
  "probeConcurrency": 4,
  "seedSource": "list",
  "seedDomains": [],
  "seedLimit": 2000,
  "wikidataDeclared": true
}
```

# Actor output Schema

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

Default dataset items: entities, identity\_change events, candidates, and diagnostics.

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

Run summary JSON in the default key-value store.

# 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 = {
    "queries": [
        "apify.com",
        "https://www.instagram.com/apifytech"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("publicrecords/company-social-profile-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 = { "queries": [
        "apify.com",
        "https://www.instagram.com/apifytech",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("publicrecords/company-social-profile-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 '{
  "queries": [
    "apify.com",
    "https://www.instagram.com/apifytech"
  ]
}' |
apify call publicrecords/company-social-profile-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,publicrecords/company-social-profile-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/fSxx6ReGXxolxxABe/builds/ugb313zCDDqR0bDHt/openapi.json
