Google's Ads Transparency Center is one of the most useful free things for
anyone doing PPC. Type in a competitor's domain and you see every ad they've run: Search, YouTube, Shopping, Display,
with dates and regions.
The annoying part is that you can look but you can't really use it. There's no export, and if you try to copy the
text of a Search ad, you can't, because it isn't text. Each ad preview is rendered as an image.
So if you want something like "all the headlines HubSpot ran in Germany last quarter" in a spreadsheet, you're
screenshotting, or you're scraping.
I went the scraping route. These are my notes, plus the tool I ended up with.
What's in there
For each ad you can get:
- the advertiser (the legal entity that paid, which is often not the brand name you'd expect)
- first and last shown dates, so how long it's been running
- which countries it ran in
- format (text, image, video) and platform (Search, YouTube, Shopping, Maps, Play)
- how many variations of the creative exist
Long-running ads are the interesting ones. If a competitor has been paying for the same ad for 200+ days, it's
probably converting.
The hard parts
The search goes through advertisers, not ads. You don't search ads directly. A domain or brand name resolves to
one or more advertiser IDs first, and big brands often have several (regional entities, agencies). Miss one and you
miss half their ads.
The text is in images. For Search ads the preview is an image of the ad. To get headline, description, display
URL and sitelinks you need OCR. Shopping ads are easier, the product title is in the data. YouTube ads give you the
video ID.
Languages. I assumed the region filter would tell me the language. It doesn't. Filtering an ad set to Germany I
still got ads in Turkish, because advertisers target people, not just places. So the language has to be detected from
the image itself. In my tests across 11 languages (Japanese, Korean, Chinese, Arabic, Russian, Ukrainian, German,
French, Spanish, Portuguese, Italian) the OCR read 54 of 56 real ads. The two misses were a Japanese ad with a big
photo over the text and an odd Maps format.
Rate limits. Google starts refusing an IP after roughly 20 to 40 requests in a row. You need rotating proxies,
and the rotation logic matters more than the scraping code.
The tool
Disclosure: I turned this into a Google Ads Transparency scraper on Apify.
It does the advertiser lookup, the OCR and the proxy rotation, and gives you a table.
Every ad a domain runs, with the actual ad copy:
{
"searchQueries": ["hubspot.com"],
"maxResults": 200,
"extractAdCopy": true,
"region": "DE"
}
Some other things it can do:
-
"resultType": "advertisers"gives one row per advertiser with their estimated ad count and format mix, which is a quick way to size up a market before pulling every ad -
"includeLandingPage": truefollows each ad to its landing page and grabs the title, H1 and main call to action -
"politicalAds": trueadds spend ranges, impressions and targeting for political ads where Google publishes them -
"deltaMode": trueon a schedule only returns ads it hasn't seen before, so you get a feed of a competitor's new ads
Price is $2 per 1,000 ads on Apify's free plan, $1 on the bigger plans. Ad copy is an extra $2 to $3 per 1,000
because OCR is the expensive part. Landing pages are extra too, and only charged when the page actually returned
something.
Ways to use it
- Pull a competitor's Search ads, sort by days running, and read the top 20 headlines. Those are the ones working.
- Run the same domain monthly with
deltaModeand see what they're testing. - Compare headlines across countries. Companies often test messaging in one market before rolling it out.
If you'd rather build it yourself, the short version: resolve advertisers first, OCR the Search previews, detect the
language from the image, and spend most of your effort on proxy rotation.
Top comments (0)