Instagram Posts Scraper: Public Account Posts, No Login avatar

Instagram Posts Scraper: Public Account Posts, No Login

Pricing

from $0.40 / 1,000 post rows

Go to Apify Store
Instagram Posts Scraper: Public Account Posts, No Login

Instagram Posts Scraper: Public Account Posts, No Login

Pull posts from public Instagram accounts: photos, carousels and reels with likes, comments, plays, caption, hashtags, mentions, tagged users, location and latest comments. No login.

Pricing

from $0.40 / 1,000 post rows

Rating

0.0

(0)

Developer

Detroit Web Agent - Open Data

Detroit Web Agent - Open Data

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

4 hours ago

Last modified

Features

Limited permissions

Share

Instagram Posts Scraper: likes, comments, carousels and captions, no login

Use this to pull posts (captions, likes, comments, hashtags, media) from public Instagram accounts without logging in.

Instagram posts scraper with no login: one row per post from any public account, with caption, hashtags, mentions, likes, comment count, the latest comments, every carousel image with its alt text, play count and duration for videos, music, tagged users, collab co-authors and location.

This Actor vs apify/instagram-post-scraper: that one is the most-used, by Apify itself, and returns caption, metrics, images, coauthors, recent comments and sponsored status. Choose this one for every carousel image with its own alt text, music or original audio and tagged users in the same row, and because private accounts, missing accounts and posts you filter out are never charged.

Instagram Posts Scraper: features, price and a real output row

Run it free on Apify

Price per 1,000 postsFree planStarterScaleBusiness
This Actor$1.20$1.10$1.00$0.40
Most-used alternative$2.70$2.30$2.00$1.60

Instagram Posts Scraper sample output table from a real run

Scrape the posts of any public Instagram account without logging in: photos, carousels and reels, newest first. Each row is one post with its caption, hashtags, mentions, likes, comments count, the latest comments, date, type, cover image, every carousel image with its own alt text, video URL, play count and duration for videos, music or original audio, tagged users, collab co-authors, paid-partnership brands, location and the pinned flag. Paste usernames, profile URLs or single post URLs.

  • No Instagram account, cookies or session. Nothing is logged in, so your own account is never at risk.
  • Full details are included in the price: comments, carousel children, alt text, tagged users and music. No separate "details" charge.
  • From $1.20 per 1,000 posts on the free plan, down to $0.40 per 1,000 on paid plans.
  • Accounts that do not exist, private accounts, failed pages and posts you filter out are never charged.
  • 20 posts with full details usually arrive in under half a minute.

Run in 30 seconds

  1. Open the actor in Apify Console (a free Apify account is enough).
  2. Press Start with the prefilled input: the 20 newest posts of @natgeo, about $0.03 on the free plan.
  3. Open the Output tab. The Posts view is a table with the image, type, caption, likes, comments, plays, date and link. Download CSV, Excel or JSON.
{
"username": ["natgeo"],
"resultsLimit": 20
}

An empty input ({}) also works and runs the same example, so you can see the output before you type anything.

Why this posts scraper

  • One price with everything in it. Comments, carousel children, alt text, tagged users and music come with every post. You do not pay a second fee per post for details.
  • Latest comments on every post: text, author handle, author picture, verified badge, comment likes, reply count and date.
  • Carousels in full. childPosts lists every slide with its own image or video URL, alt text, size and tagged users; images gives all slide images in one list.
  • Play counts for videos and reels, read from Instagram's reels feed and merged into the post rows, plus videoViewCount, duration and an audio-only URL.
  • All post types in order: photos, carousels and reels, exactly as they appear on the grid, with productType telling them apart and pinned posts flagged.
  • Collabs, tags and partnerships in their own columns, so you can map brand deals and creator networks.
  • Date filter that saves money. onlyPostsNewerThan stops paging at your date, so old posts are neither read nor charged.
  • Almost nothing per run. Beyond the price per post, a run costs only Apify's standard $0.00005 start event, which matters when you run many small scheduled jobs.

What it does and who it is for

The actor reads what Instagram serves to any logged-out visitor: the account's public post grid, the public reels tab for play counts, and each post's public page for comments and carousel details. It combines them into one clean row per post.

  • Social media managers and agencies: report on competitors' and clients' posts with likes, comments and plays in one sheet.
  • Influencer marketing: check engagement on a creator's recent posts and see their paid partnerships and collaborators.
  • Brand monitoring: track what a brand posts, when, with which hashtags and which tagged accounts.
  • E-commerce and product teams: collect product photos and captions from public brand accounts you are allowed to analyse.
  • Researchers and journalists: archive public posts with captions, timestamps, locations and the public comment snapshot.
  • AI and data teams: build datasets of captions, alt text and engagement for analysis.

What you get: output fields

Every row is one post.

FieldWhat it is
shortCode, url, idPost shortcode, link and media ID
typeImage, Video or Sidecar (carousel)
productTypefeed, carousel_container or clips (reel)
captionFull caption text
hashtags, mentionsHashtags and @mentions from the caption, original case
likesCountLikes (null when the owner hides likes)
commentsCountTotal comments
latestCommentsLatest comments: id, text, ownerUsername, ownerProfilePicUrl, ownerVerified, timestamp, likesCount, repliesCount
firstCommentText of the first comment shown
displayUrlMain image (or video cover) URL
imagesAll images of a carousel
childPostsCarousel slides: id, type, shortCode, displayUrl, videoUrl, alt, dimensions, taggedUsers
altInstagram's alt text
videoUrl, audioUrlVideo file and audio-only track (videos and reels)
videoPlayCount, videoViewCount, fbPlayCountPlays, legacy views and Facebook plays (videos and reels)
videoDurationVideo length in seconds
musicInfoartist_name, song_name, uses_original_audio, should_mute_audio, should_mute_audio_reason, audio_id
timestampPosted at, ISO 8601 UTC
dimensionsWidth, dimensionsHeight, originalWidth, originalHeightSize in pixels
ownerUsername, ownerFullName, ownerId, ownerVerified, ownerProfilePicUrlWho posted it
ownerFollowersCountFollowers of the account you asked for
taggedUsersTagged accounts (all slides) with id, username, full name, verified, picture
coauthorProducersCollab co-authors
paidPartnership, sponsorsPaid-partnership flag and the brands named
locationName, locationIdTagged place
isPinnedPinned to the top of the grid
isCommentsDisabled, likeAndViewCountsDisabledComment and count settings
captionIsEdited, hasAudioCaption edited, video has sound
inputUrl, scrapedAtWhich input produced the row, and when it was read

Sample output

A carousel row, shortened (long URLs cut):

{
"inputUrl": "https://www.instagram.com/natgeo",
"id": "4006...",
"type": "Sidecar",
"productType": "carousel_container",
"shortCode": "DeZnnO7CBKY",
"url": "https://www.instagram.com/p/DeZnnO7CBKY/",
"caption": "Photo by ...",
"hashtags": [],
"mentions": [],
"likesCount": 73695,
"commentsCount": 259,
"latestComments": [{"text": "...", "ownerUsername": "...", "timestamp": "2026-10-14T...", "likesCount": 0, "repliesCount": 0}],
"displayUrl": "https://scontent...jpg?...",
"images": ["https://scontent...jpg?...", "https://scontent...jpg?..."],
"childPosts": [{"type": "Image", "displayUrl": "https://scontent...", "alt": "Photo by National Geographic ...", "dimensionsWidth": 1080, "dimensionsHeight": 1350}],
"alt": "Photo by National Geographic on October ...",
"timestamp": "2026-10-12T...",
"ownerUsername": "natgeo",
"ownerFullName": "National Geographic",
"ownerVerified": true,
"isPinned": false
}

Input options

InputWhat it doesDefault
usernameUsernames, @handles, profile URLs or post and reel URLs, one per line["natgeo"]
resultsLimitNewest posts per account, up to 100020
onlyPostsNewerThanA date (2025-01-31) or a span (7 days, 2 weeks, 3 months)none
skipPinnedPostsLeave out pinned postsoff
dataDetailLeveldetailedData (comments, carousel slides, alt text, tags, music, plays) or basicData (grid data only, fastest)detailedData
maxItemsHard cap on rows across all accountsnone
maxConcurrencyPages read in parallel20
proxyConfigurationApify Proxy (default). No setup neededApify Proxy

Pricing

Pay per event: you pay for each post delivered. The only other charge is the standard Apify run-start event ($0.00005 per run). No monthly rental, no details surcharge.

Apify planPrice per 1,000 posts, details included
Free$1.20
Starter (Bronze)$1.10
Scale (Silver)$1.00
Business (Gold) and above$0.40

Never charged: accounts that do not exist, private accounts, pages Instagram refuses, and posts removed by your date or pinned filters. The run summary (OUTPUT in the key-value store) shows exactly how many rows were delivered and charged.

To cap your spend, set Max rows in total or a maximum cost per run in Apify Console. The actor stops cleanly at the cap.

How to run it

  • Apify Console: paste usernames, press Start, download the table.
  • Schedule: run it daily or weekly with onlyPostsNewerThan: "7 days" to collect only new posts.
  • API, Python or JavaScript: see "Calling it from code" below.
  • Integrations: send results to Google Sheets, Slack, Make, Zapier, n8n or a webhook from the Integrations tab.

Reliability and blocking

Instagram rate-limits logged-out traffic. The actor uses Apify Proxy with a fresh session for every request, starts on fast datacenter IPs and moves to residential IPs on its own when Instagram pushes back. Slow requests are raced against a second attempt so a single stuck connection does not hold up the run. If a post page cannot be read, the post is still delivered from the grid (caption, likes, comments count, images, video, date) and the run log says how many posts are missing comments.

When Instagram blocks every attempt (it sometimes rate-limits all logged-out traffic, including residential IPs, for hours), the run still ends SUCCEEDED with an empty dataset and a status message such as "could not read the posts right now (Instagram rate limit). Nothing charged. Try again later." It never returns invented data, and nothing is charged for rows that were not delivered. Unknown or private accounts and bad URLs end the same way with a specific message.

Limits and honest caveats

  • Public accounts only. Private accounts return a warning and nothing is charged.
  • Latest comments, not all comments. Instagram shows logged-out visitors about 15 recent comments per post; that is what you get.
  • Play counts of old pinned reels. Plays come from the account's reels tab, which the actor reads back as far as your newest posts reach. A reel pinned to the grid from months ago can have videoPlayCount empty; its videoViewCount is still filled.
  • Likes can be hidden. When the owner hides like counts, likesCount is null.
  • Media URLs expire. Instagram's image and video links are signed and stop working after some days. Download what you need soon after the run.
  • No hashtag or location feeds. Those need a login. Use account names or post URLs.

Use cases

  1. Weekly competitor report: last 7 days of posts from five brands, sorted by likes plus comments.
  2. Engagement rate per post: divide likes and comments by ownerFollowersCount in your sheet.
  3. Carousel analysis: count slides and read their alt text to see which formats perform.
  4. Brand deal mapping: filter paidPartnership or sponsors to see who works with whom.
  5. Location insights: group posts by locationName for travel, hospitality or retail accounts.
  6. Comment sentiment: export latestComments to your sentiment or support tools.

Input guide

  • natgeo, @natgeo and https://www.instagram.com/natgeo/ all mean the same account.
  • A post URL such as https://www.instagram.com/p/DeZnnO7CBKY/ returns that post only. Reel URLs (/reel/...) work too.
  • Hashtag, explore and story pages need a login, so they are skipped with a warning and never charged.
  • Accounts and post URLs can be mixed in one input.

Worked examples

Last 7 days from three news accounts, no pinned posts

{
"username": ["natgeo", "nasa", "bbcnews"],
"resultsLimit": 100,
"onlyPostsNewerThan": "7 days",
"skipPinnedPosts": true
}

Fastest grid export (no comments or carousel slides)

{
"username": ["nike", "adidas"],
"resultsLimit": 60,
"dataDetailLevel": "basicData"
}

Specific posts by URL

{
"username": [
"https://www.instagram.com/p/DeZnnO7CBKY/",
"https://www.instagram.com/reel/DeeUUHNAqQj/"
]
}

Tips to reduce cost and runtime

  • Use onlyPostsNewerThan on scheduled runs. Paging stops at your date, so old posts are neither read nor charged.
  • Set resultsLimit to what you will analyse. Instagram serves the grid 12 posts per page, so 12, 24 or 36 fill pages exactly.
  • Use basicData when you only need captions, likes and images. The run gets faster; the price stays the same.
  • Put many accounts in one run; accounts are processed in parallel.

Calling it from code

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("transparent_meteorite/instagram-posts-scraper").call(
run_input={"username": ["natgeo"], "resultsLimit": 20}
)
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
print(post["shortCode"], post["type"], post["likesCount"], post["commentsCount"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('transparent_meteorite/instagram-posts-scraper').call({
username: ['natgeo'],
resultsLimit: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((p) => [p.shortCode, p.likesCount]));

HTTP, one call that runs the actor and returns the rows:

curl -X POST "https://api.apify.com/v2/acts/transparent_meteorite~instagram-posts-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"username": ["natgeo"], "resultsLimit": 20}'

More public-data tools from the same publisher for creator research and influencer outreach:

Use from AI agents: every actor here is callable through the Apify MCP server (mcp.apify.com).

FAQ

Do I need an Instagram account or cookies? No. The actor reads only what Instagram shows logged-out visitors. You never share a login, so your account cannot be blocked.

Are reels included? Yes. Reels that appear on the grid are returned as type: "Video" with productType: "clips", with plays, duration, music and video URL. For reels only, use an Instagram reels scraper.

Is there an extra charge for comments or carousel details? No. Detailed data is the default and costs the same as basic data.

How many comments do I get per post? The latest comments Instagram shows publicly, usually about 15. commentsCount gives the total.

How far back can I go? As far as the account's grid goes, 12 posts per page. Large resultsLimit values simply take more pages.

What happens when Instagram blocks a request? It is retried on a fresh proxy session and then on residential IPs. Rows that still cannot be read are not charged, and the run log lists them.

Can I get posts from a hashtag? Not without a login, so this actor does not offer it.

Which export formats are there? JSON, CSV, Excel, XML, RSS and HTML, from the Output tab or the API.

Terms and responsible use

The actor collects only publicly available data that Instagram shows to anyone without logging in. You are responsible for how you use it. Respect Instagram's terms, copyright in images, videos and audio, and privacy law such as the GDPR and the CCPA, especially for comment authors. Do not use the data for spam or harassment.

Use it from AI assistants (MCP)

Connect the Apify MCP server (https://mcp.apify.com) to Claude, Cursor or another MCP client and add this actor as a tool. Ask, for example, "Pull the last 30 posts of @nike and tell me which format gets the most comments", and the assistant runs it for you.

Changelog

  • 0.2 (2026-10-28): listing refresh (title, description, README sections, console prefills). No change to output fields.

  • 0.1 (October 2026): first release. Posts by account or URL, details included in the price (latest comments, carousel slides with alt text, tagged users, music, plays), date and pinned filters, per-row pricing.

Support

Something missing or wrong? Open an issue on the Issues tab with the run link. Requests for new fields are welcome and usually ship within days.

Did this actor do the job? If it saved you time, a short honest review on the Reviews tab helps other people judge it. If something was off, open an Issue on this page with the input you used. I read every one and fix real bugs, usually the same day.

Example input

A small run that finishes quickly (this is also the prefilled input in the Apify Console). Values come from the input schema:

{
"username": [
"natgeo"
],
"resultsLimit": 20,
"skipPinnedPosts": false,
"dataDetailLevel": "detailedData",
"maxItems": 20,
"maxConcurrency": 20,
"proxyConfiguration": {
"useApifyProxy": true
}
}

Alternatives to Instagram Posts Scraper

Other ways to get similar data, so you can choose what fits:

  • Instagram Graph API: official, business and creator accounts you connect
  • Apify's Instagram Scraper (apify/instagram-scraper): another Apify Store actor

This actor's edge is pay-per-result pricing, no login and ready-to-use structured output. Compare on a small test run before you commit.