Skip to content
ProspectAPIs

API reference

Ads library

Written and maintained by The ProspectAPIs team

The ads library API returns whether a company is running ads now, where and since when, from four public ad libraries keyed on the company's domain: the Meta Ad Library, the Google Ads Transparency Center, the LinkedIn Ad Library and the TikTok Ad Library. Every answer carries a one-line summary, a status for each library and how the company's advertiser was found there. A field the library does not show is null, never filled in.

Launching soon: the routes below answer 503 until the ads library goes live.

$0.006

per library that returns ads

free

no ads, not found or not covered

free

a library that cannot be read

A company's live ads, newest last seen first. Pass domain (required) and, to narrow it, platform: one or more of meta, google, linkedin and tiktok, comma separated. Page with limit (1 to 100, default 25) and cursor (pass back next_cursor exactly as returned). Later pages are free and come from the same read, with no summary or library blocks. A cursor works only with the key that made the first call and expires after 6 hours; INVALID_CURSOR or STALE_CURSOR (the ads were read again since) means repeat the call without it. A later page never includes a library the first page reported unreadable. A lookup that pins an advertiser id is one page (raise limit to 100); its next_cursor is null.

bash
curl "https://api.prospectapis.com/v1/ads?domain=acme.com&platform=meta,google" \
  -H "Authorization: Bearer $PROSPECTAPIS_KEY"
200 OK
{
  "domain": "acme.com",
  "company_id": "c3f1...",
  "summary": {
    "running_now": true, "platforms_running": 1, "ads_live_total": 12, "ads_live_is_lower_bound": false,
    "first_seen_any": "2026-08-02", "newest_creative_at": "2026-10-30",
    "sentence": "Running 12 ads on Meta, first seen 2026-08-02"
  },
  "platforms": [
    { "platform": "meta", "status": "ok", "advertiser": { "id": "100200300", "name": "Acme", "page_url": "https://www.facebook.com/acme/" },
      "resolution": { "method": "landing_domain_majority", "confidence": 0.9, "evidence": "9 of 10 ads landing on acme.com are from the page Acme" },
      "ads_live": 12, "ads_total_band": "12", "complete": true, "truncated": false, "read_at": "2026-11-01T09:30:00.000Z", "cached": false,
      "coverage": "active ads in every country; inactive ads only when they reached the EU" },
    { "platform": "google", "status": "unreadable", "reason": "rate_limited" }
  ],
  "data": [
    { "id": "meta.1234567890", "platform": "meta", "advertiser_name": "Acme", "advertiser_id": "100200300",
      "advertiser_url": "https://www.facebook.com/acme/", "creative_text": "Warehouse robots that pay for themselves in a year.",
      "media_urls": ["https://video.example.net/acme-demo.mp4"], "first_seen": "2026-10-02T07:00:00.000Z",
      "last_seen": "2026-11-01T07:00:00.000Z", "countries": null, "landing_url": "https://acme.com/demo", "status": "active",
      "format": "video", "source_url": "https://www.facebook.com/ads/library/?id=1234567890", "read_at": "2026-11-01T09:30:00.000Z" }
  ],
  "count": 1, "total": 12, "next_cursor": "eyJvIjoxLC...", "charged_usd": 0.006
}

The example shows a fictional company: Meta answered with ads and was charged; Google could not be read at that moment and was not.

A status for each library

statusMeaning
okThe library was read, the company's advertiser was found, and it is running ads. The only status that is charged.
no_adsThe library was read, the company's advertiser was matched, and it runs no live ads there. The only empty answer you can rely on.
not_resolvedNo matching advertiser found: the library was read, but no advertiser could be tied to the company (resolution.match no_advertiser_match or ambiguous). It does not mean the company runs no ads: pass the advertiser's id (below) and ask again.
not_coveredThe library does not cover this company. TikTok's library lists only ads shown in Europe, so a company with no European ads lands here.
unreadableThe library could not be read right now; reason says why (rate_limited, blocked, timeout, parse, platform_off, no_egress). Never an empty list. Retry later.

One library that cannot be read never fails the call: you get the others with their statuses. The API answers 503 SOURCE_UNAVAILABLE only when every library you asked for is unreadable. truncated: true means the library had more ads than one read takes, so ads_live is a lower bound and ads_total_band carries the library's own count where it gives one.

How the company's advertiser is found

Each library names an advertiser, not a domain, so every answer says how the advertiser was tied to the company, strongest evidence first: caller_supplied (an id you passed), website_link (the page the company's own site links to), landing_domain_majority (the advertiser that owns most of the ads landing on the domain) and name_match (an advertiser named like the company, used last). An advertiser that only links to the domain is never taken. resolution.match says the outcome: matched, ambiguous (ads land on the domain but no one advertiser owns most of them) or no_advertiser_match. An empty list with anything but matched means no matching advertiser was found, not that the company runs no ads. When you already know the advertiser, pass it and the library is read for it directly: google_advertiser_id (AR followed by digits), meta_page_id, linkedin_company_id or tiktok_advertiser (the name as the library shows it).

GET /v1/ads/:id

One ad in full, by the id from GET /v1/ads. It adds what the library shows only on the single ad: the countries a Google ad ran in, the run dates and landing URL of a LinkedIn ad. An id we have not read answers 404, free.

bash
curl https://api.prospectapis.com/v1/ads/meta.1234567890 \
  -H "Authorization: Bearer $PROSPECTAPIS_KEY"

What each library covers

platformCoverage
metaWorldwide: active ads in every country; inactive ads only when they reached the EU.
googleWorldwide: verified advertisers' ads shown in the last 30 days, live when shown in the last 2.
linkedinAds run since 2023-06-01, kept a year after their last impression; run dates and reach only for ads shown in the EU.
tiktokOnly ads shown in the EEA, Switzerland and the UK, in the last 30 days.

We read each library's public pages logged out, the way a visitor's browser does, and never with an account. A read is kept for a few hours, so calls within that window answer from it (cached: true).

Ad fields

FieldMeaning
idOur id for the ad: the platform, a dot, and the library's own id (for example meta.1234567890). Use it with GET /v1/ads/:id.
platformmeta, google, linkedin or tiktok.
advertiser_name, advertiser_id, advertiser_urlThe advertiser as the library names it and links it. TikTok shows no advertiser id.
creative_textThe ad's text. The Google and TikTok list views show the creative, not its text, so it is null there.
media_urlsImage and video URLs as the library serves them. Some are signed and expire; download what you keep.
first_seen, last_seenWhen the library says the ad started and was last shown. LinkedIn's list shows no dates; GET /v1/ads/:id adds them where LinkedIn shows them.
countriesISO country codes, where the library names them. Google names them on the single ad, so read GET /v1/ads/:id for them.
landing_urlWhere the ad sends people, where the library shows it.
statusactive or inactive where the library states it (Meta), or where we derive it (Google: active when shown in the last 2 days). LinkedIn and TikTok state none, so it is null.
format, source_url, read_atThe creative format, the ad on its public library page, and when we read it.

Watch a company's ads

An ads watchlist sends a signed webhook when a company's ads change. Create it with kind: "ads" and the filters domain and, optionally, platform. By default it delivers company-level events: advertiser_started (the company starts running ads on a library), advertiser_stopped (it stops) and new_creatives (new creatives, with a count and sample ids). Set level: "ad" for every ad's own ad_started, ad_stopped and new_creative. An ad is reported stopped only after a complete read, and a read that suddenly loses most of a company's ads is checked again before anything is sent. Signing and retries follow the watchlists guide; creating is free and each delivered event costs $0.006, charged only when your webhook answers 2xx.

bash
curl https://api.prospectapis.com/v1/watchlists \
  -H "Authorization: Bearer $PROSPECTAPIS_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Acme ads","kind":"ads","filters":{"domain":"acme.com","platform":"meta,linkedin"},"webhook_url":"https://hooks.example.com/ads"}'

Billing

A lookup costs $0.006 for each library whose status is ok, so a company running ads on two of the four is $0.012. no_ads, not_resolved, not_covered and unreadable are free, and so are later pages of the same lookup, a 404 unknown id and a 503. charged_usd in the answer says what this call cost. When you cannot pay the API answers 402 with a top_up_url.

Next steps

Create a free account to get a key; every account starts with a free $1 balance. The quickstart covers authentication and errors, company profiles and funding signals key on the same domain, and pricing lists what each call costs. Our guides to funding signals for prospecting and researching prospects with an AI agent show where a spend signal such as a company's live ads fits an account workflow.

Was this page helpful?