Skip to main content

Scraper API for Instagram

The ScrapeBadger Instagram API turns instagram.com’s public surface into a clean JSON feed: user profiles and their posts, media detail by shortcode, and paginated comments.
Every other Instagram endpoint needs the authenticated (account-pool) tier, which is temporarily unavailable while we scale the pool: related profiles, user about/videos/reels/tagged/pinned, followers/following, stories/highlights, media oembed, media and comment likers, comment replies, all hashtag endpoints (info, top, recent, reels), all locations, audio, and all search variants (hashtags, top, users/places/reels/music/autocomplete). They currently return 503 {"error": "temporarily_unavailable"} with a Retry-After header and are not billed. The hashtag and search pages stay published, flagged, so the request shape is known when they return.
All endpoints are GET, live under https://scrapebadger.com/v1/instagram/*, and authenticate with the X-API-Key header. No Instagram account or upstream API key is required — ScrapeBadger handles authentication, rate limiting, TLS fingerprinting and proxy rotation transparently. Credits are charged per request (see the table below) and reported on the X-Credits-Used response header.

Features

  • Profiles — full public profile by username: bio, links, counts, verification, business/professional metadata, plus paginated posts.
  • Media — media detail by shortcode code and paginated comments.
  • Hashtags & search — temporarily unavailable (see above).

Honesty caveat

These endpoints read Instagram’s public surface only. Private accounts expose profile metadata but not their posts or media. Fields reflect what Instagram serves to an unauthenticated client; some professional/business fields are only present when the account has opted into them.

Conventions

  • Pagination. List endpoints take amount (page size) and a cursor (opaque next-page token). Every list response is wrapped in { items, count, next_cursor, has_more } — pass next_cursor back as cursor to walk forward until has_more is false.
  • Datetimes. Every datetime ships in both a Unix form (*_utc) and an ISO 8601 UTC string (*_at), e.g. taken_at + taken_at_utc.

Credits

Standard read (5) covers profile and media detail. Paginated listings (8) cover posts and comments. A 503 temporarily_unavailable from a gated endpoint costs 0 credits.

Quickstart

Resolve a handle with /users/{username}, then page their media with /users/{username}/posts by passing the returned next_cursor back as cursor until has_more is false.

ScrapeBadger is an independent tool and is not affiliated with, endorsed by, or sponsored by Instagram or Meta. “Instagram” is a trademark of Meta Platforms, Inc., used here only to describe the platform this scraper is designed to work with.