Apple Ads Library Scraper: App Store Ad Repository avatar

Apple Ads Library Scraper: App Store Ad Repository

Pricing

from $0.02 / 1,000 ads

Go to Apify Store
Apple Ads Library Scraper: App Store Ad Repository

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

Automation Craft

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

4 days ago

Last modified

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

  1. Open the Actor, keep the prefilled input (the name Temu, Germany, 20 ads) and press Start.
  2. 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.
  3. Pick countries (all 25 when empty), a period (90 days, 180 days or a year), and optional filters: placements, formats, startDate and endDate.
  4. Set maxAds (1,000 when left out), and a memoryName for a scheduled run that should return only new ads.
  5. Read the dataset: ad rows, one coverage row per app, developer or country, free status rows, and one summary row 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):

FieldWhat it holdsFill
adIdApple's ad id (32 hex characters)100 percent
country, countryNamethe country the ad was shown in100 percent
appId, appName, appStoreUrlthe advertised app, its App Store id (as text) and its App Store page in that country100 percent
developerId, developerName, developerUrlthe developer the ad ran for and its App Store page100 percent
legalNamethe seller's legal name on the App Store100 percent; differs from the developer name on 29.5 percent
placement, placementNameAPPSTORE_SEARCH_RESULTS (96 percent of Germany's ads), APPSTORE_PRODUCT_PAGE, APPSTORE_SEARCH_TAB or APPSTORE_TODAY_TAB, and the plain name100 percent
formatIcon Ad or Icon + Asset Ad (63 percent of Germany's ads carry assets)100 percent
firstShown, lastShown, daysShownfirst and last day Apple recorded an impression (YYYY-MM-DD), and the days between, both counted; the first day can lie before the period100 percent
targeting, targetingUsedwhether 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, previewDevicethe default language of the ad and the device Apple previews it on100 percent
iconUrl, category, descriptionthe app icon, its App Store category and the description Apple shows with the ad100 percent
subtitlethe app's subtitle97.1 percent
promotionalTextthe promotional text, when the ad has one30.1 percent
inAppPurchasestrue when the app offers in-app purchases100 percent (true on 73.2)
assets, screenshotCount, videoCount, firstScreenshotUrlthe screenshots and videos in their order, with width, height and orientationat 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, subFormatApple's colour code, the editorial badge flag, and Apple's sub format1.4, 0.7 (true) and 0 percent
variationswith 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 statuson request
foundBythe app, developer, name or country that found the ad, and the countries asked100 percent
period, periodStart, periodEndApple's reporting window the ad was read in100 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:

EventFree planBronzeSilverGold
Ad (per 1,000 ads)USD 0.045USD 0.040USD 0.030USD 0.024
Ad variation set (per 1,000, only with Add variations)USD 1.00USD 1.00USD 0.90USD 0.80
Actor start (once per run)USD 0.005USD 0.005USD 0.005USD 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

FieldWhat it does
searchTermsApp 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.
appsApp Store app links or app ids (1641486558, id1641486558). Every ad of the app in your countries and period.
developersApp Store developer links or developer ids. Every ad of every app of the developer.
countriesISO codes (DE, de) or country names (Germany, Deutschland) of Apple's 25 countries (no Lithuania, no Malta). All 25 when empty.
periodLAST_90_DAYS, LAST_180_DAYS or LAST_YEAR. When left out, the shortest one that holds your dates (90 days without dates).
startDate, endDateKeep ads that ran on at least one day between them: YYYY-MM-DD, today, yesterday, or 30 days back.
placementssearchResults, searchTab, todayTab, productPage. All when empty.
formatsiconAd, iconAssetAd. Both when empty.
nameMatchexact (when left out) or startsWith: every app and developer whose name begins with your words as whole words.
nameTypesall (when left out), apps or developers.
includeVariationsRead 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.
maxAdsTotal cap, 1,000 when left out, up to 1,000,000.
maxAdsPerTargetCap per app, developer or browsed country.
memoryName, resetMemoryCross 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 ApifyClient
client = 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

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.