Scrape public Instagram profiles or paste direct public post/reel URLs to get complete, download-ready image and video media arrays, captions, engagement, audio metadata, and handled-error diagnostics.
What does Instagram Profile & Posts Scraper do?
Instagram Profile & Posts Scraper helps you collect public profile metadata and recent public media previews from Instagram profiles. It is designed for teams that need structured exports instead of manual copy and paste.
You can enter handles like nasa, profile URLs, or direct URLs such as https://www.instagram.com/p/SHORTCODE/ and https://www.instagram.com/reel/SHORTCODE/.
The actor returns profile rows, complete media rows, and unbilled diagnostic rows for restricted or unavailable inputs.
Who is it for?
- ๐ฃ Social media marketers monitoring public creator or brand accounts.
- ๐งโ๐ผ Brand teams checking public profile positioning and recent campaigns.
- ๐ Analysts comparing public engagement signals across accounts.
- ๐ก๏ธ Compliance teams archiving public posts for review workflows.
- ๐ฐ Researchers tracking public media URLs, captions, and timestamps.
Why use this scraper?
Manual Instagram monitoring is slow and inconsistent. This actor gives you repeatable exports with stable field names. You can schedule it, connect it to datasets, or call it from the Apify API.
What data can you extract?
| Category | Example fields |
|---|---|
| Profile identity | handle, profile URL, full name |
| Profile metadata | bio, avatar URL, external URL |
| Public counts | followers, following, posts |
| Account flags | verified, private |
| Post identity | post URL, shortcode |
| Post content | caption, timestamp, media type |
| Engagement | likes, comments, views when visible |
| Media | every carousel asset, highest-resolution image URL, direct video URL, thumbnail |
| Video and audio | duration, play/view count, audio artist/title, original-audio flag |
| Diagnostics | per-input error code, message, and HTTP status for unavailable inputs |
How much does it cost to scrape Instagram profiles and posts?
This Actor uses Apify pay-per-event pricing. Error/diagnostic rows are not charged.
| Event | What is charged | Price |
|---|---|---|
start |
One-time fee when a run starts. | $0.005 |
| Event | What is charged | Free / no discount | Starter / Bronze | Scale / Silver | Business / Gold | Custom / Platinum | Custom / Diamond |
|---|---|---|---|---|---|---|---|
item |
Each saved public profile or media row. | $0.062896 / 1,000 | $0.054692 / 1,000 | $0.042660 / 1,000 | $0.032815 / 1,000 | $0.021877 / 1,000 | $0.015314 / 1,000 |
Use low limits first, then increase maxProfiles, maxPostsPerProfile, or maxDirectUrls after checking output quality.
Quick start
- Open the actor on Apify.
- Add Instagram handles such as
nasaornatgeo. - Keep
maxPostsPerProfilelow for your first run. - Start the run.
- Export the dataset as JSON, CSV, Excel, or via API.
Input settings
Core JSON keys: profileUrlsOrHandles, postUrls, maxProfiles, maxPostsPerProfile, maxDirectUrls, includePosts, includeReels, onlyPostsNewerThan, until, maxConcurrency, startUrls, and proxyConfiguration.
Profile URLs or handles
Use this when you already know the usernames.
You can include or omit the @ sign.
Instagram profile URLs
Use this when your source list contains full links. The actor extracts the handle from each URL.
Maximum profiles
Controls how many unique profiles are processed. Duplicate handles and URLs are deduplicated.
Include recent posts
When enabled, the actor saves recent public post or reel preview rows returned for the profile.
Include reels/videos
Disable this option if you only want image and carousel-style posts.
Direct post or reel URLs
Add public /p/, /reel/, or /tv/ URLs in postUrls. Each successful row contains ordered mediaAssets, flattened mediaUrls, and convenient best-image/video fields. Carousel results include every asset Instagram exposes.
Date bounds
Use onlyPostsNewerThan with an ISO timestamp or a relative value such as 7 days, and until with an ISO timestamp. Bounds are inclusive and apply to media rows; profile rows remain available for backward compatibility.
Maximum posts per profile and direct URLs
maxPostsPerProfile, maxProfiles, and maxDirectUrls are independent hard caps. Duplicate inputs are removed before processing.
Mixed legacy URLs and concurrency
startUrls remains a backward-compatible mixed list: profile URLs and public /p/, /reel/, or /tv/ URLs are classified automatically. maxConcurrency is retained for old inputs; requests are intentionally processed sequentially to reduce rate-limit risk.
Proxy configuration
Apify Proxy is enabled by default for cloud reliability because Instagram can rate-limit shared datacenter traffic. You can override the proxy configuration if your account requires a specific proxy setup.
Example input
Profile mode remains backward compatible:
{
"profileUrlsOrHandles": ["nasa", "natgeo"],
"maxProfiles": 2,
"includePosts": true,
"includeReels": true,
"maxPostsPerProfile": 5,
"onlyPostsNewerThan": "30 days",
"proxyConfiguration": { "useApifyProxy": true }
}
Direct download mode:
{
"postUrls": [
"https://www.instagram.com/p/DalfZ3Jn8yi/",
"https://www.instagram.com/reel/Dabg9j1xNHM/"
],
"maxDirectUrls": 2
}
Output example
{
"type": "profile",
"profileUrl": "https://www.instagram.com/nasa/",
"username": "nasa",
"fullName": "NASA",
"biography": "Public profile bio when visible",
"followersCount": 90000000,
"isVerified": true,
"scrapedAt": "2026-07-03T00:00:00.000Z"
}
{
"input": "https://www.instagram.com/reel/SHORTCODE/",
"profileUrl": "https://www.instagram.com/creator/",
"username": "creator",
"postUrl": "https://www.instagram.com/reel/SHORTCODE/",
"shortCode": "SHORTCODE",
"caption": "Caption text when visible",
"timestamp": "2026-07-03T00:00:00.000Z",
"likesCount": 12345,
"commentsCount": 123,
"type": "video",
"videoDurationSeconds": 42.5,
"videoPlayCount": 50000,
"thumbnailUrl": "https://...jpg",
"videoUrl": "https://...mp4",
"mediaUrls": ["https://...mp4"],
"mediaAssets": [{ "position": 1, "type": "video", "url": "https://...mp4" }],
"audioArtist": "Creator",
"audioTitle": "Original audio",
"isOriginalAudio": true,
"scrapedAt": "2026-07-03T00:00:00.000Z"
}
Tips for better results
- Start with 1-2 handles before running a larger list.
- Use public profiles only.
- Avoid private or login-only accounts.
- Keep post limits modest for scheduled monitoring.
- Export CSV for spreadsheets and JSON for automation.
Scheduling workflows
Run the actor daily or weekly to monitor public account changes. Store each run in Apify datasets. Connect the dataset to downstream reporting, alerting, or archival tools.
Integrations
Google Sheets
Export dataset results to CSV or connect through the Apify API. This is useful for campaign tracking sheets.
BI dashboards
Load JSON or CSV exports into dashboards for profile and engagement trend reports.
Compliance review
Archive public captions, URLs, and timestamps for later review.
CRM enrichment
Add public profile URLs, bios, and follower counts to creator or partner records.
API usage
Node.js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/instagram-profile-posts-scraper').call({
profileUrlsOrHandles: ['nasa'],
maxProfiles: 1,
maxPostsPerProfile: 5
});
console.log(run.defaultDatasetId);
Python
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/instagram-profile-posts-scraper').call(run_input={
'profileUrlsOrHandles': ['nasa'],
'maxProfiles': 1,
'maxPostsPerProfile': 5,
})
print(run['defaultDatasetId'])
cURL
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~instagram-profile-posts-scraper/runs?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"profileUrlsOrHandles":["nasa"],"maxProfiles":1,"maxPostsPerProfile":5}'
MCP usage
Use the Apify MCP server with tools scoped to this actor:
https://mcp.apify.com/?tools=fetch_cat/instagram-profile-posts-scraper
Add it to Claude Code:
claude mcp add apify-instagram-profile-posts https://mcp.apify.com/?tools=fetch_cat/instagram-profile-posts-scraper
Claude Desktop JSON configuration:
{
"mcpServers": {
"apify-instagram-profile-posts": {
"url": "https://mcp.apify.com/?tools=fetch_cat/instagram-profile-posts-scraper"
}
}
}
Example prompts:
- "Run the Instagram Profile & Posts Scraper for nasa and summarize the latest captions."
- "Export recent public post URLs for these brand handles."
- "Compare public follower counts for this creator shortlist."
Data quality notes
Instagram may hide some fields for some accounts, regions, or request contexts. When a public field is not visible, the actor leaves it empty instead of guessing. Counts can change frequently and should be treated as point-in-time values.
Limitations
- Public profiles only.
- No private posts.
- No login-only stories or highlights.
- No direct messages.
- Recent post previews depend on what Instagram returns publicly.
Troubleshooting
Why did a handle return no rows?
The handle may be invalid, private, blocked, renamed, unavailable in your region, or temporarily unavailable from Instagram. Try the public profile URL in a browser and lower your run limits.
Why are some engagement counts missing?
Instagram does not expose every metric for every media item in every public response. The actor saves metrics only when they are visible.
Why should I keep low limits first?
Low limits make it easier to verify output and avoid unnecessary proxy or compute usage. Increase limits once your input list is clean.
Legality
This actor is intended for public data collection. Use it responsibly and respect Instagram terms, privacy rights, and applicable laws. Do not use it to collect private, login-only, sensitive, or personal data in a way that violates rights or policies.
Support
If a run fails or output looks wrong, open a bug report from the Actor page. Include the Apify run ID or run URL, input JSON, expected output, actual output, and one reproducible public URL from Instagram.