Query Apple's official EU DSA Ad Repository API for every App Store ad Apple served an app or developer, per country — creative assets, targeting flags, impression dates. Give an app/developer name or known App Store id. No login, no API key.
Real implementation: entity resolution (name search + direct id),
live country-code resolution, RSQL query builder, curl-cffi HTTP
transport with retry/backoff, per-target pagination, Pydantic
ActorInput/ResultRow, PPE charges, per-target fault isolation.
Live-confirmed and fixed two undocumented Apple wire-format
constraints found during implementation:
curl-cffi's params= dict URL-encodes values itself — passing
an already-percent-encoded ql string double-encodes it and the
API 400s. client.fetch_ads now takes the raw (unencoded) ql.
countryOrRegion=in=(...) is capped at 5 codes per query
("Number of countries greater than allowed limit"). scraper.py
now chunks country_codes into groups of 5 and merges results —
required for REQ-6's default (empty countryOrRegions → the
full ~25-code live EU list) to work at all.
tests/fixtures/input.qa.json and the input schema prefill now use
a high-volume advertiser (Temu, App Store id 1641486558) as the
entities target so cloud QA genuinely exercises pagination past
the 50-item page size (REQ-14), confirmed live (100 rows fetched).
0.0.1 — 2026-09-21
Scaffolded actor skeleton (.actor/ manifest, minimal boot-only
src/main.py, tests scaffold, promo.json). No real scraping logic
yet — see docs/specs/apple-ad-repository-scraper/tasks.md T02-T09.