Platforms

Instagram

Instagram profiles, posts, reels, social graph, discovery, and engagement without Graph API approval.

Openhandle reads public Instagram profiles, posts, reels, pinned and tagged posts, followers, hashtags, places, audio, and engagement data with an API key and no Graph API approval, business verification, or app review.

Endpoints

OperationEndpoint
Get a profileGET /v1/instagram/profiles/{identifier}
List profile postsGET /v1/instagram/profiles/{identifier}/posts
List profile reelsGET /v1/instagram/profiles/{identifier}/reels
List profile videosGET /v1/instagram/profiles/{identifier}/videos
List tagged postsGET /v1/instagram/profiles/{identifier}/tagged-posts
List profile repostsGET /v1/instagram/profiles/{identifier}/reposts
List pinned postsGET /v1/instagram/profiles/{identifier}/pinned-posts
List followersGET /v1/instagram/profiles/{identifier}/followers
List followingGET /v1/instagram/profiles/{identifier}/following
Search followersGET /v1/instagram/profiles/{identifier}/followers/search?q={query}
Search followingGET /v1/instagram/profiles/{identifier}/following/search?q={query}
List suggested profilesGET /v1/instagram/profiles/{identifier}/suggested
Get a postGET /v1/instagram/posts/{identifier}
List commentsGET /v1/instagram/posts/{identifier}/comments
List replies to a commentGET /v1/instagram/posts/{identifier}/comments/{commentId}/replies
List tagged usersGET /v1/instagram/posts/{identifier}/tagged-users
Search profilesGET /v1/instagram/search/profiles?q={query}
Search reelsGET /v1/instagram/search/reels?q={query}
Search music/audioGET /v1/instagram/search/music?q={query}
Search hashtagsGET /v1/instagram/search/hashtags?q={query}
Search placesGET /v1/instagram/search/places?q={query}
Get a hashtagGET /v1/instagram/hashtags/{name}
List hashtag postsGET /v1/instagram/hashtags/{name}/posts
List hashtag reelsGET /v1/instagram/hashtags/{name}/reels
Get a locationGET /v1/instagram/locations/{id}
List location postsGET /v1/instagram/locations/{id}/posts
List post likersGET /v1/instagram/posts/{identifier}/likers
Get music/audioGET /v1/instagram/music/{identifier}

The complete 43-operation surface also includes public Stories, Highlights, profile-about data, business recommendations, top search, comment likers, post insights and metadata, and audio streams. Every operation has its own generated page in the API reference.

All endpoints accept the freshness parameter. Paginated list endpoints use cursors.

Each operation and locator has a generated API reference with a working Test request before its Live request.

Identifiers

Use @instagram for a username or 25025320 for a stable platform ID. Both work on every profile path, so /profiles/@instagram/posts and /profiles/25025320/posts return the same feed. Post identifiers accept a stable platform post ID or Instagram shortcode such as DAbCdEfGhIj. Convert URLs locally or with the URL resolver.

Handles change; platform IDs do not. Openhandle resolves both through its durable identity index. If you store references long-term, store the id from the response and use it for later lookups.

Test example

curl "https://api.openhandle.dev/v1/instagram/posts/OHAtlas01" \
  -H "Authorization: Bearer $OPENHANDLE_TEST_KEY"

Expected: HTTP 200, Openhandle-Environment: test, and Openhandle-Cost: 0.000. Find other documented inputs in the Test Data catalog.

Live example

curl "https://api.openhandle.dev/v1/instagram/posts/$REAL_INSTAGRAM_POST_ID" \
  -H "Authorization: Bearer $OPENHANDLE_LIVE_KEY"

Reel counts

metrics.plays and metrics.views preserve separate upstream counters. metrics.instagram.plays and metrics.facebook.plays preserve platform-specific counts when supplied. Facebook likes and comments remain under metrics.facebook. Openhandle does not replace a missing view count with a play count.

Rich response data

InstagramProfile returns the fields supplied by the endpoint. It omits missing fields and preserves supplied false values, zero counts, and empty arrays. Bio links use bioLinks. Business contact details use contact. Address details use location. Subscription details use fanClub. These groups do not use an extended wrapper. Every key of the schema is present. Avatar variants, Facebook identifiers, Threads details, and broadcast channels are null when not supplied.

Comments preserve available author details, ranking, reply previews, translation, and coauthor likes. Hashtags preserve exact counts and supplied trend flags. Locations group coordinates, address, external identifiers, and search context.

About returns joinedAt with month precision and metrics.handleChanges as a count. Follower lists can return meta.isLimited when Instagram limits the results. A missing cursor does not establish that the list contains every follower.

Posts group media, captions, comments, tags, products, collaborators, and reuse settings. The caption text is text on the post. caption holds only caption details: its identifier, creation time, status, edit and cover flags, and translation. Media retains supplied variants, thumbnails, subtitles, crops, scrubber images, and audio. DASH manifests and their stream URLs use the media proxy. Audio preserves artist credits, timings, parts, artwork, and usage counts.

Stories preserve their own expiry dates, stickers, authors, and media. Highlights preserve all returned stories and supplied cover sizes. Tagged-user responses contain user and the supplied position. Suggestions preserve their context and media previews.

Collection metadata can include counts, comment settings, parent comments, and story collection details. Explicit continuation flags remain available even when no usable cursor is supplied. Clip metadata can include partial.errors when upstream errors accompany usable audio data.

Honest limits

  • Private profiles return PROFILE_PRIVATE (HTTP 403). We do not access private content. The definitive answer is billable.
  • Missing metrics are null. See metric semantics.
  • Media URLs are proxied through media.openhandle.dev so they stay stable while you process them.
  • Search returns what Instagram returns. Music search matches loosely, so a query with no real match can still return unrelated tracks.

On this page