Search Ad Creatives
curl --request GET \
--url https://scrapebadger.com/v1/google/ads/search \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://scrapebadger.com/v1/google/ads/search"
headers = {"X-API-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<x-api-key>'}};
fetch('https://scrapebadger.com/v1/google/ads/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/google/ads/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/google/ads/search"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/google/ads/search")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/google/ads/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"region": "<string>",
"total_results": 123,
"returned_results": 123,
"next_page_token": "<string>",
"filters_applied": {},
"creatives": [
{
"creative_id": "<string>",
"advertiser_id": "<string>",
"advertiser_name": "<string>",
"target_domain": "<string>",
"format": "<string>",
"media_url": "<string>",
"preview_html": "<string>",
"first_shown_utc": 123,
"first_shown_at": "<string>",
"last_shown_utc": 123,
"last_shown_at": "<string>",
"days_shown": 123,
"details_link": "<string>"
}
]
}Ads Transparency
Search Ad Creatives
Search Google Ads Transparency Center creatives by advertiser id or verified domain, with format and date-window filtering.
GET
/
v1
/
google
/
ads
/
search
Search Ad Creatives
curl --request GET \
--url https://scrapebadger.com/v1/google/ads/search \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://scrapebadger.com/v1/google/ads/search"
headers = {"X-API-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<x-api-key>'}};
fetch('https://scrapebadger.com/v1/google/ads/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/google/ads/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/google/ads/search"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/google/ads/search")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/google/ads/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"region": "<string>",
"total_results": 123,
"returned_results": 123,
"next_page_token": "<string>",
"filters_applied": {},
"creatives": [
{
"creative_id": "<string>",
"advertiser_id": "<string>",
"advertiser_name": "<string>",
"target_domain": "<string>",
"format": "<string>",
"media_url": "<string>",
"preview_html": "<string>",
"first_shown_utc": 123,
"first_shown_at": "<string>",
"last_shown_utc": 123,
"last_shown_at": "<string>",
"days_shown": 123,
"details_link": "<string>"
}
]
}Search creatives by advertiser or domain. One of
advertiser_id or query is
required.
Credits: 10
Free-text
query is domain-based — it matches verified advertiser domains
like nike.com, not brand names. For a brand name, resolve it first with
/ads/advertisers
and pass the resulting advertiser_id.Authorization
string
required
Your ScrapeBadger API key.
Query Parameters
string
Advertiser ID as shown in the Transparency Center URL, e.g.
AR01614014350098432001. Required unless query is given.string
Free text — a verified advertiser domain such as
tesla.com. Required unless
advertiser_id is given.string
default:"US"
ISO 3166-1 alpha-2 region the ad was served in, or
anywhere for no region
filter.string
Surface the ad ran on:
SEARCH, MAPS, PLAY, SHOPPING or YOUTUBE.
Validated but not applied — see filters_applied.platform.string
Creative format:
TEXT, IMAGE or VIDEO. Applied over the returned page.string
YYYY-MM-DD. Keeps creatives still running on or after this date.string
YYYY-MM-DD. Keeps creatives first shown on or before this date.boolean
default:"false"
Restrict to political ads. Validated but not applied — see
filters_applied.political.integer
default:"40"
Results per page,
1–100.string
next_page_token from a previous response.Response
string
The region requested.
integer
Google’s reported total for the advertiser or domain, when it sends one.
integer
Creatives in this response after the format and date filters — can be
smaller than
num while next_page_token is still set.string
Pass as
cursor for the next page. null on the last page.AppliedFilters
Which filters were honoured:
region, advertiser_id, query, format,
date_range, platform, political. platform and political are always
false.AdCreative[]
Show AdCreative
Show AdCreative
string
e.g.
CR10484731423840108545.string
string
string
The advertiser’s verified domain.
string
TEXT, IMAGE or VIDEO.string
Image or video asset, for image and video creatives.
string
Google’s rendered preview markup.
integer
string
ISO 8601 UTC.
integer
string
integer
string
The Transparency Center page for this creative.
Example
curl "https://scrapebadger.com/v1/google/ads/search?advertiser_id=AR01614014350098432001®ion=US&format=VIDEO&num=40" \
-H "X-API-Key: YOUR_API_KEY"
const res = await fetch(
"https://scrapebadger.com/v1/google/ads/search?" +
new URLSearchParams({
advertiser_id: "AR01614014350098432001",
region: "US",
format: "VIDEO",
num: "40",
}),
{ headers: { "X-API-Key": process.env.SCRAPEBADGER_API_KEY } },
);
const data = await res.json();
import requests
res = requests.get(
"https://scrapebadger.com/v1/google/ads/search",
headers={"X-API-Key": "YOUR_API_KEY"},
params={
"advertiser_id": "AR01614014350098432001",
"region": "US",
"format": "VIDEO",
"num": 40,
},
)
data = res.json()
Response
{
"region": "US",
"total_results": 1284,
"returned_results": 2,
"next_page_token": "CkgKRkFSMDE2MTQwMTQzNTAwOTg0MzIwMDEQZBgB",
"filters_applied": {
"region": true,
"advertiser_id": true,
"query": false,
"format": true,
"date_range": false,
"platform": false,
"political": false
},
"creatives": [
{
"creative_id": "CR10484731423840108545",
"advertiser_id": "AR01614014350098432001",
"advertiser_name": "Nike, Inc.",
"target_domain": "nike.com",
"format": "VIDEO",
"media_url": "https://www.youtube.com/embed/dQw4w9WgXcQ",
"preview_html": "<iframe src=\"https://www.youtube.com/embed/dQw4w9WgXcQ\"></iframe>",
"first_shown_utc": 1749513600,
"first_shown_at": "2026-06-10T00:00:00Z",
"last_shown_utc": 1754870400,
"last_shown_at": "2026-08-11T00:00:00Z",
"days_shown": 63,
"details_link": "https://adstransparency.google.com/advertiser/AR01614014350098432001/creative/CR10484731423840108545"
},
{
"creative_id": "CR17738822901234567890",
"advertiser_id": "AR01614014350098432001",
"advertiser_name": "Nike, Inc.",
"target_domain": "nike.com",
"format": "VIDEO",
"media_url": "https://www.youtube.com/embed/abc123XYZ",
"first_shown_utc": 1752105600,
"first_shown_at": "2026-07-10T00:00:00Z",
"last_shown_utc": 1754784000,
"last_shown_at": "2026-08-10T00:00:00Z",
"days_shown": 32,
"details_link": "https://adstransparency.google.com/advertiser/AR01614014350098432001/creative/CR17738822901234567890"
}
]
}
The date window matches on overlap, not on start: a creative shown
2026-01-01 to 2026-06-01 matches a March query, because callers ask “what was
running then”, not “what started then”.
Errors
| Status | Meaning |
|---|---|
400 | Neither advertiser_id nor query given; unknown platform, format, region or date. |
502 | Upstream Transparency Center failure — not billed. |

