Instagram Post Scraper avatar

Instagram Post Scraper

Pricing

from $0.70 / 1,000 posts

Go to Apify Store
Instagram Post Scraper

Instagram Post Scraper

Scrape Instagram posts from public profiles or post URLs, no login: captions, likes, comment count, dates, images, videos, carousels, co-authors, tags, music and optional latest comments.

Pricing

from $0.70 / 1,000 posts

Rating

0.0

(0)

Developer

Keklik Technologies

Keklik Technologies

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 hours ago

Last modified

Share

This Instagram post scraper lets you scrape the posts of public Instagram profiles, or single posts by URL, and export them to JSON, CSV or Excel. Paste a few usernames or post links, press Start, and get one row per post: caption, likes, comment count, date, images and videos, carousel slides, co-authors, tagged accounts, hashtags and music, plus optional latest comments. No Instagram account, no login and no cookies are needed.

What data can you extract from Instagram posts?

Each post comes back as one row with 46 fields.

GroupFields
PostPost link, post ID, shortcode, caption, alt text, date (Unix seconds and ISO 8601 in UTC), type (image, video or carousel), product type (photo, carousel or reel), pinned flag, paid partnership flag, dimensions
AuthorUsername, display name, user ID, profile picture
EngagementNumber of likes and number of comments
MediaMain image or video cover, video file link, reel link for videos, up to 10 carousel slides (each with its ID, image, video, size, type and alt text) and the first 5 slide images as plain links
PeopleCollab co-authors and accounts tagged in the media (ID, username, display name, verified badge, profile picture), and the @mentions in the caption
HashtagsEvery hashtag in the caption
MusicThe audio of a reel or video: licensed track or original audio, song name, artist, trending and explicit flags
Comments (optional)The post's newest comments in a latest_comments list: comment ID, text, date, likes, edited and hidden flags, GIF, and the commenter's ID, username, verified badge and profile picture
Run detailsThe input the post came from, and when the row was scraped

Use cases

  • Social media marketing: track what competitors post, how often, in which format, and which posts get the most likes and comments.
  • Influencer marketing: check an influencer's real engagement, spot paid partnerships and collab posts, and see which brands they tag.
  • Content strategy: find the captions, hashtags, formats and music that perform best in your niche, and plan your own posts around them.
  • Brand monitoring: follow your brand's accounts and partners, and see who tags and mentions you.
  • Market and academic research: build a dataset of Instagram posts over a period with the Newer than filter, for trend, topic or sentiment analysis.
  • Reporting and archiving: export a profile's posts to a spreadsheet or a BI tool on a schedule, with the media links saved alongside.

How to scrape Instagram posts

  1. Open Instagram Post Scraper in Apify Console and go to the Input tab.
  2. In Profiles or posts, paste one entry per line: a profile URL (https://www.instagram.com/natgeo/), a username (natgeo or @natgeo), or a post or reel URL (https://www.instagram.com/p/DUvd6BykR38/).
  3. Set Max posts per profile to cap how many posts each profile gives you, or leave it empty to get every post.
  4. To keep only recent posts, set Newer than to a date (2026-01-31) or a duration (7d).
  5. If you want comments too, set Comments per post to the number of newest comments you want on each post.
  6. Press Start and watch the posts appear in the Output tab.
  7. Download the results as JSON, CSV, Excel, XML or HTML, or read them through the Apify API.

Input

FieldWhat it does
Profiles or postsOne per line. A profile URL or username (https://www.instagram.com/natgeo/, @natgeo, natgeo) scrapes the profile's posts, newest first. A post or reel URL scrapes that one post. Required.
Max posts per profileStops each profile after this many posts. Leave empty for every post.
Newer thanKeeps only posts published after a date in UTC (2026-01-31 or 2026-01-31 18:00) or within a duration back from now (24h, 7d, 2w). A profile stops at its first older post.
Skip pinned postsLeaves out the posts pinned to the top of a profile. Off by default.
Comments per postAdds up to this many of each post's newest comments, in a latest_comments list. 0 (the default) adds none.
Max resultsStops the whole run after this many posts. Leave empty for no limit.
{
"urls": ["https://www.instagram.com/natgeo/", "https://www.instagram.com/p/DeTUk4sDSp-/"],
"maxPostsPerProfile": 50,
"newerThan": "30d",
"commentsPerPost": 0
}

Output

A shortened row from a real run (the full row has 46 fields):

{
"url": "https://www.instagram.com/p/DeTUk4sDSp-/",
"post_id": "4004634989362489982",
"shortcode": "DeTUk4sDSp-",
"caption": "POV: you're watching the Earth set\n\nWe just released hundreds of new images and hours of n …",
"owner_username": "nasa",
"owner_full_name": "NASA",
"likes_count": 684438,
"comments_count": 6785,
"timestamp": 1791645302,
"timestamp_datetime": "2026-10-10T15:15:02+00:00",
"product_type": "clips",
"media_type": "video",
"is_video": true,
"is_pinned": true,
"dimensions": "1074x1908",
"reel_url": "https://www.instagram.com/reel/DeTUk4sDSp-/",
"coauthors": [
{
"id": "1611722079",
"username": "nasasolarsystem",
"full_name": "NASA Solar System Exploration",
"is_verified": true
}
],
"hashtags": ["#NASA", "#ArtemisII", "#Artemis"],
"music": {
"audio_id": "28589819277311219",
"song_name": "Original audio",
"artist_name": "nasa",
"uses_original_audio": true,
"should_mute_audio": false,
"is_explicit": false
},
"source_url": "nasa",
"scraping_time": "2026-10-16T09:29:28+00:00"
}

Carousel posts also fill child_post_1 to child_post_10 and image_1 to image_5. With Comments per post set, each post that has comments gets a latest_comments list, newest first.

You can export the results to JSON, CSV, Excel, XML and HTML, or open them in the Output tab as a table.

How much does it cost to scrape Instagram?

This Actor uses pay-per-event pricing: you pay for the posts you get, not for the time the run takes.

  • $1.00 per 1,000 posts on the Apify Free plan.
  • Bronze, Silver and Gold Apify plans pay less: $0.90, $0.80 and $0.70 per 1,000 posts.
  • Comments are optional and charged per comment: $1.00 per 1,000 comments on the Free plan, and $0.90, $0.80 and $0.70 on Bronze, Silver and Gold. With Comments per post at 0 (the default) you pay for posts only.

Comments make a run slower: in our tests, 500 posts took about 40 seconds without comments and about 3 minutes with the newest comments on every post. Ask only for the comments you need.

Integrations and API

You can run the Instagram Post Scraper from your own code through the Apify API and get the posts back as JSON.

Python, with apify-client:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("kekliktech/instagram-post-scraper").call(run_input={
"urls": ["natgeo"],
"maxPostsPerProfile": 20,
})
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
print(post["url"], post["likes_count"])

Node.js, with apify-client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('kekliktech/instagram-post-scraper').call({
urls: ['natgeo'],
maxPostsPerProfile: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

You can also:

  • Schedule runs to collect new posts every day or week.
  • Send results to your system with webhooks when a run finishes.
  • Connect it to Make, Zapier, Google Sheets, Slack and other apps through Apify integrations.
  • Let AI agents call it through the Apify MCP server, so Claude, ChatGPT or Cursor can scrape Instagram posts on request.

FAQ

This scraper collects only data that Instagram shows publicly to visitors who are not logged in. Posts can still contain personal data, such as usernames of tagged accounts or commenters. Personal data is protected by laws such as the GDPR in Europe, so make sure you have a lawful reason to collect and use it, and check with a lawyer if you are unsure.

Do I need an Instagram account?

No. You don't need an Instagram account, a login or cookies.

Can I scrape private Instagram profiles?

No. Instagram shows a private profile's posts only to approved followers, so private profiles are skipped.

Can I get view or play counts?

No. Instagram does not show view and play counts to logged-out visitors, so they are not in the results.

How do comments work?

Set Comments per post to add each post's newest comments to its row. Comments come newest first and are top-level comments only: replies and the "most relevant" order are not available without logging in. A post with no comments has no latest_comments. If Instagram refuses a post's comments, the post is still saved without them, and the run's status message says how many posts missed their comments. You pay only for the comments you get. For many comments per post, or one row per comment, use the Instagram Comments Scraper.

How do pinned posts and the date filter work together?

Pinned posts come first on a profile, whatever their date. With Newer than, older pinned posts are left out but don't stop the profile; the profile stops at its first older post that isn't pinned. Turn on Skip pinned posts to leave them out altogether. A post scraped from its own URL always has is_pinned set to false.

Why did some inputs fail?

Inputs that fail are listed with the reason in the FAILED record of the run's key-value store, not in the dataset:

  • invalid_input: not a profile, username or post URL (for example an explore or stories link).
  • not_found: the profile or post does not exist or was removed.
  • private_or_no_posts: the profile is private, or has no posts.
  • blocked: Instagram refused every attempt. Run it again later.
  • instagram_error: Instagram answered with an error the scraper does not recognise. Please report it.

Instagram image and video links expire after a while. Download the media soon after the run if you need to keep it.

Can the same post appear twice?

No. A post appears only once per run, even if it is on two of your profiles (a collab post) or entered twice.

The row keeps the first 10 slides of a carousel. carousel_media_count gives the full number of slides.

Support

Found a bug or missing a field? Open an issue in the Issues tab of this Actor and we'll look into it. Need a scraper for another website, or a custom version of this one? Get in touch through the Issues tab and ask for a custom scraper.