Apple Ads Library Scraper - App Store Ads Transparency avatar

Apple Ads Library Scraper - App Store Ads Transparency

Pricing

from $3.00 / 1,000 ad scrapeds

Go to Apify Store
Apple Ads Library Scraper - App Store Ads Transparency

Apple Ads Library Scraper - App Store Ads Transparency

See every Apple Search Ads campaign on the App Store. Scrape Apple's Ad Repository by app or developer: creatives, placements, targeting, impression dates, locale variations & new-ad monitoring. The Apple side of your ads transparency stack.

Pricing

from $3.00 / 1,000 ad scrapeds

Rating

0.0

(0)

Developer

Scrape Sage

Scrape Sage

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

Apple Ads Library Scraper — App Store Ads, Advertisers & New-Ad Monitoring (Apple Search Ads Transparency)

See every ad any app runs on the App Store. This actor scrapes Apple's official Ad Repository — the transparency register of Apple-delivered App Store advertising in the EU — and turns it into clean, structured competitor intelligence: who advertises, in which countries, on which placements (search results, Search tab, Today tab), with which creatives and localized copy, targeting refinements, and exactly when each ad ran. Search by app or developer name, sweep whole countries, build directories of active Apple Search Ads advertisers — and flip on monitor mode to get only the new ads a competitor launches between runs.

No login, no API key, no browser — fast JSON extraction straight from Apple's own documented public API, with 99%+ reliability.

Why this Apple Ads Library scraper?

Google, Meta and TikTok ad-spy tools are everywhere — but Apple Search Ads is the blind spot: a $10B+/yr ad platform that decides who wins App Store search, and almost zero competitive-intel coverage. Every serious app publisher bids there; almost nobody can see what competitors run. This actor closes that gap and ships the richest dataset in the category:

DataTypical scrapersThis actor
App + developer identity (incl. legal name)partial✅ complete
Placement (search results / Search tab / Today tab)
Ad format & creative assets (full-res screenshots, video)
First & last impression dates + days active
Audience targeting flags (age / gender / location / customer type)
App Store metadata (icon, subtitle, category, description, IAP)
Per-language ad variations (localized name, subtitle, promo text, device creatives)✅ opt-in
Search by app or developer name (no numeric IDs needed)
Advertiser directory mode (who's actively buying Apple Search Ads)
Country browse (every ad running in a market)
Advertising restriction events (removed ads, suspended accounts + reasons)
Monitor mode — only new/changed ads per run

Use cases

  • Competitor Apple Search Ads intelligence — see exactly which of a competitor's apps advertise, in which EU markets, on which placements, and how long each ad has been running. daysActive + isRecentlyActive reveal their evergreen winners vs. abandoned tests.
  • ASO & creative research — pull the creative assets, localized subtitles and promotional texts competitors pair with their ads; includeAdVariations returns every language version with per-device screenshots — a ready-made swipe file for your next custom product page.
  • New-ad alerts — schedule a daily run with monitorMode on a competitor's developer name and get only their newly launched ads, straight to Slack/CRM via integrations.
  • Lead generationentitySearchQueries turns the register into a list of apps & developers actively spending on Apple Search Ads ("vpn", "casino", "fitness"…) with live ad counts — pre-qualified, budget-proven prospects for UA agencies, ASO tools and mobile-marketing sales.
  • Market landscape sweeps — country browse returns the full ad feed of any EU market (France alone: 130k+ ads/90 days) — category mix, seasonal pushes, who's scaling.
  • Policy & compliance research — the restrictions feed exposes which advertising Apple removed or suspended, why (ToS incompatibility, government order…), and in which countries.

How to use

  1. Sign up for Apify — the free plan is enough to try this actor.
  2. Open the Apple Ads Library Scraper, enter app/developer names (or App Store URLs), and click Start.
  3. Watch results stream into the dataset table.
  4. Export as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the Apify API.

Input

{
"searchQueries": ["Duolingo", "Spotify"],
"countries": ["DE", "France"],
"datePreset": "LAST_90_DAYS",
"includeAdVariations": true,
"maxResults": 100,
"monitorMode": false
}
  • searchQueries — app or developer names; each is resolved in the register (apps + developers) and all their ads are scraped.
  • appIds / developerIds — exact App Store IDs (the number in apps.apple.com/…/id123456789 URLs) for direct scraping.
  • entitySearchQueries — search the advertiser register instead: one record per matching app/developer with live adsCount + sample ads. Directory mode for lead lists.
  • startUrls — App Store app or developer URLs (or bare numeric IDs), auto-detected.
  • countries — EU country filter (ISO codes or names). Countries as the only input = browse those countries' entire ad feeds.
  • datePresetLAST_90_DAYS (default), LAST_180_DAYS, or LAST_YEAR impression window.
  • placements — keep only search-results / Search-tab / Today-tab ads.
  • includeAdVariations (default false) — fetch every ad's language variations (localized app name, subtitle, promotional text, per-device creatives) + all icon variations (one extra request per ad).
  • includeRestrictions — also emit Apple's advertising-restriction events; set it with no other input for the restrictions feed alone.
  • maxResults (default 100) — total record cap; 0 = no limit (explicit opt-in).
  • monitorMode / monitorStoreName — cross-run new-ad detection (see below).

Output

One record per ad per country (type: "ad"), plus optional directory records (type: "entity") and restriction events (type: "restriction"):

{
"type": "ad",
"adId": "391259fb1eaa579411f7b59d52b5bcdc",
"appId": 570060128,
"appName": "Duolingo: Sprachen und Schach",
"developerId": 570060151,
"developerName": "Duolingo",
"legalName": "Duolingo, Inc",
"placement": "APPSTORE_SEARCH_RESULTS",
"placementLabel": "App Store search results",
"format": "Icon + Asset Ad",
"countryOrRegion": "DE",
"countryName": "Germany",
"targeting": { "ageTarget": false, "genderTarget": false, "locationTarget": false, "customerTypeTarget": false },
"targetingUsed": false,
"firstImpressionDate": "2026-06-25",
"lastImpressionDate": "2026-06-27",
"daysActive": 3,
"isRecentlyActive": true,
"defaultLanguage": "German",
"appIconUrl": "https://is5-ssl.mzstatic.com/image/thumb/…/1024x1024.png",
"appSubtitle": "Englisch, Schach, Mathe, Musik",
"appCategory": "Education",
"inAppPurchases": true,
"editorialBadge": true,
"promotionalText": "Checkmate! You can now learn Chess on Duolingo!…",
"appDescription": "Lerne spielend leicht eine neue Sprache…",
"adAssets": [ { "assetType": "image", "url": "https://…/iOS_6.5_01.jpg/2688x1242.jpg", "order": 1, "width": 1242, "height": 2688, "orientation": "PORTRAIT" } ],
"assetCount": 3,
"hasVideoAsset": false,
"localeVariations": [ { "languageTag": "en-GB", "appName": "Duolingo: Language & Chess", "promotionalText": "…", "deviceAssets": [] } ],
"adLanguages": ["English (United Kingdom)", "German", "Spanish (Spain)"],
"appStoreUrl": "https://apps.apple.com/app/id570060128",
"developerAppStoreUrl": "https://apps.apple.com/developer/id570060151",
"dataWindow": { "start": "2025-06-27", "end": "2026-06-27" },
"queryTotalCount": 19,
"discoverySource": "q:Duolingo→APP:Duolingo: Language Lessons",
"platform": "apple",
"adLibrary": "Apple Ad Repository (EU — DSA transparency)",
"scrapedAt": "2026-07-02T12:00:00.000Z"
}

What to expect (field coverage)

  • App/developer identity, placement, format, country, impression dates, language, icon, subtitle, category, description, creative assets — populated on ~100% of ads.
  • subFormat — Apple populates it only when a new ad-format variation is introduced; usually null (that's the source, not a scraping gap).
  • promotionalText — only apps that set promotional text have it; with includeAdVariations the actor also recovers it from the ad's language variations.
  • localeVariations / iconVariations / adLanguages — filled when includeAdVariations is on.
  • Data freshness: Apple publishes the repository with a ~7-day delay (each record carries its exact dataWindow).

Monitor mode — only new ads, run after run

Set monitorMode: true and every scraped ad's fingerprint is remembered in a named key-value store. The next run outputs only ads that are new or changed, each tagged monitorStatus: "new" or "updated". Pair it with an Apify Schedule (they complement each other — the Schedule triggers runs, monitor mode dedupes the output):

  1. Input: { "searchQueries": ["Duolingo"], "monitorMode": true, "maxResults": 0 }
  2. Schedule: daily.
  3. Add a webhook or Zapier/Make step → new competitor ads land in Slack, email, or your CRM.

Running several monitors? Give each schedule its own monitorStoreName.

Tip: monitor app/developer-scoped inputs with maxResults: 0 so the full ad set is compared every run. A country browse capped far below its total samples a different slice each run — those ads aren't really "new", you just hadn't seen them yet.

Automate & schedule

Run this actor on autopilot and pull results into your own stack:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });
const run = await client.actor('scrapesage/apple-ads-library-scraper').call({
searchQueries: ['Spotify'],
countries: ['Germany', 'France'],
includeAdVariations: true,
maxResults: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} App Store ads`);

Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

  • Make — multi-step automation scenarios.
  • Zapier — push new competitor ads straight into your CRM or ad-ops board.
  • Slack — get pinged when a monitored advertiser launches new ads.
  • Google Drive / Sheets — auto-export every run to a spreadsheet.
  • Airbyte — pipe results into your data warehouse.
  • GitHub — trigger runs from commits or releases.

Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. You can call this actor from Claude, ChatGPT, or any agent framework through the Apify MCP server — ask your assistant to "pull every App Store ad Duolingo runs in Germany and summarize their creative strategy" and let it run this scraper for you.

Agent-ready: autonomous payments (x402 & Skyfire)

This actor is agent-ready — AI agents can discover it, run it, and pay for it autonomously, with no Apify account and no human in the loop. It uses pay-per-event pricing and limited permissions, so it qualifies for Apify's agentic-payment standards:

  • x402 — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the Apify MCP server — no account, no API key.
  • Skyfire — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

More scrapers from scrapesage

Build a complete ads-transparency intelligence stack — every major ad platform, one dataset shape:

And go deeper on the app economy:

Tips

  • Who's bidding in my category? entitySearchQueries: ["fitness"] → every advertised app/developer with "fitness" in the name, with live ad counts. Feed the interesting IDs back into appIds/developerIds for full pulls.
  • Competitor deep dive: search the developer name (not the app) — you get ads for all their apps at once, then includeAdVariations for the full creative picture.
  • Cheap daily monitors: searchQueries + monitorMode + a daily Schedule is the highest-signal, lowest-cost setup — you pay only for genuinely new ads.
  • Deep country sweeps: the repository stops paginating around ~1,100–1,300 records per query. Browsing whole countries samples the top of the feed; for exhaustive coverage go app-by-app or developer-by-developer.
  • Longer windows find more: an app that paused ads last month won't show in LAST_90_DAYS — flip to LAST_YEAR for the full history (dates included on every record).

FAQ

Where does the data come from? From Apple's official Ad Repository (adrepository.apple.com), the transparency register Apple publishes under the EU Digital Services Act, using Apple's own documented public API. No login, no private data.

Why EU only? Apple's repository publishes Apple-delivered App Store ads with impressions in the 25 covered EU countries — that's what the DSA mandates. Global advertisers (Duolingo, Spotify, King, VPN apps…) all appear because they advertise in Europe; what you won't find is an ad shown only outside the EU.

Which ads are included? Apple-delivered advertising on the App Store: search-results ads (classic Apple Search Ads), Search-tab and Today-tab placements — the formats Apple sells through Apple Ads. Each record is one ad in one country.

Does it show ad spend or impression counts? Apple publishes impression date ranges (first/last impression, from which we derive daysActive and isRecentlyActive) and targeting-refinement flags — not spend or raw impression counts (no platform's DSA library publishes spend for non-political ads).

How fresh is the data? Apple publishes with a ~7-day delay; every record carries its exact dataWindow. Data reaches back up to one year (datePreset: "LAST_YEAR").

Can I monitor a competitor automatically? Yes — that's the flagship use case. monitorMode: true + an Apify Schedule + a webhook = new-ad alerts. Monitor mode stores fingerprints in a key-value store and outputs only new/changed ads each run.

Is scraping the Apple Ad Repository legal? The repository is a public transparency register that exists precisely so ads can be inspected, and Apple documents its API for programmatic use. The actor collects no personal data. You're responsible for complying with applicable laws and terms in your use of the data.

A field is null — why? subFormat is only set by Apple for new format variations; promotionalText only exists when the app sets one; variation fields fill only with includeAdVariations on. Fields are null only when the source doesn't expose the data, never because the scraper skipped it.

Need help?

Open an issue on the actor's Issues tab, or visit the Apify help center. Feature requests are welcome — this actor is actively maintained.