Google Ads Transparencygoogle.advertisers.ads.list

Google advertiser ads API

An advertiser's ads in the Google Ads Transparency Center (Search, YouTube, Display, Shopping, Maps, Play), by advertiser ID or by the brand's website domain: format, preview image, first and last time shown. 40 ads a page.

GEThttps://api.okdata.online/v1/google/advertisers/ads/list

Price

One call costs $0.004 and returns one page of about 40 ads. Collecting 1,000 ads takes about 25 calls, $0.10 in total. Each page is a separate call; failed calls are not charged.

Parameters

NameTypeDescription
idstringThe advertiser ID (AR…), from the advertiser search. Give id or domain. e.g. AR17172796163137470465
domainstringThe brand's website domain. Give id or domain. e.g. stanley1913.com
countrystringOnly ads shown in this country (ISO code); anywhere when left out. e.g. US
formatstringalltextimagevideoOnly text, image or video ads; all by default. default all
cursorstringOpaque cursor from page.next_cursor of the previous call. Each page is a separate call.
viewstringcompactstandardfullHow much of each object comes back. full adds platform-specific fields under ext. default standard
fieldsstringComma-separated fields to keep, to save tokens.

cursor, view and fields work the same on every endpoint: how requests work.

Returned fields

Each item is a Ad.

FieldTypeDescription
idstringAd ID in the library.
urlstringLink to the ad in the library.
advertiserAdvertiserRefWho runs the ad.
titlestring | nullHeadline, where the ad has one.
textstringAd copy as plain text; empty when the ad has none.
formatstring | nullCreative format; dynamic means the platform assembles it per viewer (catalog ads).
imagesstring[] | nullImage URLs of the creative.
videosstring[] | nullVideo URLs of the creative.
landing_urlstring | nullWhere the ad leads.
ctastring | nullCall-to-action button text.
platformsstring[] | nullWhere it is delivered, e.g. facebook, instagram.
activeboolean | nullWhether the ad is still running.
first_shown_atstring | nullFirst time or day shown, ISO 8601 in UTC.
last_shown_atstring | nullLast time or day shown, ISO 8601 in UTC.
reachstring | nullPeople reached, as the library publishes it: a bracket such as 1K-10K, or a count (the EU reach of a Meta ad); null where none is published.
extobjectPlatform-specific extras. Only returned with view=full.

Request

cURL
curl -G "https://api.okdata.online/v1/google/advertisers/ads/list" \
  -H "Authorization: Bearer $OKDATA_API_KEY" \
  --data-urlencode 'id=AR17172796163137470465'
Python
import os
import requests

resp = requests.get(
    "https://api.okdata.online/v1/google/advertisers/ads/list",
    headers={"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"},
    params={"id": "AR17172796163137470465"},
    timeout=60,
)
body = resp.json()
if body["code"] != "ok":
    raise RuntimeError(f"{body['code']}: {body['message']} (charged: {body['charged']})")

for row in body["data"]["items"]:
    print(row["advertiser"]["name"], row["first_shown_at"], row["text"][:60])
print("cost: $" + body["meta"]["billing"]["amount"])
TypeScript
const url = new URL('https://api.okdata.online/v1/google/advertisers/ads/list');
url.searchParams.set('id', "AR17172796163137470465");

const res = await fetch(url, {
  headers: {
    Authorization: `Bearer ${process.env.OKDATA_API_KEY}`,
  },
});
const body = await res.json();
if (body.code !== 'ok') throw new Error(`${body.code}: ${body.message}`);

for (const row of body.data.items) {
  console.log(row.advertiser.name, row.first_shown_at, row.text.slice(0, 60));
}
console.log('cost: $' + body.meta.billing.amount);
MCPtools/call
{
  "name": "call",
  "arguments": {
    "endpoint": "google.advertisers.ads.list",
    "params": {
      "id": "AR17172796163137470465"
    }
  }
}

Or ask an agent that has the MCP server connectedUse Google advertiser ads and sum up what these ads promise, which offers they push and since when.

Response

200 · application/jsonmeta.billing.amount = 0.004
{
  "code": "ok",
  "request_id": "0f6c2a8e-4b1d-4e0a-9a51-3c7d2b9e1f20",
  "data": {
    "items": [
      {
        "id": "CR06859729393586012161",
        "url": "https://adstransparency.google.com/advertiser/AR17172796163137470465/creative/CR06859729393586012161",
        "advertiser": {
          "id": "AR17172796163137470465",
          "name": "PACIFIC MARKET INTERNATIONAL, LLC",
          "url": "https://adstransparency.google.com/advertiser/AR17172796163137470465"
        },
        "title": null,
        "text": "",
        "format": "image",
        "images": null,
        "videos": null,
        "landing_url": null,
        "cta": null,
        "platforms": null,
        "active": null,
        "first_shown_at": "2026-10-16T20:42:14Z",
        "last_shown_at": "2026-11-11T15:09:13Z",
        "reach": null
      }
    ]
  },
  "page": {
    "next_cursor": "eyJvIjoyMH0",
    "has_more": true
  },
  "warnings": [],
  "meta": {
    "capability": "google.advertisers.ads.list",
    "billing": {
      "amount": "0.004",
      "currency": "USD",
      "balance_after": "9.996"
    },
    "unavailable": {},
    "cached": false,
    "replayed": false,
    "fetched_at": "2026-11-11T08:00:00Z"
  }
}

Try it

This sends a real call to https://api.okdata.online and is billed as usual: at most $0.004. Failed calls are free. Your key goes only to that address and is never stored on this site.

Questions

How much does the Google advertiser ads API cost?

One call costs $0.004 and returns one page of about 40 ads. Collecting 1,000 ads takes about 25 calls, $0.10 in total. Each page is a separate call; failed calls are not charged.

How do I get the next page?

Pass page.next_cursor from the response back as the cursor parameter. When page.has_more is false there is nothing left. Every page is its own call at $0.004.

Do I need a Google Ads Transparency account, cookies or a QR login?

No. You send only your okdata API key. The data is public data from Google Ads Transparency; nothing is fetched with your own Google Ads Transparency account.

Am I charged when a call fails?

No. Every error response says charged: false, except a timeout, which says charged: null until the outcome is known. Resend with the same Idempotency-Key and you are never charged twice.

What if Google Ads Transparency does not show a field?

The field is null, and meta.unavailable names it with the reason: platform (the platform never shows it) or capability (we cannot fetch it yet).

Answers that use this endpoint

All Google Ads Transparency endpoints → · Answers