How to Scrape Linktree and Link-in-Bio Pages (2026)
A creator's link-in-bio page is a map of their business: other social accounts, shop, newsletter, booking link, affiliate deals and often a contact email. For influencer vetting and lead research it is one of the most useful pages to read. This guide shows how to extract it from Linktree, how to classify what you find, and what to do with other link-in-bio services.
What people use bio pages for
- Influencer vetting. Find every account a creator runs, not just the one you found first.
- Brand deal discovery. Affiliate and shop links show which brands already pay a creator.
- Lead research. Booking links and business emails tell you how a creator wants to be contacted.
- Fraud checks. A bio page that links to accounts with very different follower counts, or to unrelated sites, is worth a closer look.
Is there an official Linktree API?
Not a public one for reading profiles. Linktree's developer page invites developers to register interest in its developer program, and its LinkApp SDK is for building apps that appear on profiles. Its llms.txt describes profile pages as public, server-rendered HTML.
Where the data lives
Linktree pages are built with Next.js, and each one embeds its data as JSON in a script tag with the id __NEXT_DATA__. In our check on 8 November 2026 the useful parts were:
| Path | Holds |
|---|---|
props.pageProps.account | username, pageTitle, description, profilePictureUrl, contentWarning |
props.pageProps.links | Each link's title, url, type, position, locked and nested children |
props.pageProps.socialLinks | The social icons row |
props.pageProps.hasPagePassword | Whether the page is password protected |
These are internal names, not a public contract. They can change any time, so test your parser on a few pages every week.
Code: extract and classify links
import json, requests
from urllib.parse import urlparse
def linktree(username):
html = requests.get(f"https://linktr.ee/{username}", timeout=20).text
start = html.index('id="__NEXT_DATA__"')
start = html.index(">", start) + 1
data = json.loads(html[start:html.index("</script>", start)])
page = data["props"]["pageProps"]
if page.get("hasPagePassword"):
return None # respect the lock
links = []
for l in page.get("links", []):
links.append(l)
links.extend(l.get("children") or [])
return {
"handle": page["account"]["username"],
"bio": page["account"].get("description"),
"links": [(l.get("title"), l.get("url")) for l in links
if l.get("url") and not l.get("locked")],
"socials": [s.get("url") for s in page.get("socialLinks", [])],
}
KINDS = {"instagram.com": "instagram", "tiktok.com": "tiktok", "youtube.com": "youtube",
"youtu.be": "youtube", "x.com": "x", "twitter.com": "x", "twitch.tv": "twitch",
"spotify.com": "music", "amazon.com": "affiliate", "amzn.to": "affiliate",
"calendly.com": "booking", "substack.com": "newsletter", "patreon.com": "membership"}
def kind(url):
if url.startswith("mailto:"):
return "email"
host = urlparse(url).netloc.lower().removeprefix("www.")
for domain, k in KINDS.items():
if host == domain or host.endswith("." + domain):
return k
return "other"
Run kind() over every link and you get a profile summary like "3 socials, 2 affiliate links, 1 newsletter, booking link", which is often all a vetting sheet needs.
Edge cases to handle
- Password-protected pages. Skip them. Do not try to get around the lock.
- Sensitive content warnings. A page can ask visitors to confirm before viewing. Decide your policy and record the flag.
- Locked links. Some links are gated behind actions like subscribing. Treat them as unavailable.
- Nested links. Groups and embeds hold child links; flatten them as the code does.
- Redirects and short links. Resolve them before classifying if you need the real destination.
- Content signals. Linktree's robots.txt uses content signals, for example
ai-train=nofor some crawlers. Respect what applies to you.
Keep it fresh
Creators change bio links often, sometimes weekly when a new campaign starts. Store each pull with its date, compare link lists between pulls, and treat a new affiliate domain as a signal of a new deal. For an active outreach list, refresh monthly; for a one-time vetting check, pull right before you make contact.
Other link-in-bio services
Komi, Pillar, Linkbio and link.me each use their own page formats, so a Linktree parser will not work on them. If you vet creators at scale, expect all of them in your list and plan one parser per service, or one API that normalizes them.
A vetting checklist from a bio page
- List every social profile and check follower counts on each.
- Note shops and affiliate links: they show existing brand deals and categories.
- Look for a management or business email.
- Compare the bio page with the creator's main profile; a stale page can mean an inactive creator.
Doing it with ScrapeIO
The Linktree API returns a page's name, bio, avatar, every link and the social icons from a URL or username, without a parser to maintain. The same call shape works for Komi, Pillar, Linkbio and link.me. Not-found pages are not charged. See the link-in-bio endpoints.
curl "https://scrapeio.com/v1/linktree?url=https://linktr.ee/USERNAME" -H "x-api-key: YOUR_KEY"
Sources
Checked on 8 November 2026 from each vendor's own pages. Prices and limits change; follow the links before you decide.
100 free credits, no card. Credits never expire.
Get API key