Instagram Scraper - Profiles, Posts, Reels & Ads, No Login
Pricing
from $0.80 / 1,000 post or reels
Instagram Scraper - Profiles, Posts, Reels & Ads, No Login
Scrape public Instagram profiles with their full post history, Reels tab and the Instagram ads they run, plus posts by URL, keyword search volume, trending topics and places. Exact likes, comments and views, collaborators, tagged accounts, audio and link-in-bio URLs. No login.
Pricing
from $0.80 / 1,000 post or reels
Rating
0.0
(0)
Developer
SR
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
18 days ago
Last modified
Categories
Share
Instagram Scraper: profiles, full post history, reels and ads
This Instagram scraper pulls any public Instagram profile with its complete post history, its Reels tab and the Instagram ads it runs, in one run and without logging in. It is built for brands, agencies and analysts who want competitor, influencer and ad research in one dataset. The same Actor also reads posts and reels by URL, Instagram keyword search volume, trending topics and places.
How to use the Instagram scraper
- Put one or more Instagram usernames in
search(for exampleglossier), or paste profile, post or reel URLs. - Set
maxPostsPerProfileto how far back you want to go, up to 1000 posts per profile, andmaxReelsPerProfileif you also want the Reels tab. - Leave
includeAdson to get the profile's ads from the Instagram ad library and the advertiser summary on the profile row. - Run it and download the dataset as JSON, CSV or Excel, or read it through the Apify API.
What this Instagram scraper returns
- Profiles: exact follower, following, post and reel counts, full biography, every link-in-bio URL, website, category, business and creator flags, verified status, email addresses written in the bio, and up to 49 profiles Instagram itself lists as related.
- Full post history: every post back through the account's history, newest first, up to 1000 per profile. Exact likes and comments, views on every video, caption, hashtags, mentions, tagged accounts, collaborators, paid-partnership flag, place with coordinates, audio, carousel images and download URLs.
- Reels tab: the profile's reels with play counts, duration and audio id, including reels it made together with other accounts.
- Instagram ads, joined to the profile: the ads the account runs on Instagram in Meta's Ad Library, with creative text, landing URL, start date, and whether each ad ran on Instagram only or on other Meta placements too. The profile row gets the advertiser summary: total Instagram ads, Instagram-only ads and the newest ad's start date.
- Paid next to organic: per profile, how many of the returned posts are paid partnerships, next to how many ads the account runs.
- Posts and reels by URL, with optional comments.
- Keyword search volume: reel counts per Instagram search term, related keywords, related topics and the top reels behind each term.
- Trending topics and places with address, coordinates and post counts.
Why scrape Instagram profiles and ads together
Most Instagram scrapers stop at a profile's latest dozen posts, and most ad library tools know nothing about Instagram beyond a placement flag. Brands, agencies and analysts end up running two tools and matching the results by hand, usually on the brand name, which attaches the wrong page's ads as soon as a name is shared by a fan page or a regional account.
This Actor joins them on the one key that cannot be ambiguous: the advertiser page's own Instagram handle. An ad is attached to a profile only when the Ad Library page's Instagram handle is exactly that profile's username. A lookalike page is never used, and the profile row says so plainly when the account does not advertise.
Because the full post history is included, the organic side of the comparison is complete too: every post with exact engagement, rather than an estimate from the most recent few.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
searchType | select | profile | Profile, keyword, URL, location or trending |
search | list | none (prefilled glossier) | Usernames, keywords, Instagram URLs or place IDs |
maxPostsPerProfile | integer | 24 | Posts per profile, newest first, up to 1000 |
maxReelsPerProfile | integer | 0 | Reels from the Reels tab per profile, up to 1000 |
includeAds | boolean | true | Add the profile's Instagram ads and advertiser summary |
maxAdsPerProfile | integer | 20 | Ad rows per profile; 0 keeps only the summary |
adsCountry | string | US | Country whose Ad Library to read |
activeAdsOnly | boolean | true | Only ads running now |
includeComments | boolean | false | Attach comments to posts (12 newest per profile) |
maxComments | integer | 20 | Comments per post |
mode | select | both | Keyword input: keywords, reels, or both |
maxKeywords | integer | 25 | Keyword input: keyword pages to fetch |
expandRelated | integer | 0 | Keyword input: depth of related keywords to follow |
maxReels | integer | 50 | Keyword input: reel rows from keyword pages |
includeTrending | boolean | false | Also return trending topics |
Instagram links are recognised automatically whatever searchType says.
Output
Every row has a record_type: profile, reel (posts and reels), ad, keyword,
location, trending_topic or category. The rows below are real output for the default
input (glossier, 24 posts, 20 ads), shortened to the most used fields.
Profile rows also retain these fields, even when Instagram provides no links or related accounts:
| Field | JSON type | Meaning |
|---|---|---|
bio_links | array of objects | Public link-in-bio entries; an empty array when none are returned |
bio_links[].title | string or null | Link title, or null when Instagram supplies no title |
bio_links[].url | string | Public destination URL of the link |
related_profiles | array of strings | Usernames of related public accounts suggested by Instagram; an empty array when none are returned |
Every post or reel row includes unavailable (boolean) and unavailable_reason (string).
When Instagram reports a removed, private or unknown post through its catch-all page,
unavailable is true and the reason explains that response. Otherwise these fields are
false and an empty string. A post retrieved successfully keeps its full content and counts.
{"record_type": "profile","username": "glossier","full_name": "Glossier","followers": 3131390,"posts_count": 6049,"is_verified": true,"ads_status": "ok","advertiser_page_name": "Glossier","instagram_ads_total": 71,"instagram_only_ads_returned": 0,"newest_ad_started": "2026-09-24","posts_returned": 24,"paid_partnership_posts": 0}
{"record_type": "reel","url": "https://www.instagram.com/p/DdrzbfFmw-p/","owner_username": "glossier","likes": 2181,"comments_count": 38,"views": null,"posted_at": "2026-09-24T21:01:52Z","tagged_users": ["samaharris", "libraebakery"],"coauthors": ["libraebakery"],"is_paid_partnership": false,"engagement_rate": 0.0696}
{"record_type": "ad","ad_id": "2298062574309352","page_name": "Glossier","ig_username": "glossier","publisher_platform": ["FACEBOOK", "INSTAGRAM", "AUDIENCE_NETWORK", "THREADS"],"is_instagram_only": false,"start_date": "2026-09-14","link_url": "https://www.glossier.com/products/fragrance-duo"}
The run's summary record counts rows per type; errors lists per-target problems such as
a private account or a profile that does not exist.
Use cases
Competitor research for brands. Put your competitors' usernames in and get, for each, everything they posted this year with exact engagement, every reel with its view count, and every ad they run on Instagram right now. Seeing paid and organic side by side shows which products a competitor pushes with money and which it lets carry themselves.
Influencer vetting for agencies. Engagement rate on the full post history, not the last twelve posts, separates steady creators from one viral hit. Paid-partnership counts and collaborator lists show who a creator already works with, and bio emails and link-in-bio URLs give you the contact route.
Ad intelligence for performance marketers. The Instagram-only flag separates creative made for Instagram from campaigns that just include it. Start dates show how long an ad has survived, which is the closest public signal to which creative works.
Trend and keyword research for content teams. Keyword pages give reel volume and related terms for Instagram search, and trending topics show what Instagram itself is surfacing, so content can be planned around what people search for on Instagram rather than on Google.
How this Instagram scraper compares
| This Actor | Typical Instagram scraper | Typical Ad Library scraper | |
|---|---|---|---|
| Post history | Up to 1000 per profile | Often the latest 12 to 50 | None |
| Reels tab with play counts | Yes | Separate actor | None |
| Instagram ads per profile | Yes, joined on the Instagram handle | None | Yes, matched on page name |
| Related profiles, link-in-bio URLs | Yes | Sometimes | None |
| Keyword search volume | Yes | None | None |
| Full comment threads | 12 to 15 per post, like the public page | Varies | None |
The official Instagram API needs an approved app and a connected business account, and it does not return other accounts' full post history or their ads. This Actor needs neither.
What others have that this does not: follower lists, likers and stories, which Instagram only shows to logged-in users.
Pricing
Pay per event: one event per profile, per post or reel, per ad, and per keyword, place or trending row that reaches your dataset. You only pay for results you receive. No actor-start fee, no per-compute-unit charges, and an empty run costs nothing.
| Event | Free plan | Bronze | Silver | Gold and up |
|---|---|---|---|---|
| Profile | $0.0016 | $0.0014 | $0.0012 | $0.0010 |
| Post or reel | $0.0012 | $0.0010 | $0.0009 | $0.0008 |
| Instagram ad | $0.0012 | $0.0010 | $0.0009 | $0.0008 |
| Keyword, place or trending row | $0.0014 | $0.0012 | $0.0010 | $0.0009 |
Example: the prefilled input (one profile, 24 posts, 20 ads) is 45 events, $0.0454 on the Bronze plan. 1000 posts for one profile cost $1.00 on Bronze. The pricing tab always shows the current rates.
Limits and gotchas
- Public data only. Private accounts return the profile row and no posts, with a
private_accountnote inerrors. - Comments are read for the 12 newest posts per profile, 12 to 15 per post, which is what the public post page shows.
- Some profile details (bio links, category, related profiles) are occasionally unavailable for an account; the row then still carries counts, name and recent posts.
- Ads are matched only on an exact Instagram handle.
ads_status: no_advertiser_page_foundmeans no Ad Library page claims that handle in the chosen country, not that the brand never advertises elsewhere. - Free Apify plans return up to 10 rows per run.
- Deep crawls take time: a full post history for one profile is many sequential pages.
FAQ
Can I scrape an Instagram profile's full post history without logging in?
Yes. Set maxPostsPerProfile up to 1000 and the Actor pages back through the account's
public posts, newest first.
How do I see which Instagram ads a brand is running?
Leave includeAds on and put the brand's username in search. Ads come back as ad rows
and the profile row gets the totals.
Does it scrape Instagram reels with view counts?
Yes. Posts that are videos carry views, and maxReelsPerProfile adds the Reels tab with
play counts and audio ids.
Can I get Instagram engagement rate for influencers?
Every post row has engagement_rate (likes as a share of followers) and videos have
like_to_view_rate.
Does it find emails on Instagram profiles?
It returns email addresses written in the public biography in bio_emails, plus every
link-in-bio URL. Business contact buttons are not shown to logged-out visitors.
Is this Instagram scraper free to try? Yes. On the free Apify plan every run returns up to 10 rows, enough to see the output for a profile before you pay for a full history.
Do I need an Instagram account or a login? No. The Actor reads only what Instagram shows to logged-out visitors. You never share a password or a session cookie.
Can I search the Instagram ad library for a brand?
Yes. Put the brand's Instagram username in search with includeAds on. Pick the country of
the Ad Library with adsCountry and switch activeAdsOnly off to include ads that have ended.
Can I run it from my own code or a scheduler? Yes. Start runs through the Apify API, schedule them in the Apify Console, or connect the dataset to Make, Zapier, Google Sheets or a webhook.