Get an Instagram post or reel
Retrieve a public Instagram post or reel with media URLs, caption, author, timestamps, engagement, comments, carousel items, audio, location and co-authors. Use trim for a compact projection and include_comments to select comment enrichment.
/v1/instagram/postx-api-keyHeaders
Get your API keyYour ScrapeAtlas customer key. Create one on /account/ and set SCRAPEATLAS_API_KEY.
instagram.com post, reel or video permalink (https://www.instagram.com/p/{code}/, /reel/{code}/, /tv/{code}/, optionally prefixed by a username; query strings and fragments ignored).
max 2048 chars
https://www.instagram.com/p/ExAmPlE0002/true returns the reference's trimmed projection at the top level as xdt_shortcode_media: id, shortcode, __typename, thumbnail_src, display_url, video_url, has_audio, product_type, video_duration, clips_music_attribution_info, is_video, owner, edge_media_to_caption, edge_media_to_parent_comment, edge_media_preview_comment, taken_at_timestamp, edge_media_preview_like, is_paid_partnership and location.
one of: true, false
Default true. false answers from the media document alone: the comment edges are empty, the comment counters stay, and coverage reports comments_omitted (status partial). Carousels still read the post page for their child shortcodes.
one of: true, false
Request correlation identifier.
HTTP attempts for the operation (profile: one document, plus the page load the first time a handle is seen; basic-profile: one document; post-count: page; posts: page plus document the first time a handle is seen, otherwise the profile document, the session probe and the posts document; reels: document, plus the page when identified by handle; post: document plus page, or the document alone with include_comments=false on non-carousel media; comments: page; highlights: page, plus a document when identified by user id; all including the shared transient retry), decoded bytes and duration.
Always included.
≥ 0
Always included.
≥ 0
Always included.
≥ 0
True when usable data is returned; inspect status and coverage for omissions.
success, partial, failed, or challenged. HTTP 200 can be partial.
one of: success, partial
Canonical instagram.com URL of the profile, post or reel.
absolute HTTPS URL
UTC retrieval time.
Complete means every source field of the operation was returned; comments_first_page_only (status partial) when more comments exist than the first page carries; comments_omitted (status partial) when include_comments=false left the comment edges empty.
Always included.
Always included.
Always included.
Always included.
Always included.
Always included.
one of: XDTGraphImage, XDTGraphVideo, XDTGraphSidecar
Always included.
Always included.
min 1 chars
Always included.
Author projection: id, username, is_verified, profile_pic_url, full_name.
Always included.
Always included.
min 1 chars
Always included.
No fields match.
HTTP 200 returns the success variant. Check status: partial means usable data with warnings, and failed or challenged requests carry a failure object described in Errors & responses.
| HTTP | failure.code | Meaning |
|---|---|---|
| 400 | invalid_request | Missing, duplicate, malformed or unsupported parameters, handles, ids, cursors or URLs. |
| 401 | unauthorized | Invalid API key. |
| 404 | not_found | Unknown handle, user id or post. |
| 403 | restricted_page | The page or document is private or gated (private account, gated media, login redirect). |
| 422 | count_estimated_only | Instagram abbreviates this post count and allow_estimated was not set. |
| 429 | upstream_rate_limited | Instagram rate limited the page load or the GraphQL read. |
| 502 | upstream_challenged | Instagram refused the request with its error shell (status challenged). |
| 502 | operation_unavailable | Instagram no longer serves the pinned document for this operation. |
| 502 | unsafe_redirect | Instagram redirected the request somewhere other than the login form. |
| 502 | unsupported_page | The page or GraphQL result is missing, mismatched or structurally unsupported. |
| 502 | response_too_large | The decoded responses exceeded the operation's byte budget (1–3 MiB). |
| 502 | payload_too_complex | The response exceeded the JSON depth or node limits. |
| 502 | request_limit | The upstream request budget was exhausted. |
| 502 | upstream_error | Network failure or HTTP 5xx after the single retry. |
| 503 | busy | All retrieval slots are busy. |
| 504 | timeout | The 45-second deadline elapsed. |