# Social Profile Finder (`dami_studio/social-profile-finder`) Actor

Social profile finder: the social profiles behind a name, domain or @handle across X, Instagram, LinkedIn, Facebook, TikTok, YouTube and GitHub. Each row holds the handle, display name, followers, bio and a confidence score with the evidence behind it. $0.90 per 1,000 profiles.

- **URL**: https://apify.com/dami_studio/social-profile-finder.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Social media, Automation
- **Features:** Limited permissions, Multi-tenant, Server interface
- **Stats:** 50 total users, 8 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.87 / 1,000 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

**Social profile finder for a company, a website or an @handle**:
X, Instagram, LinkedIn, Facebook, TikTok, YouTube and GitHub, one row each, with the handle, the
display name and a confidence score.

This is a search that gathers evidence and scores it, not a lookup in a table. Give it a
domain and it does well, because a company's own site links to its accounts. Give it a common name
and nothing else, and most networks will not produce a match that clears the bar.

| | |
|---|---|
| **Input** | Names, domains, @handles, or profile links |
| **Output** | One row per profile found: network, link, handle, display name, confidence score and the evidence behind it, followers, verified badge, bio and linked website |
| **Ceiling** | 50 lookups and 2,000 profiles per run |
| **Account needed** | None |
| **Price** | $0.90 per 1,000 profiles found on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 5,500 |

### 🔍 What Social Profile Finder does

For each thing you look up it gathers evidence from several directions at once. It reads the
subject's own website for the accounts it links to, which is the strongest signal there is. It tries
handle spellings on each network and checks what answers. It reads what a profile says about itself,
including the site it links back to and whether the network has verified it.

All of that turns into `matchConfidence`, a number between 0.05 and 0.99, and a row is only written
if it beats `minConfidence`. The default of `0.65` is deliberately strict. A handle that merely exists
and merely echoes the name back does not get reported.

When you have more than one clue about the same subject, pass an object rather than a line of text:
`{"name": "Patagonia", "domain": "patagonia.com"}`. The extra evidence raises the score on every match
it finds.

### 📋 What data you get from each social profile

| What you get | Field |
|---|---|
| The line you typed, and the subject and domain it was scored against | `query`, `subject`, `subjectDomain` |
| The network | `network`, `networkLabel` |
| The profile link, the handle and the display name | `profileUrl`, `handle`, `displayName` |
| The confidence score and its label | `matchConfidence`, `confidenceLabel` |
| Every signal behind the score | `matchEvidence` |
| How it was found | `source` |
| Followers, the network's badge, the bio and the site it links to | `followers`, `platformVerified`, `bio`, `profileWebsite` |
| Whether the account was confirmed on the network itself | `verifiedLive` |
| When the row was read | `scrapedAt` |

### ▶️ How to find social media profiles from a name or domain

1. Open [Social Profile Finder](https://apify.com/dami_studio/social-profile-finder) and click
   **Try for free**.
2. Put your subjects into **Who or what to look up**, one per line.
3. Optional: pick the **Networks** you actually want. Fewer networks means faster lookups.
4. Set **Maximum profiles**. Start at 20 while you see how your subjects score.
5. Click **Start**, then download the dataset as JSON, CSV or Excel, or read it from the API.

Run it with the input empty and you get a free sample row showing the shape, with nothing looked up.

### 💰 How much does it cost to find social profiles?

**$0.90 per 1,000 profiles found** on the Free plan. Paid plans pay a little less: $0.89 on Starter, $0.88 on Scale and $0.87 on Business. On the free plan, the
$5 Apify gives you each month covers about 5,500 profiles.

You pay for profiles written to the dataset. A subject that finds nothing produces no profile rows,
and neither do the sample row, the diagnostic rows, or a network you chose not to check.
`minConfidence` is the cheapest control you have: raise it and weak matches are dropped before they
are ever written.

One thing to plan around. There is no cross-checking between lookups in a run, so if `patagonia.com`
and `@patagonia` both resolve to the same X account, that is two rows and two charges. Put one line
per subject, not several spellings of the same one.

### 📥 What you give it

```json
{
  "queries": ["patagonia.com", "Marques Brownlee", "@MrBeast"],
  "networks": ["x", "instagram", "youtube"],
  "minConfidence": 0.65,
  "maxItems": 50
}
```

| Field | Default | What it is |
|---|---|---|
| `queries` | none | One subject per line: a name, domain, email, @handle or profile link. Up to 50. The form opens with three examples. |
| `networks` | all seven | Pick the ones you care about. A network you do not check is never charged for. |
| `minConfidence` | `0.65` | Below this a profile is never written and never billed. Drop to about `0.5` to review weak matches yourself, raise to `0.8` for confirmed accounts only. `65` works the same as `0.65`. |
| `maxProfilesPerNetwork` | `1` | Keeps the best-scoring account per network. Raise to 2 or 3 for brands that run several. |
| `maxHandleVariants` | `3` | Spellings tried when all you have is a name: `janedoe`, `jane.doe`, `jane_doe`. Up to 5. |
| `checkWebsite` | `true` | Reads the subject's own site for links. Leave it on unless you only ever pass bare handles. |
| `maxItems` | `50` | Profiles across the whole run, up to 2,000. This is your spend cap. |
| `proxyUrls` | none | Optional. Your own servers, one URL per line. Leave it empty for a normal run. |

### 📤 What you get back

A real row from a real run:

```json
{
  "ok": true,
  "charged": true,
  "recordType": "profile",
  "query": "patagonia.com",
  "subject": "patagonia",
  "subjectDomain": "patagonia.com",
  "network": "x",
  "networkLabel": "X (Twitter)",
  "profileUrl": "https://x.com/patagonia",
  "handle": "patagonia",
  "displayName": "Patagonia",
  "matchConfidence": 0.99,
  "confidenceLabel": "high",
  "matchEvidence": "verified-on-network | linked-from-own-website | structured-data-sameas | display-name-matches | links-back-to-domain | platform-verified-badge | established-audience",
  "source": "website-link",
  "followers": 536292,
  "platformVerified": true,
  "bio": "We're in business to save our home planet.",
  "profileWebsite": "http://patagonia.com/",
  "verifiedLive": true,
  "scrapedAt": "2026-09-21T13:01:48.062Z"
}
```

| Field | How to read it |
|---|---|
| `matchConfidence` | 0.05 to 0.99. `confidenceLabel` is the same thing as high, medium or low. |
| `matchEvidence` | Every signal that fed the score, pipe separated. This is how you audit a match. |
| `source` | `website-link`, `handle-probe` or `cross-link`. |
| `verifiedLive` | `false` when the account was only seen as a link on the subject's site and not confirmed on the network itself. |
| `handle` | Spelled the way the network spells it, which is not always how you typed it. |
| `displayName` | `null` when the network did not give one back. Nothing is guessed to fill a gap. |

### 🧾 Reading the output

Three kinds of row land in the dataset, and only the first kind is billed.

| Row | How to spot it | Billed |
|---|---|---|
| A profile | `recordType: "profile"` and a `profileUrl` | yes |
| The sample row | `_sample: true`, from an empty run | no |
| A diagnostic | `ok: false` and an `errorCode` | no |

Filter on `recordType == "profile"` and you have your profiles. The `charged` flag marks a row as a
real result rather than a sample or a diagnostic; read it as that, not as a receipt.

| Code | What it means |
|---|---|
| `NO_RESULTS` | Nothing cleared the threshold for that subject, or its website could not be read. The row carries what was tried. |
| `TIME_BUDGET` | The run hit its time limit before reaching that subject, or while it was being looked up. Nothing was charged for it. The run still ends as succeeded, with an amber status message, even when the time limit stopped it before any profile came back. |
| `NETWORK` | That subject failed outright. The others in the run are unaffected. |
| `PROXY_INPUT_ADJUSTED` | Something in `proxyUrls` was not usable and the run went on without it. |
| `CHARGE_ERROR` | Billing did not confirm for a row. Tell us if you see one. |

A useful detail the default table hides: `verifiedLive` and `platformVerified` are not columns in the
overview view, so an unconfirmed match looks the same as a badge-verified one until you open the JSON.

### 💡 What people use it for

- Filling in the social columns on a list of companies you already have domains for.
- Checking whether an account claiming to be a brand actually links back to that brand's site.

From a list of company domains to their Instagram numbers, in three steps:

1. Run this actor on the domains with `networks` set to `instagram`.
2. Keep the rows with a `matchConfidence` of 0.8 or more and copy the `handle` values.
3. Put them into [Instagram Profile Scraper](https://apify.com/dami_studio/instagram-profile-scraper)
   as `usernames` for followers and category.

### 🚧 What it does not do

- **Seven networks.** X, Instagram, LinkedIn, Facebook, TikTok, YouTube and GitHub. Nothing else.
- **A bare name rarely clears the bar.** Without a domain, a badge, a real audience or a link back,
  most name-only subjects score under `0.65` and come back as `NO_RESULTS`.
- **It does not merge duplicate lookups.** Two lines pointing at the same account produce two rows.
- **Instagram is the thinnest of the seven**, and LinkedIn member profiles are best effort. Company
  pages do better than people.
- **Private, suspended and deleted accounts read as absent.** The actor reports what it could confirm,
  and never turns "could not check" into a match.
- **No posts, no followers list, no contact details.** It finds the profile. To read what is on it,
  use the scrapers below.
- It is not an official tool of any platform or company named on this page. Dami's Studio is independent and is not affiliated with or endorsed by any of them.

### 🧭 Which social actor do you need?

| If you want | Use |
|---|---|
| Social profiles that belong to a person, brand or domain | This one |
| E-mails, phones and social links published on a list of websites | [Contact Details Scraper](https://apify.com/dami_studio/contact-details-scraper) |
| Full Instagram profile data for a handle you already have | [Instagram Profile Scraper](https://apify.com/dami_studio/instagram-profile-scraper) |
| Followers, likes and bio for TikTok handles | [TikTok Profile Scraper](https://apify.com/dami_studio/tiktok-user-scraper) |
| Size, followers, headquarters and website for LinkedIn company pages | [LinkedIn Companies Scraper](https://apify.com/dami_studio/linkedin-companies-scraper) |
| Subscriber and follower growth for YouTube, TikTok or Twitch creators | [Social Blade Scraper](https://apify.com/dami_studio/socialblade-scraper) |
| Whether Discord usernames are free | [Discord Username Checker](https://apify.com/dami_studio/discord-username-checker) |

### ❓ Questions people ask

#### What confidence score should I trust?

Anything at `0.8` or above is normally a confirmed account. Between `0.65` and `0.8`, read
`matchEvidence` before you act on it. Below that you have told the actor to show you guesses.

#### Why did a well-known person come back empty?

Because the evidence was thin, not because the account does not exist. Add their domain or a handle
you already know and run it again.

#### Can I look up 500 people at once?

Not in one run. 50 lookups is the cap, so split the list across a few runs.

#### Do I need logins for the social networks?

No. Nothing to paste and nothing that expires.

#### Can I call it from code or connect it to an AI assistant?

The [API tab](https://apify.com/dami_studio/social-profile-finder/api/python) has code for Python, JavaScript and the
CLI. MCP clients like Claude and ChatGPT use
`https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/social-profile-finder`; coding assistants can load [our
skill
file](https://api.apify.com/v2/key-value-stores/BTBHU3DdiuoF4JOsK/records/apify-contact-and-owner-lookups-SKILL.md).
All three bill your Apify account at the same price.

#### Is finding social profiles this way legal?

It reads public profile pages, the same ones anyone can open. Results are personal data, which GDPR
and similar laws cover, so have a reason for holding them. Apify's write-up on
[the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) is a good starting
point, and we are not lawyers.

### 🆘 If something breaks

Open the **Issues** tab on the actor page. Send the exact line you looked up and the run ID; the
evidence in the log usually explains the score.

# Actor input Schema

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

One entry per line. Each can be a company name, a website domain, an @handle, or a link to a profile you already have. Up to 50 per run. When you have more than one clue about the same subject, pass an object instead - {"name":"Patagonia","domain":"patagonia.com"} - and the extra evidence raises the confidence of every match.

## `networks` (type: `array`):

Leave empty to check all seven. Dropping the ones you do not need makes each lookup faster, and a network that is not checked is never charged for.

## `minConfidence` (type: `number`):

Profiles scoring below this are never written and never charged. Same 0 to 0.99 scale as the matchConfidence field in the output. Default 0.65, which is deliberately strict - a handle that merely exists and merely echoes the name back is not reported. Lower it to about 0.5 to review weak matches yourself, or raise it to 0.8 for self-declared and badge-verified profiles only.

## `maxProfilesPerNetwork` (type: `integer`):

How many profiles to keep per network for each lookup. Default 1, the highest-scoring one. Raise it to 2 or 3 for brands that legitimately run several accounts on the same network.

## `maxHandleVariants` (type: `integer`):

How many handle spellings to try when all you have is a name - janedoe, jane.doe, jane_doe and so on. Default 3, maximum 5. More variants means more coverage and more requests.

## `checkWebsite` (type: `boolean`):

Read the website for the profiles it links to. This is the single strongest signal available, so leave it on unless you only ever pass bare handles. Default on.

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

Total profiles to return across every lookup in the run. Default 50, hard ceiling 2,000. Keep it low while you are testing - you pay per profile.

## `proxyUrls` (type: `array`):

Leave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port.

## Actor input object example

```json
{
  "queries": [
    "patagonia.com",
    "Marques Brownlee",
    "@MrBeast"
  ],
  "minConfidence": 0.65,
  "maxProfilesPerNetwork": 1,
  "maxHandleVariants": 3,
  "checkWebsite": true,
  "maxItems": 50
}
```

# Actor output Schema

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

Every row in the default dataset: query, subject, subjectDomain, network, networkLabel, profileUrl, handle, displayName, matchConfidence, confidenceLabel, matchEvidence, source, followers, platformVerified, bio, profileWebsite, verifiedLive. An empty or unmatched run returns a single uncharged row explaining what happened instead.

# 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": [
        "patagonia.com",
        "Marques Brownlee",
        "@MrBeast"
    ],
    "minConfidence": 0.65,
    "maxProfilesPerNetwork": 1,
    "maxHandleVariants": 3,
    "checkWebsite": true,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/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": [
        "patagonia.com",
        "Marques Brownlee",
        "@MrBeast",
    ],
    "minConfidence": 0.65,
    "maxProfilesPerNetwork": 1,
    "maxHandleVariants": 3,
    "checkWebsite": True,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/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": [
    "patagonia.com",
    "Marques Brownlee",
    "@MrBeast"
  ],
  "minConfidence": 0.65,
  "maxProfilesPerNetwork": 1,
  "maxHandleVariants": 3,
  "checkWebsite": true,
  "maxItems": 50
}' |
apify call dami_studio/social-profile-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/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/1FpfIwkKDvri0PXCR/builds/PVNCJ1GcIeDqujrZ0/openapi.json
