Integration Guide

Instagram's Business Discovery API: What It Actually Returns

Meta does have an official way to read another account's Instagram data — Business Discovery. Here's exactly where it stops: professional accounts only, your own app review, and no path to a highlight, ever.

Written by Alex P.

  • Instagram API
  • Business Discovery API
  • Instagram Graph API
  • competitor analysis
  • Instagram reels
  • story highlights

Search for “Instagram API competitor data” and most answers collapse to one line: the official API can’t see anyone but you. That’s close, but not quite right, and the imprecision matters if you’re deciding whether to build on it. Meta does publish a way to read another account’s Instagram data without that account’s permission — it’s called Business Discovery, it’s part of the Graph API, and it does return real metrics for accounts you don’t manage.

The honest version isn’t “there’s no official answer.” It’s “there’s an official answer, and here’s the three-part gate in front of it, plus one thing it will never do no matter who approves your app.”


What Business Discovery actually returns

Business Discovery is a query you run through the IG User node’s business_discovery edge: give it another account’s username, get back that account’s followers_count, media_count, and a paged list of its recent media, each media item carrying like_count, comments_count, and view_count. That’s Meta’s own documentation, not a third-party summary — the edge is real, and it’s the closest thing the platform offers to “look up a competitor.”

So the “look at anyone” claim being false doesn’t mean the API is useless for competitor data. It means the useful part comes with three separate gates stacked on top of each other, and any one of them is enough to disqualify most of what people actually want to do with it.


Gate one: you need your own professional account, connected

To call Business Discovery at all, your app needs a valid access token for an Instagram professional account linked through Facebook Login — meaning before you can look up anyone else, you first need your own Business or Creator account wired into a Meta app. There’s no anonymous or app-only path in. If the thing you wanted was “check one competitor’s numbers before a meeting,” you’re now setting up an Instagram professional account and a Meta developer app to do it.

Gate two: App Review, for anyone who isn’t you

That gets you Standard Access, which only works against your own linked accounts. To run Business Discovery against accounts you don’t manage — which is the entire point of “competitor data” — you need Advanced Access, and Advanced Access is granted only through Meta’s App Review. That process asks for business verification, a live-mode app, a privacy policy, a data-deletion path, and a screencast of the feature actually working end to end, reviewer-reproducible, demoed against a Creator or Business account — Meta’s own review guidance is explicit that a personal account doesn’t count as a valid demo. This is a multi-week approval process to get permission to look up other people’s public Instagram numbers.

Gate three: the target has to be professional too

Even fully approved, Business Discovery only ever resolves against another professional account — Meta’s own reference describes it as reaching “public professional accounts.” A personal account — which is what most individual creators, small business owners, and a large share of the influencers anyone would actually want to vet still run — returns nothing. Not “restricted,” not “insights hidden.” Not found. The account type of the person you’re checking on decides whether the endpoint works before a single metric is in play.

Stack the three: your own professional account, weeks of app review, and a target that has to be the right account type. That’s a lot of infrastructure to check one number.


The one thing no amount of approval buys: a highlight

Story highlights aren’t gated behind Business Discovery, Advanced Access, or anything else — they’re not represented anywhere in the Graph API at all. Meta’s own API reference lists exactly six nodes: IG Comment, IG Container, IG Hashtag, IG Media, IG User, and Page, plus one root edge for hashtag search. There is no Story node and no Highlight node. The platform models permanent posts, comments, and hashtags — never the curated, pinned collections that sit on top of an account’s stories. That’s true for your own account as much as anyone else’s: even a fully-approved app with full Advanced Access has no Graph API call that returns a highlight’s title or cover, because the object was never added to the schema.

Given that, “does your API return story highlights” isn’t really an app-review question. It’s a “this doesn’t exist yet” question, for every caller, permanently.


What this looks like against a real account

Pulling a public profile — professional or personal, no account linking, no review — returns the highlight rail as part of one call:

const res = await fetch('https://api.fetchlayer.dev/instagram/user-profile', {
  method: 'POST',
  headers: { Authorization: `Bearer ${API_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ username: 'hubermanlab' }),
});
const { profile } = await res.json();
// profile.highlights: [{ id, title: "BrainArt", coverUrl }, ...]
// profile.stats.postCount is always null — Instagram doesn't publish
// a post count to a signed-out reader either, official API or not.

And reel performance — the metric Business Discovery would only ever hand you for a professional account you’ve already been approved to query — comes back the same way for any public account:

const res = await fetch('https://api.fetchlayer.dev/instagram/user-reels', {
  method: 'POST',
  headers: { Authorization: `Bearer ${API_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ username: 'mrbeast', limit: 5 }),
});
const { posts } = await res.json();
// Each reel: { playCount: 174490546, likeCount: 6147616, commentCount: 87905, ... }

That reel came back with a play count of 174,490,546 — pulled live, against an account this session doesn’t manage, with no professional account of our own in the loop and nothing to get approved.

Two things worth being precise about, since Business Discovery does return view_count on media it can see: the difference here isn’t that we return a number Meta withholds entirely. It’s that ours works on any public account — professional or personal — the moment you have a username, with no linked account, no review cycle, and no dependency on the target’s account type. user-posts, the ordinary grid listing, carries no counts at all — no likes, no comments, no dates — which is Instagram’s own publishing behavior for a signed-out reader, not something either API changes. Reels are the one listing that carries engagement, official route or not.


Where this leaves “Instagram scraper API”

If you already know you need bulk profile and post data across many accounts, that’s the Instagram Scraper API page — it’s the general capability list. This piece exists for the narrower question that sends people looking for Business Discovery in the first place: can I check what one account’s reels are actually doing, or see its highlights, without becoming a Meta-reviewed app first. That’s a different search than “scrape Instagram,” and it deserves a straight answer instead of a capability table.


Practical notes

  • countsHidden isn’t the same as an official restriction. When an account has turned off public like and view counts, countsHidden comes back true and those fields are absent rather than zero — a creator’s own setting, not an API limitation.
  • Business Discovery’s media list is still Instagram’s own recent-media window. Even approved and pointed at a professional account, you’re reading what Instagram chooses to surface as recent, not an arbitrary historical pull — the same practical ceiling any listing carries.
  • A private account still returns its profile. Whether that account is professional or personal, its bio, follower count, and highlight titles are public; only its posts are withheld — true on either path.

Next Steps