Instagram API v1
Public Instagram data — accounts, posts, reels, comments, the public reel feed and trending terms — as JSON or Markdown, from https://api.fetchlayer.dev/instagram. Everything returned is what Instagram shows a visitor who is not signed in: nothing private, nothing from an account you do not own. FetchLayer is not affiliated with, endorsed by, or sponsored by Instagram or Meta.
Three ceilings, stated first
Instagram publishes less to a signed-out reader than any other platform here. These three limits decide what you can build, so they are up front rather than buried — and all three announce themselves in the notes array on every response that hits them.
- Twelve posts per page. Instagram serves a grid 12 at a time whatever
limitsays, solimit: 60is five page reads and five credits.pagesFetchedreports what actually happened. - About thirteen comments, first page only. Instagram publishes the first page of comments and no more, while reporting a total in the thousands and setting
hasMoretrue. The response says so itself: “These are the 13 comments of the 4,334 the source reports that are public for this post. The source does not publish the rest to a signed-out reader, so there is no further page to read.” Do not loop onhasMore— you will read the same thirteen and be billed again. - A profile’s post count is never published.
stats.postCountisnullfor every account, with a note saying to read the posts and count them. Follower and following counts are published normally.
Two things you will not find elsewhere
Story highlights are on the profile. user-profile returns highlights — the id, title and cover of every highlight the account keeps — in the same call that returns the bio and the follower count, at no extra cost. The contents of a highlight are not public, and nothing here claims otherwise; the titles alone tell you how an account organises itself.
Reels carry play counts. user-reels is the only listing on Instagram that publishes engagement at all: every reel comes back with playCount, likeCount and commentCount, so sizing an account’s video does not need a detail call per reel.
Available endpoints
/user-profile POST List an account’s posts /user-posts POST List an account’s reels /user-reels POST Get one post or reel in full /post-detail POST Read a post’s comments /post-comments POST Browse Instagram’s public reel feed /reels-feed POST List what Instagram is trending /trending-searches POST Parse an Instagram URL (free) /resolve-url GET Stream an image or video asset /media One post shape, and what a listing leaves out
Every route that returns posts or reels returns the same record: id, shortcode, url, kind, productType, caption, createdAt, likeCount, commentCount, playCount, countsHidden, dimensions, altText, assets, carousel, author, coauthors, taggedUsers, location, hashtags, mentions, topics, hasAudio and fieldsFrom.
A posts listing carries no like count, no comment count and no posting date — Instagram does not publish them on a grid. fieldsFrom says whether a record came from a listing or from detail, so a null count is never mistaken for a zero. countsHidden true is the other reason a count is absent: the account turned like and view counts off.
Captions and alt text are not transcripts
caption is the author’s own written post body. altText is Instagram’s machine-written image description (“Photo by NASA on August 19, 2026. May be an image of text.”). Neither is a transcript of spoken audio, and Instagram publishes no subtitles to a signed-out reader — so this API returns none, and nothing here should be read as offering one.
Paging and billing
limit caps the items returned; pages caps how many pages are read to get them, up to 20. Because Instagram’s page is 12 items, the two are tied: a limit of 60 needs five pages. When more exists, hasMore is true and nextCursor carries an opaque value to pass back as cursor. Passing -1 means “the maximum this service allows”, which is 240 items and 20 pages.
Billing follows pages: one credit per page of results read, stated on every response as pagesFetched. A single-page request costs 1. /resolve-url reaches Instagram not at all, reports pagesFetched: 0 and is free.
Read the notes array
Several real limits on this platform are reported only in notes: the comment ceiling, the withheld post count, the fields a listing does not carry, a list that stopped early, and a private account with no readable posts. An empty result always comes with a note explaining it rather than as an unexplained empty array.
Requests are strict
An unrecognised body field is a 400 naming it, not a silent no-op. A typo such as usernam would otherwise be dropped and answered with the wrong data and no indication why.
What Instagram does not publish
These are not gaps in effort. Instagram redirects a reader who is not signed in to a login page for all of them, so no service reading public Instagram can return them honestly:
- Posts under a hashtag, and posts at a place. Both redirect to sign-in. This is the real gap on this platform: reading it needs authenticated Instagram accounts, which is a different product, not a feature we left out.
/resolve-urlstill identifies a hashtag or place link and says so. - Keyword search over accounts, hashtags or places.
/trending-searchesand/reels-feedare the public substitutes. - Follower and following lists. The counts are published; the lists are not.
- Stories, and the contents of a highlight — a story request returns an empty shell. Highlight titles and covers are published, and come back on
/user-profile. - Posts an account is tagged in, and who liked a post.
- Comments beyond the first page, and comment reply text. Each comment reports how many replies it has.
- An account’s post count, which Instagram withholds from a signed-out reader.
- Transcripts or subtitles. Instagram publishes none here.
captionis written by the author,altTextis machine-written alt text, and neither is a transcript.