Instagram Profile Posts Scraper avatar

Instagram Profile Posts Scraper

Pricing

Pay per event

Go to Apify Store
Instagram Profile Posts Scraper

Instagram Profile Posts Scraper

Collect typed public Instagram profile posts for creator, campaign, and competitor monitoring.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Share

Collect typed public Instagram profile posts for creator research, campaign tracking, competitor monitoring, and data exports.

The Actor accepts usernames or public profile URLs and returns one dataset row per post. Each row includes the shortcode, canonical URL, caption, timestamp, media metadata, author fields, visible engagement, hashtags, mentions, location, and carousel children.

It uses lightweight public Instagram data endpoints rather than downloading media or running a browser. No Instagram login is required for supported public profiles.

What can you do with this Instagram scraper?

  • Export recent posts from known public profiles.
  • Compare creator or competitor publishing activity across scheduled runs.
  • Send post records to Google Sheets, a warehouse, or a reporting pipeline.
  • Find captions, hashtags, mentions, and tagged locations for campaign analysis.
  • Track visible likes, comments, views, and plays when Instagram exposes them.
  • Preserve stable post IDs and shortcodes for deduplication between runs.

The Actor collects public profile posts only. It does not scrape private profiles, log into Instagram, post content, download media files, or monitor comments.

Who is this Actor for?

Creator marketing teams can export posts from a campaign roster and join them with internal campaign data.

Competitive intelligence teams can schedule the same input and compare stable post IDs to identify new posts.

Social media analysts can study captions, hashtags, mentions, media types, and visible engagement.

Data engineers can use typed JSON rows through the Apify API, SDK clients, webhooks, and integrations.

Agencies can collect the same fields across multiple public client or competitor profiles.

Why use this Instagram profile posts scraper?

  • Username and profile-URL inputs are normalized into one workflow.
  • Pagination supports up to 500 accepted posts per profile.
  • A date cutoff stops older-page collection early.
  • Post IDs are deduplicated within each profile run.
  • Partial profile failures are never hidden behind a successful empty run.
  • Apify Proxy is enabled by default to avoid Instagram rate limits on shared direct IPs.
  • The default datacenter proxy keeps a coherent session per profile; direct HTTP remains an explicit opt-out.
  • Paid residential proxy traffic is never enabled silently.
  • The default dataset is ready for JSON, CSV, Excel, XML, and integrations.

What Instagram post data is extracted?

FieldMeaning
postIdStable Instagram post identifier
shortcodeShort code used in the public URL
urlCanonical post or reel URL
typeimage, video, or carousel
captionVisible post caption, when available
timestampPublication time in ISO 8601 format
likesCountVisible likes, when available
commentsCountVisible comments, when available
videoViewCountVisible video views, when available
videoPlayCountVisible video plays, when available
displayUrlPrimary image or thumbnail URL
videoUrlPrimary video URL, when exposed
width, heightPrimary media dimensions
accessibilityCaptionInstagram accessibility text, when present
hashtagsLower-cased hashtags parsed from the caption
mentionsLower-cased account mentions parsed from the caption
authorIdInstagram author identifier
authorUsernameAuthor username
authorFullNameAuthor display name, when available
authorProfileUrlCanonical public author profile URL
authorIsVerifiedVisible verification status, when available
locationNameTagged location name, when available
childMediaOrdered image/video metadata for carousel children
sourceProfileUrlRequested profile that produced the row
scrapedAtCollection time in ISO 8601 format

Instagram can hide individual engagement, author, media, or location fields. Such fields are returned as null rather than guessed.

How to scrape public Instagram profile posts

  1. Open the Actor input page.
  2. Add one or more usernames, such as instagram or nasa.
  3. Alternatively, paste public profile URLs under Instagram profile URLs.
  4. Choose the maximum number of posts per profile.
  5. Optionally add an ISO 8601 date cutoff for recurring monitoring.
  6. Keep the default Apify Proxy setting, or explicitly disable it only when your direct connection is known to work.
  7. Run the Actor.
  8. Open the Instagram posts dataset view.
  9. Export results or connect an integration.

The prefilled input is intentionally small enough for a quick first run.

Input parameters

usernames

An array of up to 50 public Instagram usernames. The leading @ is optional. Values are lower-cased and deduplicated.

startUrls

An array of up to 50 public Instagram profile URLs. Post, reel, story, explore, and account-management URLs are rejected as profile inputs.

maxPostsPerProfile

An integer from 1 to 500. The limit applies independently to every requested profile. The Actor stops scheduling additional feed pages after reaching the limit.

onlyPostsNewerThan

An optional ISO 8601 timestamp, for example:

2026-01-01T00:00:00Z

When the first older post is reached, pagination for that profile stops. A future cutoff can legitimately match no rows; the run then fails with a clear no-results message.

proxyConfiguration

Apify Proxy is enabled by default because Instagram commonly rate-limits shared direct IPs. You can disable it when your direct connection is known to work, or select a country or proxy group when needed. A configured proxy keeps one session identity for all requests belonging to a profile and rotates that identity after a temporary block. Use a datacenter proxy before considering residential traffic. If you choose residential, select a geography appropriate for your use case and account for proxy transfer cost.

Example input

{
"usernames": ["nasa", "nike"],
"maxPostsPerProfile": 15,
"onlyPostsNewerThan": "2026-01-01T00:00:00Z",
"proxyConfiguration": {
"useApifyProxy": true
}
}

This input is suitable for a scheduled creator-and-competitor comparison. Compare postId or shortcode against the prior dataset to identify new rows.

Example output

{
"postId": "3953742040000000000",
"shortcode": "Dbd3EBdnW_u",
"url": "https://www.instagram.com/p/Dbd3EBdnW_u/",
"type": "image",
"caption": "A public post caption...",
"timestamp": "2026-07-31T18:01:36.000Z",
"likesCount": 587558,
"commentsCount": 1195,
"videoViewCount": null,
"videoPlayCount": null,
"displayUrl": "https://scontent.example-cdn.net/image.jpg",
"videoUrl": null,
"width": 1080,
"height": 1350,
"accessibilityCaption": "A spacecraft image against a dark background.",
"hashtags": [],
"mentions": [],
"authorId": "528817151",
"authorUsername": "nasa",
"authorFullName": null,
"authorProfileUrl": "https://www.instagram.com/nasa/",
"authorIsVerified": null,
"locationName": null,
"childMedia": [],
"sourceProfileUrl": "https://www.instagram.com/nasa/",
"scrapedAt": "2026-08-02T05:10:00.000Z"
}

CDN URLs can be temporary. Persist the dataset fields you need, and do not assume media URLs remain downloadable indefinitely.

How much does it cost to scrape Instagram profile posts?

The Actor uses pay-per-event pricing:

  • one start event per run;
  • one post event for every accepted dataset row.

The one-time start price is $0.00005 per run. The BRONZE post price is $0.000472 per accepted post, with lower prices on higher Apify tiers.

At BRONZE pricing:

Accepted postsEstimated Actor event price
1010 × $0.000472 + $0.00005 start
100100 × $0.000472 + $0.00005 start
1,0001,000 × $0.000472 + $0.00005 start

The final charge shown by Apify uses your subscription tier. Optional proxy traffic, especially residential traffic, affects the developer infrastructure cost but does not create a separate customer charge event. Failed, duplicate, filtered-out, and malformed records do not emit a post event.

Scheduling profile-post monitoring

Create an Apify Schedule with the same set of profiles and a practical date cutoff. Each run produces a new default dataset. Use stable postId values to compare the latest dataset with the previous one.

A simple monitoring workflow is:

  1. Run daily or weekly.
  2. Export the latest rows.
  3. Join on postId.
  4. Treat unseen IDs as new posts.
  5. Compare visible engagement snapshots only when the field is non-null.
  6. Send new rows to Slack, email, a webhook, or your warehouse.

The Actor does not maintain cross-run state or claim that engagement changes are real-time.

Exporting Instagram posts

Open the run dataset and choose JSON, CSV, Excel, XML, or HTML. For spreadsheets, carousel details remain available as the nested childMedia value. For warehouses, ingest JSON to preserve arrays and nullable fields.

Apify integrations can send results to:

  • Google Sheets;
  • Make;
  • Zapier;
  • webhooks;
  • cloud storage;
  • custom API consumers.

Run with the Apify API

Replace APIFY_TOKEN with your token.

cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~instagram-profile-posts-scraper/runs?token=APIFY_TOKEN&waitForFinish=300" \
-H "Content-Type: application/json" \
-d '{"usernames":["nasa"],"maxPostsPerProfile":10}'

Fetch dataset items using the defaultDatasetId returned by the run.

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/instagram-profile-posts-scraper').call({
usernames: ['nasa'],
maxPostsPerProfile: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/instagram-profile-posts-scraper').call(
run_input={'usernames': ['nasa'], 'maxPostsPerProfile': 10}
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

Use with Apify MCP

Add the Actor to Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/instagram-profile-posts-scraper"

Claude Desktop setup

Add this Actor-specific server to Claude Desktop's MCP configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/instagram-profile-posts-scraper"
}
}
}

Cursor setup

Open Settings → MCP servers, add an HTTP server named apify, and use the same Actor-specific URL shown above.

VS Code setup

In an MCP-compatible VS Code assistant extension, add an HTTP server named apify, reconnect, and confirm the Instagram Profile Posts Scraper tool appears.

Example prompts:

  • “Run Instagram Profile Posts Scraper for nasa and summarize the five newest captions.”
  • “Collect 15 recent posts from these public creator usernames and return a table of likes and comments.”
  • “Run the scraper for my competitor list and identify post IDs absent from yesterday's export.”

Reliability, retries, and partial failures

Temporary network, rate-limit, and server responses receive bounded retries with backoff. A temporary wait response can trigger one anonymous public-session bootstrap on the same proxy identity.

The Actor processes profiles sequentially to reduce source pressure. If one profile fails after another succeeds, successful rows remain in the dataset, but the run is marked failed. This makes missing profiles visible to automation consumers.

Common causes include:

  • a private profile;
  • a deleted or renamed profile;
  • a temporary Instagram schema failure;
  • rate limiting;
  • an unsuitable proxy identity;
  • a malformed profile URL.

Limits and known source behavior

  • Only public profile posts are supported.
  • Instagram may change undocumented public response shapes.
  • Some engagement counts are hidden or disabled.
  • Display names and verification fields may be absent from feed-shaped rows.
  • Video and CDN URLs can expire.
  • Pinned posts can affect chronological ordering near the first page.
  • The Actor does not scrape stories, comments, followers, hashtag feeds, or private data.
  • maxPostsPerProfile is capped at 500.
  • Inputs are capped at 50 unique profiles per run.

Troubleshooting

Why did a public profile fail?

Confirm the profile opens publicly and is not private, renamed, restricted, or deleted. Retry later after a temporary source error. If you explicitly disabled Apify Proxy and direct access is rate-limited, restore the default datacenter proxy configuration first.

Why did the run return fewer posts than requested?

The profile may contain fewer public posts, the date cutoff may have been reached, or Instagram may not expose additional pages. Check run logs for the stop reason.

Why are likes, comments, or views null?

Instagram does not expose every metric for every media type or account. The Actor returns null rather than inventing a value.

Can this Actor use my Instagram login?

No. The supported product is intentionally limited to public profile posts and does not accept login credentials or cookies.

Collect only public data you have a lawful purpose to process. Follow applicable privacy, intellectual-property, database, employment, consumer-protection, and platform rules. Do not use the Actor to harass individuals, create sensitive profiles, bypass access controls, or republish media without permission.

The user is responsible for input selection, retention, downstream use, and compliance. This documentation is not legal advice.

Use those Actors only when the separate record type is part of your job. This Actor keeps its default dataset focused on profile posts.

FAQ

Does it require an Instagram account?

No login is required for supported public profiles.

Does it download images and videos?

No. It returns public media metadata and exposed CDN URLs, avoiding unnecessary transfer.

Can I scrape more than one profile?

Yes. Provide up to 50 unique usernames and profile URLs in one run.

Can I run it repeatedly?

Yes. Use Apify Schedules and compare stable post IDs between run datasets.

Does it charge for failed records?

No post event is emitted for failed, duplicate, malformed, or filtered-out records. The one-time start event is emitted when a run begins.

Is the output suitable for a spreadsheet?

Yes. CSV and Excel exports work directly, while JSON best preserves nested carousel media.