What an Instagram Profile API Should Actually Return
The 10-field checklist that separates a useful Instagram profile endpoint from a thin one, and how the Graph API, DIY scraping, and a per-result actor grade against it.

A useful Instagram profile endpoint returns ten fields in one call: username, full name, bio, external URL, follower count, following count, posts count, a verified flag, the profile picture, and a slice of recent posts. Anything that stops short of that list forces you to make a second request, run a second tool, or guess. Judge every option (the official Graph API, a DIY scraper you maintain, a per-result actor) against that checklist and the choice gets a lot less religious. This is the opinionated version of that grading, run against a verified endpoint on Monid, the pay-per-call data API marketplace where one integration reaches hundreds of external data endpoints without a signup per vendor.
TL;DR
- The ten fields that make a profile endpoint useful: username, full name, bio, external URL, followers, following, posts count, verified, profile picture, recent posts.
- The official Instagram Graph API returns almost all of them, but only for accounts you own or manage, and only after app review. It cannot read an arbitrary public handle.
- DIY scraping can hit every field on paper, but you own the login walls, layout changes, and proxy bill, and that maintenance never ends.
- A per-result actor like
apify/instagram-profile-scraperreturns the full checklist for any public username in one call, billed at a fraction of a cent per result, price shown before you run.
The checklist, and why each field earns its place
Most "Instagram profile API" pitches lead with a field count. The count is noise. What matters is whether the fields you actually build on come back together, because a missing one is a second round trip you pay for in latency and code.
- Username and full name. The join key and the human label. Without both, you cannot dedupe against your own records or show anything readable.
- Bio and external URL. This is where creators and brands put the real contact surface: a Linktree, a booking page, a shop. For lead enrichment and creator outreach, the external URL is often the single most valuable field in the payload.
- Follower and following counts. Reach and the follower-to-following ratio are the fastest proxy for whether an account is a real audience or a follow-back farm.
- Posts count. Cheap signal for whether the account is active or abandoned before you spend on pulling media.
- Verified flag. Disambiguates the real brand from twelve impersonators, and gates trust scoring.
- Profile picture. Needed for any UI that shows the person, and a fast liveness check.
- Recent posts. The difference between a static business card and a living profile. A handful of recent posts with captions, timestamps, and engagement lets you judge activity and content fit without a separate media call.
A profile endpoint that returns the first nine but not recent posts is a directory lookup. One that returns all ten is an enrichment engine.
Grading the three options
Neither the official API nor a scraper is "wrong." They solve different problems, and the honest comparison is field-by-field.
| Field | Graph API (official) | DIY scraper | Per-result actor on Monid |
|---|---|---|---|
| Any public username | No (owned accounts only) | Yes | Yes |
| Username, full name | Yes | Yes | Yes |
| Bio, external URL | Yes | Yes | Yes |
| Followers, following | Yes | Yes | Yes |
| Posts count | Yes | Yes | Yes |
| Verified flag | Partial | Yes | Yes |
| Profile picture | Yes | Yes | Yes |
| Recent posts (with metrics) | Yes (own media) | Yes | Yes |
| Setup cost | App review, business linkage | Proxies, parsers, upkeep | One API key |
| Breaks when layout changes | No | Yes | No (vendor absorbs it) |
| Billing | Free within limits | Your infra bill | Per result, price shown first |

The official Graph API: correct, and boxed in
Start with what Meta actually allows, because it explains why every other option exists. The Instagram Graph API is a genuine, well-documented product, but it reads accounts you own or manage: an Instagram Business or Creator account linked to a Facebook Page you control, reached through an access token you obtained via app review. It will return your own username, bio, followers, media, and insights in rich detail.
What it will not do is take an arbitrary public handle you do not own and hand back its profile. That is deliberate platform policy, not a gap you can configure around. So the moment your job is "enrich this creator we found" or "profile these thousand handles from a campaign," the official surface is a dead end, and you are back to choosing between building a scraper or buying one. The Graph API wins when the account is yours. It cannot compete on the third-party read, because it was never built for it.
DIY scraping: every field, and a second job
A scraper you write yourself can technically reach all ten fields, because the data is on the public profile page. The catch is everything around the parse. Instagram rate-limits aggressively, gates more of the page behind a login every quarter, and changes its markup without notice, which means your extractor breaks on a schedule you do not control. You will run a proxy pool to avoid blocks, rotate it, and treat the whole thing as a service that pages you at 2am. For a one-off pull that can be fine. As a dependency your product leans on, you have hired yourself a maintenance job that produces no differentiated value.
The per-result actor: the checklist in one call
The pragmatic middle is renting the scraper instead of owning it. apify/instagram-profile-scraper from Apify takes an array of usernames and returns the full checklist per profile: display name, biography, profile picture, external links, follower and following counts, posts count, verification status (and even verification date), plus an overview of recent media with captions, hashtags, mentions, timestamps, media URLs, and engagement metrics. It also carries account classification (business versus private, business category) and related accounts for niche mapping. The layout breakage that would page you at 2am is the vendor's problem now, not yours.

The practical how-to
Inspect the endpoint first (free), then run it on one handle. Inspect shows the exact schema and the price before anything bills.
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 details in the agent quickstart.
For humans
npm install -g @monid-ai/cli
monid keys add --label main --key <your-api-key>
More details in the CLI quickstart.
Then inspect and run:
monid inspect -p apify -e /apify/instagram-profile-scraper # free: schema + price
monid run -p apify -e /apify/instagram-profile-scraper -i '{"usernames":["humansofny"]}' -w
The input is small on purpose. usernames is a required array, so you batch handles by adding to it, and one result comes back per username. There is one paid extra: includeAboutSection, a boolean that adds join date, country of origin, and channel info when you need the deeper account history. Leave it off and you still get all ten checklist fields.
The cost tradeoff
Billing is per result, which makes cost a function of how many handles you send, not how long a job runs or how many seats you license. A single profile is a fraction of a cent, so profiling a few hundred creators lands in small change, and there is no monthly minimum to amortize. Current magnitudes are at monid.ai/tools. Compare that to the DIY path, where the marginal cost per profile looks like zero until you price in the proxy subscription and the engineer-hours spent fixing the parser, and to the Graph API, which is free but cannot read the handles you actually want to enrich. The right question is not "what is the sticker price," it is "what does one usable, complete profile cost me all-in," and on that measure the per-result actor is hard to beat for third-party reads.
The honest caveat
A rented scraper reads public data, which means it is subject to the same availability that any public reader faces: a private account returns limited fields, and Instagram can change what is public. If your accounts are your own, the Graph API is the more durable and policy-blessed choice, and you should use it. This checklist and this endpoint are for the case the Graph API cannot serve, reading public profiles you do not own, and there the tradeoff is renting reliability instead of maintaining it. Sample a handful of your real handles before you scale, because coverage on private and long-tail accounts will always be thinner than on public creator and brand profiles.
FAQ
Can the official Instagram Graph API return any public profile? No. The Graph API reads accounts you own or manage, linked to a Facebook Page, after app review. For an arbitrary public handle you do not control, you need a scraper.
What is the minimum a profile endpoint should return? The ten fields: username, full name, bio, external URL, followers, following, posts count, verified flag, profile picture, and recent posts. Fewer than that and you are stitching multiple calls together.
How is this billed?
Per result: one profile is a fraction of a cent, and cost scales with how many usernames you send. A free monid inspect shows the price before you run, and magnitudes live at monid.ai/tools.
Do I need an Apify account to use the endpoint?
No. apify/instagram-profile-scraper is reachable from one Monid wallet, billed pay-as-you-go, with no per-vendor signup.
What does includeAboutSection add?
It is a paid extra that returns account history like join date and country of origin. The ten core checklist fields come back without it.


