YouTube Ad Creative & Advertiser Tracker
Find the video and image ad creatives an advertiser is running on YouTube, discovered by keyword, advertiser name, or advertiser ID, with country, format, and first/last-shown dates.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
advertisers | array | optional | Advertiser names or AR-IDs to scrape YouTube ads for (e.g. 'Nike, Inc.', 'AR16735076323512287233'). Leave empty to use searchTerms. |
searchTerms | array | optional | Keywords or domain names to discover advertisers, then scrape their YouTube ads (e.g. 'electric car', 'nike.com'). |
countries | array | optional | Country codes to filter ads by (ISO 3166-1 alpha-2). |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
advertisers | array | optional | Advertiser names or AR-IDs to scrape YouTube ads for (e.g. 'Nike, Inc.', 'AR16735076323512287233'). Leave empty to use searchTerms. |
searchTerms | array | optional | Keywords or domain names to discover advertisers, then scrape their YouTube ads (e.g. 'electric car', 'nike.com'). |
countries | array | optional | Country codes to filter ads by (ISO 3166-1 alpha-2). |
dateFrom | string | optional | Only return ads first shown on or after this date (YYYY-MM-DD). |
dateTo | string | optional | Only return ads last shown on or before this date (YYYY-MM-DD). |
includeVideoDetails | boolean | optional | Fetch the ad detail page for each ad to resolve the video URL and format (slower, but gives the actual video asset for video ads). |
maxAdvertisersPerTerm | integer | optional | Maximum advertisers to scrape per keyword (when searchTerms is used). |
maxItems | integer | optional | Hard cap on total ad records returned (1-5000). |
maxConcurrency | integer | optional | Advertisers scraped in parallel. Higher is faster but increases rate-limit risk. |
outputFormat | string | optional | Dataset always receives JSON records. Additionally export results as CSV, Excel, or HTML in the key-value store (OUTPUT.csv / OUTPUT.xlsx / OUTPUT.html). |
proxyConfiguration | object | optional | Optional proxy. For moderate traffic no proxy is needed. Enable Apify proxy for high-volume scraping. |
Download the published input schema
View complete JSON
{
"description": "Scrape YouTube ads from Google's Ads Transparency Center. Search by advertiser, keyword, or country, and export the results.",
"properties": {
"advertisers": {
"description": "Advertiser names or AR-IDs to scrape YouTube ads for (e.g. 'Nike, Inc.', 'AR16735076323512287233'). Leave empty to use searchTerms.",
"editor": "stringList",
"example": [
"Nike, Inc.",
"Samsung Electronics America"
],
"items": {
"type": "string"
},
"title": "Advertisers",
"type": "array"
},
"countries": {
"description": "Country codes to filter ads by (ISO 3166-1 alpha-2).",
"editor": "select",
"items": {
"enum": [
"AD",
"AE",
"AG",
"AI",
"AL",
"AM",
"AO",
"AQ",
"AR",
"AS",
"AT",
"AU",
"AW",
"AZ",
"BA",
"BB",
"BD",
"BE",
"BF",
"BG",
"BH",
"BI",
"BJ",
"BM",
"BN",
"BO",
"BQ",
"BR",
"BS",
"BT",
"BV",
"BW",
"BY",
"BZ",
"CA",
"CC",
"CD",
"CF",
"CG",
"CH",
"CI",
"CK",
"CL",
"CM",
"CN",
"CO",
"CR",
"CV",
"CW",
"CX",
"CY",
"CZ",
"DE",
"DJ",
"DK",
"DM",
"DO",
"DZ",
"EC",
"EE",
"EG",
"EH",
"ER",
"ES",
"ET",
"FI",
"FJ",
"FK",
"FM",
"FO",
"FR",
"GA",
"GB",
"GD",
"GE",
"GF",
"GG",
"GH",
"GI",
"GL",
"GM",
"GN",
"GP",
"GQ",
"GR",
"GS",
"GT",
"GU",
"GW",
"GY",
"HK",
"HM",
"HN",
"HR",
"HT",
"HU",
"ID",
"IE",
"IL",
"IM",
"IN",
"IO",
"IQ",
"IS",
"IT",
"JE",
"JM",
"JO",
"JP",
"KE",
"KG",
"KH",
"KI",
"KM",
"KN",
"KR",
"KW",
"KY",
"KZ",
"LA",
"LB",
"LC",
"LI",
"LK",
"LR",
"LS",
"LT",
"LU",
"LV",
"LY",
"MA",
"MC",
"MD",
"ME",
"MG",
"MH",
"MK",
"ML",
"MM",
"MN",
"MO",
"MP",
"MQ",
"MR",
"MS",
"MT",
"MU",
"MV",
"MW",
"MX",
"MY",
"MZ",
"NA",
"NC",
"NE",
"NF",
"NG",
"NI",
"NL",
"NO",
"NP",
"NR",
"NU",
"NZ",
"OM",
"PA",
"PE",
"PF",
"PG",
"PH",
"PK",
"PL",
"PM",
"PN",
"PR",
"PS",
"PT",
"PW",
"PY",
"QA",
"RE",
"RO",
"RW",
"SA",
"SB",
"SC",
"SE",
"SG",
"SH",
"SI",
"SJ",
"SK",
"SL",
"SM",
"SN",
"SO",
"SR",
"ST",
"SV",
"SX",
"SZ",
"TC",
"TD",
"TF",
"TG",
"TH",
"TJ",
"TK",
"TL",
"TM",
"TN",
"TO",
"TR",
"TT",
"TV",
"TW",
"TZ",
"UA",
"UG",
"UM",
"US",
"UY",
"UZ",
"VA",
"VC",
"VE",
"VG",
"VI",
"VN",
"VU",
"WF",
"WS",
"YE",
"YT",
"ZA",
"ZM",
"ZW"
],
"enumTitles": [
"Andorra",
"United Arab Emirates",
"Antigua and Barbuda",
"Anguilla",
"Albania",
"Armenia",
"Angola",
"Antarctica",
"Argentina",
"American Samoa",
"Austria",
"Australia",
"Aruba",
"Azerbaijan",
"Bosnia and Herzegovina",
"Barbados",
"Bangladesh",
"Belgium",
"Burkina Faso",
"Bulgaria",
"Bahrain",
"Burundi",
"Benin",
"Bermuda",
"Brunei Darussalam",
"Bolivia, Plurinational State of",
"Bonaire, Sint Eustatius and Saba",
"Brazil",
"Bahamas",
"Bhutan",
"Bouvet Island",
"Botswana",
"Belarus",
"Belize",
"Canada",
"Cocos (Keeling) Islands",
"Congo, The Democratic Republic of the",
"Central African Republic",
"Congo",
"Switzerland",
"Côte d'Ivoire",
"Cook Islands",
"Chile",
"Cameroon",
"China",
"Colombia",
"Costa Rica",
"Cabo Verde",
"Curaçao",
"Christmas Island",
"Cyprus",
"Czechia",
"Germany",
"Djibouti",
"Denmark",
"Dominica",
"Dominican Republic",
"Algeria",
"Ecuador",
"Estonia",
"Egypt",
"Western Sahara",
"Eritrea",
"Spain",
"Ethiopia",
"Finland",
"Fiji",
"Falkland Islands (Malvinas)",
"Micronesia, Federated States of",
"Faroe Islands",
"France",
"Gabon",
"United Kingdom",
"Grenada",
"Georgia",
"French Guiana",
"Guernsey",
"Ghana",
"Gibraltar",
"Greenland",
"Gambia",
"Guinea",
"Guadeloupe",
"Equatorial Guinea",
"Greece",
"South Georgia and the South Sandwich Islands",
"Guatemala",
"Guam",
"Guinea-Bissau",
"Guyana",
"Hong Kong",
"Heard Island and McDonald Islands",
"Honduras",
"Croatia",
"Haiti",
"Hungary",
"Indonesia",
"Ireland",
"Israel",
"Isle of Man",
"India",
"British Indian Ocean Territory",
"Iraq",
"Iceland",
"Italy",
"Jersey",
"Jamaica",
"Jordan",
"Japan",
"Kenya",
"Kyrgyzstan",
"Cambodia",
"Kiribati",
"Comoros",
"Saint Kitts and Nevis",
"Korea, Republic of",
"Kuwait",
"Cayman Islands",
"Kazakhstan",
"Lao People's Democratic Republic",
"Lebanon",
"Saint Lucia",
"Liechtenstein",
"Sri Lanka",
"Liberia",
"Lesotho",
"Lithuania",
"Luxembourg",
"Latvia",
"Libya",
"Morocco",
"Monaco",
"Moldova, Republic of",
"Montenegro",
"Madagascar",
"Marshall Islands",
"North Macedonia",
"Mali",
"Myanmar",
"Mongolia",
"Macao",
"Northern Mariana Islands",
"Martinique",
"Mauritania",
"Montserrat",
"Malta",
"Mauritius",
"Maldives",
"Malawi",
"Mexico",
"Malaysia",
"Mozambique",
"Namibia",
"New Caledonia",
"Niger",
"Norfolk Island",
"Nigeria",
"Nicaragua",
"Netherlands",
"Norway",
"Nepal",
"Nauru",
"Niue",
"New Zealand",
"Oman",
"Panama",
"Peru",
"French Polynesia",
"Papua New Guinea",
"Philippines",
"Pakistan",
"Poland",
"Saint Pierre and Miquelon",
"Pitcairn",
"Puerto Rico",
"Palestine, State of",
"Portugal",
"Palau",
"Paraguay",
"Qatar",
"Réunion",
"Romania",
"Rwanda",
"Saudi Arabia",
"Solomon Islands",
"Seychelles",
"Sweden",
"Singapore",
"Saint Helena, Ascension and Tristan da Cunha",
"Slovenia",
"Svalbard and Jan Mayen",
"Slovakia",
"Sierra Leone",
"San Marino",
"Senegal",
"Somalia",
"Suriname",
"Sao Tome and Principe",
"El Salvador",
"Sint Maarten (Dutch part)",
"Eswatini",
"Turks and Caicos Islands",
"Chad",
"French Southern Territories",
"Togo",
"Thailand",
"Tajikistan",
"Tokelau",
"Timor-Leste",
"Turkmenistan",
"Tunisia",
"Tonga",
"Türkiye",
"Trinidad and Tobago",
"Tuvalu",
"Taiwan, Province of China",
"Tanzania, United Republic of",
"Ukraine",
"Uganda",
"United States Minor Outlying Islands",
"United States",
"Uruguay",
"Uzbekistan",
"Holy See (Vatican City State)",
"Saint Vincent and the Grenadines",
"Venezuela, Bolivarian Republic of",
"Virgin Islands, British",
"Virgin Islands, U.S.",
"Viet Nam",
"Vanuatu",
"Wallis and Futuna",
"Samoa",
"Yemen",
"Mayotte",
"South Africa",
"Zambia",
"Zimbabwe"
],
"type": "string"
},
"prefill": [
"US"
],
"title": "Countries",
"type": "array"
},
"dateFrom": {
"description": "Only return ads first shown on or after this date (YYYY-MM-DD).",
"editor": "datepicker",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"title": "First shown on/after (YYYY-MM-DD)",
"type": "string"
},
"dateTo": {
"description": "Only return ads last shown on or before this date (YYYY-MM-DD).",
"editor": "datepicker",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"title": "First shown on/before (YYYY-MM-DD)",
"type": "string"
},
"includeVideoDetails": {
"default": false,
"description": "Fetch the ad detail page for each ad to resolve the video URL and format (slower, but gives the actual video asset for video ads).",
"prefill": false,
"title": "Include video details",
"type": "boolean"
},
"maxAdvertisersPerTerm": {
"default": 5,
"description": "Maximum advertisers to scrape per keyword (when searchTerms is used).",
"maximum": 50,
"minimum": 1,
"prefill": 5,
"title": "Max advertisers per search term",
"type": "integer"
},
"maxConcurrency": {
"default": 2,
"description": "Advertisers scraped in parallel. Higher is faster but increases rate-limit risk.",
"maximum": 5,
"minimum": 1,
"prefill": 2,
"title": "Max concurrency",
"type": "integer"
},
"maxItems": {
"default": 100,
"description": "Hard cap on total ad records returned (1-5000).",
"maximum": 5000,
"minimum": 1,
"prefill": 50,
"title": "Max items",
"type": "integer"
},
"outputFormat": {
"default": "json",
"description": "Dataset always receives JSON records. Additionally export results as CSV, Excel, or HTML in the key-value store (OUTPUT.csv / OUTPUT.xlsx / OUTPUT.html).",
"editor": "select",
"enum": [
"json",
"csv",
"excel",
"html"
],
"enumTitles": [
"JSON (dataset only)",
"CSV (OUTPUT.csv)",
"Excel (OUTPUT.xlsx)",
"HTML (OUTPUT.html)"
],
"prefill": "json",
"title": "Output format",
"type": "string"
},
"proxyConfiguration": {
"description": "Optional proxy. For moderate traffic no proxy is needed. Enable Apify proxy for high-volume scraping.",
"editor": "proxy",
"title": "Proxy Configuration",
"type": "object"
},
"searchTerms": {
"description": "Keywords or domain names to discover advertisers, then scrape their YouTube ads (e.g. 'electric car', 'nike.com').",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [
"electric car"
],
"title": "Search Terms (keywords)",
"type": "array"
}
},
"schemaVersion": 1,
"title": "YouTube Ads Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
ads | string | optional | Dataset containing all scraped YouTube ad creative records. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "YouTube ad creative records with advertiser, country, format, thumbnail, and first/last-shown dates, sourced from the Google Ads Transparency Center.",
"properties": {
"ads": {
"description": "Dataset containing all scraped YouTube ad creative records.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "YouTube ad creatives",
"type": "string"
}
},
"title": "YouTube Ad Creative & Advertiser Tracker Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"fields": {
"properties": {
"adCount": {
"description": "Advertiser total ad count",
"type": [
"integer",
"null"
]
},
"adId": {
"description": "Google creative ID (CR...)",
"type": [
"string",
"null"
]
},
"advertiserId": {
"description": "Google advertiser ID (AR...)",
"type": [
"string",
"null"
]
},
"advertiserName": {
"description": "Advertiser display name",
"type": [
"string",
"null"
]
},
"countryCode": {
"description": "Advertiser country (ISO-2)",
"type": [
"string",
"null"
]
},
"firstShown": {
"description": "First shown date (ISO 8601)",
"type": [
"string",
"null"
]
},
"format": {
"description": "Ad format: VIDEO / IMAGE / TEXT",
"type": [
"string",
"null"
]
},
"imageHeight": {
"description": "Media height in pixels",
"type": [
"integer",
"null"
]
},
"imageUrl": {
"description": "Ad thumbnail / image URL",
"type": [
"string",
"null"
]
},
"imageWidth": {
"description": "Media width in pixels",
"type": [
"integer",
"null"
]
},
"lastShown": {
"description": "Last shown date (ISO 8601)",
"type": [
"string",
"null"
]
},
"mediaType": {
"description": "image / video / text / unknown",
"type": [
"string",
"null"
]
},
"scrapedAt": {
"description": "ISO 8601 scrape timestamp",
"type": [
"string",
"null"
]
},
"searchTerm": {
"description": "Keyword that discovered this ad (search mode)",
"type": [
"string",
"null"
]
},
"sourceUrl": {
"description": "Ads Transparency Center detail URL",
"type": [
"string",
"null"
]
},
"type": {
"description": "ad or advertiser",
"type": [
"string",
"null"
]
},
"videoUrl": {
"description": "Resolved video URL (video ads, when includeVideoDetails is on)",
"type": [
"string",
"null"
]
}
},
"type": "object"
},
"title": "YouTube Ads",
"views": {
"overview": {
"display": {
"component": "table",
"properties": {
"advertiserName": {
"format": "text",
"label": "Advertiser"
},
"countryCode": {
"format": "text",
"label": "Country"
},
"firstShown": {
"format": "text",
"label": "First shown"
},
"format": {
"format": "text",
"label": "Format"
},
"imageUrl": {
"format": "image",
"label": "Media"
},
"lastShown": {
"format": "text",
"label": "Last shown"
},
"videoUrl": {
"format": "link",
"label": "Video"
}
}
},
"title": "YouTube Ads Overview",
"transformation": {
"fields": [
"advertiserName",
"countryCode",
"format",
"firstShown",
"lastShown",
"imageUrl",
"videoUrl"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
YouTube Ad Creative & Advertiser Tracker
Pull the ad creatives a brand is actually running on YouTube, straight from Google's public Ads Transparency Center. Hand it a keyword, an advertiser name, or an advertiser AR-ID and get back every matching ad creative with its thumbnail, format, country, and the dates it was first and last shown.
What this actor does
- Two ways in: pass advertiser names/AR-IDs directly, or give keywords and let the actor discover matching advertisers first
- YouTube-scoped: every creative returned was served on YouTube, not Google's wider display network
- Country and date filters: narrow by ISO-2 country code and by first-shown date window
- Multiple export formats: dataset JSON always, plus optional CSV, Excel, or HTML written to the key-value store
- Empty fields are omitted — a record only carries the values Google actually returned for that creative
Output per ad creative
adId— the creative's unique ID (e.g.CR09196456782480801793)advertiserId— the advertiser's AR-IDadvertiserName— advertiser display namecountryCode— ISO-2 country this creative was matched under (omitted when advertisers were passed directly by AR-ID)format—VIDEOorIMAGEmediaType—videoorimageimageUrl,imageWidth,imageHeight— the creative's thumbnail/preview image and its dimensionsvideoUrl— resolved playable video URL, only present whenincludeVideoDetailsis enabled and Google exposes itfirstShown,lastShown— timestamps the creative was first and most recently observed runningadCount— total creative count Google reports for the advertiser at query timesearchTerm— the keyword that surfaced this advertiser (present only for keyword-discovered results)sourceUrl— the Ads Transparency Center page for this exact creativescrapedAt— when the actor fetched the record
When no ad creatives match the input at all, the dataset instead gets a single status row (recordType: "status", status: "no_ads_found") echoing back the searchTerms/countries/dateFrom/dateTo that were tried, so an empty dataset always comes with an explanation.
Input
| Field | Type | Default | Description |
|---|---|---|---|
advertisers |
array | — | Advertiser names or AR-IDs to pull ads for directly (e.g. Nike, Inc., AR16735076323512287233). |
searchTerms |
array | – | Keywords used to discover advertisers before pulling their ads. |
countries |
array | – | ISO-2 country codes to match advertisers against. Leave empty for all countries. |
dateFrom |
string | — | Keep only creatives first shown on or after this YYYY-MM-DD date. |
dateTo |
string | — | Keep only creatives first shown on or before this YYYY-MM-DD date. |
includeVideoDetails |
boolean | false |
Also fetch each creative's detail page to try to resolve a playable video URL. |
maxAdvertisersPerTerm |
integer | 5 |
Advertisers to pull per keyword in searchTerms (1–50). |
maxItems |
integer | 100 |
Hard cap on total ad creative records returned (1–5000). |
maxConcurrency |
integer | 2 |
Advertisers processed in parallel (1–5). |
outputFormat |
string | json |
Also export to the key-value store as OUTPUT.csv, OUTPUT.xlsx, or OUTPUT.html. |
proxyConfiguration |
object | — | Optional Apify proxy for higher-volume runs. |
At least one of advertisers or searchTerms is required.
Example: discover advertisers by keyword
{
"searchTerms": ["electric car"],
"countries": ["US"],
"maxAdvertisersPerTerm": 5,
"maxItems": 50
}
Example: pull a known advertiser's creatives directly
{
"advertisers": ["AR16735076323512287233"],
"countries": ["US", "GB"],
"maxItems": 40
}
Example: narrow window with resolved video URLs
{
"searchTerms": ["nike"],
"dateFrom": "2026-01-01",
"dateTo": "2026-03-31",
"includeVideoDetails": true,
"outputFormat": "csv"
}
Use cases
- Competitive ad monitoring — see which creatives a rival brand is currently running on YouTube
- Creative swipe files — collect thumbnails and formats from an industry to spot creative trends
- Flight tracking — watch
firstShown/lastShownto know when a competitor's campaign started or stopped - Agency reporting — export a client's or competitor's ad library to CSV/Excel for a deck
- Market scans — run a keyword across multiple countries to see who is advertising where
FAQ
Where does this data come from? Google's own public Ads Transparency Center, filtered to creatives shown on YouTube — the same tool anyone can browse at adstransparency.google.com.
Do I need an API key, login, or cookies? No. The Transparency Center is public and the actor reads it without any authentication.
Why is there no YouTube video ID or embeddable video for most ads?
Google's Transparency Center does not publish the underlying YouTube video ID for most creatives, only a thumbnail and the ad's detail page. Enabling includeVideoDetails resolves a playable video URL when Google's detail page exposes one.
Why is countryCode missing on some records?
It's only populated when an advertiser was found through keyword search. When you pass an advertiser AR-ID directly, Google's API doesn't expose that advertiser's country, so the field is left out.
How far back does the data go? Google's Transparency Center indexes ads from September 2023 onward, and it isn't a complete archive — older or very low-volume creatives may not appear.
Is there a limit on how many creatives one advertiser can return?
Yes, Google's own library caps each advertiser's results at roughly 40 creatives per query; the actor returns the most recent ones and deduplicates by adId across repeated queries.
What's the difference between the advertisers and searchTerms inputs?
advertisers goes straight to a known advertiser's ad library. searchTerms runs a keyword search first to find matching advertisers, then pulls each one's ads — useful when you don't already know the advertiser's exact name or AR-ID.
Is this affiliated with Google or YouTube? No. This is an independent actor that reads Google's publicly available Ads Transparency Center data.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build 5d8QxabyrsPwre1lD. Documentation is regenerated from the default published build; private drafts are not included.