Field notes · 2026

Instagram Scraping in 2026: What's Public, What's Login-Walled, and How to Get It

The Graph API only covers your own business accounts. Everything else lives behind a moving wall of internal endpoints and soft blocks. Here's how it actually behaves.

Skip to a ready-made Actor →

Almost everyone who sets out to "use the Instagram API" for research, influencer discovery or competitor tracking hits the same wall in the first hour: the official Graph API does not do what they assumed it did. This guide is the map I wish I'd had — what the official API really gives you, where the public/private line actually falls, how the rate limiting behaves once you start pulling at volume, and why profile, hashtag and post scraping are three different problems wearing the same hoodie.

The Graph API's real boundary

The Instagram Graph API is built for businesses managing their own presence, not for reading the platform. Three hard facts shape everything:

So if your job is "tell me about accounts and content I don't own," the Graph API answers "I can't" for the majority of it. That is by design, not a bug you can permission your way out of.

Public vs login-walled: where the line really is

Instagram serves a lot through unauthenticated internal JSON endpoints (the ones the web client itself calls), but the surface shrinks every quarter. Roughly:

DataReadable without login?Notes
Bio, follower / following counts, post countUsually yes (public accounts)Served via the profile JSON endpoint; first page of grid included.
Recent grid posts + captions + like/comment totalsUsually yesPagination beyond the first page often forces a session.
Full comment threads on large postsNoGated after the first few comments.
Follower / following listsNoAuthenticated only, and the most aggressively rate-limited call on the platform.
Stories, Highlights, Reels insightsNoSession required; insights only for owned accounts.
Hashtag feeds (top + recent)Rarely without a sessionHeavily gated; this is where most scrapers break first.
Gotcha: a "public" endpoint returning HTTP 200 does not mean you got data. Instagram frequently answers a flagged request with a 200 whose body is a login-redirect page or an empty {"data": {"user": null}}. Always assert on the shape of the payload, not the status code.

How the rate limiting actually behaves

There is no published "X requests per minute" number for the web endpoints, because the throttle is reputation-based, not a fixed counter. From running this at volume, the pattern is:

  1. Velocity + IP reputation drive the block. A clean residential IP pacing one profile every few seconds can run for a long time. A datacenter IP firing 30+ lookups a minute typically gets soft-blocked within a few hundred requests.
  2. Blocks are soft, not loud. You'll see 429 Too Many Requests, or a checkpoint_required redirect, or that empty-200 described above. The session isn't banned forever — it's parked.
  3. Follower-list and hashtag calls burn budget fastest. Treat them as 5–10x more "expensive" than a plain profile read when you plan concurrency.

The practical mitigations are residential proxy rotation, randomized pacing, session pools, and exponential backoff on the soft-block signatures. Building and maintaining that stack is the actual work — the parsing is the easy 10%.

Three scrape types, three different problems

Profile scraping

The most reliable. You pass usernames, you get account-level fields plus the first page of the grid. Good for influencer vetting (followers, engagement rate from recent posts) and lead qualification from bios.

Hashtag scraping

The most fragile. Hashtag feeds are split into "top" and "recent," both gated, both quick to throttle. If a scraper is going to fail on you, it fails here first. Expect lower throughput and plan retries.

Post scraping

Middle ground. A single post's media, caption and counts read cleanly; the comment thread underneath needs a session and paginates slowly. Great for campaign tracking and UGC monitoring, less so for full comment-sentiment at scale.

A pragmatic shortcut: a managed Actor

If you don't want to own the proxy/session/backoff machinery, the no-code route is to call a maintained Instagram scraper on Apify. You hand it usernames, hashtags or post URLs; it returns clean JSON over a REST endpoint and absorbs the rate-limit fight for you. Here's the shape of a synchronous run:

curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "usernames": ["nike","adidas"],
    "resultsType": "posts",
    "resultsLimit": 100,
    "addParentData": true
  }'

The response is an array of post or profile objects with fields like ownerUsername, caption, likesCount, commentsCount, timestamp and url — ready to drop into a notebook, a sheet, or your own enrichment pipeline.

Want a ready-made Instagram Actor?

Our maintained Instagram scraper returns profiles, posts and hashtag feeds as clean JSON, handles the proxies and rate limits, and is callable as an API. Free to start with Apify's monthly platform credits.

Get the Instagram Scraper → Or get done-for-you leads

FAQ

Can the Instagram Graph API read any public profile?

No. It only returns data for Business/Creator accounts you've connected via a Facebook Page you administer, plus limited Business Discovery lookups of other Business/Creator accounts by exact username. Personal profiles, follower lists and non-business hashtag feeds are out of reach.

What Instagram data still requires a login?

Follower/following lists, who liked a post, full comment threads, Stories, and most hashtag results. Basic public-account fields and recent grid posts are usually readable unauthenticated, through endpoints that change often.

How do the rate limits work?

They're reputation- and velocity-based, not a fixed published number. Datacenter IPs at high velocity soft-block within a few hundred requests; residential proxies, pacing and session rotation push that far higher.

Profile vs hashtag vs post — which is hardest?

Hashtag is the most gated and fragile, profile is the most reliable, and single-post reads sit in the middle (the comment thread is the gated part).

Disclosure: links to Apify on this page are affiliate links. If you create a paid account through them we may earn a commission, at no extra cost to you. We recommend Apify because we build and ship Actors on it ourselves.