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
| Operation | Endpoint |
|---|---|
| Get a profile | GET /v1/instagram/profiles/{identifier} |
| List profile posts | GET /v1/instagram/profiles/{identifier}/posts |
| List profile reels | GET /v1/instagram/profiles/{identifier}/reels |
| List profile videos | GET /v1/instagram/profiles/{identifier}/videos |
| List tagged posts | GET /v1/instagram/profiles/{identifier}/tagged-posts |
| List profile reposts | GET /v1/instagram/profiles/{identifier}/reposts |
| List pinned posts | GET /v1/instagram/profiles/{identifier}/pinned-posts |
| List followers | GET /v1/instagram/profiles/{identifier}/followers |
| List following | GET /v1/instagram/profiles/{identifier}/following |
| Search followers | GET /v1/instagram/profiles/{identifier}/followers/search?q={query} |
| Search following | GET /v1/instagram/profiles/{identifier}/following/search?q={query} |
| List suggested profiles | GET /v1/instagram/profiles/{identifier}/suggested |
| List related profiles | GET /v1/instagram/profiles/{identifier}/related |
| Get a post | GET /v1/instagram/posts/{identifier} |
| List comments | GET /v1/instagram/posts/{identifier}/comments |
| List replies to a comment | GET /v1/instagram/posts/{identifier}/comments/{commentId}/replies |
| List tagged users | GET /v1/instagram/posts/{identifier}/tagged-users |
| Search profiles | GET /v1/instagram/search/profiles?q={query} |
| Search reels | GET /v1/instagram/search/reels?q={query} |
| Search music/audio | GET /v1/instagram/search/music?q={query} |
| Search hashtags | GET /v1/instagram/search/hashtags?q={query} |
| Search places | GET /v1/instagram/search/places?q={query} |
| Get a hashtag | GET /v1/instagram/hashtags/{name} |
| List hashtag posts | GET /v1/instagram/hashtags/{name}/posts |
| List hashtag reels | GET /v1/instagram/hashtags/{name}/reels |
| Get a location | GET /v1/instagram/locations/{id} |
| List location posts | GET /v1/instagram/locations/{id}/posts |
| List post likers | GET /v1/instagram/posts/{identifier}/likers |
| Get music/audio | GET /v1/instagram/music/{identifier} |
The complete 45-operation surface also includes public Stories, Highlights, profile-about data, business recommendations, combined search, comment likers, post insights and metadata, audio streams, and location guides. 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"Cross-posted reel plays
For a reel that was also posted to Facebook, metrics.views remains Instagram's
combined play count for compatibility. When attribution is available,
metrics.play_count_breakdown.instagram and
metrics.play_count_breakdown.facebook expose the two component counts. The
breakdown is omitted when the upstream response does not provide it, and when
there is no Facebook count and Instagram's count equals the combined count.
Rich response data
InstagramProfile composes the shared profile fields with an optional
extended node for public bio links, business contact details, address,
coordinates, and Instagram's account-type code. InstagramPost keeps the full
author, media rendition, location, music, collaborator, sponsor, product-type,
accessibility, and platform-metric data supplied upstream.
Stories and Highlights have dedicated schemas rather than a generic key-value shape. Stories preserve author and mention nodes, all usable image or video renditions, links, hashtags, locations, stickers, timestamps, and reply or reshare capabilities. Highlights can include their cover, owner, item count, and nested typed Story nodes.
The remaining metadata surface is typed as well: profile transparency/about, business recommendations and comment likers, heterogeneous top-search results, post insights, comment moderation and metadata, oEmbed, reel templates and clip metadata, music streams, and location guides each expose a dedicated schema.
Honest limits
- Private profiles return
PROFILE_PRIVATE(HTTP 403). We do not access private content. The definitive answer is billable. - Some metrics are not exposed by Instagram: they come back
null. See metric semantics. - Media URLs are proxied through
media.openhandle.devso they stay stable while you process them.