Instagram User Posts Scraper avatar

Instagram User Posts Scraper

Pricing

from $0.90 / 1,000 instagram posts

Go to Apify Store
Instagram User Posts Scraper

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

Tarique

Maintained by Community

Actor 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

  1. Add public usernames in the Actor's Input tab.
  2. Set maxPages; start with one page for testing.
  3. Use the configured proxy and moderate concurrency.
  4. 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:

  1. INSTAGRAM_PROXY_CONFIGURATION: a JSON object in the same format as the input's proxyConfiguration.
  2. INSTAGRAM_PROXY_URL: a single HTTP or HTTPS proxy URL, with optional username and password.
  3. 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?

FieldTypeDescription
ownerUsername, pagestring, integerRequested feed and page.
postCode, postUrlstringStable public post identifiers.
caption, usernamestringPublic content and creator.
isVideo, hasAudiobooleanMedia flags.
likeCount, commentCountintegerVisible engagement counters.
assetsarrayImage 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 tierPrice per postPrice 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.

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.