# Linktree Scraper (`bigibyte/linktree-scraper`) Actor

Free Linktree scraper: extract all links, social profiles, bio, avatar, verification, country and published emails from any public Linktree profile. Built for influencer and creator lead generation. No login.

- **URL**: https://apify.com/bigibyte/linktree-scraper.md
- **Developed by:** [BigiByte](https://apify.com/bigibyte) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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: Extract Links, Socials, and Emails from Public Profiles

This actor opens a public Linktree page, reads the profile data embedded in the page, and saves the links, social profiles, bio, avatar, country, and any email the creator actually published. You can download JSON, CSV, or Excel, or send the dataset to Google Sheets, HubSpot, Make, Zapier, or n8n. There is no login.

It only reads `linktr.ee`. Other link-in-bio hosts are not included.

### Use cases

- Influencer and creator lead lists: start from a username and keep every public link plus Instagram, TikTok, YouTube, Spotify, and the rest.
- Brand and affiliate research: see product links, prices, and which domains a creator sends traffic to.
- Talent agencies: check verification, country, tier, and the bio without opening each page by hand.
- Competitor tracking: save a creator's link list and rerun it when the page changes.
- Enrich a social list: you already have Instagram or TikTok names that match a Linktree username, and you want the other profiles and any published email.

### How to run it

1. Paste usernames (`selenagomez`, `@mkbhd`) or profile URLs (`https://linktr.ee/linktree`).
2. Leave the output as one row per profile, or switch to one row per link.
3. Set a max profile count. The free cap is 5,000 profiles per run.
4. Start the run and export the dataset.

A missing username does not stop the run. The actor writes an error row and moves on.

### Input

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `profiles` | string\[] | `selenagomez`, `mkbhd` | Usernames or `https://linktr.ee/...` URLs. |
| `outputFormat` | string | `profiles` | `profiles` nests links on the profile row. `links` writes one row per link. |
| `includeCommerceProducts` | boolean | `true` | Add product title, price, currency, and image. Prices are converted from cents. |
| `includeTheme` | boolean | `false` | Add the public theme fields. |
| `extractContacts` | boolean | `true` | Scan the bio, titles, and `mailto` / `tel` / WhatsApp links for emails and phone numbers. |
| `maxItems` | integer | `100` | Max profiles for the run. Maximum 5,000. |
| `maxConcurrency` | integer | `5` | Simultaneous page requests. Maximum 5. |
| `timeoutSecs` | integer | `300` | Stop after this many seconds and keep rows already saved. |
| `requestTimeoutSecs` | integer | `30` | Per-request timeout. |
| `proxyConfiguration` | object | No proxy | Leave it off unless you see 403 or 429. |

#### Profiles

```json
{
    "profiles": ["selenagomez", "@mkbhd", "https://linktr.ee/linktree"],
    "outputFormat": "profiles",
    "maxItems": 100
}
```

#### One row per link

```json
{
    "profiles": ["selenagomez"],
    "outputFormat": "links"
}
```

### What you get

A profile row includes `username`, `url`, `accountId`, `pageTitle`, `bio`, `avatarUrl`, `isVerified`, `badges`, `tier`, `country`, `timezone`, `createdAt`, `links`, `socialLinks`, `socials`, `emails`, `phones`, and `externalDomains`. Link rows add `username`, `profileUrl`, `isVerified`, and `country` onto each link.

The link table uses `linkTitle` and `linkType` because Apify's dataset schema rejects the field names `title` and `type`. Each link object still includes `title` and `type` with the same values. `instagram` is the same URL as `socials.instagram`, so the profile table can show it.

Group headers stay on the profile so child links can carry `groupTitle`. In link output, a group with no URL is skipped. Commerce prices are stored in currency units (`10000` cents becomes `100`). A locked or age-gated link has `isGated: true`. A password-protected page sets `hasPagePassword` and returns no links.

Emails show up only when the page publishes them: a `mailto:` link, an email social, or an address written in the bio or a link title. Most profiles have none.

Failures use `error` and `statusCode`. Codes: `NOT_FOUND`, `NO_DATA`, `HTTP_<code>`, `PARSE_ERROR`, `INVALID_INPUT`. Duplicate usernames and the same account id are saved once.

### Limits

- Public Linktree pages only. No login, and no private or password-unlocked content.
- Emails and phone numbers are included only when the creator published them.
- Free runs cap at 5,000 profiles. Link output can write more rows than that, because the cap counts profiles.
- Proxy is off by default. Turn it on only if Linktree answers with 403 or 429.

### FAQ

**Does this log in to Linktree?**
No. It requests the public profile page.

**Why is the email list empty?**
The creator did not put an email on the page. The actor does not guess one.

**Can I paste a Beacons, Stan Store, or bio.link URL?**
No. Those hosts are out of scope. Use a `linktr.ee` username or URL.

**Why does MKBHD come back as `MKBHD`?**
The account username keeps the casing Linktree stores. The site treats the URL as case-insensitive, so `mkbhd` and `MKBHD` are the same profile.

### Related

If you also need a contact extractor, or TikTok and Instagram follower counts, BigiByte builds those as separate actors and can join them into one lead list.

Need thousands of creator leads enriched with emails and follower counts? BigiByte builds custom lead pipelines: https://bigibyte.com

### Trademark Notice

Linktree and related names, logos, and trademarks belong to their respective owners. Their use in this documentation is solely to identify the source of the data and does not imply affiliation, sponsorship, endorsement, or partnership.

### Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, sponsored by, or otherwise officially associated with Linktree.

### Is web scraping legal?

Collecting information that is already public is generally legal. Scraping is not the same thing as hacking, and there is no single law that bans it. The limits are the usual ones: do not break into accounts, do not take private or confidential data, and be careful with personal data and copyrighted works. A site's terms can also restrict how you access it. Facts such as a public name, price, or rating are not the same thing as republishing someone's article or photo.

This actor reads public pages or official public APIs. It does not log in and it does not bypass access controls.

This is not legal advice. For the longer explanation, see Apify's article [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

# Actor input Schema

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

Usernames or profile URLs. Examples: selenagomez, @mkbhd, https://linktr.ee/linktree.

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

One row per profile, with links nested, or one row per link.

## `includeCommerceProducts` (type: `boolean`):

Add price, currency, and image for commerce links. Prices are converted from cents.

## `includeTheme` (type: `boolean`):

Add the public theme fields (colors, button style, typeface) when Linktree includes them.

## `extractContacts` (type: `boolean`):

Scan the bio, link titles, and mailto, tel, and WhatsApp links for emails and phone numbers.

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

Free version cap: 5,000 profiles per run.

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

How many profile pages can be requested at once. Maximum 5.

## `timeoutSecs` (type: `integer`):

Stop the run after this many seconds and keep the rows already saved.

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

Per-request timeout.

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

Enable only if you see 403 or 429. Leave it off for normal runs.

## Actor input object example

```json
{
  "profiles": [
    "selenagomez",
    "https://linktr.ee/mkbhd"
  ],
  "outputFormat": "profiles",
  "includeCommerceProducts": true,
  "includeTheme": false,
  "extractContacts": true,
  "maxItems": 100,
  "maxConcurrency": 5,
  "timeoutSecs": 300,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `profiles` (type: `string`):

Username, title, verification, country, link count, Instagram, and emails.

## `links` (type: `string`):

One row per link when the run uses link output. Profile runs keep links nested.

## `errors` (type: `string`):

Inputs that failed, with the error code and HTTP status.

## `dataset` (type: `string`):

Every row from the run, without a table view applied.

# 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": [
        "selenagomez",
        "mkbhd"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("bigibyte/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": [
        "selenagomez",
        "mkbhd",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("bigibyte/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": [
    "selenagomez",
    "mkbhd"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call bigibyte/linktree-scraper --silent --output-dataset

```

## MCP server setup

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