# YouTube Sponsorship & Brand Deal Researcher (`danielmichalek/youtube-sponsorship-researcher`) Actor

Collect recent public YouTube channel-feed videos and flag unverified sponsorship, affiliate-link and discount-code signals.

- **URL**: https://apify.com/danielmichalek/youtube-sponsorship-researcher.md
- **Developed by:** [Daniel Michałek](https://apify.com/danielmichalek) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 video analyzeds

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 & Brand Deal Researcher

### Overview

This Actor collects recent videos from the public YouTube Atom feed for channel IDs you supply. It returns video titles, public descriptions, links, dates and view counts where the feed provides them. It flags explicit sponsorship disclosures, possible affiliate links and labelled discount codes for human review. It does not claim that a brand deal exists.

### Input

Provide channelIds as an array of UC channel IDs or canonical HTTPS /channel/ URLs. Up to 50 inputs are accepted; duplicates are removed. @handles, arbitrary websites, credentials in URLs and local addresses are rejected before any request. maxItems caps returned rows; maxVideosPerChannel caps examined entries per channel. onlyWithSignals removes rows without a detected disclosure, possible affiliate link or labelled code.

### Example

The reproducible sample input is in examples/input.json. Run npm install followed by npm test, then use the existing factory release tool with --local-run --write-example. examples/output.json is populated only from a real successful run, never from the synthetic test fixture.

### Output

Each row contains videoId, channelId, channelName, title, url, publishedAt, updatedAt, description, views, thumbnailUrl, sponsorshipStatus, sponsorEvidence, affiliateLinks, discountCodes, externalLinks, source and checkedAt. Missing feed fields remain null or empty rather than being invented. sponsorshipStatus is unverified-signals or no-explicit-signal. Neither value proves that a commercial relationship does or does not exist. Evidence is quoted from the public description.

The default key-value store also contains RESEARCH_SUMMARY and REPORT, including failed channels. HTTP failures and invalid feed responses are not emitted as video rows. If all channels fail, the Actor fails rather than returning a paid placeholder. A legitimately empty feed can succeed with zero rows. Duplicate video IDs are removed globally.

### Pricing

Pricing is $0.005 per returned video (video-analyzed), equivalent to $5 per 1,000 videos, plus $0.00005 for the Actor start event at the default memory setting. The synthetic default-dataset event is not charged in addition to the video event. Apify Console is authoritative for current pricing and any memory-based start-event multiplier. No paid proxies, external AI APIs or YouTube API key are used. Local test execution does not purchase credits. Use the existing release.mjs usage guard before cloud runs.

### Limitations

This is recent-feed research, not a complete YouTube archive, keyword search engine, video downloader or transcript scraper. The provider controls which recent entries are present. Views and descriptions can be absent or stale. Sponsorship matching is heuristic and recognizes selected English, Polish and German disclosure phrases; it can miss disclosures, and links or codes can be non-commercial. No external links are opened, no user account is logged in, and no CAPTCHA, access control or paywall is bypassed. Review evidence yourself before business decisions.

### Verification

Regression tests cover real Atom structure, XML entities, output fields, missing and unsafe inputs, per-channel and global caps, duplicate channels/videos, failed and malformed feeds, empty feeds, partial success and filtering. Test data is synthetic and isolated from production outputs. Run receipts distinguish local execution from cloud execution and public publication.

Protocol reference: https://developers.google.com/youtube/data/guides/push_notifications

# Actor input Schema

## `channelIds` (type: `array`):

1-50 public UC channel IDs or https://www.youtube.com/channel/ID URLs. Handles and arbitrary URLs are rejected.

## `maxItems` (type: `integer`):

Hard output cap.

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

Only entries currently provided in the public feed are available, not the complete archive.

## `onlyWithSignals` (type: `boolean`):

Signals are not proof of a paid brand deal.

## Actor input object example

```json
{
  "channelIds": [
    "UCBJycsmduvYEL83R_U4JriQ"
  ],
  "maxItems": 100,
  "maxVideosPerChannel": 15,
  "onlyWithSignals": false
}
```

# Actor output Schema

## `results` (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 = {
    "channelIds": [
        "UCBJycsmduvYEL83R_U4JriQ"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("danielmichalek/youtube-sponsorship-researcher").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 = { "channelIds": ["UCBJycsmduvYEL83R_U4JriQ"] }

# Run the Actor and wait for it to finish
run = client.actor("danielmichalek/youtube-sponsorship-researcher").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 '{
  "channelIds": [
    "UCBJycsmduvYEL83R_U4JriQ"
  ]
}' |
apify call danielmichalek/youtube-sponsorship-researcher --silent --output-dataset

```

## MCP server setup

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

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/soEwlQIiRpeNM06DQ/builds/r2UDH9SnRJpDeIWZ4/openapi.json
