Instagram User Posts Scraper
Pricing
from $0.90 / 1,000 instagram posts
Instagram User Posts Scraper
Collect paginated public Instagram posts for one or many usernames with normalized media metadata.
Pricing
from $0.90 / 1,000 instagram posts
Rating
0.0
(0)
Developer
Tarique
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
21 days ago
Last modified
Categories
Share
What does Instagram User Posts Scraper API do?
Instagram User Posts Scraper API collects paginated public posts for one or more usernames on Instagram. Every successful Dataset item represents one post with its shortcode, creator, caption, engagement counters, preview, media type, and downloadable asset URLs. This focused Instagram user feed API alternative runs with Apify scheduling, API access, proxy rotation, retries, monitoring, and common data integrations.
No Instagram account, password, or authenticated session cookie is required. The Actor accesses public user feeds only.
The Actor produces post rows only. Profile metadata, keyword discovery, post-detail resolution, and binary downloads remain separate Actors so each service has one clear output type.
Why scrape Instagram user posts?
- Monitor public content published by creators, brands, or competitors.
- Build post inventories before resolving full media details.
- Analyze captions, formats, and visible engagement over time.
- Send normalized rows to BigQuery, Google Sheets, webhooks, or custom APIs.
- Control cost with page and concurrency limits per run.
How to scrape an Instagram user's posts
- Add public
usernamesin the Actor's Input tab. - Set
maxPages; start with one page for testing. - Use the configured proxy and moderate concurrency.
- Click Start, then inspect or export the Dataset.
Input
See the Input tab for all options. Usernames may include @. Duplicate usernames and overlapping posts returned by Instagram pagination are ignored. Each successful page normally contains about 12 posts, although Instagram controls the actual size. Authentication fields and Instagram session cookies are not part of the input.
Actor input example:
{"usernames":["instagram","natgeo"],"maxPages":2,"includeRaw":false}
Proxy environment variables
Operators can override the input proxy settings through the Actor's environment. The first nonblank setting wins:
INSTAGRAM_PROXY_CONFIGURATION: a JSON object in the same format as the input'sproxyConfiguration.INSTAGRAM_PROXY_URL: a single HTTP or HTTPS proxy URL, with optional username and password.- The input's
proxyConfiguration, or the default GB residential proxy when omitted.
For one custom proxy:
$export INSTAGRAM_PROXY_URL='http://username:password@proxy.example.com:8000'
For multiple custom proxies:
$export INSTAGRAM_PROXY_CONFIGURATION='{"useApifyProxy":false,"proxyUrls":["http://username:password@proxy1.example.com:8000","http://username:password@proxy2.example.com:8000"]}'
The JSON setting can also select Apify Proxy, for example {"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"US"}, or disable the Actor's proxy with {"useApifyProxy":false}.
Environment settings replace the input proxy configuration entirely. Blank values are ignored. Malformed JSON and invalid custom proxy URLs stop the run instead of falling back to the input. Custom proxies do not trigger the GB-to-DE country fallback; that fallback still applies when the effective configuration selects GB residential Apify Proxy.
For cloud deployment, add the chosen variable to environmentVariables in .actor/actor.json. A Secret reference such as "INSTAGRAM_PROXY_URL": "@instagramProxyUrl" keeps the proxy credentials out of source. For local development, set the variable in the environment or the Actor's .env file before running apify run.
Output
You can download the Dataset in various formats such as JSON, HTML, CSV, or Excel.
{"success":true,"ownerUsername":"natgeo","page":1,"postCode":"ABC","postUrl":"https://www.instagram.com/p/ABC/","username":"natgeo","caption":"Example","isVideo":false,"assets":[{"position":1,"type":"image","url":"https://scontent.cdninstagram.com/file.jpg"}],"error":null}
What Instagram post data is extracted?
| Field | Type | Description |
|---|---|---|
ownerUsername, page | string, integer | Requested feed and page. |
postCode, postUrl | string | Stable public post identifiers. |
caption, username | string | Public content and creator. |
isVideo, hasAudio | boolean | Media flags. |
likeCount, commentCount | integer | Visible engagement counters. |
assets | array | Image or video URLs and dimensions. |
How much does it cost to scrape Instagram posts?
This Actor uses pay-per-event pricing with platform usage included. At the default 512 MB memory, the Actor start costs $0.002; higher user-selected memory can add start units at $0.002 per GB. Only successfully scraped posts are charged. Failure rows and upstream error reports are not charged.
| Apify discount tier | Price per post | Price per 1,000 posts |
|---|---|---|
| Free | $0.0015 | $1.50 |
| Bronze | $0.0013 | $1.30 |
| Silver | $0.0011 | $1.10 |
| Gold, Platinum, Diamond | $0.0009 | $0.90 |
A request is made for each page, with bounded retries on transient failures. Start with maxPages: 1, measure output, and increase only when needed. Set a maximum charge per run in Apify when you need a hard spending limit.
Tips and limitations
Residential proxies and conservative concurrency improve reliability. With the default proxy setting, the first attempt uses GB; after a failure the run switches to DE and keeps DE active. Failures are limited to two retries (three total attempts). A user-selected non-GB country or custom proxy URL is respected and does not trigger the automatic fallback. Private feeds cannot be accessed. The first page and subsequent pages both use the public GraphQL posts connection with twelve items per page. A failed profile-info request no longer blocks the feed because no profile bootstrap is required. JSON is parsed as it arrives and the connection is stopped once a complete document is received. Instagram may change public response shapes or GraphQL document identifiers, so monitor failure rows after deployments. Raw output is useful for debugging but increases storage.
The public feed request uses the same CSRF/LSD defaults and mobile request headers as the working website implementation. Operators can override the defaults with INSTAGRAM_PROFILE_POSTS_CSRF_TOKEN and INSTAGRAM_PROFILE_POSTS_LSD_TOKEN. These parameters are not an Instagram account pool; optional authenticated cookies are still read from INSTAGRAM_ACCOUNTS_JSON. A missing GraphQL posts connection produces a failure row instead of appearing as an empty feed.
Legal use, privacy, and support
The Actor accesses public content only. Public posts may contain personal or copyrighted material. Ensure a legitimate purpose, honor platform terms and rate limits, and comply with privacy and intellectual-property law. Use the Issues tab for support and the API tab for integration examples.