# Linktree Scraper: Links, Socials & Emails 🔗 (`tagadanar/linktree-scraper`) Actor

Turn Linktree usernames or linktr.ee URLs into one row per profile: name, bio, avatar, verified badge, every link with title and URL, social profiles with handles, and the emails, phones and WhatsApp numbers the page publishes. $2 per 1,000 profiles + $0.001/run, usage included.

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

## Pricing

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

## Linktree Scraper: Links, Socials & Emails

Paste a list of Linktree usernames or linktr.ee links and get one clean row per profile: display name, bio, avatar, verified badge, every link with its title and URL, the creator's social profiles with handles, and the emails, phone numbers and WhatsApp numbers the page itself publishes. **$2 per 1,000 profiles, plus $0.001 per run, platform usage included.** No login, no cookies, no proxy setup.

Built for influencer marketing teams, agencies building creator lead lists, and anyone who has a column of Instagram or TikTok bios full of linktr.ee links and wants to know what is behind them.

### What you get

One row per profile. Missing values are `null` (or an empty list), never guesses.

| Field | What it is |
| --- | --- |
| `username` | The Linktree username, as Linktree spells it |
| `profileUrl` | `https://linktr.ee/<username>` |
| `displayName` | The page title shown at the top of the profile |
| `bio` | The profile description |
| `avatarUrl` | Profile picture URL |
| `verified` | `true` when the profile carries Linktree's verified badge |
| `badges` | Raw badge names from Linktree (for example `VERIFIED_AND_NOTABLE_TICK`) |
| `country` | Country set on the Linktree account, when present |
| `accountCreatedAt` | When the Linktree account was created (ISO date) |
| `sensitiveContent` / `pageLocked` | Flags for pages marked sensitive or protected |
| `linkCount` | Number of links with a URL |
| `links` | Every block on the page, in display order: `order`, `position`, `title`, `url`, `type` (CLASSIC, GROUP, HEADER, YOUTUBE_VIDEO, COMMERCE_PRODUCT...), `groupTitle` for links inside a collection, and `gate` when a link is behind an age or password check |
| `socials` | Social profiles: `platform`, `handle`, `url`, and `source` (`icon` for the social icons row, `link` for a regular link that points to an account page) |
| `instagramUrl`, `tiktokUrl`, `youtubeUrl`, `xUrl`, `facebookUrl`, `linkedinUrl` | The first profile found for each platform, for easy spreadsheet use |
| `email` / `emails` | Addresses from `mailto:` links and the email icon |
| `phone` / `phones` | Numbers from `tel:` and `sms:` links |
| `whatsappNumbers` | Numbers from WhatsApp click-to-chat links (wa.me, api.whatsapp.com) |
| `input` | What you typed for this profile |
| `scrapedAt` | When the page was read |

Emails and phone numbers are only the ones the profile owner put on the page as links. Nothing is guessed from names, nothing is looked up elsewhere. The "Contact Info" card some profiles show (a vCard behind a button) is listed as a `CONTACT_DETAILS` link, but its contents are not fetched.

The dataset has two views: **Profiles** (one row per profile) and **All links** (one row per link, handy for CSV export).

### Input

```json
{
  "profiles": ["mrbeast", "@hubspot", "https://linktr.ee/selenagomez", "linktr.ee/tiktok?utm_source=ig"]
}
```

Usernames with or without `@`, full URLs, URLs with tracking parameters: all of them work, and duplicates are merged. Up to 5,000 profiles per run. If you pipe in a dataset from another scraper, items with a `url`, `profileUrl` or `username` field are picked up.

### Pricing

- **$2.00 per 1,000 delivered profiles** on the Free plan, $1.80 Bronze, $1.60 Silver, $1.40 Gold. All links, socials and contacts of a profile are included in that one price.
- **$0.001 per run** (start fee).
- Platform usage is included. You pay nothing for profiles that don't exist, are blocked by Linktree, or could not be read.

### What happens with bad or missing profiles

Every profile you asked for ends with a named outcome in the run's status message (and the full list in the `RUN_SUMMARY` record of the key-value store):

- **no such Linktree profile (HTTP 404)**: the username does not exist or was deleted.
- **page blocked by Linktree**: Linktree replaced the page with its "blocked" notice.
- **refused / rate-limited / network error**: Linktree did not answer this time; run it again later.
- **page served without its profile data**: Linktree changed its page format. The run fails loudly instead of returning empty rows, and we fix the parser.

A run that delivers at least one profile succeeds and lists the rest. A run that delivers nothing fails with the reason, so you never pay for an empty success. Inputs that are not Linktree profiles (a Beacons link, a sentence) are skipped and named; if nothing valid is left the run fails with `BAD_INPUT`.

### Use cases

- **Influencer marketing:** turn a list of creators into their contact emails, WhatsApp numbers and every platform they are on.
- **Lead generation:** small businesses (tattoo studios, realtors, coaches, restaurants) often put their booking link, email and WhatsApp on Linktree. Export them in one go.
- **Competitor and brand monitoring:** see which products, campaigns and affiliate links a brand or creator is pushing right now, and re-run on a schedule to catch changes.
- **Enrichment:** you scraped Instagram or TikTok bios and got linktr.ee links. Feed them here to get the real destinations.

### FAQ

**Is there a Linktree API for this?** Linktree has no public API for reading other people's profiles. This actor reads the public profile page, the same one anyone sees in a browser.

**Do I need a Linktree account or cookies?** No.

**Does it work for Beacons, bio.link, lnk.bio or other link-in-bio sites?** Not yet. This actor is Linktree only, and other sites' links are skipped with a note.

**How fast is it?** Profiles are read three at a time; a few hundred profiles take a few minutes.

**Are hidden or age-gated links included?** Links behind an age or password gate are listed with the `gate` field when Linktree puts them in the page. Password-protected pages are flagged with `pageLocked`.

**Why is a field empty?** Because the profile doesn't show it. We never fill gaps with guesses.

**Is scraping Linktree legal?** The actor reads publicly available pages only. You are responsible for how you use personal data such as emails and phone numbers (GDPR, CAN-SPAM and similar rules apply to outreach).

Keywords: linktree scraper, linktr.ee scraper, link in bio scraper, linktree email extractor, linktree links extractor, creator contact finder, influencer email finder, linktree API alternative.

# Changelog

This Actor's version history is a separate document: https://apify.com/tagadanar/linktree-scraper/changelog.md

# Actor input Schema

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

One per line: a username (mrbeast, @mrbeast) or a profile link (https://linktr.ee/mrbeast, linktr.ee/mrbeast?utm_source=ig). Duplicates are merged. Up to 5,000 profiles per run. Each delivered profile is one row with all of its links.

## Actor input object example

```json
{
  "profiles": [
    "mrbeast",
    "hubspot"
  ]
}
```

# Actor output Schema

## `dataset` (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": [
        "mrbeast",
        "hubspot"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/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 = { "profiles": [
        "mrbeast",
        "hubspot",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/linktree-scraper").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": [
    "mrbeast",
    "hubspot"
  ]
}' |
apify call tagadanar/linktree-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tagadanar/linktree-scraper"
        }
    }
}
```

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/jNGxdN9V5oNLttAP2/builds/bMrypCqwCSeDUJz14/openapi.json
