Instagram Profile Posts Scraper — Post History by Profile avatar

Instagram Profile Posts Scraper — Post History by Profile

Pricing

from $0.40 / 1,000 posts

Go to Apify Store
Instagram Profile Posts Scraper — Post History by Profile

Instagram Profile Posts Scraper — Post History by Profile

The posts of public Instagram profiles — photos, carousels, reels — newest first, page by page: caption, hashtags, mentions, kind, image, approximate time. On request each post's likes, comments, exact time, tagged accounts, carousel items and topics. Only-new mode. No login, no cookies.

Pricing

from $0.40 / 1,000 posts

Rating

0.0

(0)

Developer

Berkan Kaplan

Berkan Kaplan

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

13 days ago

Last modified

Categories

Share

Instagram Profile Posts Scraper — Post History by Profile 🚀

foXLabs Instagram series: Bulk Profile · Post Details · Comments · Reels

🎉 Give this Actor Instagram profiles and get their posts — photos, carousels and reels — one row per post, from the top of each list down until the list ends or your limit is reached. A row carries the caption with hashtags and mentions, the kind, the image address, author and two approximate times. Turn on Read each post's details and one more request per post adds like and comment counts, exact time, location, co-authors, tagged accounts, carousel items, topics, and for a video its length, file address and sound.

It reads only what a signed-out visitor sees. No login, no cookies, nothing from your own Instagram account. Not affiliated with Instagram or Meta.

🔍 What is the Instagram Profile Posts Scraper — and when should you use it?

Give this Actor profiles and it returns their post history as clean rows — built for content/competitor analysis, brand-partnership tracking (who's tagged, who co-authored) and watching accounts for new posts.

Use it when you need: a profile's full post feed (photos/carousels/reels); engagement + exact times with details; or an only-new feed of new posts.

Use something else when: you want profile-level metrics → Bulk Profile; one post by URL → Post Details; a post's comments → Comments; only reels → Reels.

🤖 Use with AI agents

Already on the Apify MCP server? Ask for this Actor by name: foxlabs/instagram-profile-posts-scraper. An agent can discover it, run it and read the dataset over MCP; the Actor is built to run in Standby for on-demand lookups.

Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

I want an Instagram profile's posts using the Apify Actor
`foxlabs/instagram-profile-posts-scraper`.
Input: `profiles` is a list of usernames/URLs; `maxPostsPerProfile` caps rows; `postTypes`
filters photo/carousel/video; `includeDetails` adds like/comment counts, exact time and more.
Each row has type, caption, hashtags, url, takenAtApprox and (with details) likeCount, commentCount.
Start with:
{ "profiles": ["natgeo"], "maxPostsPerProfile": 24 }
Ask me which profiles to analyse, run the Actor, then summarise the posts.

The machine-readable API, MCP config and OpenAPI definition live at apify.com/foxlabs/instagram-profile-posts-scraper.md.

📋 Overview

Everything you need to turn a profile's post history into clean, structured data — captions, media and (with details) engagement — in one Actor, with no login, cookies or account.

Why teams pick this Actor:

  • ✅ Full post history — photos, carousels and reels, page by page to the list's end or your cap.
  • 📊 Engagement on demand — includeDetails adds like/comment counts, exact time, carousel items, topics.
  • 🤝 Partnership signals — co-authors and tagged accounts (per carousel item too).
  • 🎯 Honest — unknown is null never 0; approximate vs exact times clearly separated.
  • 💰 Pay only for results — post / post-detailed events per row; status rows and skipped kinds free.
  • 🤖 Agent-ready — MCP + Standby.

✨ Features

  • 🔍 Posts by profile — username/@handle/URL, up to 10,000 profiles; duplicates read once.
  • 🖼️ From the list — type, caption, hashtags, mentions, accessibility caption, image URL, carousel count, approximate times, position.
  • 🔎 With details — exact time, like/comment counts (+ hidden/disabled flags), location, co-authors, tagged users, carousel media, topics, size, video URL + music, AI label.
  • 🧹 Filter — postTypes (photo/carousel/video). 🔁 Only-new lists for watching accounts.

🎬 Quick Start

curl -X POST "https://api.apify.com/v2/acts/foxlabs~instagram-profile-posts-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"profiles": ["natgeo"], "maxPostsPerProfile": 24}'

🚀 Getting Started (3 steps)

  1. List your profiles — one per line: natgeo, @natgeo or a URL.
  2. Set the cap & depth — maxPostsPerProfile, optional postTypes, includeDetails for engagement.
  3. Run and export — get a clean dataset as JSON, CSV or Excel.

📥 Input

FieldDefaultWhat it does
profilesrequiredOne profile per line (up to 10,000); a profile in two spellings read once.
maxPostsPerProfile100Posts per profile from the top of its list.
maxPosts100000Post rows in total.
postTypesallphoto, carousel, video (covers reels); other kinds skipped, not charged.
includeDetailsfalseRead each post's own record (one more request per post).
onlyNewPosts, listNamefalse, defaultDeliver only posts not delivered before.
proxyConfigurationautoNothing to change for normal use.
{ "profiles": ["nasa"], "maxPostsPerProfile": 12, "includeDetails": true }

📤 Output

One row per post (postId is the key; delivered once per run). A value Instagram didn't give is null, never 0.

From the list: type (photo/carousel/reel/video), postId, shortCode, url, productType, profile, ownerUsername, ownerUserId, caption, hashtags, mentions, accessibilityCaption, displayUrl, carouselCount, takenAtApprox, publishedDayApprox, positionInProfile, input, scrapedAt.

With includeDetails: takenAt (exact), likeCount (+ likesHidden), commentCount (+ commentsDisabled), captionIsEdited, isAiLabeled, locationName/locationId, coauthors, taggedUsers, carouselMedia[], topics, width/height, durationSeconds/videoUrl, musicArtist/musicTitle, detailsSource.

{
"type": "photo",
"postId": "4002789380695323831",
"url": "https://www.instagram.com/p/DeMw7vrDPS3/",
"profile": "nasa",
"ownerUsername": "nasa",
"caption": "Moon-like Madagascar … #NASA #Earth #Geology",
"hashtags": ["NASA", "Earth", "Geology"],
"takenAtApprox": "2026-10-07T16:15:00.015Z",
"publishedDayApprox": "2026-10-07",
"takenAt": "2026-10-07T16:15:06.000Z",
"likeCount": 84901, "likesHidden": false,
"commentCount": 249,
"topics": ["satellite view", "geology", "earth from space"],
"detailsSource": "post-query",
"positionInProfile": 9
}

Honest on time: takenAtApprox is read from the post id (the moment it was made) — within a minute of the exact time for 64 of 120 posts, over an hour early for 16; use takenAt (details) for the exact order. publishedDayApprox is Instagram's image-description day; allow a day when filtering. No view/play counts (the public record has none); no comment texts, stories, follower lists or search; no private/signed-in-only profiles (free status row).

💼 Use cases

1. Content & competitor analysis — a profile's posts with formats, captions and (with details) engagement. Input: the profiles, includeDetails. Output: posts + like/comment counts. Use: learn what performs.

2. Partnership tracking — who a brand co-authors and tags. Input: the brand's profile, includeDetails. Output: coauthors, taggedUsers. Use: map collaborations.

3. Account watching — only-new posts as they appear. Input: the profiles, onlyNewPosts, scheduled. Output: new posts each run. Use: a content feed.

🔗 Integration

JavaScript / Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('foxlabs/instagram-profile-posts-scraper').call({ profiles: ['natgeo'], maxPostsPerProfile: 24 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);

Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('foxlabs/instagram-profile-posts-scraper').call(run_input={'profiles': ['natgeo'], 'maxPostsPerProfile': 24})
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item)

Written for apify-client 3 for Python, where call() returns a run object; with version 1 or 2 it returns a dict — write run['defaultDatasetId'] there.

Automation (n8n / Zapier / Make): schedule → HTTP request to the Actor API with your profiles → handle the JSON dataset → push to a sheet, CRM or dashboard.

📊 Pricing

Pay-per-event, one event per delivered row: post (from the list) or post-detailed (details read, detailsSource: "post-query"). A post asked with details that came without them carries post. Not charged: status rows, posts of a kind you didn't ask for, posts skipped as already delivered. View current pricing.

❓ FAQ

Do I need an Instagram login or cookies? No — only what a signed-out visitor sees.

Why no like/comment counts on some rows? The list carries none; they come with includeDetails. A hidden like count stays null.

Are the times exact? takenAtApprox/publishedDayApprox are approximate (no details); takenAt (details) is exact — use it to sort.

Does it get reels? Yes (as video/reel). For reels-only with a performance score, use the Reels Scraper.

Can I export to CSV / Excel / JSON? Yes — directly from the Apify dataset.

🐛 Troubleshooting / What it does NOT do

  • No view/play counts — the public post record carries none; no comment texts, stories, highlights, follower lists or search; no file downloads.
  • Private / signed-in-only / age-restricted profiles get a free status row (not read).
  • Approximate times aren't sort keys — don't filter dates on takenAtApprox; allow a day on publishedDayApprox; use takenAt for order.
  • likesHidden/commentsDisabled — a hidden like count is null; a disabled-comments post can state a higher count than the comments shown.
  • Media isn't downloaded — displayUrl/videoUrl/carouselMedia are temporary addresses.
  • A changed Instagram page ends the run with a message (start-up check), not empty rows.

⚠️ Trademark

Independent, third-party tool. Not affiliated with, endorsed by or connected to Instagram or Meta Platforms, Inc. "Instagram" and related marks belong to their owners and are used here for identification only.

Posts are published by the accounts themselves, but rows can hold personal data of others (co-authors, tagged accounts, mentions, locations); you decide why you use it and are responsible for a lawful reason (GDPR and similar). Media belongs to its owners; addresses are temporary. The Actor writes only to your own run's storage. See Apify's blog post on the legality of web scraping.

🤝 Support & contact

Changelog

0.1 — 2026-10-09

  • First version: a profile's posts from its list, page by page; optional details per post; filter by kind; only-new lists; a free status row for every line that brings no posts; publishedDayApprox on every row; requests leave from the run's own address first; start-up check. Standby mode prepared.