YouTube Shorts Sponsorship Signals Scraper
Pricing
Pay per usage
YouTube Shorts Sponsorship Signals Scraper
Detect brand-deal signals in a YouTube channel's recent Shorts — spoken sponsor mentions in the transcript, disclosure hashtags, @brand/domain mentions — and score each Short's sponsorship likelihood (0.0–1.0).
Pricing
Pay per usage
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
🎯 What this scrapes
Influencer-intel SaaS dashboards charge $200–2 000/mo to tell agencies which creators run paid placements. This Actor surfaces the same signal from public data for a fraction of the cost. For every recent Short on a channel it pulls the title, view count, duration, tags, description, and — crucially — the spoken transcript, then scores how likely the Short is sponsored and lists the exact phrases that fired.
Shorts descriptions are mostly empty, so caption-only scrapers miss most deals. We read what the creator actually says, which is where Shorts sponsorships live.
🔥 What we handle for you
- 🛡️ Browser fingerprint impersonation —
curl-cffimimics a real Chrome TLS + HTTP/2 handshake, so YouTube sees a browser, not a bot. - 🍪 Consent-gate handling — we send the consent cookie YouTube requires before it will list a channel's Shorts. Skip it and you get zero results; we don't skip it.
- 🗣️ Transcript-first detection — spoken sponsor language is the primary signal, caught even when the description is blank.
- 🌐 Optional proxy rotation via Apify Proxy — datacenter is fine at low volume; residential scales it up.
- 🧱 Graceful degradation — a Short with no captions still emits a row (
has_transcript: false) instead of crashing the run. - 💰 Pay-Per-Event pricing — you only pay for Shorts that land in your dataset.
💡 Use cases
- Influencer-agency intel — see which creators run brand deals and which brands keep coming back.
- Competitive brand monitoring — track where a competitor's products show up across creators' Shorts.
- Sponsorship benchmarking — measure how often a niche's top channels run paid placements.
- Disclosure compliance audits — flag Shorts with spoken sponsorships but no
#addisclosure. - Creator vetting — gauge a channel's commercial density before signing a deal.
⚙️ How to use it
- Click Try for free at the top of the page.
- Add one or more channel handles —
@mkbhd,mkbhd, or a fullyoutube.com/@mkbhdURL all work. - Click Start. Rows stream into the run's dataset as each Short is scored.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
channels | array | yes | ["@mkbhd"] | Channel handles or URLs. Normalised to @handle. |
maxShortsPerChannel | integer | no | 20 | 1–200. How many recent Shorts to inspect per channel. |
language | string | no | "en" | Preferred transcript language; falls back to any available track. |
minSponsorshipScore | number | no | 0.0 | 0–1. Only emit rows scoring ≥ this. Set 0.5 to keep only likely-sponsored Shorts. |
proxyConfiguration | object | no | {"useApifyProxy": false} | Optional. Direct (no proxy) by default — YouTube degrades the player and transcript endpoints for shared datacenter IPs. Enable residential proxy only if you hit rate limits at high volume. |
Example input
{"channels": ["@mkbhd"],"maxShortsPerChannel": 20,"language": "en","minSponsorshipScore": 0.0,"proxyConfiguration": { "useApifyProxy": false }}
📤 Output
Every row is one Short.
| Field | Type | Notes |
|---|---|---|
channel | string | Channel handle (@handle). |
video_id | string | YouTube Short ID (11 chars). |
url | string | Canonical Shorts URL. |
title | string | Short title. |
published_text | ['string','null'] | Human-readable publish text when available. |
view_count | ['integer','null'] | Views at scrape time. |
length_seconds | ['integer','null'] | Duration in seconds. |
description | string | Short description (often empty for Shorts). |
tags | array | Video keywords/tags. |
has_transcript | boolean | True when a spoken transcript was retrieved. |
transcript_chars | integer | Character length of the transcript. |
hashtags | array | #hashtags found in description/transcript. |
mentions | array | @mentions found in the description. |
detected_brands | array | Brands inferred from mentions, domains, and tokens after code/sponsored by. |
sponsorship_signals | array | The literal phrases/tokens that fired. |
sponsorship_score | number | Heuristic sponsorship likelihood, 0.0–1.0. |
is_likely_sponsored | boolean | True when sponsorship_score >= 0.5. |
scraped_at | string | ISO-8601 timestamp of the scrape. |
Example output
{"channel": "@mkbhd","video_id": "n3V3LZh_r40","url": "https://www.youtube.com/shorts/n3V3LZh_r40","title": "My everyday carry, sponsored","published_text": null,"view_count": 2805352,"length_seconds": 58,"description": "#ad","tags": ["tech", "edc"],"has_transcript": true,"transcript_chars": 712,"hashtags": ["#ad"],"mentions": [],"detected_brands": ["Surfshark", "MARQUES"],"sponsorship_signals": ["this video is sponsored", "use code", "#ad"],"sponsorship_score": 1.0,"is_likely_sponsored": true,"scraped_at": "2026-06-13T10:00:00+00:00"}
🧮 How the score works
A transparent weighted sum over transcript + description + title, clamped to [0, 1]:
| Signal | Examples | Weight |
|---|---|---|
| Spoken strong | sponsored by, this video is sponsored, for sponsoring, use code, promo code, paid partnership | +0.5 each |
| Spoken weak | check out, link in bio, link in description, discount, % off | +0.15 each |
| Disclosure hashtag | #ad, #sponsored, #spon, #partner, #partnership, #collab | +0.4 each |
@mention / brand domain | @brand, brand.com (in description) | +0.1 each |
A single strong spoken signal crosses the 0.5 threshold and marks the Short as likely sponsored. The fired phrases are returned in sponsorship_signals so you can audit every call.
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.005 | One-off warm-up charge per run |
result | $0.004 | Per Short written to the dataset |
Example: 1 000 Shorts ≈ $4.00. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
The score is a heuristic, not a legal determination — treat is_likely_sponsored as a strong lead, not proof. Some Shorts (music-only, no narration) have no captions; those still emit a row with has_transcript: false and score only on description/hashtag signals. YouTube's official "Includes paid promotion" flag is not third-party accessible, so we infer from spoken + textual signals instead.
❓ FAQ
Why transcripts instead of captions/descriptions?
Because Shorts descriptions are almost always empty. The sponsorship lives in what the creator says, so we read the transcript first and treat description/hashtags as secondary signals.
What handle formats are accepted?
@mkbhd, mkbhd, youtube.com/@mkbhd, and full https://…/@mkbhd/shorts URLs all normalise to @mkbhd.
Do I need a proxy or API key?
No. The data path is keyless and works without a proxy at low volume. Add a proxy if you're scanning many channels.
Can I keep only the sponsored Shorts?
Yes — set minSponsorshipScore to 0.5 and only likely-sponsored Shorts are emitted (and billed).
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.