Instagram bio analysis: links, categories and niches at scale
A bio is the most compact piece of positioning on Instagram. Across a few thousand accounts, bios tell you which link-in-bio tools a niche uses, which shops creators send traffic to, how creators describe themselves, and how many accounts present as businesses. This guide shows how to analyze bios in aggregate.
One boundary first: this is market research, not lead harvesting. The goal is counts and patterns, not a list of people's emails or phone numbers. Leave contact details out of your dataset entirely.
What a profile gives you
| Field | What it tells you |
|---|---|
bio | Self-description, niche words, location words, calls to action |
external_url | Where the account sends traffic |
category | The category label a professional account picked, such as Artist or Health/beauty |
verified, followers, posts | Size and maturity, for segmenting |
Instagram has allowed up to five links on a profile since April 2023, with only the first shown directly in the bio TechCrunch. So the main external link is the one that matters most to visitors.
Step 1: build the account list
Start from a defined population, not a random crawl. Good seeds are: accounts posting under a niche hashtag this month, accounts in search results for a niche keyword, or the similar-accounts list of five known accounts in the niche. Dedupe by handle.
Step 2: pull profiles
import os, requests, csv
API = "https://scrapeio.com"
H = {"x-api-key": os.environ["SCRAPEIO_API_KEY"]}
rows = []
for handle in open("handles.txt").read().split():
r = requests.get(f"{API}/v1/instagram/profile", params={"handle": handle}, headers=H).json()
if r.get("success"):
d = r["data"]
rows.append({k: d.get(k) for k in ["handle", "followers", "category", "external_url", "bio"]})
Step 3: classify links by domain
Parse each external_url and keep only the domain. Then map domains to types:
- Link hubs: link-in-bio pages that list many links.
- Shops: store platforms and marketplaces.
- Content: YouTube, podcasts, newsletters, blogs.
- Booking and services: scheduling and booking sites.
- Own domain: anything else.
from urllib.parse import urlparse
from collections import Counter
def domain(u):
if not u:
return None
host = urlparse(u if "://" in u else "https://" + u).netloc.lower()
return host[4:] if host.startswith("www.") else host
print(Counter(domain(r["external_url"]) for r in rows).most_common(20))
The top 20 domains usually cover most of a niche. Label those by hand and treat the rest as "own domain".
Step 4: count categories
A filled category usually means a professional (business or creator) account. The share of accounts with a category is a quick measure of how commercial a niche is. Then compare engagement by category: in many niches, creator-labeled accounts and business-labeled accounts perform very differently.
Step 5: mine the bio text
- Niche words: count the most common words after removing stop words. These are the terms the niche uses about itself.
- Calls to action: look for "shop", "book", "free guide", "code", "link below". Their share shows how hard a niche sells.
- Partnership signals: words like "collab", "partner" or "PR" show openness to brand work, without you needing any contact detail.
- Language: detect the bio language to split a niche by market.
A language model is handy for this step. Send bios in batches of 100 and ask for a niche label and a one-word positioning tag for each. Keep handles out of the prompt if you do not need them.
Step 6: report in aggregate
A useful output is a one-page table: share of professional accounts, top categories, top link domains by type, top niche words, and median followers per segment. That is enough to answer "how do creators in this niche monetize?" without exposing any individual.
Rules for doing this responsibly
- Do not store emails, phone numbers or addresses, even if a bio contains them. Strip them with a regex before saving.
- Store handles only as long as you need them for deduping.
- Privacy law can apply to public profile data. This is not legal advice; check what applies to your project.
Doing it with ScrapeIO
The instagram profile API returns bio, external_url and category in one call. Build the account list with the instagram search profiles API or the instagram similar accounts API. A 2,000-account study costs about 2,000 credits, and private or missing accounts cost nothing. ScrapeIO's profile data does not include contact fields.
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