Google Ad Library
GET /v1/ad-library/google/company-ads

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.

2 credits per request
TL;DR
Google publishes spend and impression ranges only for election ads; commercial advertisers omit both. isActive is true when lastShown is within 7 UTC days. The Google Company Ads API (Google Ad Library) is a single authenticated 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

Open in Playground

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

Sign in to run live
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

NameTypeRequiredDescription
advertiserstringYesAdvertiser name, domain (e.g. nike.com), or Google advertiser ID (AR…). Prefer AR… from advertiser-search.
countrystringNoTwo-letter ISO country / region code (soft filter). Default US. Alias: region.
regionstringNoAlias for country.
start_datestringNoYYYY-MM-DD — keep creatives whose shown window overlaps this start.
end_datestringNoYYYY-MM-DD — keep creatives whose shown window overlaps this end.
sortstringNoClient-side sort: last_shown (recent activity first) or first_shown. Default is ATC order.
cursorstringNoPagination cursor from nextCursor.
topicstringNoOnly "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.
limitintegerNoMax items to return (default 20, max 200). Flat 2 credits when results are returned; 0 credits when totalReturned is 0.
cachebooleanNoSet 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.

Using an AI agent? This endpoint is the MCP tool google_ad_library_company_ads via @captapi/mcp. Set it up →

How it works

  1. 1. Sign up — get 100 free credits, no card required.
  2. 2. Create a key from your dashboard.
  3. 3. Send one request to /v1/ad-library/google/company-ads and 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.

Google Company Ads API | Captapi — Captapi