Instagram API: Which One to Use for Profiles and Search
Pick the right Instagram API for profile lookups, search and recent posts. Three endpoints run on one public account: fields, speed and billing.

Get the public profile, followers and bio of any list of Instagram accounts. Paste this into your agent:
Set up https://monid.ai/SKILL.md, and then use Monid to get the Instagram profile for nasa, give me followers, following, bio, verified status and whether it is a business account, and tell me which endpoint you used.
One prompt returns a profile. 1 min setup · 10-30 hrs saved.
You need Instagram data for accounts you do not own: followers, bio, whether it is a business, maybe a list of accounts in a niche. "Instagram API" turns out to mean several different things, and the endpoint that finds accounts is not the one that describes them. This guide sorts the jobs (look up a profile, search for accounts, read recent posts), shows what three live profile endpoints returned for the same public account on 2026-10-16, and names the traps we hit. It runs through Monid, the OpenRouter for agent tools: one key, one balance, every tool priced per call.
What is the easiest way to get Instagram profile data through an API?
Monid. Install it once, add a key, and your agent calls an Instagram profile endpoint with a username: no developer app to register, no token to refresh and no plan to choose.
- Pay per call. A profile lookup is billed on its own, at $0.001 on the default route (Verified 2026-10-16 on the Instagram tools page). Buy calls as you need them: no monthly plan and no minimum top-up. Discovery and inspection are free; only a run bills.
- One install, every API. The same key and balance reach several Instagram providers and every other platform on Monid, so a second source for the same job is a different endpoint name, not a new account.
- Lives inside your agent. Install the CLI, add your key, run the prompt above, and the tools are there whenever your agent needs them. Your agent reads
SKILL.mdand learns the rest, so setup is about a minute.
At that price 1,000 profile lookups cost about $1.00 (Verified 2026-10-16).
How do you pick the right Instagram API for your job?
Start from the job, because three different jobs share the name. A profile lookup takes a username and returns one account. A search takes a keyword and returns accounts. A posts pull takes an account and returns its content. Each has its own endpoint, its own speed and its own billing.
| Route | Good for | Cost shape | Catch |
|---|---|---|---|
| Download a dataset | One look at a niche on one date | One-off | Stale the day you get it; you cannot ask for a new account |
| Build it yourself | Learning, one account | Hours of your time | You maintain it when Instagram changes |
| Hosted scraper actor | Recent posts and a profile in one record | Per result | Slower, heavier records |
| Monid profile endpoints | A list of accounts, on demand, from your agent | Per call or per result | One job per endpoint, so choose by job |
The same sorting across every platform is in What Is the Best API for Social Media Scraping?.
For agents
Grab an API key at app.monid.ai, then paste this to your agent and hand it the key:
set up https://monid.ai/SKILL.md
It learns the whole discover, inspect, run workflow itself. More in the agent quickstart.
For humans
npm install -g @monid-ai/cli
monid keys add -k <your-api-key> -l main
Step 1. Find the endpoints
monid discover -q "instagram profile and follower data"
monid inspect -p anyapi -e /instagram.profile
This shows each provider, its billing shape and its status. Both commands are free.
Step 2. Look up one profile
monid run -p anyapi -e /instagram.profile -w \
-i '{"handle":"nasa"}'
The lightest option: fast and flat. For the richest record, call the TikHub endpoint with a GET query:
monid run -p tikhub -e /api/v1/instagram/v2/fetch_user_info -w \
--query '{"username":"nasa"}'
And for a profile plus its latest posts in one record, the Apify actor takes a list of usernames:
monid run -p apify -e /apify/instagram-profile-scraper -w \
-i '{"usernames":["nasa"]}'
Step 3. Search for accounts by keyword
monid run -p anyapi -e /instagram.search_profiles -w \
-i '{"query":"coffee roaster"}'
Or hand the whole job to an agent
Give this to your agent![]()
Set up https://monid.ai/SKILL.md, and then use Monid to find 40 Instagram accounts for coffee roasters, then look up each one's followers, bio and business status, and give me one CSV sorted by followers.📖 See also Instagram Follower and Engagement Data: Which API in 2026?
Can you build your own Instagram API client with Python?
Yes, people do, with a headless browser or with libraries that talk to the same private endpoints the mobile app uses. It works until Instagram changes something, and then it is your job to fix it.
Doing it yourself means session handling, proxies, retries, parsing that follows Instagram's internal field names, and a repair every time a response changes shape. That is hours before the first useful row and a standing maintenance bill after it. The rules side differs by country and by use, so read the platform's terms and the law where you operate before you build anything.
A call to a maintained endpoint costs $0.001 (Verified 2026-10-16) and returns typed JSON that someone else keeps working. For anything you will run more than once, Monid is the better trade: the collection is maintained for you, and when one provider is slow or down you call a different endpoint with the same key. The middle path is a hosted actor that drives the browser for you, which the Apify Instagram scraper guide compares actor by actor. A one-off look at one account is the case where writing your own is fine.
What does an Instagram profile API return?
A flat identity block, counts, and sometimes a lot more, depending on which endpoint you call. On 2026-10-16 we ran three profile endpoints on the same public organisation account, one call each.
The lightweight record
anyapi /instagram.profile took 2.2 seconds and returned 14 keys: avatarUrl, bio, bioLinks (5 links), displayName, externalUrl, followers (104,375,730), following (90), handle, highlightsCount, isBusiness, posts, private, userId and verified. Two of those, highlightsCount and posts, came back null. It is a compact identity record, easy to put in a table.
The rich record
tikhub /api/v1/instagram/v2/fetch_user_info took 6.8 seconds and returned the raw profile object, far longer than the other two. The useful parts: follower_count (104,375,730) and following_count (90) as flat numbers, media_count (4,967), is_verified, is_private, is_business, a business_contact_method of CALL, a public_email, and an about block with country and the month the account joined. The summary text promises these and they came back.
The record with recent posts
apify /apify/instagram-profile-scraper took 6.2 seconds and returned one record: followersCount (104,375,733), followsCount, postsCount (4,967), highlightReelCount (6), igtvVideoCount (171), isBusinessAccount, a businessCategoryName of "Government Agencies", latestPosts (12 posts) and relatedProfiles (50 accounts). Each post carried caption, likesCount, commentsCount, hashtags, mentions, timestamp, type, videoViewCount and isPinned.
What you can build with it
- A creator or brand shortlist. Pull followers, bio and business status for a list of handles, then sort. The same pull feeds an enriched CSV, as in Ship an Instagram Profile Enricher This Afternoon.
- A niche map. The actor's
relatedProfilesgave 50 accounts around one profile, which is a starting list for a competitor or lookalike set. - A contact list for outreach. The rich record exposes a contact method and a public email when the account has published one. Use it for people who chose to publish it.
What goes wrong when you pull Instagram profiles at scale?
Four things, all visible on the runs above.
Why do two endpoints disagree on the same account?
Because each reads Instagram at a slightly different moment through a different route. Within the same minute, followers were 104,375,730 on two endpoints and 104,375,733 on the third, a gap of 3 on a base of over 104 million, which does not matter. The business flag did matter: the lightweight record said isBusiness: false while the other two said true, and the actor classified the account as "Government Agencies".
Pick one endpoint per column and stick with it. Mixing sources inside one dataset makes counts that do not add up and flags that flip between rows.
Why did a keyword search return names and nothing else?
Because the search endpoint finds accounts and does not describe them. Our search for "coffee roaster" returned 40 profiles in 10.6 seconds, each with handle, displayName and url, and every other field (followers, bio, verified, isBusiness) was null on all 40 rows.
The pattern that follows: search first, then look up each handle with a profile endpoint. Budget for it. Forty accounts is one search call at $0.0012 (Verified 2026-10-16) plus 40 lookups at $0.001 each, about $0.04.
const found = await search("coffee roaster"); // handles only
const profiles = await Promise.all(found.profiles.map(p => lookup(p.handle)));
Why are the links in the bio redirects?
Because the raw profile hands you Instagram's click wrapper. In the rich record each bio_links entry carries both a clean url and a lynx_url that points at l.instagram.com with tracking parameters appended. Store the url, not the lynx_url, or your dataset fills up with redirect links back to Instagram.
What does a whole list cost?
Multiply the unit price. 1,000 profiles is about $1.00 on the lightweight endpoint, $1.60 on the actor at $0.0016 a result, and $2.00 on the rich endpoint at $0.002 a call (all Verified 2026-10-16). Pay for the richer record only where you use its fields.
📖 See also Are Instagram Engagement Trackers Accurate?
Which endpoint should I use for which job?
| Endpoint | What it does | Input | Returns | Latency (our run) | Billing |
|---|---|---|---|---|---|
anyapi /instagram.profile | Lightweight profile | handle | 14 keys: bio, followers, following, verified, business flag | 2.2 s | Per call |
tikhub /api/v1/instagram/v2/fetch_user_info | Full raw profile | username or user_id | Counts, contact method, public email, about block | 6.8 s | Per call |
apify /apify/instagram-profile-scraper | Profile plus recent content | usernames list | Counts, category, 12 latest posts, 50 related profiles | 6.2 s | Per result |
anyapi /instagram.search_profiles | Find accounts by keyword | query | Up to 40 rows of handle, name and url | 10.6 s | Per call |
All four rows were run on 2026-10-16. Billing shape is given here and the current figure is on monid.ai/tools.
The rule of thumb: search to find handles, the lightweight profile for a table of counts, the rich profile when you need contact fields, the actor when you also need recent posts. The lightweight endpoint also lets you choose an upstream route, with the price and uptime of each shown by monid inspect, so a slow route is a parameter change rather than a new integration.
When is another route a better fit?
You manage the accounts. Meta's own Graph API is built around accounts that connect to your app: your own properties and your customers' after they authorise it. For publishing, replying as the account, and insight numbers that only the owner sees, it is the route to use. Its access and review rules are Meta's to set, so read its current documentation for your case.
You need the exact count at an exact moment. Our three endpoints disagreed by 3 followers on an account with over 104 million. Counts are a snapshot taken at call time, and one provider's snapshot is not another's.
You need private accounts. is_private and private came back false for the account we ran. When an account is private, the media is not available from a public endpoint, and the flag is useful because it lets you skip those accounts in a batch.
You need contractual stability. If a broken field is an incident for a customer, a managed first-party integration with a contract is a better dependency than any scraped source.
And the disclosure: this is Monid's blog and we sell these endpoints. The most reusable advice here costs nothing and works with any vendor: search to find handles, look up each one, and stick to one source per column.
Conclusion
The right Instagram API is chosen by the job. To describe an account you know, call a profile endpoint through Monid: $0.001 a call for the lightweight record (Verified 2026-10-16), one key for Instagram and everything else, about a minute to set up. To find accounts, search first and look each one up. To manage your own accounts, use Meta's API.
Two traps matter more than the choice. Endpoints disagree on small things and sometimes on flags: we saw a business account reported as not a business by one of three. And a keyword search returns names only, so the real cost of a list is the search plus one lookup per handle.
How we estimated the time saved: building and maintaining your own profile lookup, account search and recent-posts pull is roughly 3 to 10 hours each for sessions, parsing and upkeep. That is 10 to 30 hours. The 1 minute is the install, key and first call once you already have a Monid key.
Free next step: run monid discover -q "instagram profile and follower data", then monid inspect the top result, and make one call on an account you know. Compare the followers and business flag with what you see in the app. Start at monid.ai.
FAQ
Is the Instagram API free?
Not through Monid, but each lookup is small: $0.001 for a profile on the default route (Verified 2026-10-16), with no monthly plan and no minimum top-up. Discovery and inspection are free. Meta's Graph API has its own access terms, which you should read in Meta's documentation.
What is the difference between the Instagram Graph API and a profile endpoint?
The Graph API is the platform's own interface for accounts that connect to your app, used for publishing, comments and owner insights. A profile endpoint takes any public username and returns the public profile with no app of your own. Use the first to manage accounts and the second to research accounts you do not own.
Can an Instagram API read private accounts?
No. The identity fields come back and the flag says private, but the posts are not available from a public endpoint. Use the flag to skip those accounts instead of retrying them.
How do you find Instagram accounts by keyword?
Call the search endpoint with a phrase such as "coffee roaster". It returned 40 accounts in our run, with handle, display name and URL only. Then call a profile endpoint on each handle to get followers, bio and business status.
Published August 2026.


