How to find advertiser IDs from a domain on six ad libraries

Each ad library links a domain to an advertiser differently, or not at all. How we find advertiser IDs from a domain on Meta, Google, TikTok and more.

The AdLib team · · 6 min read

You have a domain, say nike.com, and you want every advertiser account behind it so you can pull their ads. Six ad libraries, six different answers to "find advertiser id from domain", and one of them has no real answer at all. This is how each platform behaves, how we score the candidates, and where the matching still goes wrong.

Why there is no single advertiser ID per domain

An ad library is keyed by advertiser, and an advertiser is whatever entity paid for the ad. That is rarely "the brand". On Google, nike.com resolves to Nike Retail BV, Nike, Inc. and NIKE GLOBAL TRADING B.V. SINGAPORE BRANCH. On TikTok it is NIKE Retail B.V. On Meta and LinkedIn it is a page that happens to be called Nike.

So the honest output of a domain lookup is a list with a confidence per entry, not one id. That is what GET /v1/advertisers/resolve returns: ids in the form <platform>:<platform id>, each with a score from 0 to 1 and a match_reason.

Every platform exposes a different piece of evidence. Some is strong, some is a guess.

Platform Evidence we use Strength
Meta Landing URLs of the page's own ads Strong when most ads link to the domain
Google Native domain search in the Ads Transparency Center Strong, but agencies show up too
TikTok Landing URL of the advertiser's newest ad Good for active advertisers
LinkedIn Website field on the company page Strong
Pinterest Verified profile domain Strong
X Handle name only Weak, no domain proof

Meta: Facebook page ID from a domain

Meta's Ad Library has no "advertisers for this domain" search, so a Facebook page ID from a domain has to be inferred. We look up candidate pages by the brand name, sample their ads and check where the landing URLs point. For nike.com, 11 of the 12 sampled ads of page 15087023444 linked to nike.com, so the page gets a score of 1.0 with match_reason: domain. The response also carries the evidence in extra (ads_linking_domain, ads_sampled, domain_evidence: landing_urls).

The weak spot: a page with no recent ads has no landing URLs to sample. Then all we have is the name.

Google: native advertiser ID lookup by domain

Google is the easy one. The Ads Transparency Center supports domain search natively, so a Google Ads advertiser ID lookup by domain returns the AR… ids of every entity with ads on that domain. Nike Retail BV (google:AR18378488041124659201) and Nike, Inc. (google:AR16735076323512287233) both come back at 0.97.

We cap a pure domain match at 0.97 on purpose. Agencies and resellers that run ads for a domain also match it, and the score should leave room for that doubt.

TikTok: the newest ad's landing URL

TikTok's Ad Library (EU, UK and Switzerland) has no domain field on advertisers. We find candidates by name and check the landing URL of each one's newest ad. NIKE Retail B.V. (tiktok:6876453864464188162, verified) matches nike.com and scores 0.97. An advertiser that has not run anything recently cannot be confirmed this way.

LinkedIn, Pinterest and X

LinkedIn company pages have a website field, which is good evidence. Company 2029 lists nike.com and scores 1.0. Pinterest shows a verified profile domain, so the "Nike" profile also lands at 1.0.

X is the exception. Its Ads Repository lets you search by handle, and the account says nothing verifiable about a website. Handle 415859364 is called Nike, so it scores 0.75 with match_reason: name. Treat X results as a suggestion to check by hand. X is also in beta with us: its ad search often answers 503 "over capacity", see /platforms for the current state.

How we score each candidate

Each platform adapter gives a first score. Then we adjust it with the domain evidence:

  • Domain matches (the platform's domain equals yours or is a subdomain of it): the score rises by 0.3, up to 0.97, and match_reason is domain. A platform that already reported 1.0, like Meta with 11 of 12 matching landing URLs, keeps it.
  • A different domain: if the platform names some other website, the score is capped at 0.3. We report it as name because the name is all that matched.
  • Name only: an exact name match (lowercased, punctuation removed) gets at least 0.75, a prefix match like "Nike Football" for nike gets at least 0.45, and a verified account with an exact name gets another 0.1.
  • History: if our archive already linked an advertiser to the domain on earlier crawls, it comes back with match_reason: history and 0.9, or pushes an existing match to at least 0.95.

Anything at 0.05 or below is dropped. max_per_platform (default 3, up to 10) limits how many candidates you get per platform. The domain check endpoint only looks at candidates scoring 0.7 or more, and only the best one per platform.

A real resolve request and response

Here is the call for nike.com, captured on 26 Oct 2026 from Germany, trimmed to the fields that matter.

Shell
curl -H "X-API-Key: $ADLIB_API_KEY" \
  "https://api.adlibapi.com/v1/advertisers/resolve?domain=nike.com"
JSON
{
  "data": {
    "domain": "nike.com",
    "advertisers": [
      { "id": "meta:15087023444", "name": "Nike", "score": 1, "match_reason": "domain", "verified": true },
      { "id": "meta:51212153078", "name": "Nike Football", "score": 0.45, "match_reason": "name", "verified": true },
      { "id": "google:AR18378488041124659201", "name": "Nike Retail BV", "score": 0.97, "match_reason": "domain" },
      { "id": "google:AR16735076323512287233", "name": "Nike, Inc.", "score": 0.97, "match_reason": "domain" },
      { "id": "tiktok:6876453864464188162", "name": "NIKE Retail B.V.", "score": 0.97, "match_reason": "domain", "country": "Netherlands" },
      { "id": "tiktok:7587573238117498896", "name": "NIKE COM SRL", "score": 0.7, "match_reason": "name" },
      { "id": "linkedin:2029", "name": "Nike", "score": 1, "match_reason": "domain" },
      { "id": "pinterest:Nike", "name": "Nike", "score": 1, "match_reason": "domain", "verified": true },
      { "id": "x:415859364", "name": "Nike", "score": 0.75, "match_reason": "name" }
    ]
  }
}

The full response had 14 advertisers and cost 10 credits. A resolve that finds nothing costs 0. Prices per call are on /pricing.

Edge cases: subsidiaries, country pages and name collisions

Three kinds of results need a human decision, and the scores are built to make them visible.

Subsidiaries. Nike Retail BV and Nike, Inc. are both real Nike entities on Google with the same 0.97. In our index Nike, Inc. had 25 creatives and Nike Retail BV 23. You usually want both. The Singapore trading branch came back at 0.92 with no ads in our history yet.

Country entities. TikTok returned NIKE COM SRL and a second "Nike, Inc." at 0.7, and Pinterest returned "Nike S.r.l." at 0.7 and "nike.com.br" just under it. These are exact or near-exact names without domain proof. Some will be regional Nike accounts, some may be resellers. The 0.7 line is exactly where we stop trusting names in the domain check.

Name collisions. This is the case that breaks naive matching. Meta returned "Nike Football" (verified, 39,986,218 likes) and "Nike Run Club" next to the main Nike page (39,495,620 likes). If you pick the biggest verified page called Nike-something, you get the football page. Landing URL evidence is what separates them: the main page scored 1.0, the other two 0.45.

What to do with the IDs

Take everything with match_reason: domain or history and a score of 0.9 or more as confirmed. Review the 0.45 to 0.75 band by hand, or drop it. Then pass the ids to GET /v1/search?advertiser=meta:15087023444 or /v1/advertisers/{id}/ads?source=history to get the ads, including ended ones (we explain why that matters in why ad libraries forget ended ads).

If you only need a yes or no per company, the domain check endpoint in Clay and n8n is cheaper. If you want an agent to do the lookup for you, see asking Claude about competitor ads with MCP. The API reference lives at /for/developers.

Questions people ask

How do I find a Facebook page ID from a domain?
Meta's Ad Library has no domain lookup for advertisers. We search candidate pages by brand name, sample their ads and count how many landing URLs point to the domain; for nike.com, 11 of 12 sampled ads linked to nike.com, which gave page 15087023444 a score of 1.0.
Can I look up a Google Ads advertiser ID by domain?
Yes. The Google Ads Transparency Center supports domain search natively, so a lookup returns the legal entities that advertise for that domain, often more than one (for nike.com: Nike Retail BV and Nike, Inc.).
Which ad library cannot map a domain to an advertiser?
X. Its Ads Repository lets you search a handle, but nothing on the advertiser ties it to a website, so a domain lookup on X is a name match and we score it 0.75 at most for an exact name.
What does match_reason mean in the resolve response?
domain means the platform itself linked the advertiser to the domain, name means only the advertiser's name matched, and history means our own archive already linked that advertiser to the domain from earlier crawls.
How much does a domain lookup cost?
GET /v1/advertisers/resolve costs 10 credits per call and nothing if no advertiser is found. GET /v1/domains/{domain}/check costs 3 credits and is free if no platform could be checked.