Apple Ads Library Scraper: App Store Ad Repository
Pricing
from $0.02 / 1,000 ads
Apple Ads Library Scraper: App Store Ad Repository
Scrape the Apple Ads Library, Apple's EU App Store ad repository, by App Store link, app or developer id, name or country. Every page read to the end: app, developer, legal name, placement, format, dates shown, targeting flags, screenshots. Misses are free rows. JSON, CSV, API.
Pricing
from $0.02 / 1,000 ads
Rating
0.0
(0)
Developer
Automation Craft
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Share
Apple Ads Library Scraper: App Store Ad Repository
Scrape the Apple Ads Library, Apple's public EU ad repository (Digital Services Act) of every ad Apple delivered on the App Store in 25 EU countries over the last year: search results, the Search tab, the Today tab and product pages. Give App Store links, app or developer ids, names, or whole countries, and get one row per ad with the app, the developer and its legal name, the placement, the format, the first and last day shown, the targeting flags, the texts, the screenshots and the videos.
Every page Apple returns is read to the last one, and each app, developer or country gets a coverage row with Apple's own total next to the ads delivered, so you can see the result is complete. A name that matches no app, or several, comes back as a free row listing the candidates with their ids. Each ad is charged once per run.
Quick start
- Open the Actor, keep the prefilled input (the name
Temu, Germany, 20 ads) and press Start. - Replace it with your own App Store links (
https://apps.apple.com/de/app/.../id1641486558), app or developer ids, or names in the first three fields. With none of them the run browses every ad of the countries you pick. - Pick countries (all 25 when empty), a period (90 days, 180 days or a year), and optional filters: placements, formats,
startDateandendDate. - Set
maxAds(1,000 when left out), and amemoryNamefor a scheduled run that should return only new ads. - Read the dataset:
adrows, onecoveragerow per app, developer or country, freestatusrows, and onesummaryrow with every counter. The "Ads" view shows the main columns; the "Coverage" view shows what was read.
What you get
One ad row per ad. Apple's ad id is one ad in one country: an app that ran the same creative in three countries has three rows. Fill rates measured on 2026-10-09 on 1,500 ads (Germany, France, Poland, Spain over a year, Luxembourg and one large developer, pages drawn across the whole alphabet):
| Field | What it holds | Fill |
|---|---|---|
adId | Apple's ad id (32 hex characters) | 100 percent |
country, countryName | the country the ad was shown in | 100 percent |
appId, appName, appStoreUrl | the advertised app, its App Store id (as text) and its App Store page in that country | 100 percent |
developerId, developerName, developerUrl | the developer the ad ran for and its App Store page | 100 percent |
legalName | the seller's legal name on the App Store | 100 percent; differs from the developer name on 29.5 percent |
placement, placementName | APPSTORE_SEARCH_RESULTS (96 percent of Germany's ads), APPSTORE_PRODUCT_PAGE, APPSTORE_SEARCH_TAB or APPSTORE_TODAY_TAB, and the plain name | 100 percent |
format | Icon Ad or Icon + Asset Ad (63 percent of Germany's ads carry assets) | 100 percent |
firstShown, lastShown, daysShown | first and last day Apple recorded an impression (YYYY-MM-DD), and the days between, both counted; the first day can lie before the period | 100 percent |
targeting, targetingUsed | whether the campaign used Apple's age, gender, location and customer type refinements (Apple publishes yes or no, not the values) | 100 percent; any of them on 11.6 percent (customer type 9.5, age 2.5, gender 1.1, location 0.4) |
language, languageName, previewDevice | the default language of the ad and the device Apple previews it on | 100 percent |
iconUrl, category, description | the app icon, its App Store category and the description Apple shows with the ad | 100 percent |
subtitle | the app's subtitle | 97.1 percent |
promotionalText | the promotional text, when the ad has one | 30.1 percent |
inAppPurchases | true when the app offers in-app purchases | 100 percent (true on 73.2) |
assets, screenshotCount, videoCount, firstScreenshotUrl | the screenshots and videos in their order, with width, height and orientation | at least one image on 99.8 percent or more (a few ads carry only a video or no asset); a video on 16.1 percent |
colors, editorialBadge, subFormat | Apple's colour code, the editorial badge flag, and Apple's sub format | 1.4, 0.7 (true) and 0 percent |
variations | with Add variations on: every language version of the ad (app name, subtitle, category, promotional text and, where Apple has them, per device screenshots) and its icon variations, with a status | on request |
foundBy | the app, developer, name or country that found the ad, and the countries asked | 100 percent |
period, periodStart, periodEnd | Apple's reporting window the ad was read in | 100 percent |
A coverage row per app, developer or browsed country holds appleTotal (Apple's own count of ads for your countries and period), pagesRead, pagesFailed, adsDelivered, adsCharged, the ads skipped as already known (knownSkipped), already delivered (duplicatesSkipped) or filtered out (filteredOut), stopReason, and complete: true only when every page was read to Apple's last and the distinct ads seen equal Apple's total.
Free status rows: name_not_found and name_ambiguous (with up to 20 candidate apps and developers, their ids and App Store links), no_ads (an app, developer or country without ads in your scope, or none passing your filters), lookup_failed (Apple did not answer after its retries), invalid (a value that could not be used), skipped (inputs not started because the run stopped), memory_free.
How much does it cost to scrape the Apple Ads Library?
You pay per ad delivered, at Apify's Store prices for your plan:
| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Ad (per 1,000 ads) | USD 0.045 | USD 0.040 | USD 0.030 | USD 0.024 |
| Ad variation set (per 1,000, only with Add variations) | USD 1.00 | USD 1.00 | USD 0.90 | USD 0.80 |
| Actor start (once per run) | USD 0.005 | USD 0.005 | USD 0.005 | USD 0.005 |
Platinum and Diamond plans pay the Gold price. The Actor start fee has no plan discount. The Store pricing card shows these same prices per 1,000 events: "$0.045 / 1,000" on the Ad row means one ad costs USD 0.000045.
Examples on the Free plan: every ad of one developer in one country (201 ads) costs USD 0.005 + 201 x 0.000045 = about USD 0.014; 5,000 ads of a whole country cost about USD 0.23. Ads an earlier input of the same run already delivered, ads your memory knows, rows your filters drop, names without a match, targets without ads and calls Apple did not answer are free. A variation set is charged only when Apple answered the variations call for that ad.
Input
| Field | What it does |
|---|---|
searchTerms | App or developer names, matched through Apple's own name search, which reads names from their first letter. By default only an app or developer named exactly like your text (capitals and spaces aside) is used; otherwise a free row lists the candidates. An App Store link pasted here is read as that app or developer. |
apps | App Store app links or app ids (1641486558, id1641486558). Every ad of the app in your countries and period. |
developers | App Store developer links or developer ids. Every ad of every app of the developer. |
countries | ISO codes (DE, de) or country names (Germany, Deutschland) of Apple's 25 countries (no Lithuania, no Malta). All 25 when empty. |
period | LAST_90_DAYS, LAST_180_DAYS or LAST_YEAR. When left out, the shortest one that holds your dates (90 days without dates). |
startDate, endDate | Keep ads that ran on at least one day between them: YYYY-MM-DD, today, yesterday, or 30 days back. |
placements | searchResults, searchTab, todayTab, productPage. All when empty. |
formats | iconAd, iconAssetAd. Both when empty. |
nameMatch | exact (when left out) or startsWith: every app and developer whose name begins with your words as whole words. |
nameTypes | all (when left out), apps or developers. |
includeVariations | Read each delivered ad's variations with one extra call per ad (charged as an Ad variation set when Apple answers). Apple's variations call takes 4 to 33 seconds and fails now and then; after about 35 seconds of failed calls in a run (plus 15 for every set charged) no more variations are asked, and the ads are still delivered. |
maxAds | Total cap, 1,000 when left out, up to 1,000,000. |
maxAdsPerTarget | Cap per app, developer or browsed country. |
memoryName, resetMemory | Cross run memory for scheduled runs: an ad delivered once under a name is never delivered or charged again under it. |
Example through the API:
{"apps": ["https://apps.apple.com/de/app/temu-shop-like-a-billionaire/id1641486558"],"developers": ["368677371"],"countries": ["DE", "FR", "IT"],"placements": ["todayTab", "searchTab"],"startDate": "30 days","maxAds": 5000}
How names are matched
Apple's name search returns apps and developers whose name starts with the letters you type. "Temu" returns the developer Temu, the app "Temu: Shop Like a Billionaire" and the developer "Temurbek Rakhimov". With the default exact, only the developer Temu is used. With startsWith, the developer Temu and the app are used (both begin with the word Temu), and Temurbek is not. A name that matches nothing, or several apps or developers with exactly that name, gives a free row with the candidates and their ids: put the id you mean into apps or developers.
Countries, pages and speed
An app or developer is read over every country in one query when no country is given, and in groups of five otherwise; a browsed country is read on its own. Apple returns 100 ads per page and the Actor reads three pages at a time through the Apify datacenter proxy. Measured on 2026-10-09: 1,000 ads in about 30 seconds, one app's 3,206 ads in all countries in 40 seconds, 5,000 ads of France in under 4 minutes; a read test of Apple's API from an Apify run with the same three datacenter exits walked all 175,584 ads of Germany's 90 days in 47 minutes with no page lost. The default run timeout is 2 hours: raise it for a run of more than about 200,000 ads.
Filters and the work allowance
Apple's API has no placement, format or date filter, so these filters are applied to every row Apple returns: every page is still read and the rows that do not pass are dropped free. Every request the run sends draws on a work allowance of 26 units (a page or a name search is 1, a variations call 3; names are searched up to three at a time) plus 0.03 for every ad charged and 10 for every variation set charged. A page that brings 34 or more new ads earns more than it costs, and a name whose apps bring about 30 ads or more in your scope pays most of its search and its first page (a list of 20 such names is read to the end); a long list of names whose apps advertise little, or a run whose pages earn little or nothing (ads a memory already knows, a filter that keeps few rows of a whole country, names nobody has, a failing variations call) stops when it is spent, with a free row naming the inputs it did not start.
Monitoring with a memory
With a memoryName, a scheduled run delivers and charges only ads it has not delivered before under that name. Apple sorts its pages by app name, not by date, so a memory run reads every page of its apps and developers again and skips the known ads free; with the work allowance a memory run reads about 26 pages of ads it already knows (about 2,600 ads) plus one more page for every 33 new ads, which suits apps and developers (a developer with 2,000 ads is 20 pages) far better than whole countries. Split a larger watch list over several memory names. Two runs on one memory name at the same time are not supported: the second one delivers its rows free and remembers nothing.
What this Actor does not do
- It returns what Apple's repository publishes. Apple does not publish keywords, bids, spend, impressions, taps, installs or the values of the targeting (only whether age, gender, location and customer type targeting was used).
- It covers the 25 EU countries of Apple's repository and the last year, with Apple's publishing delay of about 5 to 7 days. No other country and no older ad.
- It does not include Apple's separate list of removed ads and suspended accounts (about 210 records a year, which name no app, developer or ad).
- It does not offer a paid directory of advertisers with ad counts; names that match several apps or developers are listed free with their ids.
- It does not re-deliver ads that changed since an earlier memory run: the memory delivers new ads only (a full run without a memory shows the current last day of every ad).
- It does not read input from files, sheets or drive links: paste lists into the input or send them through the API.
- It has no proxy setting: it always uses the Apify datacenter proxy, which read all of Germany's pages without a block in the test of 2026-10-09.
API
Run it and read the ads with curl:
curl -X POST "https://api.apify.com/v2/acts/automation_craft~apple-ads-library-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"developers": ["1641486560"], "countries": ["DE"], "maxAds": 100}'
Node.js:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation_craft/apple-ads-library-scraper').call({ searchTerms: ['Temu'], countries: ['DE'], maxAds: 100 });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.filter((x) => x.type === 'ad').length);
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("automation_craft/apple-ads-library-scraper").call(run_input={"apps": ["1641486558"], "maxAds": 100})ads = [x for x in client.dataset(run["defaultDatasetId"]).iterate_items() if x["type"] == "ad"]
FAQ
Does Apple have an ad library?
Yes. Under the EU Digital Services Act, Apple publishes the Apple Ads Library (its ad repository at adrepository.apple.com): every ad Apple delivered on the App Store in 25 EU countries over the last year, searchable by app or developer. This Actor reads it as rows, every page to the end.
How can I see competitor ads on the App Store?
Put the competitor's App Store link, app id, developer id or exact name into the input and pick the countries. You get every ad Apple shows for it in the EU repository: placement, format, the days it ran, the targeting flags and the creative, one row per ad and country.
What is the Apple Ad Repository and which countries does it cover?
It is Apple's public record of the ads it delivered on the App Store in the European Union, kept for one year: Austria, Belgium, Bulgaria, Croatia, Cyprus, Czech Republic, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Ireland, Italy, Latvia, Luxembourg, Netherlands, Poland, Portugal, Romania, Slovakia, Slovenia, Spain and Sweden. Germany alone held 175,584 ads over 90 days on 2026-10-09.
Can I see the keywords, bids or spend of competitor Apple Ads?
No. Apple's repository does not publish keywords, bids, spend, impressions or installs, so no row carries them. It shows which app advertised, where on the App Store, in which country, on which days, with which creative, and whether age, gender, location or customer type targeting was used.
Can I monitor a competitor and pay only for new ads?
Yes. Give a memoryName and schedule the run: each ad is delivered and charged once under that name, later runs return only ads that are new. Known ads are skipped free.
Why does this Actor run with limited permissions?
It runs with the least privileges the platform offers: it can only use its own storages. The cross run memory is a named store the Actor creates itself under your memory name, which works with limited permissions.
More data tools by Automation Craft
- Meta Ads Library Scraper - Ad Library, All Filters
- Google Ads Transparency Scraper - Decoded Creatives
- TikTok Ads Library Scraper: EU Ads, No Login
- Amazon Ad Library Scraper - EU Ads & Impressions
- Pinterest Ads Library Scraper - EU Ads Repository
- Snapchat Ads Library Scraper: EU Ads Gallery
- Microsoft Ads Library Scraper - Competitor Ads
- LinkedIn Ad Library Scraper: Ads by Company
- TikTok Creative Center Scraper: Top Ads, No Login
- Google Trends Scraper - Compare and Trending Now
Changelog
- 0.1 (2026-10-09): first version: apps, developers and names, whole country browse, every page to Apple's last with a coverage row, filters, variations, memory.