# YouTube Sponsorship Finder - Brand Deals & Codes (`gganbukim/youtube-sponsorship-finder`) Actor

Find which brands sponsor which YouTube creators. Reads each video's description and spoken captions and returns the sponsor, the tracked campaign link, the discount code and the timestamp of the read. Point it at a channel to see who pays them, or at a brand to map its whole creator roster.

- **URL**: https://apify.com/gganbukim/youtube-sponsorship-finder.md
- **Developed by:** [DONGMIN KIM](https://apify.com/gganbukim) (community)
- **Categories:** Social media, Videos, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 sponsorship founds

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/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

## YouTube Sponsorship Finder — Which Brands Pay Which Creators

Point it at a channel and get **every brand deal in its back catalogue**: the sponsor, the
tracked campaign link, the discount code, and the second the read starts.

Point it at a brand instead and get the reverse — **every creator running that brand**,
which is how you map a competitor's entire influencer roster in one run.

No API key, no login, no YouTube Data API quota.

### Why this is not another transcript scraper

There are eight transcript Actors on this store. All of them hand you the words and stop.
The words contain a commercial fact worth more than the text: *who is taking money from
whom, on what link, with what code.*

```
brilliant.org/veritasium      hensonshaving.com/veritasium   code: veritasium
ground.news/nutshell          saily.com/johnnyharris         code: johnnyharris
ridge.com/MKBHD               80000hours.org/veritasium
```

Those paths are campaign identifiers. A sponsor hands each creator a URL with the
creator's own name in it — which is both the strongest possible proof a deal exists, and
the join key that lets you go from one brand to every creator carrying it.

### What it does well

- **Two independent sources.** The description carries the link, the code and the offer. The captions prove it was *read out* and give the timestamp. Measured across 27 videos: description alone found 22, captions alone 19, together 24.
- **It knows what is not a sponsorship.** A creator's own merch store, an Amazon affiliate aggregator and a link shortener all sit in the same paragraph and match every cue word. Those are excluded — `shop.mkbhd.com` is Marques selling shirts, not a brand deal.
- **It refuses to bill for a row it cannot name.** A read with no attachable link proves something was sold and cannot say by whom. Those are counted in the run summary and **never charged**.
- **Filters run before billing** — one brand, tracked links only, or read-aloud only. Filtered rows cost nothing.

### Input

```jsonc
{
  "videoUrls": ["@veritasium", "@JohnnyHarris"],
  "maxVideos": 200,
  "trackedLinksOnly": true
}
```

Mapping one brand instead:

```jsonc
{
  "videoUrls": ["@mkbhd", "@LinusTechTips", "@Kurzgesagt"],
  "brandContains": ["ground.news"],
  "maxVideos": 500
}
```

#### Every option

The same wording you see in the Apify console, with the JSON key for API and MCP callers.

| Option | What it does | Default |
|---|---|---|
| **Channels, videos or playlists** — `videoUrls` *(required)* | @handles, channel URLs, playlist URLs or watch URLs. Channels are expanded into their videos automatically. | — |
| **Max videos** — `maxVideos` | Cap on videos scanned. Each costs two cheap requests and only yields a row if a deal is found. | `100` |
| **Only these brands** — `brandContains` | Case-insensitive fragments matched against the sponsor's domain. Empty means every brand. Filtered rows are not billed. | — |
| **Tracked campaign links only** — `trackedLinksOnly` | Keep only deals where the sponsor gave the creator a URL with their own name in it. | `false` |
| **Read aloud only** — `readAloudOnly` | Keep only deals also spoken in the video, so every row carries a timestamp. | `false` |
| **Caption languages** — `languages` | Priority order for the caption track used to find spoken reads. The description is read regardless. | `["en"]` |
| **Concurrency** — `concurrency` | Videos processed in parallel. | `8` |
| **Proxy** — `proxyConfiguration` | Leave the default. Starts on cheap datacenter proxies and escalates only if YouTube throttles. | `{"useApifyProxy":true}` |

### Output

One row per brand per video.

```json
{
  "videoId": "wt4p2oalmRY",
  "videoUrl": "https://www.youtube.com/watch?v=wt4p2oalmRY",
  "videoTitle": "Is spider web really stronger than steel?",
  "publishedAt": "2026-08-05",
  "viewCount": 5500000,
  "channelName": "Veritasium",
  "channelId": "UCHnyfMqiRRG1u-2MsSQLbXA",
  "channelUrl": "https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA",
  "brand": "hensonshaving.com",
  "brandDomain": "hensonshaving.com",
  "sponsorUrl": "https://hensonshaving.com/veritasium",
  "campaign": "veritasium",
  "trackedLink": true,
  "code": "veritasium",
  "offer": "20% off",
  "source": "description+transcript",
  "readAtSeconds": 964,
  "evidence": "Get a Henson razor at hensonshaving.com/veritasium and use code veritasium…",
  "spokenEvidence": "Thanks to Henson Shaving for sponsoring this video. See, facial hair resists more than you think…",
  "scrapedAt": "2026-08-20T09:14:02.113Z"
}
```

#### Every field

You are billed per sponsorship delivered, so here is everything a row can contain.

**The deal**

| Field | What it is |
|---|---|
| `brand` / `brandDomain` | The sponsor's domain, which is the stable identifier. `ground.news` is the same advertiser however the read phrases it. |
| `sponsorUrl` | The exact URL from the description, including the campaign path. |
| `campaign` | The path when it carries the creator's name — `veritasium`, `nutshell`, `MKBHD`. This is the sponsor's own campaign id, and the join key for mapping a brand's roster. |
| `trackedLink` | `true` when that path was found. A cue word can be a coincidence; a third-party domain carrying the creator's handle is a deal. |
| `code` | The discount code, when one is stated. |
| `offer` | The stated offer — `20% off`, `$10 off`, `free trial`. |

**The evidence**

| Field | What it is |
|---|---|
| `source` | `description`, or `description+transcript` when the same brand was also spoken. |
| `readAtSeconds` | Where the spoken read starts. Absent when the deal appears only in the description — a timestamp pointing at the wrong read is worse than none. |
| `evidence` | The description text around the link. |
| `spokenEvidence` | The caption text around the read, when there was one. |

**The video and creator**

| Field | What it is |
|---|---|
| `videoId` / `videoUrl` / `videoTitle` | The video the deal was found in. |
| `publishedAt` | Upload date, so you can see when a brand started or stopped with a creator. |
| `viewCount` | Views at the time of the run — a rough proxy for what the placement was worth. |
| `channelName` / `channelId` / `channelUrl` | The creator taking the money. |
| `scrapedAt` | When this run read the video. |

### Who this is for

- **Influencer agencies** building a creator shortlist that already runs deals in a category.
- **Brand and growth teams** checking which creators a competitor sponsors, how often, and what offer they run.
- **Creators and managers** benchmarking rate cards against who else a brand is paying.
- **Analysts** tracking a brand's spend footprint across YouTube over time.

### What it does not do

It finds deals that are **disclosed** — a link in the description, or a read in the audio.
It cannot see an undisclosed placement, and it does not estimate what a deal was paid.
It will also miss a read in a video with no captions in your chosen languages, unless the
description also carries the link.

Detection was measured on 27 videos across five channels while this was built: the
description found 22, the captions 19, and the two together 24, with no false positives in
that sample. **Recall on a larger labelled sample has not been measured** — treat an empty
result as "nothing disclosed that we could attribute", not as proof of no sponsorship.

### Common uses

- **Roster mapping** — run a brand fragment across 20 creators and see every one carrying it.
- **Category shortlist** — scan a niche and rank creators by how many distinct brands they run.
- **Competitive timeline** — `publishedAt` per deal shows when a brand entered or left a creator.
- **Rate benchmarking** — brands, offers and view counts side by side.

### Pricing

Pay per **sponsorship delivered** — $8.00 per 1,000. Videos with no deal, rows removed by
your filters, and reads that could not be attributed to a brand **cost nothing**.

Starting a run costs $0.00002 — the platform's $0.00001 minimum, charged once per GB of
memory, and these Actors run on 2 GB. That is two thousandths of a cent per run.

Scanning is the expensive part and you are not billed for it: a 500-video channel with
forty deals costs forty rows, not five hundred.

### Other Actors in this family

Same engines, same billing, no account or API key on any of them.

**YouTube & video**

- [Download YouTube Subtitles in Bulk — SRT, VTT & Text](https://apify.com/gganbukim/youtube-transcript-scraper) — Bulk subtitles from videos, channels or playlists — text, SRT, VTT or RAG chunks.
- [Export YouTube Comments to CSV — Replies and Likes](https://apify.com/gganbukim/youtube-comments-scraper) — Every comment and reply thread, with likes, authors and creator flags.
- [List Every Video on a YouTube Channel — Export to CSV](https://apify.com/gganbukim/youtube-channel-scraper) — A channel's whole back catalogue plus a subscriber and RSS summary row.
- [YouTube Search API — Bulk Results, No Quota](https://apify.com/gganbukim/youtube-search-scraper) — Many search terms at once, every result as a row, filtered before you are billed.
- [Track Deleted YouTube Videos & Title Changes](https://apify.com/gganbukim/youtube-channel-monitor) — What a channel quietly changed: deleted videos, rewritten titles, view velocity.
- [YouTube Creator Email Finder & Sponsor Lookup](https://apify.com/gganbukim/youtube-creator-leads) — A channel list into leads: the published email, audience bands, and who already sponsors them.
- [Export a YouTube Playlist to CSV — Every Video](https://apify.com/gganbukim/youtube-playlist-scraper) — Any playlist as a table, with each video position in it.

**Search demand**

- [AnswerThePublic Alternative — Autocomplete Keyword API](https://apify.com/gganbukim/long-tail-keyword-scraper) — One seed into hundreds of real keywords from Google, YouTube and Amazon autocomplete.
- [Google Trends API — Today's Trending Searches, No Key](https://apify.com/gganbukim/google-trends-scraper) — Today's trending searches by country, with traffic bands and the news behind them.

**E-commerce**

- [Export Any Shopify Store's Products to CSV or JSON](https://apify.com/gganbukim/shopify-product-scraper) — Any Shopify catalogue: variants, SKUs, live prices, stock, images, collections.
- [New Shopify Product Alerts — Competitor Drop Tracker](https://apify.com/gganbukim/shopify-new-arrivals-monitor) — Only what a store launched since the last run. Scanning is free.

**Hiring**

- [Greenhouse, Lever & Ashby Job Scraper — No API Key](https://apify.com/gganbukim/ats-job-scraper) — Paste a company domain, get its open roles from Greenhouse, Ashby, Lever or SmartRecruiters.
- [Ghost Job Detector — Track Reposts, Closures & Edits](https://apify.com/gganbukim/job-lifecycle-monitor) — What changed on a careers page: opened, closed, quietly reposted, or a ghost job.

### FAQ

**Will I get blocked, or my account banned?** There is no account to ban — no login, no cookies. It reads public descriptions and caption tracks, starting on datacenter proxies and escalating only if YouTube throttles. YouTube signals throttling with an HTTP 200 and an error body rather than an error code, which is the trap that silently halves most scrapers' results; this one detects it by reason and rotates.

**Is it legal to scrape this?** It reads the public description and public caption track
that YouTube serves for every video, with no login and nothing bypassed. Sponsorship
disclosures are, by design, public statements — the FTC and its equivalents require them
to be. YouTube's Terms of Service are a separate contract question, and what you do with a
list of creators is governed by marketing and privacy law regardless of where the list came
from. Not legal advice.

**How accurate is it?** See "What it does not do" above — the measured numbers are there
rather than a claim of completeness.

**Why is `brand` a domain and not a company name?** Because the domain is stable and
joinable. A read might say "Henson", "Henson Shaving" or "Henson razors"; the link says
`hensonshaving.com` every time.

**How much does 1,000 sponsorships cost?** $8.00, plus $0.00002 for the run.

**Can I export the results to Excel or Google Sheets?** Yes. Every run's dataset downloads
as CSV, Excel, JSON, XML or RSS from the Storage tab, or straight from the API if you want
a live link a spreadsheet can pull.

**Can I connect it to Zapier, Make or n8n?** Yes — Apify publishes integrations for all
three, plus webhooks that fire when a run finishes.

**Do I need to write code?** No. Fill the form in the console and press Start. It is also
available over MCP so an AI agent can call it directly.

**Can I run it on a schedule?** Yes, via Apify Schedules, webhooks, or the API. Scheduling
it on a creator list is how you catch a new brand deal the week it starts.

# Actor input Schema

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

@handles, channel URLs, playlist URLs, or individual watch URLs. A channel is expanded into its videos automatically — that is the usual way to run this.

## `maxVideos` (type: `integer`):

Cap on videos scanned, counting those pulled out of channels and playlists. Each video costs two cheap requests and only yields a row if a deal is found.

## `brandContains` (type: `array`):

Case-insensitive fragments matched against the sponsor's domain — "brilliant", "ground.news". Leave empty for every brand. This is how you map one brand's whole creator roster. Filtered rows are not billed.

## `trackedLinksOnly` (type: `boolean`):

Keep only deals where the sponsor gave the creator a URL with their own name in it (brilliant.org/veritasium). That path is the campaign id, and its presence is the strongest proof a deal exists.

## `readAloudOnly` (type: `boolean`):

Keep only deals that were also spoken in the video, so every row carries a timestamp. Drops description-only affiliate placements.

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

Priority order for the caption track used to find spoken reads. The description is read regardless of language.

## `concurrency` (type: `integer`):

Videos processed in parallel.

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

Leave the default. The actor starts on cheap datacenter proxies and escalates to residential only if YouTube actually throttles it.

## Actor input object example

```json
{
  "videoUrls": [
    "@veritasium",
    "@JohnnyHarris"
  ],
  "maxVideos": 100,
  "trackedLinksOnly": false,
  "readAloudOnly": false,
  "languages": [
    "en"
  ],
  "concurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per sponsorship found: the brand, the tracked campaign link, the discount code, the quoted evidence and the timestamp of the read.

## `runSummary` (type: `string`):

Counts for this run: videos scanned, videos carrying a deal, sponsorships delivered, rows filtered, videos without captions, and reads that were detected but could not be attributed to a brand — which are never billed.

# 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": [
        "@veritasium",
        "@JohnnyHarris"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gganbukim/youtube-sponsorship-finder").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": [
        "@veritasium",
        "@JohnnyHarris",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("gganbukim/youtube-sponsorship-finder").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": [
    "@veritasium",
    "@JohnnyHarris"
  ]
}' |
apify call gganbukim/youtube-sponsorship-finder --silent --output-dataset

```

## MCP server setup

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

```

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/0JzeNUAd0R8bp60qK/builds/OcKRBCxyoBSo7oAyX/openapi.json
