Instagram Scraper - Profiles, Posts & Reels, $0.45/1k avatar

Instagram Scraper - Profiles, Posts & Reels, $0.45/1k

Pricing

Pay per event

Go to Apify Store
Instagram Scraper - Profiles, Posts & Reels, $0.45/1k

Instagram Scraper - Profiles, Posts & Reels, $0.45/1k

Instagram's own profile endpoint errors out on accounts with a business category, so this reads whichever route answers: that lookup, the rendered page, or the account's post feed. Usernames return profile plus recent posts; URLs return one post or reel. $0.45 per 1,000 items.

Pricing

Pay per event

Rating

5.0

(1)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

39

Total users

13

Monthly active users

2 days ago

Last modified

Share

Instagram Scraper — profiles, posts and reels

Instagram hands a signed-out visitor its data through the endpoints its own site calls, and those endpoints move. The profile lookup currently errors out on any account with a business category set — most brands, most creators. So this reads whichever route is answering: the site's own lookup when it works, the rendered page and the account's post feed when it doesn't. A username gets you the profile row plus that account's recent posts, a post or reel URL gets you that single item. Everything comes back flat, one JSON row per thing, ready for a spreadsheet or a database.

No login, no cookie, no API key, no app review. Instagram serves profiles and public posts to a signed-out client and that's the route this uses.

What you get

Profile row (type: "profile"):

{
"ok": true,
"type": "profile",
"username": "nasa",
"id": "528817151",
"fullName": "NASA",
"biography": "Making the seemingly impossible, possible. ✨",
"externalUrl": "https://www.nasa.gov/",
"followersCount": 104400555,
"followsCount": 92,
"postsCount": 4887,
"verified": true,
"isBusinessAccount": true,
"private": false,
"profilePicUrl": "https://scontent-fra3-2.cdninstagram.com/...",
"url": "https://www.instagram.com/nasa/"
}

Post and reel rows (type: "image", "video" or "carousel") carry: shortCode, url, caption, hashtags[], mentions[], likesCount, commentsCount, videoViewCount, displayUrl, videoUrl, images[], isVideo, dimensions, ownerUsername, ownerId, timestamp (ISO 8601) and accessibilityCaption.

hashtags and mentions are parsed out of the caption for you, so you don't have to regex them yourself downstream.

Input

{
"usernames": ["nasa"],
"resultsLimit": 50
}
FieldDefaultNotes
usernamesHandles with or without @. Each one returns its profile row plus its posts. The most reliable mode.
startUrlsProfile URLs scrape that account's posts; /p/, /reel/ and /tv/ URLs scrape that one item.
resultsLimit50Total items across the whole run — profiles and posts together, both count. Capped at 5,000. This is your spend cap.
onlyPostsNewerThanYYYY-MM-DD. Older posts are dropped and not charged.
sessionCookiesOptional and normally not needed. Everything above works without an account. A cookie is only attached if the signed-out route is refused. Stored as a secret.
proxyConfigurationApify datacenterLeave it. Instagram rate-limits per address, and rotating datacenter proxies are exactly what that needs. They're included in the run cost and add nothing to your bill. Set it only to use proxy servers you already pay for.
notionConnector / notionParentIdOptional: write each row into a Notion database as well as the dataset.

Run it with no input at all and you get one labelled _sample row showing the output shape, charged nothing.

Limits

  • Private accounts return the profile shell only. Follower counts, bio and private: true come through; the posts don't, because there's nothing public to read.
  • Recent posts, not the full archive. Timeline paging stops at 60 pages, so very large accounts won't come back complete in one run. Use onlyPostsNewerThan to make the walk purposeful.
  • postsCount comes back null on the fallback route. When the site's own profile lookup errors out, the rendered page it falls back to carries the follower and following counts but not the account's total post count. Everything else in the profile row is there.
  • No comments, no follower lists, no stories. Those are separate scrapers.
  • Media URLs expire. Instagram signs its CDN links with a short lifetime. Fetch the file while the run is going if you need to keep it; a URL you save today will 403 on you later.
  • Items are deduplicated within a run, so nothing is returned or charged twice.

Billing

$0.00045 per item ($0.45 per 1,000), plus $0.001 when a run starts. Flat rate on every Apify plan. No volume tiers to climb, no minimum spend.

A profile row and a post row cost the same. You're charged only for rows that carry data — sample rows, diagnostic rows, date-filtered posts, duplicates and empty results are free. The start fee goes by run memory, one event per gigabyte, so it's $0.001 at the default 1 GB.