Pricing
from $0.99 / 1,000 results
Instagram Post Detail Scraper
Fetch a single Instagram post / reel / IGTV by shortcode or URL. Includes caption, media URLs, engagement, location, taggings.
Pricing
from $0.99 / 1,000 results
Rating
0.0
(0)
Developer
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Categories
Share
Fetch a single Instagram post, reel, or IGTV by shortcode or URL and get the caption, media URLs, engagement counters, owner, location, and tagged users as one clean JSON record.
Why use this actor
- No account / no login required β give it a public Instagram shortcode or URL and you get the data back.
- Accepts shortcodes or URLs β
DYSM8J5yzSj,https://www.instagram.com/p/DYSM8J5yzSj/,/reel/..., and/tv/...all work; one dataset row per input. - All media types β photo, video, carousel (multi-image / multi-video), and reels are unified into the same output shape.
- Direct media URLs in multiple resolutions β
image_versions2.candidateslists every thumbnail size andvideo_versionslists every available bitrate, so you can pick the one you need or mirror them all. - Owner + tagged users + location β the full owner profile snippet, tagged accounts (
usertags), and place data (when the author tagged a location) are included. - Stable JSON envelope β every row carries
_input,_shortcode,_source, and_scrapedAtso you can join results back to your input list and triage failures.
How it works
- You provide a list of Instagram post shortcodes or URLs (posts, reels, or IGTV).
- The actor fetches each post the same way the Instagram web app does and assembles a flat JSON record with caption, media URLs, engagement, and owner.
- If a post is unavailable on the primary path, the actor automatically falls back to a secondary path before giving up.
- Results stream into your dataset, ready to download as JSON, CSV, or Excel.
You do not need to manage scrapers, browsers, or rotating IPs β all handled internally.
Input
{"posts":["DYSM8J5yzSj","https://www.instagram.com/p/DYSM8J5yzSj/"],"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["DATACENTER"]}}
| Field | Type | Description |
|---|---|---|
posts | array | List of Instagram post shortcodes or full URLs. Plain shortcodes, /p/..., /reel/..., and /tv/... are all accepted. |
proxyConfiguration | object | Apify Proxy settings. Datacenter is the default; switch to Residential for large batches or if you hit rate limits. |
Output
Input: https://www.instagram.com/p/DYSM8J5yzSj/
{"_input":"https://www.instagram.com/p/DYSM8J5yzSj/","_shortcode":"DYSM8J5yzSj","_source":"S1-primary","_scrapedAt":"2026-05-18T09:14:22.481036+00:00","code":"DYSM8J5yzSj","pk":"3896233537988932771","id":"3896233537988932771_25025320","taken_at":1778687953,"media_type":2,"product_type":"clips","original_width":1080,"original_height":1920,"like_count":382573,"comment_count":5950,"view_count":null,"has_audio":true,"is_paid_partnership":false,"comments_disabled":false,"like_and_view_counts_disabled":false,"carousel_media_count":null,"carousel_media":null,"caption":{"text":"48 players. 48 countries. One canvas π¨β½\n\n@werner_bronkhorst (Werner Bronkhorst) is an artist known for pairing abstract, textured backgrounds with hyper-realistic miniature figures. His latest piece, ...","created_at":1778687952},"owner":{"pk":25025320,"username":"instagram","full_name":"Instagram","is_verified":true,"is_private":false,"profile_pic_url":"https://instagram.fcgk52-1.fna.fbcdn.net/v/t51.82787-19/550891366_18667771684001321_1383210656577177067_n.jpg?..."},"user":{"pk":25025320,"username":"instagram","is_verified":true,"is_private":false,"profile_pic_url":"https://instagram.fcgk52-1.fna.fbcdn.net/v/t51.82787-19/550891366_18667771684001321_1383210656577177067_n.jpg?..."},"usertags":{"in":[{"user":{"pk":"1993864590","username":"werner_bronkhorst","full_name":"Werner Bronkhorst","is_verified":true,"profile_pic_url":"https://instagram.fcgk52-1.fna.fbcdn.net/v/t51.2885-19/441508531_973274071067668_3812793703924207721_n.jpg?..."},"position":[0.5,0.5]}]},"location":null,"image_versions2":{"candidates":[{"url":"https://instagram.fcgk52-1.fna.fbcdn.net/v/t51.82787-15/671776371_18753401356001321_2144846863064822851_n.jpg?...","width":1080,"height":1920}// ... 12 more candidates at smaller resolutions]},"video_versions":[{"type":101,"width":720,"height":1280,"url":"https://instagram.fcgk52-1.fna.fbcdn.net/o1/v/t2/f2/m86/AQOY5hjf6Sujvcw6V_frgfxGxbJSDQe2owPFdBT19uSi..."}// ... 2 more video renditions],"clips_metadata":{"audio_type":"original_sounds","music_info":null,"original_sound_info":{"...":"..."}}}
| Field | Type | Description |
|---|---|---|
_input | string | The shortcode or URL exactly as you supplied it. Use this to join results back to your input list. |
_shortcode | string | Normalized shortcode parsed from the input. |
_source | string | Internal tag for the path used to fetch the record. S1-primary (and S1-* variants) means the fastest, richest path; values starting with S2-, S3-, or S4- indicate a fallback was used. |
_scrapedAt | string | ISO-8601 UTC timestamp when the record was scraped. |
code | string | The Instagram shortcode (same as _shortcode). |
pk | string | Internal numeric post ID. Stable across URL changes. |
id | string | Composite post ID in the form <pk>_<owner_pk>. |
taken_at | integer | Unix timestamp (seconds) when the post was published. |
media_type | integer | 1 = photo, 2 = video / reel, 8 = carousel. |
product_type | string | Sub-type for videos: clips (reel), feed (in-feed video), igtv (long-form), or null for photos. |
original_width | integer | Native width of the primary media in pixels. |
original_height | integer | Native height of the primary media in pixels. |
like_count | integer | Total likes at scrape time. |
comment_count | integer | Total comments at scrape time. |
view_count | integer / null | Video play count when published; null for photos or when Instagram hides the counter. |
has_audio | boolean | true if the video has audio (always false for photos). |
is_paid_partnership | boolean | true if the post is tagged as a paid partnership / branded content. |
comments_disabled | boolean | true if the author disabled comments on this post. |
like_and_view_counts_disabled | boolean | true if the author hid like and view counts on this post. |
carousel_media_count | integer / null | Number of children in a carousel post; null for single-media posts. |
carousel_media | array / null | For carousel posts, each child has its own image_versions2, video_versions, media_type, and dimensions in the same shape as the top-level record. null for single-media posts. |
caption.text | string | The full caption text including emoji, mentions, and hashtags. |
caption.created_at | integer | Unix timestamp when the caption was created (usually equal to taken_at). |
owner | object | Owner profile snippet β pk, username, full_name, is_verified, is_private, profile_pic_url. |
user | object | Display-side user snippet for the post (usually identical to owner; differs only for some collab posts). |
usertags.in | array | List of accounts tagged in the post. Each entry contains a user profile snippet and a position ([x, y]) of the tag on the image. |
location | object / null | Place data when the author tagged a location (pk, name, short_name, lat, lng, address, city). null otherwise. |
image_versions2.candidates | array | All available image renditions, sorted largest to smallest. Each entry has url, width, and height. The first entry is the highest-resolution version. |
video_versions | array | All available video renditions for video / reel posts. Each entry has type, width, height, and url. Sorted highest to lowest quality. |
clips_metadata | object / null | Reel-only metadata: audio_type, music_info (licensed track when applicable), original_sound_info (when the audio is original). |
Error envelope
Posts that cannot be fetched return a structured error instead of crashing the run:
{"_input":"https://www.instagram.com/p/this-does-not-exist/","_shortcode":"this-does-not-exist","_source":"S2-fallback","_error":"not_found","_errorDetail":"post page returned 404","_scrapedAt":"2026-05-18T09:14:24.118201+00:00"}
| Error | Meaning |
|---|---|
invalid_input | The string you passed is not a recognizable Instagram shortcode or URL. |
not_found | The post was deleted, never existed, or the account was deactivated. |
no_anon_data | All paths returned empty β usually a private account or a region-locked post. |
Filter on _error to triage failed rows.
Pricing
This actor is billed per result: $6.00 per 1,000 posts. Each successful post = 1 result. Errors (not_found, invalid_input, no_anon_data) are not billed.
Other Sosmed Actors
| Platform | Actor | Best for |
|---|---|---|
| Instagram Account Scraper | Bio, followers, post count for any handle | |
| Instagram Account Posts Scraper | Recent posts feed for an account | |
| Instagram Account Reels Scraper | Reels-only feed for an account | |
| Threads | Threads Post Detail Scraper | Single Threads post with replies metadata |
| Facebook Post Detail Scraper | Single Facebook post by URL | |
| X / Twitter | X Post Detail Scraper | Single tweet with media and counters |
| YouTube | YouTube Video Detail Scraper | Single video with metadata and stats |
Browse the full catalog at apify.com/xtracto.
Notes
- Private posts return only a metadata snippet (and may surface as
_error: "no_anon_data"when nothing is visible to anonymous viewers). Use a public account or a different post for full detail. - IGTV has been unified with reels since 2025 β
/tv/<shortcode>/URLs work and the record looks the same as a reel (product_type: "clips"or"igtv"). - Carousel children are returned under
carousel_mediawith each child carrying its ownimage_versions2,video_versions, and dimensions; the top-levelimage_versions2/video_versionsfor a carousel reflects the cover (first child). - Media CDN URLs (
image_versions2.candidates[].url,video_versions[].url,profile_pic_url) are signed and time-bound. Download or mirror them immediately if you need permanence. - For batches over a few hundred posts, switch
proxyConfigurationto Residential to stay under per-IP rate limits.
