Instagram Profile Posts · Capped avatar

Instagram Profile Posts · Capped

Pricing

from $0.60 / 1,000 posts

Go to Apify Store
Instagram Profile Posts · Capped

Instagram Profile Posts · Capped

Every post and reel from any public Instagram profile — captions, hashtags, engagement, media links, tagged accounts. A post we cannot deliver is never charged. Your result limit is exact: set 30 and you get 30, not 240 because a page size said so. No login, no cookies.

Pricing

from $0.60 / 1,000 posts

Rating

0.0

(0)

Developer

Steadyfetch Team

Steadyfetch Team

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

Share

Your result limit is the law. Set it to 30 and you get 30 — not 31, not 240 because the page size said so. Every post and reel from any public Instagram profile, no login and no cookies, and a post we could not deliver is never charged.

Paste a handle. Get the posts.

Unofficial. Not affiliated with, endorsed by, or sponsored by Instagram or Meta Platforms, Inc. This actor reads publicly available profile pages; Instagram is a trademark of Meta Platforms, Inc.


Output

One row per post, one row per profile, and every row carries charged and status — so your invoice reconciles from the dataset itself. Real rows below, taken from a verified run against nasa (captions trimmed with … for the page):

shortCodetypetakenAtcaptionlikeCountcommentCountplayCountvideoDuration
DcOX3hWFieyimage2026-08-19T14:11:47ZWith your powers combined… This colorful picture of the cosmos is the product of teamwork between our @NASAHubble, @NASAWebb…432,6242,998
DcMXl1IPNtBvideo2026-08-18T19:37:40ZSoothing spacewalk scenes. Today, August 18, NASA's @astro_anil and…86,4187193,142,69350.2
Db9IVmrDvQ4image2026-08-12T21:28:58ZWhen the Moon and Sun align. This rare sight — a total solar eclipse —…2,405,7824,587

The first row above in full, exactly as it lands in the dataset (caption and signed URL trimmed with … for the page):

{
"postId": "3967213292204992434",
"shortCode": "DcOX3hWFiey",
"url": "https://www.instagram.com/p/DcOX3hWFiey/",
"type": "image",
"productType": "feed",
"caption": "With your powers combined…\n\nThis colorful picture of the cosmos is the product of teamwork between our @NASAHubble, @NASAWebb, and @NASAChandraXray telescopes…",
"hashtags": ["nasa", "universe", "nebula"],
"mentions": ["nasahubble", "nasawebb", "nasachandraxray"],
"takenAt": "2026-08-19T14:11:47.000Z",
"takenAtTimestamp": 1787148707,
"likeCount": 432624,
"commentCount": 2998,
"playCount": null,
"videoDuration": null,
"displayUrl": "https://instagram.fruh4-3.fna.fbcdn.net/v/t51.82787-15/780550892_…",
"videoUrl": null,
"videoUrlExpiresAt": null,
"carouselCount": null,
"dimensionsWidth": 1280,
"dimensionsHeight": 1129,
"ownerUsername": "nasa",
"ownerFullName": "NASA",
"ownerIsVerified": true,
"taggedUsers": [],
"coauthors": [],
"isPinned": true,
"isSponsored": false,
"postSource": "feed",
"profileHandle": "nasa",
"charged": true,
"status": "delivered",
"statusReason": null
}

And one profile row per handle you asked about — uncharged, always:

{
"profileHandle": "nasa",
"profileUrl": "https://www.instagram.com/nasa/",
"fullName": "NASA",
"biography": "Making the seemingly impossible, possible. ✨",
"externalUrl": "https://www.nasa.gov/",
"followers": 104427542,
"following": 92,
"postCount": 4893,
"isVerified": true,
"isPrivate": false,
"isBusiness": true,
"categoryName": "Government Agencies",
"postsReturned": 30,
"postsFiltered": 0,
"charged": false,
"status": "profile",
"statusReason": "Profile row for \"nasa\" — 30 posts returned. This row itself carries no result fee."
}

Every field is always present (explicit null over silent omission), so a row from the profile route and a row from the depth route are the same shape.

Agent / API paste-block

Actor: steadyfetch/instagram-profile-posts (Apify Store)
Does: Instagram handle -> every post and reel that public profile has published.
One JSON row per post + one uncharged profile row per handle.
No Instagram login, no cookies.
Run: POST https://api.apify.com/v2/acts/steadyfetch~instagram-profile-posts/run-sync-get-dataset-items?token=APIFY_TOKEN
Input:
{
"profiles": ["nasa", "https://www.instagram.com/bbcnews/"],
"resultsLimit": 30, // HARD cap per profile, newest first (1-5000)
"maxItems": 1000, // HARD cap for the whole run (1-100000)
"maxRunSeconds": 900, // clean stop before the platform timeout
"mediaType": "any", // any | image | video | carousel
"postedAfter": "2026-01-01",
"postedBefore": "2026-08-01",
"datasetId": "<dataset id of a run that emits handles>",
"datasetItems": [ { "username": "nasa" } ]
}
Output post rows: postId, shortCode, url, type, productType, caption, hashtags[],
mentions[], takenAt, takenAtTimestamp, likeCount, commentCount, playCount,
videoDuration, displayUrl, videoUrl, videoUrlExpiresAt, carouselCount,
dimensionsWidth, dimensionsHeight, ownerUsername, ownerFullName,
ownerIsVerified, taggedUsers[], coauthors[], isPinned, isSponsored,
postSource, profileHandle, charged, status, statusReason
profile rows (uncharged): profileHandle, profileUrl, fullName, biography,
externalUrl, followers, following, postCount, isVerified, isPrivate,
isBusiness, categoryName, postsReturned, postsFiltered
one final summary row: delivered, profilesRequested, stoppedBy, resumeCursor
Pricing pay per event, platform usage INCLUDED, no start fee:
post $0.0024 -> $0.0006 per delivered post (falls with your Apify plan tier)
Charged only on delivery — private accounts, wrong handles, empty profiles,
filtered-out posts and Instagram's own walls cost $0.
Cap any run with maxTotalChargeUsd (minimum $0.05).
MCP: reachable through Apify's MCP server; ask for "instagram profile posts".

Input

Handles (nasa), or profile URLs (https://www.instagram.com/nasa/). Capital letters, a leading @ and a trailing slash are all fine. You can also chain a Dataset ID from a previous run and this actor will find the profiles in it.

Optional: max posts per profile, max posts for the whole run, post type, posted-after and posted-before dates, max run seconds.

Leave the input empty and you get uncharged sample rows showing the exact schema, without touching Instagram.

The limits are hard, and they name themselves

Three things can stop a run: your result limit, your maximum cost per run, or your time limit. Whichever binds, the run still finishes successfully, the last row tells you which one it was and what is still pending, and only delivered posts were charged. You will never have to guess which knob to raise.

The result limit is exact under concurrency too: two profiles are read in parallel, and a whole-run cap of 1 still delivers exactly one row and exactly one charge.

What it costs

One result = one delivered post or reel, with everything Instagram publishes about it in the same row. There is no second charge for "details" — no per-field, per-comment or per-image top-up. No start fee, no subscription, no third-party API key to buy.

from $0.60/1,000 posts — $0.0024 each on the free plan, falling to $0.0006 on the top Apify plan tier. Platform usage (compute + transfer) is included in the event price, so the per-post price you see is the whole price.

What can fail, and it is free when it does. These rows ship with charged: false, always:

statuswhen
not_foundno public profile at that handle — wrong, renamed or deleted
private_accountthe account is private, so its posts are not publicly readable
no_postsa real public profile with nothing on it
rate_wall / rate_limitedInstagram asked us to wait, and was still asking after retries
unavailable_schemaInstagram's own profile service is erroring for that handle
empty_response / source_unavailableInstagram answered, but with nothing readable
input_errorthat input is not an Instagram profile — the row names the fix

Posts your filters excluded are also never delivered and never charged; the profile row counts them. Cap any run with Maximum cost per run (any amount from $0.05 up) and it stops cleanly before your ceiling.

Honesty contract

A profile that returns nothing still gets a row, and the row says why — uncharged, every time:

statuswhat it meanscan a re-run help?
not_foundno public profile at that handle — wrong, renamed or deletedno
private_accountthe account is private, so its posts are not publicly readableno
no_postsa real public profile with nothing on it — a definitive answerno
unavailable_schemaInstagram's own profile service is erroring for that handleno, it is on their side
rate_wall / rate_limitedInstagram asked us to wait, and was still asking after retriesyes
empty_responseInstagram answered but sent an empty bodyyes
source_unavailableInstagram did not return readable data on this runyes
input_errorthat input is not an Instagram profile — the row names the fixfix and re-run

A post that appears on two profiles you asked for (a co-authored post) is one row and one charge, not two. If Instagram stops serving a profile part-way through, the profile row says so and is marked worth re-running — a partial answer never reads like a complete one.

This actor may fail when the platform changes things — failed items are never charged.

Freshness

Post data is read live on every run, so it is as current as Instagram's own public profile page. The videoUrl and image links are signed by Instagram and expire in roughly 1–3 days — the videoUrlExpiresAt column tells you exactly when, so download or transcribe soon after the run rather than months later. The permalink in url never expires.

Works with

Chain this actor's output straight into the transcript actors, or feed it from any actor that emits Instagram handles.

ChainHow
Profiles → reel transcriptsrun this actor, then pass its Dataset ID to Instagram Reels to Text · @handle — it reads the videoUrl column
Any list of handles → postspass a Dataset ID here; rows need a username / ownerUsername field or an instagram.com profile URL
Paste rows directlyuse Dataset items instead of a dataset ID

Steadyfetch Instagram suite

Handle in, structured rows out. All-inclusive pay per event, no start fee, charged only on delivery.

What you wantActor
Reels turned into text, with the 3-second hookInstagram Reels to Text · @handle
A profile's recent posts, capped where you saythis actor

The rest of the steadyfetch shelf — same contract everywhere: all-inclusive pay per event, no start fee, charged only on delivery.

FamilyActors
Ad creative intelligenceFacebook · Google Ads video · TikTok · LinkedIn · Google Ads text & OCR
Trends & keywordsGoogle Trends · Trends Now · Breakout keywords · Autocomplete keywords · Keyword volume & CPC · Social trends
YouTube transcriptsYouTube videos · YouTube channels
InstagramReel transcripts · Profile posts
JobsIndeed · Career sites by domain · Glassdoor · Multi-board
AmazonProducts · Search · Bestsellers · Sellers
Any media fileSpeech to Text · any link or file

Unlinked names are publishing shortly on the same account — search steadyfetch on Apify Store.

Feedback & support

Open an issue on the actor's Issues tab with the input you used — we respond within one business day. Bugs on our side are fixed; misses on Instagram's side are documented in the row you already have.