Instagram API reference

Public Instagram profiles, media, stories, highlights, following, comments, transcripts, hashtags, locations, audio, trending Reels and search over REST with one consistent shape — one API key, no Graph app review.

Social Fetch's Instagram tag is a set of GET /v2/instagram/... routes. Pass a handle, profile URL, user id, shortcode, media URL, hashtag, location id or audio id and get { data, meta } with data.lookupStatus, meta.requestId, meta.creditsCharged, and meta.version: "v2". Authenticate with x-api-key only — no Meta app review, business account, or page token.

These pages are generated from the public OpenAPI spec. Product overview, examples, and FAQs live on the Instagram platform hub.

Credits

Most Instagram routes are 1 credit per completed lookup, and paginated calls bill each page, including a last page that comes back empty. Exceptions: the engagement audit is 5 for an audited profile and 1 for a private or missing one; the profile route adds 1 per include (recentMedia, about) it serves; and GET /v2/instagram/media/{media}?include=files adds 10 (11 in total) when the files are hosted. Trust meta.creditsCharged.

Identifiers

Each v2 route takes the identifier named in its path, and a bad one is a 400 before anything is billed.

You havePass it asNotes
instagram.com/nike{profile} = nike, @nike, or the URLHandle with or without @, or a profile URL
A user id from an earlier response{profile} = 13460080Digits alone are read as a user id
instagram.com/p/DePzV26vLFB/{media} = DePzV26vLFB or the URLShortcode, post, Reel or TV URL, or the numeric media id
A comment id from the comments list{commentId} = 17858893269036513Digits only; read it from GET /v2/instagram/media/{media}/comments
instagram.com/stories/highlights/17921…/{highlightId} = 17921… or the URLFind ids with GET /v2/instagram/profiles/{profile}/highlights
instagram.com/explore/tags/nike/{hashtag} = nike, #nike, or the URLAny letter case. Spaces and punctuation are a 400. Find tags with GET /v2/instagram/hashtags/search
instagram.com/explore/locations/213385402/{locationId} = 213385402 or the URLDigits (up to 19), or a location URL. Find ids with GET /v2/instagram/locations/search, or location.id on a post
instagram.com/reels/audio/1234567890/{audioId} = 1234567890Digits (up to 19). Find ids with GET /v2/instagram/audio/search, or audio.id on a Reel
instagram.com/popular/harry-potter/{topic} = harry%20potter or the URLA word or phrase, or the topic's Popular page link
instagram.com/share/…not acceptedOpen the link and pass the post URL it opens

Post and Reel links are not profiles, and profile links are not media; the error says what to send instead. A story link (instagram.com/stories/{handle}/…) works as a profile. /v2/instagram/profiles/search, /v2/instagram/hashtags/search, /v2/instagram/locations/search and /v2/instagram/audio/search are search routes, so the account whose handle is search is reached as /v2/instagram/profiles/@search and the tag named search as /v2/instagram/hashtags/%23search.

Pagination

List routes return data.page with nextCursor, hasMore and returnedCount. Pass data.page.nextCursor back as cursor while data.page.hasMore is true. Cursors are opaque and tied to the route (and the tab, sort, query, post or other identifier) that issued them; a cursor from somewhere else is a 400 bad_request. A list can end on an empty page (hasMore was true, and nothing more came back): like any served page, it costs 1 credit. Query parameters are passed once: include=recentMedia,about, not include=recentMedia&include=about.

Profiles

Media, comments and transcripts

Hashtags

Locations

Audio

Search and discovery

The hashtag, location and audio searches are listed with their groups above. The other search routes, Popular topics and trending Reels:

On this page