Instagram Ads Library Scraper - Instagram-Only Ads & Creatives
Pricing
from $1.00 / 1,000 run start fees
Instagram Ads Library Scraper - Instagram-Only Ads & Creatives
Scrape the Instagram ads library by brand, Instagram handle, page ID or Meta Ad Library URL. Get Instagram ads only, or flag the ones that ran on Instagram and nowhere else, with ad text, images, videos, CTA, run dates and placement spread.
Pricing
from $1.00 / 1,000 run start fees
Rating
0.0
(0)
Developer
SR
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Instagram Ads Library Scraper
Instagram Ads Library Scraper exports the Instagram ads a brand runs, straight from Meta's public ads library, so marketers, agencies and researchers can study a competitor's Instagram creatives without scrolling the library by hand. Each row includes creative text, images, videos, calls to action, run dates and placement information. Search by advertiser name, Instagram handle, Meta page ID or an existing Ad Library URL.
Instagram advertisements are disclosed through Meta's Ad Library. This actor uses that public library to identify Instagram placements and distinguish ads that also run on Facebook, Messenger, Audience Network or Threads. It provides one dataset row per returned advertisement variant and a run summary that describes the placement spread.
How to use the Instagram Ads Library Scraper
- Enter a brand name or Instagram handle in
search, or paste a page ID or an Ad Library URL. - Pick the market with
country, for exampleNLorUS. - Choose a
placementmode: every ad that includes Instagram, Instagram-only ads, or all placements. - Start the run and download the dataset as JSON, CSV, Excel or through the Apify API.
The same input works from the Apify Console, the API, scheduled runs and integrations, so a weekly competitor check needs no extra setup.
Instagram Ads Library search and placement filters
Choose instagram to keep ads that include Instagram among their placements. Choose instagram_only to keep ads whose only reported placement is Instagram. Choose all to retrieve the advertiser's ads across every placement; this mode may include ads that never ran on Instagram.
The is_instagram_only field makes that distinction explicit. platform_count reports the number of distinct placements. also_on lists placements other than Instagram and remains null when none exist. All placement names in publisher_platform are normalised to uppercase and duplicate names are removed while their order is preserved.
Use these fields to compare creative formats, review whether a campaign uses several Meta surfaces, or collect Instagram-specific advertisements for analysis. Placement information describes public disclosures. It does not reveal campaign budgets, conversion rates, sales or the advertiser's private targeting configuration.
Input
The existing input names and defaults are preserved:
| Field | Default | Description |
|---|---|---|
search | None | Advertiser name or Instagram handle, with or without @ |
page_id | None | Meta page ID of the advertiser |
url | None | A Meta Ad Library URL |
country | US when omitted | Market to search; use a two-letter country code |
placement | instagram | instagram, instagram_only or all |
active_only | true | Include only currently active ads |
max_ads | 100 | Maximum ads fetched before the placement filter, from 1 to 5000 |
Provide at least a search, page ID or usable URL. A page ID is useful when several brands have similar names. An exact Instagram handle is considered when resolving a search to the advertiser's Meta page. Explicit page IDs and search terms take precedence over values read from a URL. A market specified in the URL takes precedence over country, except for the special URL value ALL.
Apify supplies the default active_only: true, including for API runs. To include inactive ads, send active_only: false explicitly. A URL's status does not override that explicit input. When placement is all, publisher-platform filters in the URL are respected; the two Instagram modes select Instagram placements themselves.
This input is from the recorded Zalando baseline:
{"search": "zalando", "country": "NL"}
max_ads counts unique advertisements fetched before the final placement filter. A request for 300 fetched ads can therefore return fewer than 300 Instagram-only ads. Increasing that value expands the examined inventory, rather than promising an exact number of delivered rows. Collection also respects the run timeout and upstream availability.
Output
The default dataset contains one row per advertisement variant that passed the selected placement filter. Existing fields and their JSON types are retained, including nullable media and disclosure fields. New common fields include source, platform, fetched_at, advertiser_name and creative_id.
Creative fields include ad_id, collation_id, collation_count, display_format, title, body_text, link_url, link_description, caption, cta_text and cta_type. Media fields include images and videos; each video retains its hd_url, sd_url and preview_image_url. Some ads have no media of a particular kind, so those lists can be empty.
Timing and activity fields include start_date, end_date, is_active and total_active_time. Advertiser fields include page_id, page_name, page_profile_uri, page_profile_picture_url, page_like_count, page_categories, page_is_deleted, ig_username and ig_followers. A direct page-ID request skips name lookup, so the Instagram handle may be null. The follower count falls back to the information reported for the advertiser page. When the library does not report a page's like count, page_like_count stays null instead of being turned into 0, so an unknown value is never mistaken for a page without likes.
Disclosure fields include categories, reach_estimate, currency, spend, targeted_or_reached_countries, contains_digital_created_media, contains_sensitive_content, state_media_run_label, byline, disclaimer_label, country_iso_code and branded_content. Political and issue ads may include public spend and impression ranges. Commercial ads generally do not expose those values. These are ranges reported by the library, not independently estimated spending.
The output also preserves impressions_text, impressions_index, spend_text, spend_index, query, country and resolved_page_id. The query remains available even when an explicit page ID resolved the advertiser.
This excerpt comes from an actual Walmart baseline recorded on 2 October 2026. Inventory and media URLs can change after collection:
{"ad_id": "1573074233800485","page_id": "159616034235","page_name": "Walmart","body_text": "{{product.brand}}","start_date": "2026-03-11","end_date": "2026-05-01","publisher_platform": ["INSTAGRAM"],"is_instagram_only": true,"also_on": null,"platform_count": 1,"ig_username": "walmart","ig_followers": 4019759,"link_url": "https://www.walmart.com/shop/womens-trends/garden-florals","images": [],"videos": []}
For comparison, this row from the recorded Zalando baseline ({"search": "zalando", "country": "NL"}) shows an ad that runs on Instagram and four other placements:
{"ad_id": "2167116270512912","page_id": "365604620536","page_name": "Zalando","display_format": "DPA","body_text": "Ontdek de laatste mode- en beautytrends bij Zalando.","cta_text": "Shop now","start_date": "2026-08-28","end_date": "2026-10-02","is_active": true,"publisher_platform": ["FACEBOOK", "INSTAGRAM", "AUDIENCE_NETWORK", "MESSENGER", "THREADS"],"is_instagram_only": false,"also_on": ["FACEBOOK", "AUDIENCE_NETWORK", "MESSENGER", "THREADS"],"platform_count": 5,"ig_username": "zalando","link_url": "https://www.zalando.nl/"}
The summary key-value record contains adsReturned, placement, instagramOnly, platformSpread, unknownPlatforms, sourceNote and errorCount. It describes the delivered advertisements. Unrecognised placement names remain visible rather than being silently discarded. The errors record explains empty searches and interrupted collections when applicable.
Use cases
- Competitor creative research: collect every Instagram ad a rival brand runs in a market and review its hooks, formats and calls to action in one table.
- Instagram-only campaigns: find the creatives a brand made for Instagram alone, separate from the ads it spreads across Facebook, Messenger and Threads.
- Agency pitches and audits: show a prospect what their competitors run on Instagram today, with start dates that reveal long-running winners.
- Landing page and offer tracking: follow
link_urlandcta_typeover time to see which products and promotions a brand pushes. - Academic and policy research: export political and issue ads with their public spend and impression ranges for analysis.
Instagram Ads Library Scraper compared with other options
| Meta Ad Library website | General Meta ads scrapers | This actor | |
|---|---|---|---|
| Export to JSON, CSV or Excel | No | Yes | Yes |
| Search by Instagram handle | No | Usually not | Yes |
| Instagram-only filter | Manual | No | Yes (instagram_only) |
Placement spread per ad (also_on, platform_count) | Manual | Raw list | Yes |
| Instagram username and followers per ad | No | Varies | Yes |
| Scheduling and API access | No | Yes | Yes |
If you need every Facebook and Instagram ad without a placement focus, choose placement: all. If your work is about Instagram, the default mode keeps the dataset and the bill limited to the ads that matter.
Pricing and free-plan limits
Pricing is unchanged: $0.001 per run start and $0.0015 per returned advertisement. The run-start event applies even when no advertisements are found. Advertisement charges apply only to delivered rows matching the selected placement filter. Empty results have no advertisement charges, and continuation within the same run does not add another start fee.
Free-plan runs deliver at most ten dataset rows and charge at most ten advertisement events. Filtering still examines the requested inventory, so an Instagram-only search can find its first qualifying rows after advertisements that have several placements. Paid runs retain the requested fetched-ad limit. The OUTPUT record reports delivery, charges, warnings and whether the free-plan cap was reached.
FAQ
Does Instagram have a separate public ads library?
Instagram ads appear in Meta's Ad Library. This actor selects and describes Instagram placements from those disclosures. It does not claim to access a separate Instagram advertising database.
Why does Instagram-only return fewer ads than max_ads?
The limit applies before the final filter. Ads that include Facebook or another placement are examined but excluded from Instagram-only output and advertisement billing. An advertiser may have no ads exclusive to Instagram in the examined inventory.
Can I search by Instagram username?
Yes. Use the username in search, with or without @. Page resolution considers the disclosed Instagram handle along with advertiser name, market, verification and page popularity. Supplying a page ID gives you direct control when a name is ambiguous.
Are inactive advertisements included?
Set active_only to false. Results depend on what Meta's library publishes for that advertiser and market. A successful empty run means no qualifying rows were returned; consult the summary and errors for context.
What happens when a large search is interrupted?
The actor keeps paging until it reaches max_ads, the end of the advertiser's inventory or the run timeout. Pages that fail briefly are retried at the same position, so ads are not skipped or charged twice. This also applies to the first page: when Meta stops early with fewer ads than it reports for the advertiser, the same search is retried before the run finishes. If collection still cannot finish, the run succeeds with the ads delivered so far, and the OUTPUT record sets partial to true with the warning "Meta pagination could not complete; retry later or raise the run timeout." Retry later, raise the run timeout or narrow the search to collect the rest.
Do media URLs stay valid indefinitely?
No. Public image and video URLs can expire or change. Download needed assets while they remain accessible and keep the associated ad ID for future comparisons.
Can I run the Instagram Ads Library Scraper through the API?
Yes. Start the actor with the same JSON input through the Apify API or a client library, then read the dataset items. Scheduled runs and webhooks work as well.
Which countries are supported?
Any market Meta's library covers. Pass a two-letter code in country; when omitted, the search uses US. Results reflect what the library publishes for that market.