Pricing
from $0.30 / 1,000 results
Instagram Account Posts Scraper - Cheaper
Scrape all posts from any public Instagram account: caption, media URLs, engagement counts, etc. HTTP-only, fast, supp pagination, and no cookies required.
Pricing
from $0.30 / 1,000 results
Rating
0.0
(0)
Developer
Actor stats
0
Bookmarked
7
Total users
4
Monthly active users
3 days ago
Last modified
Categories
Share
Instagram Account Posts Scraper
Fetch the post timeline of any public Instagram account in bulk β captions, image and video URLs, like and comment counts, carousel children, timestamps, and the poster's profile data β as clean structured JSON.
Why use this actor
- No account, no login, no API key β give it a username and you get the same feed the Instagram app shows.
- Paginated timeline β pulls the full grid newest-first, dozens to thousands of posts per account, in a single run.
- All post formats β single photos, single videos, Reels, and multi-slide carousels with every child media included.
- Rich engagement β like count, comment count, view / play count, video duration, and the original capture timestamp.
- Full media β multi-resolution image and video URLs straight from Instagram's CDN, plus alt-friendly metadata.
- Stable JSON envelope β every row carries
_input,_source,_scrapedAtso you can join results back to your input list and feed pipelines, spreadsheets, or databases.
How it works
- You provide a list of Instagram usernames (e.g.
nasa) or full profile URLs. - The actor walks the account's post timeline page by page, newest-first, until
maxPostsis reached or the timeline ends. - Each post is emitted as one dataset row with media URLs, caption, counters, and the poster's user record.
- Results stream into your Apify dataset, ready to download as JSON, CSV, or Excel.
You do not manage scrapers, browsers, sessions, or rotating IPs β all handled internally.
Input
{"usernames":["nasa","natgeo"],"maxPosts":30,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["DATACENTER"]}}
| Field | Type | Description |
|---|---|---|
usernames | array | List of Instagram usernames or full profile URLs. Both nasa and https://www.instagram.com/nasa/ are accepted. |
maxPosts | integer | Max posts returned per account, paginated newest-first. 0 = unlimited. Default: 30. |
proxyConfiguration | object | Apify Proxy settings. Datacenter works for most accounts; switch to Residential for large batches. |
Output
Input: nasa, maxPosts: 30 (first 2 posts shown, long URLs truncated).
[{"_input":"nasa","_source":"S1-primary","_scrapedAt":"2026-05-18T10:54:19.253080+00:00","pk":"3895560746578059612","id":"3895560746578059612_528817151","code":"DYPz9wEvaFc","taken_at":1778607257,"media_type":1,"product_type":"feed","caption":{"text":"Percy is roving the βWestern Frontierβ of Mars π€ \n \nIt's the farthest west our Perseverance rover has explored since landing in Jezero Crater in 2021, and it's an ancient landscape that may predate the crater itselfβ¦"},"like_count":227972,"comment_count":936,"play_count":null,"video_duration":null,"original_width":2500,"original_height":2123,"user":{"pk":"528817151","username":"nasa","full_name":"NASA","is_verified":true,"profile_pic_url":"https://instagram.fcgk52-1.fna.fbcdn.net/v/t51.2885-19/29090066_159271188110124..."},"image_versions2":{"candidates":[{"width":2500,"height":2123,"url":"https://instagram.fcgk52-1.fna.fbcdn.net/v/t51.82787-15/689446779_18608299801049152..."}]},"locations":[]},{"_input":"nasa","_source":"S1-primary","_scrapedAt":"2026-05-18T10:54:19.253080+00:00","pk":"3891942993783911519","id":"3891942993783911519_528817151","code":"DYC9YhOj3Rf","taken_at":1778175780,"media_type":8,"product_type":"carousel_container","caption":{"text":"Don't let anyone dull your shine π«\n \nThe heart of galaxy M77 is shining so brightly in this Webb telescope image, it nearly outshines the galaxy itselfβ¦"},"like_count":678128,"comment_count":1549,"user":{"pk":"528817151","username":"nasa","full_name":"NASA","is_verified":true},"image_versions2":{"candidates":[{"width":1060,"height":1288,"url":"https://instagram.fcgk52-1.fna.fbcdn.net/v/t51.82787-15/672396587_18606926689049152..."}]},"carousel_media_count":3,"carousel_media":[{"id":"3891940960318236431_528817151","media_type":1,"image_versions2":{"candidates":[{"width":1060,"height":1288,"url":"https://instagram.fcgk52-1.fna.fbcdn.net/v/t51.82787-15/672396587_18606926689049152..."}]}},{"id":"3891940963992441227_528817151","media_type":1,"image_versions2":{"candidates":[{"width":1440,"height":1743,"url":"https://instagram.fcgk52-1.fna.fbcdn.net/v/t51.82787-15/688674294_18606926698049152..."}]}},"... 1 more"]}]
| Field | Type | Description |
|---|---|---|
_input | string | The username or URL exactly as you supplied it. Use this to join results back to your input list. |
_source | string | Internal tag for the path used to fetch the post. S1-primary means the fastest, richest path; S2-* would indicate a fallback. |
_scrapedAt | string | ISO-8601 UTC timestamp when the row was captured. |
pk | string | Instagram's internal numeric media ID. Stable across edits. |
id | string | Composite <pk>_<user_pk> id used in Instagram's mobile responses. |
code | string | Shortcode visible in the post URL (instagram.com/p/<code>/ or /reel/<code>/). |
taken_at | integer | Unix epoch (seconds) when the post was uploaded. |
media_type | integer | 1 = single photo, 2 = single video / Reel, 8 = carousel container (children are in carousel_media). |
product_type | string | feed for grid photos, clips for Reels, carousel_container for multi-slide posts, igtv for long video. |
caption.text | string | Full caption text (may contain emoji and line breaks). null if the post has no caption. |
like_count | integer | Number of likes at fetch time. Some accounts hide this; null when hidden. |
comment_count | integer | Number of comments at fetch time. |
play_count | integer | Plays for video / Reels posts; absent for photos. |
video_duration | number | Length in seconds for video / Reels posts. |
original_width / original_height | integer | Native resolution of the post (or the first carousel child). |
user | object | Poster's profile snippet: pk, username, full_name, is_verified, profile_pic_url. |
image_versions2.candidates | array | Multi-resolution image URLs (largest first). Each entry: { width, height, url }. |
video_versions | array | Multi-resolution video URLs (Reels and single videos). Each entry: { type, width, height, url }. |
carousel_media | array | For carousel posts (media_type: 8) β one entry per slide, each with its own image_versions2 / video_versions. |
carousel_media_count | integer | Number of slides in a carousel post. |
locations | array | Tagged location(s); empty array when none was attached. |
Error envelope
Accounts that don't exist, are deactivated, or fail to fetch return a structured error instead of crashing the run:
{"_input":"this-account-does-not-exist-xyz","_error":"not_found","_errorDetail":"NotFound feed/user this-account-does-not-exist-xyz","_source":"S1-primary","_scrapedAt":"2026-05-18T10:54:19.253080+00:00"}
Filter on _error to triage failed rows.
Pricing
This actor is billed per result: $6.00 per 1,000 posts. Each post in the dataset = 1 result. Error rows (not-found, fetch-failed) are not billed.
Other Sosmed Actors
| Platform | Actor | Best for |
|---|---|---|
| Instagram Account Scraper | Bio, follower / following counts, post count for any handle | |
| Instagram Account Reels Scraper | Reels-only timeline with play counts and durations | |
| Instagram Post Detail Scraper | Full single-post detail by shortcode or URL | |
| Threads | Threads Account Threads Scraper | Posts timeline for a Threads handle |
| Facebook Page Posts Scraper | Posts timeline for any public Facebook Page | |
| Twitter / X | X Account Tweets Scraper | Tweets timeline for any handle |
| Bluesky | Bluesky Account Posts Scraper | atproto posts timeline by handle or DID |
Browse the full catalog at apify.com/xtracto.
Notes
- Instagram returns a rich record per post (carousel children with their own resolutions, video manifests, music metadata, paid-partnership flags, etc.). This actor preserves the full envelope so you can pick the fields you need.
- Pagination is handled internally β you do not need to manage cursors. To page externally, simply re-run with a larger
maxPosts. - Private accounts return zero posts and a single
not_founderror row. - Media CDN URLs are signed and time-bound (valid for a few hours). If you need permanent copies, mirror the bytes shortly after the run finishes.
like_countandcomment_countare eventually-consistent and may lag the live UI by a few minutes.maxPosts: 0means unlimited β a multi-year account can return thousands of posts; budget your run accordingly.- For batches over ~30 accounts, switch
proxyConfigurationtoRESIDENTIALto avoid per-IP rate limits.
