# Link in Bio Email Finder: Linktree, Taplink, AllMyLinks (`datagleaner/bio-link-email-finder`) Actor

Find a creator's email, phone and socials from their Linktree or other link-in-bio page. Give URLs or handles. $0.004 per profile with an email. Pages without one are free. Returns Instagram, TikTok, YouTube, X, website, booking and shop links. No login.

- **URL**: https://apify.com/datagleaner/bio-link-email-finder.md
- **Developed by:** [Data Gleaner](https://apify.com/datagleaner) (community)
- **Categories:** Lead generation, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 profile with emails

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

## Link in Bio Email Finder: Linktree, Taplink, AllMyLinks

Find a creator's email, phone and socials from their Linktree or other link-in-bio page. Give URLs or handles. $0.004 per profile with an email; pages without one are free.

Answers questions like **"find email from Linktree"**, **"Linktree email"**, **"link in bio email finder"**, **"link in bio contacts"** and **"creator contact from Linktree"**: give it `linktr.ee/name`, `taplink.cc/name`, `allmylinks.com/name`, a bare handle, or an Instagram or TikTok profile URL, and get one row per creator with their **public email, phone (E.164), Instagram, TikTok, YouTube, X and website, plus their booking, shop, newsletter and media-kit links**. No login, no browser, no CAPTCHA. Every row has the same fields, so AI agents and lead pipelines can use it as well as people.

### Who it is for

- **Influencer-marketing agencies and brands** that have a creator's Instagram or TikTok handle and need a way to reach them. Instagram hides contact details behind a login; the creator's link-in-bio page usually shows them openly.
- **UGC platforms and creator marketplaces** enriching sign-ups or prospect lists with email, portfolio and rate-card links.
- **AI agents** asked "what is this creator's contact email?" for a handle or a Linktree URL, paying only when an email is found.

### What it reads

| Platform | How | What comes back |
|---|---|---|
| **Linktree** (`linktr.ee`) | The profile JSON the page ships with it | Name, bio, avatar, category (Linktree verticals), every link with its type, social icons, email and phone buttons |
| **Taplink** (`taplink.cc`) | The page's block data | Title, bio text, every button, WhatsApp and messenger buttons, social icons |
| **AllMyLinks** (`allmylinks.com`) | The page's HTML and profile JSON-LD | Name, bio, avatar, every link, email links (including addresses the page hides from plain view) |
| **Other bio-link pages by URL** (Stan Store, bio.site, Komi, hoo.be, Carrd, lnk.bio ...) | The page's HTML | Emails, phones, socials and links the page renders |

From each page it decodes `mailto:` buttons, `tel:` and SMS links, and `wa.me` / WhatsApp links into E.164 phone numbers, and reads emails and phones written in the bio and link titles (including `name [at] domain [dot] com`). Image file names, `example.com` and template placeholder numbers are rejected. With **`crawlWebsite`** on, a page with no email gets one more try: the creator's **own website** (never shops, marketplaces or social platforms) and its contact page, keeping only addresses on the creator's domain, a free mailbox or a domain named after the creator.

Pages that refuse automated requests (Beacons and solo.to answer 403) are reported as errors and never worked around.

### Input

| Field | Meaning |
|---|---|
| `profiles` | One per line: a bio-link URL, a bare handle (`name` or `@name`), or an Instagram, TikTok or X profile URL. |
| `tryPlatforms` | Where a bare handle is looked up, in order: `linktree`, `taplink`, `allmylinks` (default `["linktree"]`). The first platform with a page that has content wins. |
| `crawlWebsite` | When the page has no email, read the creator's own website and contact page (default `false`, up to 3 extra pages). |
| `maxProfiles` | Stop after this many inputs (default 100). |
| `requestDelaySecs` | Minimum gap between requests to one site (default 0.5 s, with jitter). |
| `proxyConfiguration` | Optional. No proxy by default. |

Leave `profiles` empty to run 5 example profiles.

```json
{
  "profiles": ["https://linktr.ee/mkbhd", "@aliabdaal", "https://www.instagram.com/melrobbins/", "taplink.cc/abrine"],
  "tryPlatforms": ["linktree", "taplink", "allmylinks"],
  "crawlWebsite": true
}
```

### Output

One row per profile. Fields that were not found are empty, never invented.

```json
{
  "platform": "linktree",
  "url": "https://linktr.ee/MKBHD",
  "found": true,
  "username": "MKBHD",
  "displayName": "Waveform",
  "bio": null,
  "avatarUrl": "https://ugc.production.linktr.ee/USl9Uq9GR8y5K2Gdj0UL_74v07R9H8U7Iayn4",
  "verified": false,
  "category": "Creator",
  "email": "podcast@mkbhd.com",
  "emails": ["podcast@mkbhd.com"],
  "emailSource": "page",
  "hasEmail": true,
  "phones": [],
  "socials": {
    "instagram": "https://www.instagram.com/wvfrmpodcast",
    "tiktok": null,
    "youtube": "https://www.youtube.com/channel/UCEcrRXW3oEYfUctetZTAWLw",
    "x": "https://x.com/WVFRM",
    "facebook": "https://www.facebook.com/WVFRM",
    "twitch": null,
    "spotify": "https://open.spotify.com/show/6o81QuW22s5m2nfcXWjucc",
    "linkedin": null, "threads": null, "snapchat": null, "pinterest": null, "website": null
  },
  "website": null,
  "businessLinks": [],
  "links": [
    {"title": "YouTube", "url": "https://www.youtube.com/channel/UCEcrRXW3oEYfUctetZTAWLw", "type": "YOUTUBE_CHANNEL"},
    {"title": "Apple Podcasts", "url": "https://podcasts.apple.com/us/podcast/waveform-the-mkbhd-podcast/id1474429475", "type": "CLASSIC"}
  ],
  "linkCount": 12,
  "status": "ok",
  "error": null,
  "input": "mkbhd",
  "scrapedAt": "2026-10-09T15:40:21+00:00"
}
```

- `email` is the best address: business mailboxes (`collab@`, `booking@`, management) come before general ones, and shop support addresses last. `emails` lists them all.
- `emailSource` says where the best email came from: `page` (an email button or link), `bio` (written in the page text) or `website` (the creator's own site, with `crawlWebsite`).
- `businessLinks[].kind` is `booking` (Calendly, Cal.com ...), `shop` (Amazon storefront, LTK, ShopMy, Etsy, Stan ...), `newsletter` (Substack, beehiiv, Kit ...), `membership` (Patreon, Ko-fi ...), `mediaKit`, `portfolio` or `contact` (forms and collab pages).
- `verified` is the platform's own badge where it has one (Linktree), and `null` where the platform shows none.
- A page that does not exist comes back with `found: false` and `status: "not_found"`; one that could not be read has `status: "error"` and an `error` message. Neither is charged.

### Pricing

One event, pay per answer:

- **`profile-with-email`: $0.004** for each bio-link page where at least one public email was found.
- A page **without an email is free**. It is still returned with its socials and links, so you can see why.
- Pages that do not exist or could not be read are free.

**Worked example.** You check 1,000 creator handles; 800 have a Linktree page and 45% of those show an email: 360 x $0.004 = **$1.44**. The 640 rows without an email cost nothing.

Set a maximum total charge on the run and the Actor stops cleanly when it is reached.

### What to expect

Measured on 20 real creator handles (2026-10-09), 19 of which had a page: **10 of 15 Linktree pages showed a public email** on the page itself. UGC and small creators who sell sponsorships almost always publish one; large celebrities rarely do. With `crawlWebsite` on, 2 more came from the creators' own websites (Linktree 11 of 15, Taplink 1 of 2). The two AllMyLinks pages in the sample had none. Rates depend heavily on who you look up.

### Limits

- **A bare handle is matched by name.** The same handle can belong to different people on different platforms. Give the full URL when you know it, and check the `displayName` and socials before outreach.
- Only what the page shows publicly is returned. Contact forms are listed as links; nothing is submitted.
- Password-protected or age-gated Linktree pages return what the page exposes without unlocking it.
- Pages built entirely in the browser (some Stan Store and Komi pages) may show fewer links than you see.
- Beacons and solo.to refuse automated requests, so those pages come back as errors.

### Use with Python

```python
## pip install apify-client
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("datagleaner/bio-link-email-finder").call(run_input={
    "profiles": ["mkbhd", "https://www.tiktok.com/@aliabdaal"],
    "tryPlatforms": ["linktree", "taplink", "allmylinks"],
})
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item["input"], item["platform"], item["email"], item["socials"]["instagram"])
```

### Use with JavaScript / Node.js

```js
// npm install apify-client
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('datagleaner/bio-link-email-finder').call({
    profiles: ['https://linktr.ee/mkbhd', 'taplink.cc/abrine'],
    crawlWebsite: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) console.log(item.url, item.emails, item.phones);
```

### Use it from n8n, Make, Zapier or an AI agent

Actor ID: `datagleaner/bio-link-email-finder`

Minimal input:

```
{"profiles": ["https://linktr.ee/mkbhd", "https://linktr.ee/aliabdaal", "https://allmylinks.com/allmylinks"]}
```

Each tool below runs this Actor with your own Apify API token.

- **n8n:** add the **Apify** node (`@apify/n8n-nodes-apify`). On n8n Cloud you install it from the community node registry. Choose **Run an Actor and get dataset**, set Actor to `datagleaner/bio-link-email-finder` and paste the input above.
- **Make:** use the Apify app's **Run an Actor** module, then **Get Dataset Items** to read the results. **Watch Actor Runs** can trigger a scenario when a run finishes.
- **Zapier:** use the Apify action **Run Actor**, then the search **Fetch dataset items**. The trigger **Finished Actor run** starts a Zap when a run ends.
- **AI agents (MCP):** connect to `https://mcp.apify.com?tools=datagleaner/bio-link-email-finder`. Without a token, an agent can still find Actors with the `search-actors` tool, but running this one needs your Apify account. In Claude Code:

  ```
    claude mcp add --transport http apify "https://mcp.apify.com?tools=datagleaner/bio-link-email-finder"
  ```

  Then run `/mcp` to sign in to Apify in your browser. Then ask in plain language, for example: "Here are 30 TikTok creators' handles. Find each one's Linktree or Taplink page and give me their contact email, Instagram and booking link as a table."
- **LangChain (Python):**

```python
## pip install langchain-apify, then set APIFY_TOKEN in your environment
import json
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("datagleaner/bio-link-email-finder")
result = tool.invoke({"run_input": json.loads('{"profiles": ["https://linktr.ee/mkbhd", "https://linktr.ee/aliabdaal", "https://allmylinks.com/allmylinks"]}')})
```

Claude Desktop:

```json
{
  "mcpServers": {
    "actors-mcp-server": {
      "command": "npx",
      "args": ["-y", "@apify/actors-mcp-server"],
      "env": { "APIFY_TOKEN": "YOUR_APIFY_TOKEN" }
    }
  }
}
```

### FAQ

**How do I find someone's email from their Linktree?** Give the Linktree URL or the handle. The Actor reads the page's email button, the bio and the link titles, and returns every public address with where it was found.

**I only have an Instagram or TikTok handle. Does that work?** Yes. Paste the handle or the profile URL; it is looked up on Linktree (and on Taplink and AllMyLinks if you add them to `tryPlatforms`). Instagram itself is never scraped.

**Why does a page with an email button show no email?** Some creators use a contact form or a Gmail-compose link instead of an address. Those are listed in `businessLinks` (`contact`) and `links`, and the row is free.

**Is it charged when nothing is found?** No. Only rows with at least one email are charged, $0.004 each.

**Does it log in or bypass anything?** No. It reads the same public page any visitor sees, and pages that refuse automated requests are reported, not worked around.

### Responsible use

This Actor reads public pages only. Email addresses and phone numbers can be personal data, even when a creator publishes them for business. You are responsible for lawful use, including consent and opt-out rules for outreach (GDPR, CAN-SPAM and local law), and for respecting the terms of the platforms you use the data on.

# Actor input Schema

## `profiles` (type: `array`):

One per line: a link-in-bio URL (`https://linktr.ee/name`, `taplink.cc/name`, `allmylinks.com/name`, or another bio-link page such as Stan Store, bio.site, Komi or Carrd), a bare handle (`name` or `@name`), or an Instagram, TikTok or X profile URL, whose handle is tried. A handle is looked up on each platform in `Platforms to try for handles`, in order, until a page exists. Leave empty to run 5 example profiles.

## `tryPlatforms` (type: `array`):

Where a bare handle is looked up, in this order; the first platform with a page wins. Full URLs are always fetched as given.

## `crawlWebsite` (type: `boolean`):

When the bio-link page shows no email, open the creator's own website (never shops, marketplaces or social platforms) and its contact page, and keep emails that belong to the creator. Up to 3 extra pages per profile; robots.txt is respected.

## `maxProfiles` (type: `integer`):

Stop after this many inputs.

## `requestDelaySecs` (type: `number`):

Requests to the same host start at least this far apart, with a little jitter. Raise it for very large runs.

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

Optional. Defaults to no proxy.

## Actor input object example

```json
{
  "profiles": [
    "https://linktr.ee/mkbhd",
    "https://linktr.ee/aliabdaal",
    "https://allmylinks.com/allmylinks"
  ],
  "tryPlatforms": [
    "linktree"
  ],
  "crawlWebsite": false,
  "maxProfiles": 100,
  "requestDelaySecs": 0.5
}
```

# Actor output Schema

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

No description

# 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 = {
    "profiles": [
        "https://linktr.ee/mkbhd",
        "https://linktr.ee/aliabdaal",
        "https://allmylinks.com/allmylinks"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datagleaner/bio-link-email-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 = { "profiles": [
        "https://linktr.ee/mkbhd",
        "https://linktr.ee/aliabdaal",
        "https://allmylinks.com/allmylinks",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("datagleaner/bio-link-email-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 '{
  "profiles": [
    "https://linktr.ee/mkbhd",
    "https://linktr.ee/aliabdaal",
    "https://allmylinks.com/allmylinks"
  ]
}' |
apify call datagleaner/bio-link-email-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datagleaner/bio-link-email-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/LZFKzzthcT7IPekW7/builds/CRmOh4BwTbWqgs2eG/openapi.json
