# YouTube Sponsorship Tracker (`switkowski/youtube-sponsor-segments`) Actor

Find paid sponsorships in YouTube videos: the brand, promo code, tracking link and ad-read timestamps, plus the creator's exact words. Works on any video with captions, in any language.

- **URL**: https://apify.com/switkowski/youtube-sponsor-segments.md
- **Developed by:** [Stephen Witkowski](https://apify.com/switkowski) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $25.00 / 1,000 video processeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## YouTube Sponsorship Tracker

Find every paid sponsorship in a YouTube video: which brand paid, when the ad read starts and ends, the promo code, the tracking link, and the exact words the creator said. Paste video links, or a channel to check its latest videos, and get structured sponsorship data back in about a minute per video.

### What you get for each video

- **Every sponsor read** with start and end timestamps, so you can jump straight to the ad.
- **The brand**, spelled the way the sponsor spells it, even when the captions mishear it.
- **The promo code and tracking link** from the video description, such as `SpagCoat` or `drinklmnt.com/huberman`.
- **Sponsor or affiliate**, so paid ad reads are kept apart from affiliate-link product mentions.
- **The ad read transcript**, the creator's own words for each promotion.
- **YouTube's "Includes paid promotion" flag**, the video's view count, and an estimated sponsor spend.

### Who uses it

- **Influencer marketing agencies** checking which brands a creator already works with before pitching a deal, by scanning the creator's channel.
- **Brands** tracking where competitors spend on creators, and which codes and offers they use.
- **Sponsorship and podcast ad sellers** building lists of active YouTube advertisers to prospect.
- **Copywriters and marketers** studying how top creators deliver ad reads.

### Example

From a 2-hour Huberman Lab episode:

| Time | Type | Brand | Link |
|---|---|---|---|
| 13:12 to 14:21 | sponsor | David | davidprotein.com/huberman |
| 14:21 to 15:47 | sponsor | Eight Sleep | eightsleep.com/huberman |
| 42:53 to 44:07 | sponsor | AG1 | drinkag1.com/huberman |
| 1:15:13 to 1:16:32 | sponsor | LMNT | drinklmnt.com/huberman |
| 1:35:23 to 1:37:02 | sponsor | Function | functionhealth.com/huberman |

The captions say "Element". The tracker reads the description and reports the brand correctly as LMNT.

### Check a whole channel

Add a channel URL or @handle and the tracker checks the channel's most recent long videos, up to 30. Shorts are skipped. Scanning the three latest Huberman Lab episodes found 13 sponsor reads from 8 brands: AG1, David, Eight Sleep, Function, Helix Sleep, Lingo, LMNT and Mateina, each with its tracking link.

### Ready-made examples

Open one, look at its results, then swap in your own videos or channels:

- [Find a YouTube creator's recent sponsors](https://apify.com/switkowski/youtube-sponsor-segments/examples/find-youtube-creator-sponsors)
- [Track sponsors across tech YouTube channels](https://apify.com/switkowski/youtube-sponsor-segments/examples/track-tech-youtube-sponsors)
- [Track sponsors on science YouTube](https://apify.com/switkowski/youtube-sponsor-segments/examples/science-youtube-sponsors)
- [Get podcast sponsors, links and promo codes](https://apify.com/switkowski/youtube-sponsor-segments/examples/podcast-sponsors-promo-codes)
- [Find promo codes in YouTube sponsor reads](https://apify.com/switkowski/youtube-sponsor-segments/examples/find-youtube-promo-codes)
- [Get sponsor timestamps for one YouTube video](https://apify.com/switkowski/youtube-sponsor-segments/examples/youtube-video-sponsor-timestamps)
- [Find sponsors in Spanish-language YouTube videos](https://apify.com/switkowski/youtube-sponsor-segments/examples/spanish-youtube-sponsors)

### How it works

1. **Captions and description.** The actor reads the video's captions and its description, which usually lists the sponsor's exact name, link and promo code.
2. **AI detection.** An AI model finds every paid promotion spoken in the video, names the company as the sponsor spells it, and copies the link and code from the description.
3. **Sponsor or affiliate.** Each segment is marked `sponsor` when the company paid for that mention, or `affiliate` when the creator recommends a product with a referral or affiliate link. The creator's own merch, courses and memberships are left out.

The video itself is never downloaded, so a 60-minute video costs about the same as a 5-minute one.

### Input

| Field | Description |
|---|---|
| `videoUrls` | YouTube URLs or video IDs |
| `channelUrls` | Channel URLs or @handles. Each channel's most recent long videos are checked. |
| `maxVideosPerChannel` | How many recent videos to check per channel, from 1 to 30. Default 10. |
| `sponsorCpmLow`, `sponsorCpmHigh` | The range a sponsor pays per 1,000 views, used for the spend estimate. Default $20 to $50. |
| `languages` | Caption languages to try, in order. Default `en`. |
| `proxyConfiguration` | Datacenter proxy by default, with automatic residential retry when YouTube blocks a request. |

### Output

```json
{
  "videoId": "o0O_fiH7CqU",
  "url": "https://www.youtube.com/watch?v=o0O_fiH7CqU",
  "title": "This Was Way Harder Than It Looks",
  "channelName": "The Wood Whisperer",
  "channelId": "UC...",
  "hasTranscript": true,
  "transcriptStatus": "ok",
  "paidPromotion": true,
  "sponsors": "Carbon Method",
  "affiliates": "Titebond",
  "sponsorCount": 3,
  "viewCount": 119408,
  "estSponsorSpendLowUsd": 7164,
  "estSponsorSpendHighUsd": 17911,
  "promoCodes": "Carbon Method: SpagCoat",
  "adTimes": "Carbon Method 0:09–0:19; Titebond 17:54–18:06; Carbon Method 19:14–20:43; Carbon Method 24:55–25:39",
  "cached": false,
  "segments": [
    {
      "start": 1154, "end": 1246, "type": "sponsor",
      "brand": "Carbon Method", "promoCode": "SpagCoat",
      "link": "https://carbonmethod.com/benchnuts/?ref=mjguvwfm",
      "text": "Now at the top of the show, I mentioned our sponsor today is Carbon Method..."
    }
  ]
}
```

`transcriptStatus` is `ok`, `unavailable` when the video has no captions, or `blocked` when YouTube refused the request, which is worth retrying later. `paidPromotion` is YouTube's own "Includes paid promotion" flag. `cached` is true when the result was served from earlier processing of the same video. `sponsors` and `affiliates` list each video's brands in plain text, `sponsorCount` counts its paid sponsor reads, `promoCodes` lists each brand's code, and `adTimes` lists when each promotion starts and ends. `viewCount` is the video's views when it was processed.

**Estimated sponsor spend.** Sponsorship prices are private, so the tracker estimates them the way the industry quotes them: views ÷ 1,000 × a CPM, once per paid sponsor read. CPM is the price per 1,000 views. With the default $20 to $50 range, the example above, with 119,408 views and three Carbon Method reads, estimates $7,164 to $17,911. Treat it as a range, not a fact. Views keep growing after a deal is signed, and big creators often negotiate flat fees. Set your own CPM range for your niche. A link is returned only when its domain appears in the video description, and a promo code only when it appears in the description or the captions, so neither is ever made up. When the captions mishear a brand that the description lists, the description's spelling is used. When a sponsor isn't listed in the description, the brand is spelled from the captions and can be misspelled.

In Apify Console the results open as two tables: **Sponsors by video**, one row per video, and **Every ad read**, one row per promotion.

### Pricing

Pay per event: $0.025 per video processed, plus $0.03 per promotion found. A video is free when its captions could not be read.

For example, 100 videos that average one sponsor each cost about $5.50. Checking a channel's last 10 videos that average two sponsors each costs about $0.85.

### How accurate is it?

We tested it on 40 videos uploaded in the same month, from 40 kinds of channel in six languages:

- It found 17 of the 18 paid ad reads that SponsorBlock users had labeled by hand.
- It found 6 more real ad reads that SponsorBlock users had never labeled.
- It flagged nothing on 20 videos with no ads.

A follow-up test of the current version on 24 of those videos, run three times:

- It captured the sponsor's tracking link in all 21 cases where the description listed one.
- It found the one ad read the first test missed, a product mention in the middle of a conversation, in every run.
- It still flagged nothing on videos with no ads.

### FAQ

**Does it download the video?** No. It reads captions and the description, which is why it's fast and the same price for a 5-minute or a 3-hour video.

**Are Shorts included?** Not in channel scans, which check long videos only, since Shorts rarely carry sponsor reads. A Short you list directly under `videoUrls` is processed like any video.

**Which languages work?** Any language with captions on YouTube. Set `languages` to the caption languages you want, in order of preference. It has been tested in English, Spanish, Portuguese, French, German and Hindi.

**What counts as a sponsor?** A company that paid for the mention in that video. Affiliate-link product recommendations are returned with the type `affiliate`. The creator's own merch, courses and memberships are not included.

**What if a video has no captions?** The video comes back empty, `transcriptStatus` tells you why captions were missing, and you are not charged.

**Can I use it from my own code or an AI agent?** Yes. Call it through the Apify API, the Apify client libraries, or Apify's MCP server from an AI assistant.

**How is this different from a YouTube transcript scraper?** A transcript scraper gives you the whole text, and you still have to find the ads, name the brands and match the codes. This gives you only the sponsorships, already structured.

# Actor input Schema

## `videoUrls` (type: `array`):

YouTube video URLs or 11-character video IDs.

## `channelUrls` (type: `array`):

YouTube channel URLs or @handles. The tracker checks each channel's most recent long videos. Shorts are skipped.

## `maxVideosPerChannel` (type: `integer`):

How many of each channel's most recent videos to check, from 1 to 30.

## `sponsorCpmLow` (type: `integer`):

Low end of what a sponsor pays per 1,000 views, used for the spend estimate. Industry guides put tech YouTube at about $20 to $60.

## `sponsorCpmHigh` (type: `integer`):

High end of what a sponsor pays per 1,000 views, used for the spend estimate.

## `languages` (type: `array`):

Caption languages to try, in order of preference.

## `proxyConfiguration` (type: `object`):

Datacenter proxy is tried first. If YouTube blocks it, the actor retries automatically on residential proxy.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.youtube.com/watch?v=y-fRFiTrrg4"
  ],
  "maxVideosPerChannel": 10,
  "sponsorCpmLow": 20,
  "sponsorCpmHigh": 50,
  "languages": [
    "en"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

One item per video, with its sponsor and affiliate segments.

# 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 = {
    "videoUrls": [
        "https://www.youtube.com/watch?v=y-fRFiTrrg4"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("switkowski/youtube-sponsor-segments").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 = { "videoUrls": ["https://www.youtube.com/watch?v=y-fRFiTrrg4"] }

# Run the Actor and wait for it to finish
run = client.actor("switkowski/youtube-sponsor-segments").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 '{
  "videoUrls": [
    "https://www.youtube.com/watch?v=y-fRFiTrrg4"
  ]
}' |
apify call switkowski/youtube-sponsor-segments --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,switkowski/youtube-sponsor-segments"
        }
    }
}
```

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/dOshXSwWRMoovqBji/builds/M3Ek4fsNX6bAV2Zoi/openapi.json
