LurkAPI
Docs · Google ads by company

Google ads by company

Every ad an advertiser or website runs on Google Search, YouTube, Maps, Play and Shopping, from the Ads Transparency Center.

1 credit per callFresh within 12 hoursMCP tool: google_company_ads
GEThttps://api.lurkapi.com/v1/google/company/ads

Example response

When to use this

Use it to study a competitor's Google and YouTube ads: formats, run dates and how long each ad has run. Pass a domain such as nike.com to get every advertiser promoting it, or an advertiser_id from search advertisers (google_search_advertisers).

Filter by region, platform, format and date range. topic=political lists election ads with their spend and impressions; it needs a region. For an ad's text, landing page and per-country stats, pass its ids to ad details (google_ad).

Pagination. Up to 100 ads per page. Pass cursor back with the same filters for the next page. It's null on the last page. Date ranges that start more than about a year ago come back empty.

Example request

Copy one and replace YOUR_API_KEY with your API key (get one free). The code versions read the key from the LURKAPI_API_KEY environment variable instead.

Language

Parameters

Add them to the URL after a ?, as in ?domain=nike.com&region=US. Join several with &.

ParameterDescription
domain
stringoptional
The advertiser's website, e.g. nike.com. Required unless you pass advertiser_id.
Example
nike.com
advertiser_id
stringoptional
The advertiser's id, e.g. AR16735076323512287233 (Nike, Inc.). Required unless you pass domain.
topic
stringoptional
political lists only election ads (with spend and impressions); it needs a region.
One of
allpolitical
Default
all
region
stringoptional
Only ads shown in this country: a 2-letter code (US, GB, DE…), or ALL for anywhere.
Default
ALL
Example
US
start_date
stringoptional
Only ads shown on or after this date (YYYY-MM-DD).
end_date
stringoptional
Only ads shown on or before this date (YYYY-MM-DD).
platform
stringoptional
Only ads shown on this Google product.
One of
allgoogle_mapsgoogle_playgoogle_searchgoogle_shoppingyoutube
Default
all
format
stringoptional
Only ads in this format.
One of
alltextimagevideo
Default
all
cursor
stringoptional
The cursor from the previous response, for the next page. Keep every other param the same.

Example response

A real response, captured from the live API. Lists are trimmed to a couple of items, and long text such as media links is cut short with ….

Show the example response (2 KB)
{
  "success": true,
  "credits_remaining": 999959,
  "credits_charged": 1,
  "ads": [
    {
      "advertiserId": "AR16735076323512287233",
      "creativeId": "CR15254823507167543297",
      "format": "text",
      "adUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/cre…",
      "advertiserName": "Nike, Inc.",
      "domain": "nike.com",
      "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/5840308546330368628",
      "previewUrl": null,
      "firstShown": "2023-11-16T21:42:56.000Z",
      "lastShown": "2026-10-03T00:12:26.000Z",
      "daysShown": 900,
      "overallImpressions": null,
      "spend": null,
      "politicalRegions": null
    },
    {
      "advertiserId": "AR11154049584043393025",
      "creativeId": "CR14240224963381428225",
      "format": "video",
      "adUrl": "https://adstransparency.google.com/advertiser/AR11154049584043393025/cre…",
      "advertiserName": "INITIATIVE MEDIA B.V.",
      "domain": "nike.com",
      "imageUrl": null,
      "previewUrl": "https://displayads-formats.googleusercontent.com/ads/preview/content.js?…",
      "firstShown": "2023-10-18T04:22:23.000Z",
      "lastShown": "2026-10-02T23:55:34.000Z",
      "daysShown": 500,
      "overallImpressions": null,
      "spend": null,
      "politicalRegions": null
    }
  ],
  "cursor": "CgoAP7zmjHPnhhnzEhDFA1A5wuZ66qcIolgAAAAAGgn8+Gip+OOF4F8=",
  "number_of_ads_estimate": 8000,
  "number_of_ads_range": {
    "min": 8000,
    "max": 9000
  }
}

Response fields

Every field in a successful response, and what it means. A name with [] belongs to each item of a list: ads[].advertiserId is the advertiserId of every item in ads. null means there's no value.

Show all 28 fields
FieldTypeDescription
successtrueAlways true here; errors have success: false.
credits_remainingnumberYour balance after this call. On anonymous playground calls: free tries left today.
credits_chargednumberCredits this call cost; 0 on free endpoints. On anonymous playground calls: tries used (1).
adsobject[]The ads in Google's order: roughly most recently shown first.
ads[].advertiserIdstringThe advertiser's id (AR…). Pass it as advertiser_id to company ads.
ads[].creativeIdstringThe ad's id (CR…). Pass it with advertiser_id as creative_id to ad details.
ads[].formatstringcan be nulltext, image or video. Google often saves text ads as a picture of the ad.
ads[].adUrlstringThe ad's page on the Ads Transparency Center.
ads[].advertiserNamestringcan be nullThe advertiser's verified name, e.g. Nike, Inc..
ads[].domainstringcan be nullThe website this ad matched, on domain searches; null on advertiser searches.
ads[].imageUrlstringcan be nullA picture of the ad, for image ads and for text ads Google saved as an image. null when the ad only has a live preview (previewUrl).
ads[].previewUrlstringcan be nullGoogle's live preview of the ad: a script the Transparency Center renders. null when there's an imageUrl.
ads[].firstShownstringcan be nullWhen the ad was first shown, ISO 8601 (UTC).
ads[].lastShownstringcan be nullWhen the ad was last shown, ISO 8601 (UTC). Today's date for ads still running.
ads[].daysShownnumbercan be nullHow many days the ad has been shown. A long run usually means the ad works.
ads[].overallImpressionsobjectcan be nullImpressions as the range Google reports. Political ads only; null otherwise.
ads[].overallImpressions.minnumberLower bound of impressions.
ads[].overallImpressions.maxnumberUpper bound of impressions.
ads[].spendobjectcan be nullSpend as the range Google reports. Political ads only; null otherwise.
ads[].spend.currencystringCurrency code, e.g. USD.
ads[].spend.lowernumberLower bound of the spend, in currency.
ads[].spend.uppernumberUpper bound of the spend, in currency.
ads[].politicalRegionsstring[]can be nullRegions where it ran as an election ad, as 2-letter codes, e.g. ["US"]; null for other ads.
cursorstringcan be nullPass as cursor for the next page. null on the last page.
number_of_ads_estimatenumbercan be nullHow many ads match, as Google estimates it: the lower end of its range, or the exact count when it gives one.
number_of_ads_rangeobjectcan be nullThe ad count as the range Google shows (e.g. 7000–8000); null when it gives none.
number_of_ads_range.minnumberLower bound of the ad count.
number_of_ads_range.maxnumberUpper bound of the ad count.

Pagination

Results come in pages. For the next page, repeat the call with the same parameters and add the response's cursor as cursor. On the last page, cursor is null. Each page costs 1 credit.

The first five pages, in JavaScript
let cursor = null;for (let page = 1; page <= 5; page++) {const params = new URLSearchParams({ domain: "nike.com", region: "US" });if (cursor) params.set("cursor", cursor);const res = await fetch(`https://api.lurkapi.com/v1/google/company/ads?${params}`, {headers: { "x-api-key": process.env.LURKAPI_API_KEY },});const data = await res.json();if (!data.success) throw new Error(`${data.code}: ${data.error}`);console.log(data.ads);cursor = data.cursor;if (!cursor) break; // last page}

Cost and freshness

Each call costs 1 credit. Calls turned away before they reach the platform (invalid parameters, a key or balance problem, a rate limit) are free, and so are 5xx errors. A not_found is charged, since the platform was checked. How charging works.

Answers are cached for up to 12 hours. A repeat call within that time can return the same data, and costs the same.

Errors

A failed call returns success: false, an error message, a code your program can check, and a docs link. These are the errors this endpoint can return. All error codes.

StatusCodeMeaning
401missing_api_keyNo API key was sent. Put it in the x-api-key header.
401invalid_api_keyThis key doesn't exist or was revoked.
402insufficient_creditsNot enough credits for this call. Buy a pack, or wait for tomorrow's free top-up.
402over_max_creditsThis call would cost more than the max_credits you set. The error says what it needs; raise max_credits to allow it. Not charged.
403account_suspendedThis account is suspended. Email support@lurkapi.com. Not charged.
405method_not_allowedEndpoints only take GET, with parameters in the URL.
429rate_limitedToo many calls in a short time. Wait as many seconds as the retry-after header says, then retry.
500internal_errorSomething broke on our side. Retry. Not charged.
502upstream_errorThe platform didn't send a usable answer. Retry. Not charged.
503upstream_busyAll our connections to the platform are busy. Retry in a few seconds. Not charged.
504upstream_timeoutThe platform took over 30 seconds to answer (90 for web pages). Retry. Not charged.

Use it in Claude

Connect LurkAPI to Claude and ask in plain English. This endpoint is the google_company_ads tool. For example:

Ask Claude
Use LurkAPI's google_company_ads tool with domain "nike.com", region "US", then summarize what you find.

Claude calls google_company_ads with arguments like these, and each call costs 1 credit:

Tool arguments
{"domain": "nike.com","region": "US"}

To save tokens, tool results leave out empty fields, keep one URL per image or video, and give transcripts as plain text unless you pass timestamps=true. A result over 45,000 characters comes in parts. Its _note gives the offset for the next part, and later parts are free for 15 minutes. Pass trim=false for the full response.

From the blog

All posts