LurkAPI
Docs · Google ad details

Google ad details

One ad from Google's Ads Transparency Center: every version of the creative, where it ran and, for political ads, spend and targeting.

1 credit per callFresh within 12 hoursMCP tool: google_ad
GEThttps://api.lurkapi.com/v1/google/ad

Example responseView as markdown

When to use this

Use it after company ads (google_company_ads) for one ad's versions, regions and landing page. Pass the ad's Transparency Center link as url, or advertiser_id + creative_id.

Each version has an imageUrl when Google archived it as a picture, else a previewUrl. For text and video ads we also read one live preview for the headline, description, landing page and YouTube video; image-only text stays null (we don't OCR). Impressions, spend and targeting are only published for political ads.

Returns 404 not_found if the ad doesn't exist.

Parameters

All parameters go in the query string.

ParameterDescription
url
stringoptional
The ad's Transparency Center link, e.g. https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR11071274990039990273. Required unless you pass both ids.
Example
https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR11071274990039990273?region=US
advertiser_id
stringoptional
The advertiser's id (AR…), with creative_id, instead of url.
creative_id
stringoptional
The ad's id (CR…), with advertiser_id, instead of url.

Example request

Replace YOUR_API_KEY with your key, or set LURKAPI_KEY for the code. Get a free key.

Language

Example response

A real response from this endpoint, captured from the live API and trimmed to a couple of items. Strings over 96 characters (mostly signed media URLs) are cut short and end in ….

Show the example response (2 KB)
{
  "success": true,
  "credits_remaining": 999997,
  "credits_charged": 1,
  "advertiserId": "AR16735076323512287233",
  "creativeId": "CR11071274990039990273",
  "advertiserName": "Nike, Inc.",
  "format": "video",
  "adUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/cre…",
  "firstShown": null,
  "lastShown": "2026-09-30T09:58:06.000Z",
  "daysShown": null,
  "overallImpressions": null,
  "spend": null,
  "targeting": null,
  "creativeRegions": [
    {
      "regionCode": "US",
      "regionName": "United States"
    }
  ],
  "regionStats": [
    {
      "regionCode": "US",
      "regionName": "United States",
      "firstShown": null,
      "lastShown": "2026-09-30",
      "impressions": null,
      "platformImpressions": []
    }
  ],
  "variations": [
    {
      "destinationUrl": "https://www.nike.com/retail/",
      "headline": "Engineered for Max Airflow",
      "description": "Maximum breathability meets ultra-light comfort in new Nike Aero-FIT styles.",
      "allText": null,
      "imageUrl": null,
      "previewUrl": "https://displayads-formats.googleusercontent.com/ads/preview/content.js?…",
      "videoId": "RZ1MLoOdWcc"
    },
    {
      "destinationUrl": null,
      "headline": null,
      "description": null,
      "allText": null,
      "imageUrl": null,
      "previewUrl": "https://displayads-formats.googleusercontent.com/ads/preview/content.js?…",
      "videoId": null
    }
  ]
}

Response fields

Every field of a successful response. [] marks a list: a[].b is the b of each item in a. nullable fields can be null; optional fields can be missing.

Show all 59 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).
advertiserIdstringThe advertiser's id (AR…). Pass it as advertiser_id to company ads.
creativeIdstringThe ad's id (CR…).
advertiserNamestringnullableWho paid for the ad (Google's "paid for by" name), e.g. Nike, Inc.; it can differ from the advertiser account, e.g. for agencies. Often null for political ads.
formatstringnullabletext, image or video. Text ads are often archived as a picture of the ad.
adUrlstringThe ad's page on the Ads Transparency Center.
firstShownstringnullableWhen the ad was first shown, ISO 8601 (UTC). Google often leaves it out here; company ads always has it.
lastShownstringnullableWhen the ad was last shown, ISO 8601 (UTC). Today's date for ads still running.
daysShownnumbernullableHow many days the ad has been shown. A long run usually means the ad works. null when Google leaves it out.
overallImpressionsobjectnullableImpressions as the range Google reports. Political ads only; null otherwise.
overallImpressions.minnumberLower bound of impressions.
overallImpressions.maxnumberUpper bound of impressions.
spendobjectnullableSpend as the range Google reports. Political ads only; null otherwise.
spend.currencystringCurrency code, e.g. USD.
spend.lowernumberLower bound of the spend, in currency.
spend.uppernumberUpper bound of the spend, in currency.
targetingobjectnullableWho the ad targeted. Political ads only; null otherwise. Empty lists can still mean targeting was used: Google doesn't always list the groups.
targeting.ageobjectAge groups (0-17, 18-24, 25-34, 35-44, 45-54, 55-64, 65+, unknown) targeting.
targeting.age.includedstring[]Age groups (0-17, 18-24, 25-34, 35-44, 45-54, 55-64, 65+, unknown) the ad targeted.
targeting.age.excludedstring[]Age groups (0-17, 18-24, 25-34, 35-44, 45-54, 55-64, 65+, unknown) the ad excluded.
targeting.genderobjectGenders (male, female, unknown) targeting.
targeting.gender.includedstring[]Genders (male, female, unknown) the ad targeted.
targeting.gender.excludedstring[]Genders (male, female, unknown) the ad excluded.
targeting.locationobjectLocation targeting.
targeting.location.includedobject[]Locations the ad targeted.
targeting.location.included[].criterionIdstringGoogle's location id, e.g. 2840 (United States) or 1015229 (a city).
targeting.location.included[].namestringnullableThe country's name for country-level ids; null for cities and regions, which we don't resolve.
targeting.location.included[].fullNamestringnullableSame as name for countries; null for cities and regions.
targeting.location.included[].countryCodesstring[]The country code for country-level ids, e.g. ["US"]; empty otherwise.
targeting.location.excludedobject[]Locations the ad excluded.
targeting.location.excluded[].criterionIdstringGoogle's location id, e.g. 2840 (United States) or 1015229 (a city).
targeting.location.excluded[].namestringnullableThe country's name for country-level ids; null for cities and regions, which we don't resolve.
targeting.location.excluded[].fullNamestringnullableSame as name for countries; null for cities and regions.
targeting.location.excluded[].countryCodesstring[]The country code for country-level ids, e.g. ["US"]; empty otherwise.
creativeRegionsobject[]Countries where the ad was shown.
creativeRegions[].regionCodestring2-letter country code, e.g. US.
creativeRegions[].regionNamestringCountry name in English.
regionStatsobject[]Per-country delivery: dates and, for political ads, impressions.
regionStats[].regionCodestring2-letter country code, e.g. US.
regionStats[].regionNamestringCountry name in English.
regionStats[].firstShownstringnullableFirst day shown in this country, YYYY-MM-DD; often null outside political ads.
regionStats[].lastShownstringnullableLast day shown in this country, YYYY-MM-DD.
regionStats[].impressionsobjectnullableImpressions in this country. Political ads only; null otherwise.
regionStats[].impressions.minnumberLower bound of impressions.
regionStats[].impressions.maxnumberUpper bound of impressions.
regionStats[].platformImpressionsobject[]Impressions per Google product in this country, when Google reports them; usually empty.
regionStats[].platformImpressions[].platformstringnullableThe Google product.
regionStats[].platformImpressions[].minnumbernullableLower bound of impressions there.
regionStats[].platformImpressions[].maxnumbernullableUpper bound of impressions there.
variationsobject[]Every version of the creative Google shows. We read the live preview of the first previewed version of text and video ads only.
variations[].destinationUrlstringnullableLanding page, from the version's live preview. For search ads it can be just the display URL (e.g. nike.com); null when we didn't read one.
variations[].headlinestringnullableHeadline, from the live preview; null for image-only versions and ones we didn't read.
variations[].descriptionstringnullableDescription text, from the live preview; null for image-only versions and ones we didn't read.
variations[].allTextstringnullableAll text on the ad. Always null for now: reading text off archived images needs OCR, which we don't run.
variations[].imageUrlstringnullablePicture of this version; null when it only has a live preview.
variations[].previewUrlstringnullableGoogle's live preview of this version (a script); null when there's an imageUrl.
variations[].videoIdstringnullableThe YouTube video id of a video ad, from the live preview (youtube.com/watch?v=<id>); null otherwise.

Caching and freshness

Responses are cached for up to 12 hours, so a repeat call within that window can return the same data. It still costs 1 credit.

Errors

Errors return { success: false, error, code, docs } with the HTTP status below. Validation errors, 401/402/429 rejections and 5xx failures are free; not_found is charged (how charging works). All error codes.

StatusCodeMeaning
401missing_api_keyNo API key. Send it in the x-api-key header.
401invalid_api_keyThe key is unknown or was revoked.
402insufficient_creditsNot enough credits for this call. Buy a pack or wait for tomorrow's top-up.
404not_foundThe endpoint, or the thing you asked for (ad, post, subreddit), doesn't exist. Charged when the platform was checked.
405method_not_allowedEndpoints take GET with query params.
429rate_limitedToo many calls at once. Wait for the retry-after seconds, then retry.
500internal_errorSomething broke on our side. Retry; 5xx errors are free.
502upstream_errorThe platform didn't give a usable answer. Retry; 5xx errors are free.
503upstream_busyAll our connections to the platform are busy. Retry in a few seconds; 5xx errors are free.
504upstream_timeoutThe platform took over 30 seconds to answer. Retry; timeouts are free.

Use it in Claude

Once LurkAPI is connected to Claude, this endpoint is the google_ad tool. Ask in plain English, for example:

Ask Claude
Use LurkAPI's google_ad with url "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR11071274990039990273?region=US" and summarize what you find.

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

Tool arguments
{
  "url": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR11071274990039990273?region=US"
}

Tool results skip nulls and empty lists to save tokens.