Blog/Social data
11 min read

What Is the Best Instagram API in 2026?

Four products answer to the name: Meta's Graph API, the private mobile API, hosted actors, metered endpoints. One question decides which.

What Is the Best Instagram API in 2026?

Copy this line to your agent to pull a public Instagram profile without a Meta app review.

set up https://monid.ai/SKILL.md and use tikhub instagram fetch_user_info_by_username to get a public profile

Four different products answer to "Instagram API" and they are not ranked versions of each other. Meta's official Graph API, the private mobile API that the app itself calls, hosted actors that drive a browser, and metered endpoints that wrap one of the above. The reason the ranked lists disagree is that they are comparing four categories as if they were four brands. Sort by what you are allowed to ask for and the shortlist collapses, which is what this guide does with a live response, running through Monid, the OpenRouter for agent tools.

What is the best Instagram API in 2026?

There is no single best one, and the reason is not diplomatic. The four kinds differ on a question that comes before quality: whose data you are allowed to ask for.

Meta's Graph API: your own accounts

The official product. It is well documented, stable, free, and it answers questions about accounts you control or that have explicitly connected to your app. Insights, media, comments, publishing. It is the correct answer for a social media management tool and it is not an answer at all for research on accounts that have never heard of you.

The app review process is the practical gate. Getting the permissions that matter takes a submission, a review, and a business verification, and the permission set is scoped to consented accounts throughout.

The private mobile API: what the app calls

Instagram's own client talks to endpoints that are not published for third parties. Several providers wrap those, which is why you can get a full profile from a username with one call and no app review. Coverage is excellent because it is the same data the app renders.

What you give up is any contract. There is no deprecation notice, no support, and the shape can change when Instagram ships a client update.

Hosted actors: a browser somebody else runs

A prebuilt scraper for Instagram, run on a vendor's infrastructure, sold per result. This is what Apify's Instagram actors are, and there is more than one of them for a reason: profiles, posts, comments, hashtags and reels are different jobs. We took that apart in The Apify Instagram Scraper: Which Actor to Use in 2026.

Metered endpoints: any of the above, per call

The delivery shape rather than a fifth source. One key, one balance, and the underlying provider is whoever covers the field you asked for. This is the only one of the four an agent can pick at run time, and it is how the calls in this guide run.

The four kinds, side by side

AspectMeta Graph APIPrivate mobile APIHosted actorMetered endpoint
Whose accountsYours and consentedAny publicAny publicAny public
Gate to accessApp reviewA providerA providerA key
Stability contractYesNoneVendor's best effortVendor's best effort
CostFreePer callPer resultPer call or result
Good forManaging accountsProfile lookups at volumePosts, comments, hashtagsMixed jobs, agents

Read the first row and most decisions are made. If the accounts consented, use Meta's. If they did not, Meta's cannot help you and the rest of the table is your shortlist. The same sorting applied across every platform rather than just this one is in What Is the Best API for Social Media Scraping in 2026?.

📖 See also Instagram Follower and Engagement Data: Which API in 2026?

Why does Instagram have four different APIs?

Because they were built for different parties, and only one of them was built for you.

The official one was built for Meta's partners

Graph API exists so scheduling tools, ad platforms and analytics products can operate accounts on their customers' behalf. Every design decision follows from that: consent is the organising principle, the permission scopes are per-account, and app review is the gate that keeps unconsented access out. Nothing about it is hostile. It simply answers a different question from "what is this public account's follower count".

This is the single most common disappointment in the category. Somebody searches the official product name, reads that it is the proper way to do it, builds against it, and discovers three days in that it cannot see the accounts they came for.

The private one was never built for anyone but the app

It exists because the mobile client needs it. Third parties reading it is a side effect, and every property that follows from that is real: no versioning promise, no changelog, and a shape that reflects Instagram's internal model rather than a designed public contract. The next section is a concrete example of exactly that leaking through.

The actors exist because pages are not records

Some Instagram data is not in any API at any price, and the only way to it is rendering the page. Comment threads, hashtag listings and reel metadata land here. A hosted actor is a browser plus a parser plus somebody maintaining both, and it is the right tool for those jobs and an expensive one for a profile lookup.

How do you get Instagram profile and follower data?

Three steps, two of them free.

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. Pick by billing shape, not by brand

What it does. Shows which providers cover Instagram and how each one charges, which decides more than coverage does at this level.

The endpoints. tikhub Instagram profile endpoints bill per call; apify/apify/instagram-profile-scraper bills per result.

The call.

monid discover -q "instagram profile and follower data"
monid inspect -p tikhub -e /api/v1/instagram/v1/fetch_user_info_by_username

What comes back. A ranked list with provider, price, billing shape and a verified flag, then the schema.

What it costs. Nothing. Discovery and inspection never bill.

Step 2. Fetch the profile

What it does. Turns a username into a full public profile record.

The endpoints. tikhub /api/v1/instagram/v1/fetch_user_info_by_username, billed per call.

The call.

monid run -p tikhub -e /api/v1/instagram/v1/fetch_user_info_by_username -w \
  --query '{"username": "natgeo"}'

What comes back. Running exactly that on 2026-08-27 returned a data.user object with a very large field set: biography, bio_links, external_url, full_name, id, fbid, is_verified, is_business_account, is_professional_account, highlight_reel_count, has_clips, business_address_json and business_contact_method, plus follower and following counts. It also carried ai_agent_owner_username and ai_agent_type, which are newer fields most documentation has not caught up with.

The business fields are the underrated ones for anything commercial. A professional account that has published a contact method is telling you how it wants to be reached, and that is a very different signal from an address somebody guessed.

What it costs. A fraction of a cent per call, billed per call rather than per field, so a fully populated profile costs the same as a sparse one. Current figures at monid.ai/tools.

Step 3. Read the counts correctly

What it does. Avoids the single most common integration bug in this category, which the next section is about.

The call. No endpoint. A path, not a field:

followers = user["edge_followed_by"]["count"]
following = user["edge_follow"]["count"]

There is a worked version of this whole pull, list in and enriched CSV out, in Ship an Instagram Profile Enricher This Afternoon.

What comes back. The right number. Reaching for user["follower_count"] returns nothing, silently, and a pipeline that treats a missing key as zero will report every account as having no followers.

📖 See also What an Instagram Profile API Should Actually Return

Give this to your agent

$Set up https://monid.ai/SKILL.md, and then use Monid to pull the public profile for these 40 instagram usernames, give me follower count, verified status and business contact method as a CSV, and flag any that came back empty.

Why is the follower count nested three levels deep?

Because you are reading Instagram's internal GraphQL model, not a designed public API, and this is the clearest place that shows.

What the live response actually looked like

In the run above the follower count did not arrive as follower_count. It arrived as edge_followed_by, an object whose only useful member is count. The following count is edge_follow, the same shape. Those are GraphQL edge wrappers: Instagram's own schema models a follower relationship as an edge collection, and the wrapper survives all the way out to you.

Why this matters more than it looks

Three reasons, and they compound.

The failure is silent. A missing key in most languages is a None or an undefined, not an exception, so a wrong field name produces a record that looks fine and reports zero followers. Nobody notices until somebody asks why the biggest account in the dataset has no audience.

It is not consistent across providers. A provider that normalises the response to a flat follower_count is doing you a favour and also making your code non-portable, because switching to a passthrough provider silently breaks it. Read the actual response from the actual provider before writing the mapping.

And it is a live warning about the whole category. The edge_ prefix is a piece of Instagram's internal design leaking through, which is exactly the property you accepted when you chose the unofficial route: you are reading somebody's private model and it can change without a note.

The defence is cheap. Assert on the parsed value rather than on the request, the same discipline we argued for crawls in the Crawl4AI guide. A record whose follower count is zero and whose biography is present is almost certainly a mapping bug, not an account with no followers.

Which endpoint should I use for which job?

EndpointWhat it doesInputOutputBest forBilling
tikhub profile by usernameFull public profileA usernameBio, counts, verified, business contactProfile lookups at volumePer call
tikhub user followersFollower listA user idFollower recordsAudience analysisPer call
apify/apify/instagram-profile-scraperProfile plus recent postsProfile URLsProfile and post recordsYou need posts tooPer result
apify Instagram post and comment actorsPosts, comments, hashtagsURLs or hashtagsPost and comment recordsContent and sentiment workPer result
Meta Graph APIAccounts you manageAn access tokenInsights, media, publishingManaging consented accountsFree, after app review

Every Monid row was verified with monid inspect on 2026-08-27. The table gives billing shape rather than figures, because shape changes your design and current numbers live on monid.ai/tools.

The per-call versus per-result split is the budget. A profile lookup is bounded, so per-call billing is right and a thousand lookups is a thousand calls. Posts and comments are unbounded, so per-result billing is right and the number you must set before running is the cap, not the budget. Getting these the wrong way round is how a comment pull becomes an unpleasant surprise. The same per-call versus per-result reasoning, worked through on a different platform, is in the YouTube scraper guide.

When should you use Meta's official API?

Three cases, and the first is not a compromise.

You manage the accounts. If your users connect their own Instagram accounts, Graph API is not the fallback, it is the correct and complete answer. It is free, it is supported, it has a deprecation policy, and it gives you insights data that no unofficial route can see because it was never rendered on a public page.

You need to publish. Posting, scheduling, replying to comments as the account. No scraper does this and none should.

You need Instagram insights. Reach, impressions and saves are computed by Meta and were never rendered on a public page, so no unofficial route can see them at any price. This is a hard limit rather than a coverage gap, and it is the same shape as the argument in Web Scraping Tools: Which Kind Do You Actually Need?.

Stability is contractual. If a broken field is an incident with a customer on the other end, an undocumented source is the wrong dependency at any price.

There is also a case for going to a specialist rather than a catalog. If Instagram is the whole product and you need deep coverage of one surface, a vendor who does only Instagram will out-cover a generalist. Per-call access is optimised for the opposite: several platforms, unpredictable volume, no contract each.

And the disclosure: this is Monid's blog and we sell per-call access, so the argument we make best is the mixed, unpredictable one. If your accounts consented, use Meta's API and ignore this page.

Conclusion

The best Instagram API is decided by one question asked before any comparison: did the accounts you care about consent to your app. If they did, Meta's Graph API wins outright and nothing else is close. If they did not, Graph API cannot help you at all, and the real choice is between a per-call profile endpoint, a per-result actor for content, and how much stability you are willing to trade for coverage.

The thing worth carrying past the choice is what the live response showed. Reading an unofficial Instagram API means reading Instagram's internal model, edge_followed_by and all, and that model can move without warning. Assert on the values you parsed rather than on the status of the request, because this is a category where the failure is a plausible-looking record rather than an error.

Free next step: run monid discover -q "instagram profile and follower data" and monid inspect the top result. Both are free, and the schema will show you the real field names before you write a single line of mapping. Start at monid.ai.

FAQ

How do I automate scraping public Instagram data without getting blocked?

The short answer is that blocking is an infrastructure problem rather than a code problem: it is decided by the address your requests leave from and how they are paced, not by your parser. Using an endpoint moves both to the provider, and failed fetches on the better ones are not billed. The long answer, including which specific actor to use for which surface and what two measured runs cost, is in The Apify Instagram Scraper.

What is the most reliable way to get Instagram profile data into n8n?

One HTTP request node against a metered endpoint, rather than a community node per vendor, because the community nodes are the part that breaks on upgrade. That keeps credentials in one place and lets you swap the provider behind the request without touching the workflow. There is a full walkthrough in Instagram Follower and Engagement Data and the general pattern for any vendor in The Data Layer for n8n.

Can the Instagram Graph API read any public account?

No, and this is the misunderstanding that sends most people looking for an alternative. Graph API is scoped to accounts that have connected to your app, so it reads your own properties and your customers' after they authorise it. Business Discovery gives you a narrow read on other business accounts from a connected account, with a limited field set, and it is not a general public-profile lookup. If you need arbitrary public accounts, the official API is not a smaller version of what you want, it is a different product.

What are the rate limits on an Instagram scraper API?

They are set by the provider rather than by Instagram, and the more useful number is usually concurrency rather than a daily cap: most providers will let you run a modest number of parallel requests indefinitely rather than giving you a large burst and then a wall. Read the pricing note on inspect before designing a batch, because per-call and per-result endpoints want different batch shapes, and pace by concurrency rather than by sleep.

Last updated August 2026.

instagram apiinstagram graph apisocial datatikhubapify