Same code as Google Ads Transparency Scraper 0.1.15.
- README: OCR takes 0.6–7.5 s per picture, depending on how busy the platform's server is (it said about 3–4 s; measured in four runs of Google Ads Transparency Scraper on 2026-09-27, same code and memory). No code change.
Same code as Google Ads Transparency Scraper 0.1.14.
- Minimum memory is 512 MB (was 256 MB). With OCR, memory use peaked at about 240–340 MB, and a run at 256 MB was stopped for lack of memory. The API's Standby runs use 1 GB and are not affected.
- The input form of a batch run starts at 10 ads per query (
maxAdsPerQuery). Requests to the API are not affected.
Same code as Google Ads Transparency Scraper 0.1.13.
- Text of image-only ads (OCR). Google keeps many ads only as a picture. The API now reads the text in the picture (Tesseract; English, German, French, Spanish, Portuguese, Italian, Dutch, Polish, Turkish; the models ship with the Actor). Such items get the text in
adTexts, adCopyStatus: "ocr" and ocrConfidence (0–100); pictures that hold no ad get "image-placeholder". On by default; turn it off with ocr=false. Text read this way counts as ad copy.
Same code as Google Ads Transparency Scraper 0.1.9 (fixes from the pre-publication checks). For this API:
- Invalid parameters are answered with HTTP 400 and the reason instead of being dropped: an unknown
region, adFormat, platform or datePreset, a malformed or reversed date, a non-numeric maxAds / maxAdvertisers, or a blank query. Before, an unknown filter returned unfiltered ads, and a non-numeric maxAds paged through the whole account and returned nothing.
- Dates:
dateFrom / dateTo sent without datePreset (or with any) are applied as a custom window. A fixed period such as last30 takes precedence, and the response's dateNote says so.
- Brand names: when no advertiser carries the exact name,
report.note says that the closest match was used (Google's name lookup is accent-sensitive).
- Shopping items have a
price field, and merchantName no longer holds a price or a condition label (34 of 111 values in the scraper's test runs).
- Creative URLs return
format, the advertiser name and the YouTube ID; the video player's notice is no longer reported as ad text.
- Not ad content anymore: Material icons and Google Maps pins in
imageUrl, and invisible direction marks around text lines. Previews refused with HTTP 429 get a second proxy attempt.
First version: the Google Ads Transparency Scraper's logic as a real-time HTTP API (Standby mode).
GET /ads — ads of a domain, brand, advertiser ID or Transparency Center URL, up to 100 per request, with the same fields as the batch Actor's dataset (ad copy, landing page, YouTube ID, per-country impressions for the EEA and Turkey, platforms, targeting, topic, advertiser legal name).
GET /advertisers — advertiser lookup by name, best match first. Not billed.
- Same pay-per-event events as the batch Actor:
ad, ad-detail, ad-copy.
- OpenAPI 3 description of the endpoints.
- Brand-name queries pick among the brand's advertiser entities by the requested region, then by ad volume: "Nike" → Nike, Inc., "Decathlon" in France → Decathlon France SASU (the Decathlon case was measured on the platform; both are covered by tests).
- Ad previews are read in all three shapes seen on the platform (HTML, renderer config with app fields, video without HTML); previews refused with HTTP 429 are retried and then fetched through a proxy.
- On the proxy a new session is used whenever Google refuses the current one; eight ads are processed at a time. Google Maps preview buttons are not reported as ad copy.
- Targeting:
topicsOfInterest and customerLists were swapped in private test builds 0.1.1–0.1.5; fixed in 0.1.6 and cross-checked against Google's BigQuery dataset. Previews Google cannot draw are reported as adCopyStatus: "preview-unavailable".