sfoln/instagram-user-posts · Social media, Lead generation, Automation On request
Scrape the latest posts and reels of public Instagram profiles, no login needed: caption, date, likes, comments, views, media URLs, hashtags, mentions and location, one row per post. $0.60 per 1,000 posts + $0.003 per page of about 12.
Instagram Posts Scraper (No Login) gets the latest posts of public Instagram profiles with one normalized record per post: shortcode, URL, type (image / video / carousel / reel), caption, post date, likes, comments, video views, thumbnail, all media URLs, hashtags, mentions, tagged users, pinned flag and location. You can optionally also read the Reels tab. It's built for influencer vetting, brand and competitor monitoring, content analytics and AI agents.
Price
Price per delivered record
Event
Price
Per 1,000
Charged for
Instagram post instagram-post
$0.0006
$0.60 / 1,000
Charged once per Instagram post or reel delivered as a dataset record. User summary records are never charged.
Instagram posts page instagram-posts-query
$0.003
$3 / 1,000
Charged once per page of a user's posts or reels (about 12 per page) that delivered at least one post, or that the provider billed although it had no new posts (e.g. a private account's empty feed). Covers the per-request upstream fee.
Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.
Run
Call it from code, an agent or the Console
This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com
POST https://api.apify.com/v2/actors/sfoln~instagram-user-posts/runs?maxTotalChargeUsd=1
GET https://api.apify.com/v2/actor-runs/{runId} # until status is SUCCEEDED
GET https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json
Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Get the 12 latest Instagram posts of @nasa and rank them by likes and comments.
Input
Input fields
Paste Instagram handles or profile URLs. Each profile produces one dataset record per post (newest first) plus one summary record per profile.
Field
Type
Default
Meaning
handles *
array
required
Instagram profiles Handles (with or without @) or profile URLs such as https://www.instagram.com/nasa/. Post and reel URLs are not accepted. Duplicates are removed. Accounts on the Apify free plan can process up to 10 profiles per run.
maxPostsPerUser
integer
12
Max posts per profile How many of the newest posts to return per profile (1–120). Posts are fetched in pages of about 12; each delivered post is one charged event, plus one page event per page. Range 1–120.
includeReels
boolean
false
Also fetch the Reels tab Also read the profile's Reels tab (up to the same limit) and add reels that are not already in the posts feed. Reels from this tab come without captions. Billed like posts.
maxUsers
integer
100
Max profiles Safety cap on the number of profiles processed in this run. Range 1–1000.
concurrency
integer
4
Concurrency How many profiles are fetched in parallel (1–8). Range 1–8.
itemTimeoutSecs
integer
600
Time limit per input (seconds) Pagination for one profile stops cleanly shortly before this limit (60–3600). Raise it for very large per-input limits. Range 60–3600.
includeRaw
boolean
false
Include raw upstream response Attach the unmodified provider post object to each post record (much larger output).
Example input
{
"handles": [
"nasa"
],
"maxPostsPerUser": 6
}
Output
One record per input item
Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.
Field
Type
Meaning
input
string | object
Input The handle or profile URL as provided.
recordType
string
Record type post (one per delivered post, charged) | user (one summary per profile, never charged) e.g. "post"
handle
string | null
Handle
feed
string
Feed posts (main grid) | reels (Reels tab, only with includeReels)
position
integer
Position
postId
string | null
Post ID
shortcode
string | null
Shortcode
url
string | null
URL
type
string | null
Type image | video | carousel | reel
caption
string | null
Caption
takenAt
string | null
Posted at ISO 8601 UTC
likes
number | null
Likes null when the owner hides like counts
comments
number | null
Comments
views
number | null
Views Video/reel plays (Instagram only); null for images
durationSecs
number | null
Duration (s)
thumbnailUrl
string | null
Thumbnail URL
mediaUrls
array
Media URLs Image/video URLs (one per carousel item); CDN links expire.
mediaCount
integer
Media count
hashtags
array
Hashtags
mentions
array
Mentions @handles mentioned in the caption
taggedUsers
array
Tagged users
isPinned
boolean | null
Pinned
isPaidPartnership
boolean | null
Paid partnership
locationName
string | null
Location
ownerHandle
string | null
Owner handle
ownerId
string | null
Owner ID
profileUrl
string
Profile URL user records only.
postsDelivered
integer
Posts delivered user records only.
reelsDelivered
integer
Extra reels delivered user records only.
pagesFetched
integer
Pages fetched user records only.
pagesCharged
integer
Pages charged user records only.
reachedEnd
boolean
Reached end user records only.
stopReason
string
Stop reason user records only.
status
string
Status ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
charged
boolean
Charged Post records: charged instagram-post. user summary records are never charged themselves: the instagram-posts-query page fees charged for the input (including empty pages the provider billed) are counted in pagesCharged.