Linktree Scraper - Bio Links & Destination URLs avatar

Linktree Scraper - Bio Links & Destination URLs

Pricing

from $2.67 / 1,000 results

Go to Apify Store
Linktree Scraper - Bio Links & Destination URLs

Linktree Scraper - Bio Links & Destination URLs

Extract every destination URL behind a Linktree bio-link page, plus the account's title, description, avatar, tier, country and creation date. Reads the page's embedded data island, so it returns fields the page never displays. HTTP-only, no account.

Pricing

from $2.67 / 1,000 results

Rating

0.0

(0)

Developer

Farhan Febrian Nauval

Farhan Febrian Nauval

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

23 days ago

Last modified

Categories

Share

Linktree Scraper — Bio Links & Destination URLs

Extract every destination URL behind a Linktree bio-link page, plus the account's title, description, avatar, tier, country and creation date. HTTP-only, no account, no browser.

Useful when you have a list of creators or brands and want the links they actually point people at — the shop, the newsletter, the booking page — rather than just the bio-link URL.

Input

FieldTypeDefaultDescription
profilesarrayrequiredUsernames (spotify), @handles, or full URLs (https://linktr.ee/spotify)
maxConcurrencyinteger5Profiles fetched in parallel
proxyConfigurationobjectApify proxyOptional — a bare IP worked in testing

Output

One row per input, always — including failures, so downstream joins never silently lose a key.

{
"_input": "spotify",
"_source": "S1-next-data",
"_scrapedAt": "2026-09-07T01:52:39Z",
"username": "spotify",
"profileUrl": "https://linktr.ee/spotify",
"pageTitle": "@spotify",
"description": "…",
"profilePictureUrl": "…",
"tier": "free",
"country": "US",
"createdAt": 1557790392,
"isActive": true,
"isUnclaimedAccount": false,
"linkCount": 6,
"urls": ["https://open.spotify.com/…", "…"], // flat list of destinations
"links": [ // structured, with Linktree's own fields
{ "id": "9964805", "title": "Playlist 1", "url": "https://open.spotify.com/…",
"type": "CLASSIC", "position": 0, "_depth": 0 }
],
"pinnedLinks": [],
"socialLinks": []
}

Failure rows carry _error (not_found, bad_input, blocked, unexpected_shape) and _errorDetail, and no payload.

How it works

Everything comes from the __NEXT_DATA__ island Next.js ships with the page, not from the rendered markup. That is both more stable across redesigns and richer — tier, country, createdAt and link position are all in the island and never shown on the page.

Two details worth knowing, because both cause silent wrong answers if you get them wrong:

Select the island by id, not by a regex over its opening tag. Linktree renders it as <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">. A regex written against the usual two-attribute form matches nothing, and the page then looks empty rather than broken.

A 200 is not proof the profile exists. Linktree answers an unregistered handle with a normal 200 "claim this username" page that still carries a __NEXT_DATA__ island — so the parse succeeds and every field comes back null. This actor checks for account identity markers (id, uuid, createdAt, pageTitle, username) and emits not_found instead of a null-filled row that looks like a successful scrape of an empty profile.

Nested links are flattened. Linktree lets a link be an expandable group with children. Each descendant is emitted as its own row in links with a _depth and _parentTitle, so you get every destination URL without walking a tree but can still reconstruct the grouping.

Known limits

LimitDetail
No click analyticsView and click counts are private to the account owner
No email captureLinktree's email-signup blocks expose no collected addresses
Gated profilesPages behind a password or age gate return no links