# Linktree Scraper - Creator Bio Links, Emails & Leads (`scrapesage/linktree-scraper`) Actor

Scrape any Linktree (linktr.ee) profile into clean data: name, bio, every link with previews, social handles, emails & phones for lead gen. Discover related creators, enrich contacts from their website, and monitor for new profiles. Export JSON, CSV, Excel.

- **URL**: https://apify.com/scrapesage/linktree-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 profile scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Linktree Scraper — Creator Bio Links, Emails & Leads

Turn any **Linktree (`linktr.ee`) profile** into a clean, structured **lead record**: creator name, bio, **every link with its rich preview**, normalized **social handles**, and the fields that actually drive outreach — **emails and phone numbers**. Optionally **snowball-discover related creators**, **enrich contacts from each creator's own website**, and **monitor a niche for new profiles**.

No login, no cookies, no browser — fast JSON extraction straight from the page's embedded data, with 99%+ reliability.

### Why this Linktree scraper?

Most Linktree scrapers just dump the visible links from one URL. This actor ships the **richest record in the category** and turns Linktree into a real lead engine:

| Capability | Typical scrapers | This actor |
|---|---|---|
| All links (cleaned URLs, no tracking params) | ✅ | ✅ |
| Rich link previews (title, description, image) | ❌ | ✅ |
| Normalized social handles per platform | partial | ✅ Instagram, TikTok, YouTube, X, FB, LinkedIn, Spotify… |
| **Emails** (from `EMAIL` links, `mailto:` & bio) | ❌ | ✅ |
| **Phone numbers** | ❌ | ✅ |
| Website / shop / payment link classification | ❌ | ✅ |
| **Website contact enrichment** (crawl their site) | ❌ | ✅ opt-in |
| **Snowball discovery** of related creators | ❌ | ✅ opt-in |
| Verified, tier, country, created/updated, gating | ❌ | ✅ |
| Lead score (0–100) | ❌ | ✅ |
| Resolve from URL, bare username, @handle or social URL | ❌ | ✅ |
| Monitor mode — only NEW profiles | ❌ | ✅ |

### Use cases

- **Influencer & creator lead generation** — you already have a list of handles from Instagram/TikTok/YouTube; this actor resolves each to their Linktree and pulls **email, phone, website and every social** in one pass. Filter to `hasEmailOnly` for an outreach-ready list.
- **Bulk prospecting (discovery)** — start with a few creators in your niche and let **snowball discovery** follow Linktree's related-creator graph to build a large lead list automatically.
- **Agency & brand outreach** — find creators who **sell products** (`sellsProducts`, shop links), have a website, or accept donations, and reach them directly.
- **Competitive & market research** — see exactly which links, shops, socials and offers creators promote, with link previews.
- **List maintenance & monitoring** — schedule recurring runs with **monitor mode** to capture only newly discovered creators in a niche.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Linktree Scraper**, paste profile URLs / usernames (or turn on discovery), and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "profileUrls": ["https://linktr.ee/garyvee"],
    "usernames": ["mkbhd", "@natgeo"],
    "discoverRelatedProfiles": true,
    "discoveryDepth": 2,
    "maxProfiles": 200,
    "enrichContactEmails": true,
    "hasEmailOnly": true
}
```

- **profileUrls** — full Linktree URLs (`https://linktr.ee/...`).
- **usernames** — bare usernames or `@handles`. A social-media URL works too — its handle is tried against `linktr.ee` (creators reuse the same handle).
- **startUrls** — generic URL list; anything that resolves to a Linktree username is scraped.
- **discoverRelatedProfiles** *(default false)* — snowball out to related/SEO-linked creators that Linktree lists on every page.
- **discoveryDepth** *(default 2)* — how many hops to snowball when discovery is on.
- **maxProfiles** *(default 100)* — max profiles to fetch in one run (the cost/work budget).
- **enrichContactEmails** *(default false)* — crawl each creator's own website (home + contact/about) for extra emails, phones and socials.
- **includeLinkPreviews** *(default true)* — attach each link's preview (title/description/image).
- **hasEmailOnly / verifiedOnly / countryFilter / minLinks** — output filters.
- **monitorMode / monitorKey** — return only profiles not seen in previous runs.
- **maxConcurrency / proxyConfiguration** — performance & proxy.

### Output

One record per creator (`type: "profile"`):

```json
{
    "type": "profile",
    "platform": "linktree",
    "username": "mkbhd",
    "profileUrl": "https://linktr.ee/mkbhd",
    "displayName": "MKBHD",
    "bio": "Quality Tech Videos",
    "avatarUrl": "https://ugc.production.linktr.ee/...",
    "isVerified": true,
    "tier": "free",
    "country": "US",
    "sellsProducts": true,
    "emails": ["podcast@mkbhd.com"],
    "primaryEmail": "podcast@mkbhd.com",
    "phones": [],
    "websiteUrls": ["https://shop.mkbhd.com"],
    "primaryWebsite": "https://shop.mkbhd.com",
    "shopUrls": ["https://shop.mkbhd.com"],
    "socialLinks": [
        { "platform": "youtube", "url": "https://youtube.com/mkbhd", "handle": "@mkbhd" },
        { "platform": "instagram", "url": "https://instagram.com/mkbhd", "handle": "@mkbhd" },
        { "platform": "x", "url": "https://x.com/mkbhd", "handle": "@mkbhd" }
    ],
    "socialPlatforms": ["youtube", "instagram", "x", "spotify"],
    "links": [
        {
            "title": "Waveform Podcast",
            "url": "https://open.spotify.com/show/...",
            "type": "CLASSIC",
            "category": "social",
            "platform": "spotify",
            "isGated": false,
            "preview": { "title": "Waveform: The MKBHD Podcast", "description": "...", "image": "https://..." }
        }
    ],
    "linkCount": 9,
    "relatedUsernames": ["...", "..."],
    "leadScore": 92,
    "discoverySource": "seed",
    "scrapedAt": "2026-06-16T18:00:00.000Z"
}
```

When `enrichContactEmails` is on, records also include `websiteCrawled`, `websitePagesCrawled`, `enrichedEmails`, `enrichedPhones`, and `enrichedSocials` (merged into the main `emails`/`phones`/`socialLinks`).

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it daily/weekly to monitor a niche for new creators; pair with `monitorMode` to capture only new profiles.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/linktree-scraper').call({
    usernames: ['garyvee', 'mkbhd'],
    discoverRelatedProfiles: true,
    maxProfiles: 200,
    enrichContactEmails: true,
    hasEmailOnly: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} creator leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new creator leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored niche surfaces new creators.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. You can call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find fitness creators on Linktree with an email and a shop" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **creator & influencer lead-gen stack** — Linktree is the contact hub; these pull the platform-side audience and monetization data:

- **[YouTube Scraper](https://apify.com/scrapesage/youtube-scraper)** — channels, videos and creator leads.
- **[Patreon Scraper](https://apify.com/scrapesage/patreon-scraper)** — creators, membership tiers, earnings estimates & leads.
- **[Substack Scraper](https://apify.com/scrapesage/substack-scraper)** — newsletters, posts & creator leads.
- **[SoundCloud Scraper](https://apify.com/scrapesage/soundcloud-scraper)** — artists, tracks & creator leads.
- **[Apple Podcasts Scraper](https://apify.com/scrapesage/apple-podcasts-scraper)** — shows, episodes, reviews & host leads.
- **[Bluesky Scraper](https://apify.com/scrapesage/bluesky-scraper)** — profiles, posts, followers & leads.
- **[Product Hunt Scraper](https://apify.com/scrapesage/product-hunt-scraper)** — launches, makers & leads.
- **[Eventbrite Scraper](https://apify.com/scrapesage/eventbrite-scraper)** — events + organizer leads.

### Tips

- **You have handles, not Linktree URLs?** Drop the handles into `usernames` — the scraper tries `linktr.ee/<handle>` (creators almost always reuse the same handle). Profiles that don't exist are skipped quietly.
- **Bulk lists**: turn on `discoverRelatedProfiles` with a few strong seed creators and raise `maxProfiles` to snowball a niche.
- **Outreach-ready only**: set `enrichContactEmails: true` and `hasEmailOnly: true` to keep just the profiles with a real email.
- **Cost control**: `maxProfiles` caps the work; email enrichment only runs for creators that actually link a website.
- **Monitoring**: combine [Schedules](https://docs.apify.com/platform/schedules) with `monitorMode` to capture only newly found creators each run.

### FAQ

**Do I need a Linktree login or API key?** No. The actor reads the public profile's embedded data — the same content any visitor sees.

**Where do the emails come from?** From the creator's own published contact links (Linktree `EMAIL`/`mailto:` links and bio text) and, with `enrichContactEmails`, from their own public website. Nothing private is accessed.

**Can it scrape usernames I only have from Instagram/TikTok?** Yes — paste the handle or the social URL; the actor tries the matching Linktree username.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**How do I get only new creators over time?** Turn on `monitorMode` and run on a [Schedule](https://docs.apify.com/platform/schedules) — each run returns only profiles not seen before.

**A field is null — why?** Some creators simply don't publish an email, phone, website or country. Fields are `null` only when the data doesn't exist, not because the scraper skipped them.

**Is scraping Linktree legal?** This actor collects publicly available data only. You are responsible for using the data in compliance with applicable laws (GDPR/CCPA for personal data) and Linktree's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `profileUrls` (type: `array`):

Full Linktree profile URLs, e.g. `https://linktr.ee/garyvee`. The scraper reads the profile's embedded data (no login, no browser).

## `usernames` (type: `array`):

Bare Linktree usernames or @handles (e.g. `mkbhd`, `@natgeo`). A social-media URL (e.g. an Instagram link) also works — its handle is tried against linktr.ee, since creators reuse the same handle across platforms.

## `startUrls` (type: `array`):

Generic URL list — paste Linktree URLs or other profile links. Anything that resolves to a Linktree username is scraped.

## `discoverRelatedProfiles` (type: `boolean`):

Expand beyond your seed profiles: every Linktree page lists related/SEO-linked creators, so the scraper follows them to discover MORE creators like your seeds — great for building bulk lead lists. Bounded by `Max profiles` and `Discovery depth`.

## `discoveryDepth` (type: `integer`):

How many hops to snowball out from the seed profiles when discovery is on. 1 = direct relations only; 2–3 expands much wider.

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

Maximum number of Linktree profiles to fetch in one run (the work/cost budget). With discovery off, this caps the seed list; with discovery on, it caps total profiles scanned.

## `enrichContactEmails` (type: `boolean`):

For each profile that links to its own website, crawl the home + contact/about pages (capped) for extra emails, phone numbers and social links — the contact wedge a bio page doesn't always expose. Adds a few requests per profile.

## `maxEnrichPagesPerProfile` (type: `integer`):

When enriching, the most pages to crawl on each creator's website (home + contact/about).

## `includeLinkPreviews` (type: `boolean`):

Attach each link's rich preview (title, description, image) when Linktree provides it. Turn off for a leaner dataset.

## `hasEmailOnly` (type: `boolean`):

Keep only profiles that have at least one email address (after enrichment) — ideal for outreach-ready lead lists.

## `verifiedOnly` (type: `boolean`):

Keep only Linktree-verified profiles.

## `countryFilter` (type: `string`):

Keep only profiles whose Linktree country matches this two-letter code (e.g. `US`, `GB`). Leave empty for all countries.

## `minLinks` (type: `integer`):

Keep only profiles with at least this many links (filters out empty/placeholder pages).

## `monitorMode` (type: `boolean`):

Remember which profiles were emitted in previous runs (in a named key-value store) and return ONLY profiles not seen before — ideal for watching a niche for new creators. Works with Apify Schedules: the schedule starts the run, monitor mode deduplicates against prior runs.

## `monitorKey` (type: `string`):

Names the monitor store so you can keep separate watch-lists. Lowercase letters, numbers and hyphens.

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

Maximum number of profiles fetched in parallel.

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

Proxy settings. Linktree serves clean pages to Apify datacenter IPs, so the default Apify proxy is plenty. Switch to residential if you ever see blocks at scale.

## Actor input object example

```json
{
  "profileUrls": [
    "https://linktr.ee/garyvee"
  ],
  "discoverRelatedProfiles": false,
  "discoveryDepth": 2,
  "maxProfiles": 100,
  "enrichContactEmails": false,
  "maxEnrichPagesPerProfile": 3,
  "includeLinkPreviews": true,
  "hasEmailOnly": false,
  "verifiedOnly": false,
  "countryFilter": "",
  "minLinks": 0,
  "monitorMode": false,
  "monitorKey": "default",
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped Linktree profile records as JSON items in the default dataset.

# 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 = {
    "profileUrls": [
        "https://linktr.ee/garyvee"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/linktree-scraper").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 = { "profileUrls": ["https://linktr.ee/garyvee"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/linktree-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "profileUrls": [
    "https://linktr.ee/garyvee"
  ]
}' |
apify call scrapesage/linktree-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/linktree-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/xVcfTyT1ALoA1U86d/builds/sD8UCfOO4R8EAysOI/openapi.json
