Google Ads Transparency
Google Ads Transparency Creative API
One Google ad creative in full, and the only endpoint carrying its history: every size variation of the asset, the impression bucket it landed in, the per-region breakdown with first and last shown dates and a per-surface impression split inside each region, Google's own category label, and the funder disclosure on political ads. Keyed by the advertiser_id + creative_id PAIR, both of which come off a search row. Costs 1 credit.
Authorizations
AuthorizationstringheaderrequiredBearer authentication header of the form Bearer <token>, where <token> is your Scavio API key (e.g. Bearer sk_live_your_key).
Body
application/jsonadvertiser_idstringrequiredGoogle advertiser id, 3-40 characters, as returned by /api/v1/googleads/advertisers and on every search row. Its shape is checked before any request goes out, so a typo costs nothing — but a well-formed id that does not own the creative is a BILLED 404.
Example: AR18378488041124659201
creative_idstringrequiredGoogle creative id, 3-40 characters, as returned on every search row. It must belong to the advertiser_id sent with it: the lookup is keyed by the pair, and a mismatched pair is a 404. Always carry both ids together off the search row rather than reassembling them.
Example: CR04596254956847104001
Request
from scavio import ScavioClient
client = ScavioClient(api_key="sk_live_your_key")
# The two ids travel together off a search row - the lookup is keyed by the pair.
ads = client.google_ads.search(domain="nike.com", region="DE", limit=100)
row = ads["data"]["creatives"][0]
detail = client.google_ads.creative(row["advertiser_id"], row["creative_id"])
# Impressions are EEA-only. An EEA region row carries them; a US row will not.
for region in detail["data"]["regions"]:
print(region["region_code"], region["impressions_min"], region["impressions_max"])Response