# Google Ads Transparency API – YouTube Video Ads (`tubetext/google-ads-transparency-video`) Actor

Get any advertiser's YouTube video ads from Google Ads Transparency by brand, domain or advertiser ID. Returns video link, title, views, first/last shown dates, days running and creative IDs; optional transcript. $0.003 per ad (+$0.002 transcript); not-found advertisers are free. · by TubeText

- **URL**: https://apify.com/tubetext/google-ads-transparency-video.md
- **Developed by:** [TubeText Labs](https://apify.com/tubetext) (community)
- **Categories:** Videos, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.20 / 1,000 video ads

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Ads Transparency API – YouTube Video Ads

> **TubeText** · Ads & marketing · Pay per result. No login. Ready for AI agents. [All tools](https://apify.com/tubetext)

Get any advertiser's **video ads** from Google's public [Ads Transparency Center](https://adstransparency.google.com). You can use a brand name, a website domain or an advertiser ID.

You get one row per unique video:

- the **YouTube video** (link, title, channel, views, likes, duration);
- **first and last shown** dates and days running;
- every creative ID that runs the video;
- the ad's page on Google;
- optionally, the **transcript**.

No login, no Google Ads account.

### What you can do with it

- **Competitor ad research:** see which video ads a competitor runs on YouTube, how long each has been live, and what it says.
- **Weekly monitoring:** schedule it with **Only new ads** to get only the video ads that appeared since the last run. Skipped ads are free.
- **Creative libraries for AI:** feed the YouTube links and transcripts to an LLM, or to our [Video Ad Analyzer](https://apify.com/tubetext/video-ad-analyzer) for hook, angle and script teardowns.

### Input

| Field | What it does |
|---|---|
| `advertisers` | Brand names (`Nike`), domains (`nike.com`), advertiser IDs (`AR…`) or adstransparency.google.com advertiser links. A brand's own domain finds its ads most reliably. |
| `region` | Only ads shown in this country (`US`, `GB`, `DE`, …), or `anywhere`. |
| `dateFrom` / `dateTo` | Only ads shown in this period: a date (`2026-09-01`) or a period (`30 days`). |
| `maxAdsPerAdvertiser` | Unique playable videos per advertiser, newest first. Default 20, up to 500. |
| `onlyNew` | Skip videos this account already got for the same advertiser and region. |
| `includeVideoStats` | YouTube title, channel, views, likes, publish time, duration. Default on. |
| `includeTranscript`, `transcriptLanguages`, `includeSrt` | Spoken text from the video's YouTube captions. |

Example:

```json
{ "advertisers": ["nike.com", "adidas.com"], "region": "US", "dateFrom": "30 days", "maxAdsPerAdvertiser": 20, "includeTranscript": true }
```

### Output (one row per unique video ad)

```json
{
  "advertiserName": "Duolingo Inc",
  "matchedAs": "domain duolingo.com",
  "advertiserAdCountRange": "7",
  "videoHost": "youtube",
  "youtubeVideoId": "…",
  "youtubeUrl": "https://www.youtube.com/watch?v=…",
  "videoTitle": "Duo Plushie - Owl on the Prowl",
  "videoViews": 1308083,
  "firstShown": "2025-11-05",
  "lastShown": "2026-03-27",
  "daysRunning": 143,
  "creativeIds": ["CR…", "CR…", "CR…"],
  "adUrl": "https://adstransparency.google.com/advertiser/AR…/creative/CR…",
  "transcriptStatus": "ok",
  "transcript": "…",
  "status": "ok",
  "charged": true
}
```

- **Video ads hosted by Google**, not on YouTube (bought through Display & Video 360), come with `videoHost: "google"` and an HLS `videoStreamUrl` instead of a YouTube link.
- **Free explanation rows:** `not_found`, `no_ads`, `no_playable_video`, `no_new_ads`, `error`, `cost_limit_reached`.

### Pricing

- **$0.003 per video ad** delivered (lower on higher Apify plans).
- **+$0.002 per transcript**, only when transcripts are on and the video has captions.
- **Free:** advertisers not found, advertisers without video ads, skipped creatives, ads already delivered (with `onlyNew`), and failures.
- **Maximum cost per run** is respected. The run stops before the limit and adds a row telling you how to continue.

### Use it from code (API)

```bash
curl -X POST "https://api.apify.com/v2/acts/tubetext~google-ads-transparency-video/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"advertisers":["nike.com"],"region":"US","maxAdsPerAdvertiser":10}'
```

### Limits

- **About 15–18% of video creatives can't be resolved to a video and are skipped free.** These are AMP previews that load the ad from an internal Google host; neither the preview nor Google's public creative lookup names the video. The status line says how many were skipped. Every other video creative comes with its YouTube video or its Google-hosted stream.
- **Text and image ads are not included.** This Actor is for video ads only.
- **Transcripts** exist only for YouTube-hosted videos with captions. Google-hosted videos get `transcriptStatus: "not_on_youtube"` and are not charged for a transcript.
- **An ad is charged when its row is delivered**, i.e. with its video ID, all creative IDs and its dates. That holds even if YouTube refused the extra video stats for that one row (`videoStatsStatus` says so; the stats fields are then empty).
- **Dates** are what Google's transparency report shows (first and last shown, per day). `firstShown`/`lastShown` are the ad's worldwide dates; the `region` and date filters use Google's per-region dates, so an ad can match "last 30 days" in a region while its worldwide `lastShown` looks older (or the other way round).
- **Max ads per advertiser** counts playable videos: the Actor keeps reading the advertiser's creatives (up to 1,000) until it has that many, or the advertiser has no more. Impression ranges are not included yet.

### Related TubeText tools

- [Video Ad Analyzer](https://apify.com/tubetext/video-ad-analyzer): AI teardown (hook, angle, script, shot list) of video ads from Google Ads Transparency, the Meta Ad Library or links.
- [Meta Ad Library Scraper](https://apify.com/tubetext/meta-ad-library-videos): Facebook and Instagram ads.
- [YouTube Transcript API](https://apify.com/tubetext/youtube-transcript-fast): transcripts of any YouTube video, playlist or channel.

### Support

Found a bug or missing a field? [Open an issue](https://apify.com/tubetext/google-ads-transparency-video/issues). We read every one.

**Cost telemetry:** when a run ends unusually (for example it cost more than it earned), the Actor sends us a small anonymous summary via a webhook: run ID, duration, memory, compute and AI cost, whether the account is on a free or paid plan, and counts of free rows. We use it to keep prices fair. Your inputs, links and results are never sent.

# Actor input Schema

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

Brand names (Nike), domains (nike.com), advertiser IDs (AR...) or adstransparency.google.com advertiser links. A brand's own domain finds its ads most reliably.

## `region` (type: `string`):

Only ads shown in this country.

## `dateFrom` (type: `string`):

Only ads shown on or after this date (2026-09-01) or within a period ('30 days').

## `dateTo` (type: `string`):

Only ads shown on or before this date.

## `maxAdsPerAdvertiser` (type: `integer`):

Unique videos, newest first. A video that runs as several creatives is one row (all creative IDs are listed).

## `onlyNew` (type: `boolean`):

Skip videos this account already got for the same advertiser and region. Skipped ads are free.

## `includeVideoStats` (type: `boolean`):

Title, channel, views, likes, publish time and duration of the YouTube video.

## `includeTranscript` (type: `boolean`):

Spoken text from the YouTube video's captions. Charged only when a transcript exists.

## `transcriptLanguages` (type: `array`):

Preferred caption languages in order.

## `includeSrt` (type: `boolean`):

Transcript as SRT subtitles.

## `maxConcurrency` (type: `integer`):

Ads processed in parallel.

## Actor input object example

```json
{
  "advertisers": [
    "Nike"
  ],
  "region": "anywhere",
  "maxAdsPerAdvertiser": 20,
  "onlyNew": false,
  "includeVideoStats": true,
  "includeTranscript": false,
  "transcriptLanguages": [
    "en"
  ],
  "includeSrt": false,
  "maxConcurrency": 8
}
```

# Actor output Schema

## `ads` (type: `string`):

No description

# 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": [
        "Nike"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tubetext/google-ads-transparency-video").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": ["Nike"] }

# Run the Actor and wait for it to finish
run = client.actor("tubetext/google-ads-transparency-video").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": [
    "Nike"
  ]
}' |
apify call tubetext/google-ads-transparency-video --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tubetext/google-ads-transparency-video"
        }
    }
}
```

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/z31eflNO3k1MRZIlp/builds/jWSt8XTVYLoRC6ZRT/openapi.json
