Instagram Post Detail Scraper avatar

Instagram Post Detail Scraper

Pricing

from $0.99 / 1,000 results

Go to Apify Store
Instagram Post Detail Scraper

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

Farhan Febrian Nauval

Farhan Febrian Nauval

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days 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 URLsDYSM8J5yzSj, 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 resolutionsimage_versions2.candidates lists every thumbnail size and video_versions lists 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 _scrapedAt so you can join results back to your input list and triage failures.

How it works

  1. You provide a list of Instagram post shortcodes or URLs (posts, reels, or IGTV).
  2. 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.
  3. If a post is unavailable on the primary path, the actor automatically falls back to a secondary path before giving up.
  4. 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"]
}
}
FieldTypeDescription
postsarrayList of Instagram post shortcodes or full URLs. Plain shortcodes, /p/..., /reel/..., and /tv/... are all accepted.
proxyConfigurationobjectApify 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": { "...": "..." }
}
}
FieldTypeDescription
_inputstringThe shortcode or URL exactly as you supplied it. Use this to join results back to your input list.
_shortcodestringNormalized shortcode parsed from the input.
_sourcestringInternal 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.
_scrapedAtstringISO-8601 UTC timestamp when the record was scraped.
codestringThe Instagram shortcode (same as _shortcode).
pkstringInternal numeric post ID. Stable across URL changes.
idstringComposite post ID in the form <pk>_<owner_pk>.
taken_atintegerUnix timestamp (seconds) when the post was published.
media_typeinteger1 = photo, 2 = video / reel, 8 = carousel.
product_typestringSub-type for videos: clips (reel), feed (in-feed video), igtv (long-form), or null for photos.
original_widthintegerNative width of the primary media in pixels.
original_heightintegerNative height of the primary media in pixels.
like_countintegerTotal likes at scrape time.
comment_countintegerTotal comments at scrape time.
view_countinteger / nullVideo play count when published; null for photos or when Instagram hides the counter.
has_audiobooleantrue if the video has audio (always false for photos).
is_paid_partnershipbooleantrue if the post is tagged as a paid partnership / branded content.
comments_disabledbooleantrue if the author disabled comments on this post.
like_and_view_counts_disabledbooleantrue if the author hid like and view counts on this post.
carousel_media_countinteger / nullNumber of children in a carousel post; null for single-media posts.
carousel_mediaarray / nullFor 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.textstringThe full caption text including emoji, mentions, and hashtags.
caption.created_atintegerUnix timestamp when the caption was created (usually equal to taken_at).
ownerobjectOwner profile snippet — pk, username, full_name, is_verified, is_private, profile_pic_url.
userobjectDisplay-side user snippet for the post (usually identical to owner; differs only for some collab posts).
usertags.inarrayList of accounts tagged in the post. Each entry contains a user profile snippet and a position ([x, y]) of the tag on the image.
locationobject / nullPlace data when the author tagged a location (pk, name, short_name, lat, lng, address, city). null otherwise.
image_versions2.candidatesarrayAll available image renditions, sorted largest to smallest. Each entry has url, width, and height. The first entry is the highest-resolution version.
video_versionsarrayAll available video renditions for video / reel posts. Each entry has type, width, height, and url. Sorted highest to lowest quality.
clips_metadataobject / nullReel-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"
}
ErrorMeaning
invalid_inputThe string you passed is not a recognizable Instagram shortcode or URL.
not_foundThe post was deleted, never existed, or the account was deactivated.
no_anon_dataAll 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

PlatformActorBest for
InstagramInstagram Account ScraperBio, followers, post count for any handle
InstagramInstagram Account Posts ScraperRecent posts feed for an account
InstagramInstagram Account Reels ScraperReels-only feed for an account
ThreadsThreads Post Detail ScraperSingle Threads post with replies metadata
FacebookFacebook Post Detail ScraperSingle Facebook post by URL
X / TwitterX Post Detail ScraperSingle tweet with media and counters
YouTubeYouTube Video Detail ScraperSingle 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_media with each child carrying its own image_versions2, video_versions, and dimensions; the top-level image_versions2 / video_versions for 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 proxyConfiguration to Residential to stay under per-IP rate limits.