Google Company Ads API
Google publishes spend and impression ranges only for election ads; commercial advertisers omit both. isActive is true when lastShown is within 7 UTC days.
GET request to /v1/ad-library/google/company-ads that responds with clean JSON and costs 2 credits. Pass cache=true for a free 24h cache hit; default is always fresh. Start with 100 free credits — no credit card.What is the Google Company Ads API?
Google publishes spend and impression ranges only for election ads in regions that require disclosure; commercial advertisers omit both. isActive is derived from lastShown — true when the creative was seen within 7 UTC days. Pass an advertiser name, domain (nike.com), or AR… id from advertiser-search and get public commercial creatives as clean JSON: id, url, adFormat, firstShown/lastShown, advertiser, media[], isActive. A name/domain can match more than one Google AR… entity — ads[] and adsCountEstimate are always the single resolvedAdvertiser; siblings are otherMatches[{id, name}], not mixed into the list. ATC does not publish structured copy: adFormat=text is inferred from the absence of an image/video asset — those rows keep text/headline/cta/landingUrl as null (the parser still runs; inactive creatives are not skipped). Image/video rows omit those keys (copy lives in the asset). The same omit convention applies to spend/impressions (election-only) and empty country/countries. Supports country/region, start_date/end_date, sort=last_shown|first_shown, cursor pagination, adsCountEstimate. resolution is always keyed: not-in-library | resolved-no-ads | resolved-filtered-out when ads is empty; null when ads exist (null means the list is populated — it is not a leftover). Flat 2 credits when ads are returned; totalReturned=0 is 0 credits (max 200 per page).
What you get
- id, url, adFormat, firstShown/lastShown, advertiser, media[], isActive
- resolvedAdvertiser is one AR…; otherMatches lists sibling entities
- resolution names not-in-library | resolved-no-ads | resolved-filtered-out (null when ads exist)
- Image/video omit text/headline/cta/landingUrl; text format keeps those keys (often null)
- Empty result is 0 credits; Flat 2 credits when ads are returned
Try it
Fill in the parameters below and copy a ready-to-run request, or open the live Playground to run it against your account (no API key paste).
Parameters
curl "https://api.captapi.com/v1/ad-library/google/company-ads?advertiser=nike.com" \
-H "Authorization: Bearer capt_live_..."
# or: -H "x-api-key: capt_live_..."Edit the parameters and the code updates instantly. Switch languages and hit copy.
Example response
{
"success": true,
"data": {
"advertiser": "nike.com",
"country": "US",
"totalReturned": 2,
"platformNote": "Google publishes spend and impression ranges only for election ads in regions that require disclosure; commercial advertisers omit both. isActive is derived from lastShown — true when the creative was seen within 7 UTC days.",
"ads": [
{
"platform": "google",
"id": "CR13596485266373083137",
"url": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR13596485266373083137",
"adFormat": "image",
"firstShown": "2022-11-30T14:47:01.000Z",
"lastShown": "2026-07-26T13:01:42.000Z",
"isActive": true,
"advertiser": {
"id": "AR16735076323512287233",
"name": "Nike, Inc.",
"url": "https://adstransparency.google.com/advertiser/AR16735076323512287233"
},
"media": [
"https://tpc.googlesyndication.com/archive/simgad/1889619096914274581"
]
},
{
"platform": "google",
"id": "CR00101170943954518017",
"url": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR00101170943954518017",
"adFormat": "image",
"firstShown": "2022-11-30T18:54:18.000Z",
"lastShown": "2026-07-26T12:53:39.000Z",
"advertiser": {
"id": "AR16735076323512287233",
"name": "Nike, Inc.",
"url": "https://adstransparency.google.com/advertiser/AR16735076323512287233"
},
"media": [
"https://tpc.googlesyndication.com/archive/simgad/3850814477191431652"
]
}
]
}
}Billing metadata is returned in response headers: X-Captapi-Credits (credits charged), X-Captapi-Cache (hit or miss), and X-Captapi-Source. Failed requests (4xx/5xx) are never charged. See the full list of error codes in the error reference.
Response structure
A successful call returns success and a data object with the following fields:
Top-level fields
advertiserAdvertiser running the ad.countryCountry for the request context. On popular-creators top-level: ISO feed market you queried (e.g. US) — not each creator's home country (see region).totalReturnedNumber of items returned in this response.platformNotePlatform note.
Ads
Each item in ads contains:
platformPlatform identifier for this response (matches the endpoint's platform).idId of this ads item.urlCanonical URL of the item.adFormatInferred from assets — text means no image/video URL, not a labelled text field. ATC does not ship the copy next to that label. text rows always include text/headline/cta/landingUrl (null when SearchCreatives has no copy). image/video rows omit those keys — copy lives in the asset.firstShownWhen the ad was first shown.lastShownWhen the ad was last shown.isActiveDerived: true when lastShown is within 7 UTC days. Google does not publish an activity flag.advertiserAdvertiser running the ad.mediaMedia attached to the item.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| advertiser | string | Yes | Advertiser name, domain (e.g. nike.com), or Google advertiser ID (AR…). Prefer AR… from advertiser-search. |
| country | string | No | Two-letter ISO country / region code (soft filter). Default US. Alias: region. |
| region | string | No | Alias for country. |
| start_date | string | No | YYYY-MM-DD — keep creatives whose shown window overlaps this start. |
| end_date | string | No | YYYY-MM-DD — keep creatives whose shown window overlaps this end. |
| sort | string | No | Client-side sort: last_shown (recent activity first) or first_shown. Default is ATC order. |
| cursor | string | No | Pagination cursor from nextCursor. |
| topic | string | No | Only "all" is supported (commercial ATC). Google publishes spend and impression ranges only for election ads; commercial advertisers omit both. isActive is true when lastShown is within 7 UTC days. |
| limit | integer | No | Max items to return (default 20, max 200). Flat 2 credits when results are returned; 0 credits when totalReturned is 0. |
| cache | boolean | No | Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh. |
Authentication: send your key as Authorization: Bearer capt_live_.... A typical call costs 2 credits. Pass cache=true for a free 24h cache hit; default is always fresh.
google_ad_library_company_ads via @captapi/mcp. Set it up →How it works
- 1. Sign up — get 100 free credits, no card required.
- 2. Create a key from your dashboard.
- 3. Send one request to
/v1/ad-library/google/company-adsand parse the JSON response.
Use cases
Discovery
Surface items matching a topic, tag, sound, or trend query.
Monitoring
Watch a list feed over time for new activity.
Research
Sample structured list results for analysis.
Pipelines
Ingest list results into your own store or CRM.
Frequently asked questions
What does the Google Company Ads API do?+
The Google Company Ads API lets you list items in bulk with metadata from a public Google Ad Library ad using one GET request to /v1/ad-library/google/company-ads. It returns clean JSON — no OAuth or infrastructure setup required.
How many credits does the Google Company Ads API cost?+
Each successful call costs 2 credits. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d. Failed or empty results are never charged.
Do I need a Google Ad Library API key or OAuth?+
No. A single Captapi key works across every platform Captapi supports — YouTube, TikTok, Instagram, Facebook, Twitter/X, Reddit, Threads, Bluesky, Pinterest, LinkedIn, Rumble, Spotify, Kwai, and more. We handle proxies, rate limits, retries, and authentication for you.
Why are text/spend null on Google creatives?+
That is Google's limit, not a scrape miss. Google publishes spend and impression ranges only for election ads in regions that require disclosure; commercial advertisers omit both. isActive is derived from lastShown — true when the creative was seen within 7 UTC days. Image/video rows omit text/headline/cta/landingUrl (copy lives in the asset). Text-format rows keep those keys as null because the format is inferred from no media — ATC does not ship the copy. Use sort=first_shown to see isActive:false.
Why is ads[] empty — and did I pay?+
Read resolution. not-in-library means Google's library has no matching advertiser (a domain like supermaker.ai). resolved-no-ads means we found the AR… entity and ATC answered with zero creatives — verified without the country filter too, so a region-tagged entity does not read as empty. resolved-filtered-out means a start_date/end_date window dropped every creative. All three are 0 credits — two byte-identical empties no longer bill differently. A proxy timeout mid-fetch is never sold as resolved-no-ads: that path retries on the extended tier and 502s only when every tier fails.
advertiser-search said adsCount 4 — why did company-ads return 0?+
It should not anymore. That mismatch had one honest cause and one bug. Honest: country is a soft filter — when the AR entity's creatives carry no region tag for your country we automatically retry without the filter, so region-tagged inventory still comes back. Bug (fixed): a proxy timeout during the creatives pull used to ship ads=[] with resolution=resolved-no-ads; a transport failure now falls through to the extended tier instead of masquerading as an empty advertiser.
Why does otherMatches list a second advertiser?+
A name or domain can match more than one Google AR… legal entity (Base44 vs Base44 Ltd). ads[] and adsCountEstimate are only resolvedAdvertiser. otherMatches is the rest — pass advertiser=AR… to fetch one of them. We do not merge those accounts.
What does resolution: null mean?+
Ads were returned. The field is always keyed; null is not a leftover. Empty lists use not-in-library | resolved-no-ads | resolved-filtered-out.
Is the Google Company Ads API suitable for production use?+
Yes. It is a stable REST endpoint with predictable JSON and automatic retries. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d. Use it for analytics, monitoring, and content automation.
More Google Ad Library APIs
Ready to use the Google Company Ads API?
Sign up, grab your key, and make your first call in 60 seconds.