# Google Advertiser Verifier 🕵️ (real company behind the ads) (`tagadanar/ads-advertiser-verifier`) Actor

Who is really paying for a Google ad, and are they a real company? The Ads Transparency Center advertiser record joined to the registers of France, the UK and Germany: legal name, registration number, still trading or in liquidation, insolvency and sanctions checks, scored. No API key.

- **URL**: https://apify.com/tagadanar/ads-advertiser-verifier.md
- **Developed by:** [Tagada Data](https://apify.com/tagadanar) (community)
- **Categories:** Lead generation, Automation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $17.50 / 1,000 advertiser verifieds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google Advertiser Verifier 🕵️ (real company behind the ads)

Find out who is actually paying for a Google ad, and whether they are a real
company. Give it a brand name, a landing domain or an Ads Transparency Center
advertiser ID and it comes back with the advertiser record Google publishes,
the matching legal entity in the official French, British or German company
register, whether that entity is still trading or in insolvency, a sanctions
screen, and a confidence score that shows its workings.

It answers the question a transparency page never does: the Center will tell
you that "Asos.com Limited" bought 80,000 ads, but not that the company number
is 03584121, that it was incorporated in June 1998, or that it is still active.

**No API key. Flat price per advertiser, platform usage included.** Duplicate
rows collapse before you are billed, so you can paste a whole ad export in and
pay once per advertiser rather than once per ad.

### Two tools, and the gap between them

Ad intelligence and company verification are sold separately, by different
vendors, to the same person. AdSpy is $149 a month and shows you the creatives.
A Dun & Bradstreet business information report starts at $139.99 for one company
and tells you whether the company is real and solvent. Neither one joins the two
sides, so the answer to "is this advertiser a company that still exists" is a
manual job somebody does in two browser tabs.

That join is what this actor sells, per advertiser, with no subscription.

| Question | Ad-intel subscription (AdSpy, $149/month) | Company report (D\&B, from $139.99 per company) | Ad-library scrapers on the Store | **This actor** |
| --- | --- | --- | --- | --- |
| Which ads is this advertiser running, and how recently? | yes | no | yes | yes, a sample plus Google's own ad-count bracket |
| Registered legal name and registration number | no | yes | no | yes, SIREN / UK company number / HRB |
| Still trading, dissolved, or in insolvency | no | yes | no | yes, register status plus BODACC, The Gazette, Insolvenzbekanntmachungen |
| Sanctions screen | no | sold separately | no | yes, OFAC SDN, UN, EU, UK OFSI, US Consolidated Screening List |
| Advertising while closed | no | no | no | yes, that is the flag this actor exists for |
| Cost of checking 40 advertisers once | $149 for the month | roughly $5,600 in single reports | ads only | 40 rows, paid per advertiser |

The D\&B figures are its own published self-serve prices for a single Business
Information Report; both vendors answer questions this actor does not, and the
claim here is narrow: for the specific question "who is behind this ad and are
they still a company", one run does it.

***

### What you get, per advertiser

| Field | What it tells you |
| --- | --- |
| `verdict` | One sentence a non-technical colleague can act on |
| `confidence`, `confidenceBand` | 0-100, plus `verified` / `likely` / `uncertain` / `unverified` |
| `riskFlags` | `advertising-while-closed`, `insolvency`, `closed`, `sanctions`, `no-registry-match`, `country-mismatch`, `stale-ads` and friends |
| `advertiserId`, `advertiserName`, `advertiserLegalName` | The Center's advertiser record and the legal name Google holds for it |
| `advertiserCountry`, `identityVerified` | Home country, and whether the Center carries an identity-verification record |
| `adCountLower`, `adCountUpper` | Google's own published ad-count bracket, not a guess |
| `firstAdSeen`, `lastAdSeen`, `daysSinceLastAd`, `stillAdvertising` | How recently the money was actually being spent |
| `adFormats`, `landingDomains`, `adSampleRegion` | What kind of ads, where they point, which market was measured |
| `otherAdvertisers` | Namesakes, or everyone else buying ads for the same domain |
| `registry`, `registryId`, `registryIdType` | SIRENE (FR), Companies House (UK), Handelsregister (DE) and the number |
| `legalName`, `tradingName`, `legalForm`, `activityCode` | The registered entity |
| `incorporationDate`, `dissolutionDate`, `companyStatus` | Age and whether it still exists |
| `registeredAddress`, `registeredCity`, `registeredPostalCode` | Registered office |
| `officers`, `employeesRange` | Directors and size band, where the register publishes them |
| `matchScore`, `matchType`, `matchAlternatives`, `registryNote` | How sure the name match is, and what else was close |
| `insolvencyStatus`, `insolvencyHits`, `insolvencySource` | BODACC, The Gazette or Insolvenzbekanntmachungen |
| `sanctionsStatus`, `sanctionsHits`, `sanctionsListsScreened` | OFAC SDN, UN, EU, UK OFSI, US Consolidated Screening List |
| `sectionsCompleted`, `sectionsSkipped` | Which checks ran, which did not, and exactly why |
| `confidenceBreakdown`, `confidenceReasons` | Every point the score is made of, in plain English |

#### Nothing is ever silently partial

Four independent sources answer each row, and any one of them can be having a
bad day. When that happens the row still ships, it names the section that was
skipped and the reason, and the confidence score is **rescaled over the checks
that actually ran** instead of quietly docking points for evidence nobody could
collect. `confidenceOutOf` tells you the raw denominator. A run where Google
rate-limited us still gives you every register, insolvency and sanctions
answer, and says so in `adsSkipReason`.

***

### Three ways to ask

**A brand name.** `"Zalando"` finds the advertiser Google publishes under that
name, preferring the one in the country you named and, failing that, the one
actually spending the money. A name that is not close enough to any advertiser
is refused rather than guessed at, and the register is then searched with your
own words.

**A landing domain.** `"made.com"` is settled by the ads that point at the
domain, not by a text search over advertiser names, which is how you learn that
the ads landing on made.com today are bought by Next PLC.

**An advertiser ID.** `"AR15589870916631265281"` goes straight to the record.

***

### Use cases

**Ad-fraud and brand-safety teams.** Pull the advertisers bidding on your brand
terms with [Google Ads Transparency Scraper](https://apify.com/tagadanar/ads-transparency-scraper),
pipe the dataset in here, and get back which of them are real registered
companies, which are dissolved shells still running ads, and which appear on a
sanctions list.

**Publishers and ad networks vetting demand partners.** A company number, an
incorporation date and an insolvency check before you extend credit to an
advertiser you have never heard of.

**Competitive intelligence.** Who owns the entity outspending you, when it was
incorporated, how many employees it declares, and whether the ad account
belongs to the parent or to a local subsidiary.

**Due diligence and journalism.** A defensible trail from an ad you saw to a
registration number in an official register, with the match score and the
runners-up shown.

**Lead qualification.** An advertiser that has spent money in the last 90 days
is a company with a marketing budget. Sort by `stillAdvertising` and
`adCountUpper`.

***

### Input examples

Paste any of these straight into the Input tab.

Three well-known European advertisers, three ways of naming them:

```json
{
  "advertisers": [
    { "advertiserName": "Zalando", "country": "DE" },
    "asos.com",
    { "advertiserName": "Doctolib", "country": "FR" }
  ]
}
```

A whole ad export from the Ads Transparency Scraper, deduplicated and billed
once per advertiser, scoped to ads served in France:

```json
{
  "advertisersDatasetId": "PASTE_THE_DATASET_ID_HERE",
  "adRegion": "FR",
  "maxAdvertisers": 200
}
```

A fast pass with no insolvency or sanctions work, for a first look at a long
list:

```json
{
  "advertisers": ["zalando.de", "asos.com", "otto.de", "boohoo.com"],
  "checkInsolvency": false,
  "screenSanctions": false
}
```

A CSV from your own system, with your own column names:

```json
{
  "advertisersCsvUrl": "https://example.com/advertisers.csv",
  "defaultCountry": "GB",
  "minMatchScore": 90
}
```

***

### Sources

Every source is an official register or the platform's own transparency
surface. There is no scraped third-party database anywhere in the chain, and
none of them needs an API key.

| Check | Source |
| --- | --- |
| Advertiser record, ad volume, ad dates | Google Ads Transparency Center |
| Company register, France | SIRENE and the RNE, via recherche-entreprises.api.gouv.fr |
| Company register, United Kingdom | Companies House (public search, or your own free API key) |
| Company register, Germany | Handelsregister, the Registerportal |
| Insolvency, France | BODACC |
| Insolvency, United Kingdom | The Gazette |
| Insolvency, Germany | Insolvenzbekanntmachungen |
| Sanctions | OFAC SDN and ALT, UN Consolidated, EU FSF, UK OFSI, US Consolidated Screening List |

***

### FAQ

**Which countries can you verify the company in?**
France, the United Kingdom and Germany today. Advertisers registered anywhere
else still get the full Ads Transparency section, and the row says plainly that
no register is covered for that country rather than pretending otherwise.

**How do you know which company register to search?**
Google publishes a home country for each advertiser, which is the country whose
identity check the advertiser passed. That routes the lookup. A country you
state yourself is used as the fallback and as a tiebreaker between namesakes,
and a disagreement between the two shows up as `country-mismatch`.

**What is an Ads Transparency Center advertiser ID?**
The `AR…` identifier in the URL of an advertiser page on
adstransparency.google.com. It is the most precise thing you can hand this
actor, and it is what our
[Google Ads Transparency Scraper](https://apify.com/tagadanar/ads-transparency-scraper)
puts in every row it produces.

**Can I check advertisers I found with another scraper?**
Yes. Give it a dataset ID or a CSV link and it picks the advertiser name,
company name, website or domain out of the usual field names by itself.

**Do I pay once per ad or once per advertiser?**
Once per advertiser. A 5,000-row ad export usually contains a few dozen
distinct advertisers, and the duplicates are collapsed before anything is
billed.

**What does the confidence score actually mean?**
How sure we are that the entity buying these ads is a real, currently-trading
company we can name. It is built from the register match, whether the company
is still alive, whether Google publishes it as an advertiser with recent ads,
and whether the addresses agree. `confidenceReasons` lists every point.

**Why is one advertiser "verified" and another only "likely"?**
Usually because the register holds more than one company with a very similar
name. When that happens the score is capped, `matchAlternatives` shows the
rivals and the verdict tells you to look. Adding a town or a postcode to the
row usually settles it.

**Does a sanctions hit lower the confidence score?**
No, and deliberately. A sanctioned company is a perfectly well-identified,
perfectly alive company. It rides in `riskFlags` and in the verdict, where you
can filter on it, instead of muddling a number that means something else.

**Do I need a Companies House API key?**
No. UK advertisers are checked through the free public company search. Your own
key, which is free, adds SIC codes and richer status data. It is never stored
and we never charge you for a Companies House lookup.

**What happens if Google rate-limits the run?**
The registers, insolvency sources and sanctions lists still answer, every
affected row carries the reason in `adsSkipReason` and `sectionsSkipped`, and
the confidence score is rescaled so a throttled Google does not demote a
perfectly verified company. Rows where nothing at all answered are not billed.

**Is this GDPR-friendly?**
The company registers, the insolvency gazettes and the sanctions lists are all
official public sources published for exactly this purpose. Director names come
from the register's own public record.

***

### Related actors

- [Google Ads Transparency Scraper](https://apify.com/tagadanar/ads-transparency-scraper)
  gets you every ad an advertiser runs, with creatives and dates. Its output
  pipes straight into this actor.
- [B2B Lead Verifier](https://apify.com/tagadanar/b2b-lead-verifier) does the
  register, insolvency and sanctions checks on a lead list that has nothing to
  do with advertising, and uses the same field names, so the two datasets join.
- [Sanctions Screener](https://apify.com/tagadanar/sanctions-screener) if the
  sanctions screen is the only part you need.
- [French Company KYC](https://apify.com/tagadanar/french-company-kyc),
  [German Company KYC](https://apify.com/tagadanar/german-company-kyc) and
  [Companies House Monitor](https://apify.com/tagadanar/companies-house-monitor)
  for deeper single-country work.

***

Google Ads Transparency Center, advertiser verification, advertiser lookup, ad
spender background check, who owns this ad, Google advertiser ID, ad fraud
detection, brand safety, demand partner vetting, KYC for advertisers, SIREN
lookup, Companies House lookup, Handelsregister lookup, BODACC, The Gazette
insolvency, Insolvenzbekanntmachungen, OFAC SDN screening, EU sanctions list,
UK OFSI, competitor ad spend, landing domain owner.

# Actor input Schema

## `advertisers` (type: `array`):

Brand names (<code>Zalando</code>), landing domains (<code>asos.com</code>) or Ads Transparency Center advertiser IDs (<code>AR15589870916631265281</code>). Objects work too, with any of <code>advertiserId</code>, <code>advertiserName</code>, <code>domain</code>, <code>country</code>, <code>city</code>, <code>postalCode</code>, <code>registrationNumber</code>. A town or a postcode makes the register match far more reliable when several companies share a name. Rows from a <a href='https://apify.com/tagadanar/ads-transparency-scraper' target='_blank'>Google Ads Transparency Scraper</a> run can be pasted in as they are: duplicates are collapsed, so you pay once per advertiser and not once per ad.

## `advertisersDatasetId` (type: `string`):

Verify the output of another run instead of pasting it. Paste the dataset ID of a Google Ads Transparency Scraper run, or of any scraper whose rows carry an advertiser name, company name or website. One row per ad is fine: the same advertiser is only verified, and only billed, once.

## `advertisersCsvUrl` (type: `string`):

A public, direct link to a CSV file. The header row names the columns; comma and semicolon files both work. Columns such as <code>advertiser</code>, <code>company</code>, <code>domain</code>, <code>country</code>, <code>city</code> are recognised automatically.

## `adRegion` (type: `string`):

Only count ads Google served in this country, so "still advertising" means still advertising in your market. Leave on Any country to date the advertiser's spend worldwide.

## `defaultCountry` (type: `string`):

Used only when Google publishes no country for the advertiser and the row does not state one either. Leave empty to report those advertisers as "country unknown" rather than guess a register.

## `checkInsolvency` (type: `boolean`):

Look every matched company up in BODACC (France), The Gazette (UK) and Insolvenzbekanntmachungen (Germany), so an advertiser still buying ads while in liquidation shows up as one. Adds about a second per advertiser.

## `screenSanctions` (type: `boolean`):

Screen every advertiser, its verified legal name and its directors against the OFAC SDN, UN, EU, UK OFSI and US Consolidated Screening lists, downloaded fresh from the official sources on every run. Adds about fifteen seconds once per run, then nothing per advertiser.

## `minMatchScore` (type: `integer`):

How close a registered legal name has to be to the advertiser name before we call it a match, from 70 (loose) to 100 (the exact legal name only). 82 keeps "Doctolib" matching "DOCTOLIB SAS" while rejecting look-alikes in another town.

## `companiesHouseApiKey` (type: `string`):

UK advertisers work without this: we fall back to the free public company search on GOV.UK. Supplying your own key (free from <a href='https://developer.company-information.service.gov.uk/' target='_blank'>developer.company-information.service.gov.uk</a>) adds SIC codes and richer status data. The key is yours, is never stored, and we never charge you for Companies House lookups.

## `maxAdvertisers` (type: `integer`):

Stop after this many distinct advertisers. Use it to cap what a run can cost. Duplicates are collapsed before this limit applies.

## Actor input object example

```json
{
  "advertisers": [
    {
      "advertiserName": "Zalando",
      "country": "DE"
    },
    "asos.com",
    {
      "advertiserName": "Doctolib",
      "country": "FR"
    }
  ],
  "adRegion": "",
  "defaultCountry": "",
  "checkInsolvency": true,
  "screenSanctions": true,
  "minMatchScore": 82,
  "maxAdvertisers": 500
}
```

# Actor output Schema

## `advertisers` (type: `string`):

One record per distinct advertiser: the Google advertiser record, the register match, insolvency, sanctions and the confidence score.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "advertisers": [
        {
            "advertiserName": "Zalando",
            "country": "DE"
        },
        "asos.com",
        {
            "advertiserName": "Doctolib",
            "country": "FR"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/ads-advertiser-verifier").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "advertisers": [
        {
            "advertiserName": "Zalando",
            "country": "DE",
        },
        "asos.com",
        {
            "advertiserName": "Doctolib",
            "country": "FR",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/ads-advertiser-verifier").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "advertisers": [
    {
      "advertiserName": "Zalando",
      "country": "DE"
    },
    "asos.com",
    {
      "advertiserName": "Doctolib",
      "country": "FR"
    }
  ]
}' |
apify call tagadanar/ads-advertiser-verifier --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tagadanar/ads-advertiser-verifier"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/5cWBebohzaEQrtxkk/builds/kV9yhcfUgNbMUSjxe/openapi.json
