# YouTube Creator Finder - Channels, Contacts & Activity (`thirdwatch/youtube-creator-finder-scraper`) Actor

Find YouTube creators by keyword and qualify them by subscribers, video count, country, and recent activity. Export channel profiles, links, public emails, socials, websites, and discovery evidence.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## 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 Creator Finder

Find public YouTube channels by niche keyword, qualify creators by audience and activity, and export one clean row per channel with profile metrics, country, recent uploads, public websites, social profiles, emails disclosed in public content, and discovery evidence.

This is a creator-sourcing workflow rather than a generic video scraper. It answers: **which creators match this niche, are the right size, are still active, and expose a public way to research or contact them?**

No YouTube Data API key, login, browser, or proxy is required.

### Quick start

```json
{
  "searchTerms": ["coffee roasting", "home espresso"],
  "maxCreatorsPerSearch": 20,
  "minSubscribers": 5000,
  "maxSubscribers": 250000,
  "minVideos": 20,
  "uploadedWithinDays": 180,
  "requirePublicContact": true
}
```

The Actor searches YouTube's channel-only results, enriches every candidate from its public channel pages, applies filters before billing, deduplicates by channel ID, and saves only qualifying channels.

### Why use a creator finder instead of raw YouTube search?

- Channel-only discovery avoids mixing videos, playlists, and repeated creators.
- Subscriber, video-count, country, and activity filters remove poor fits before export.
- Full public About data adds descriptions, total views, join date, websites, and social profiles.
- Recent-video context distinguishes active creators from dormant channels.
- Optional linked-website checks find emails that creators publicly place on their own sites.
- Every row preserves the first keyword and rank that discovered the creator.

### Inputs

| Input | Purpose | Default |
| --- | --- | --- |
| `searchTerms` | Creator niches or keywords | `coffee roasting` |
| `channelUrls` | Known @handle or `/channel/UC...` URLs to enrich | none |
| `maxCreatorsPerSearch` | Qualifying creators per keyword | `20` |
| `maxTotalCreators` | Global run cap | `100` |
| `minSubscribers` / `maxSubscribers` | Audience-size range | none |
| `minVideos` | Minimum public video count | none |
| `country` | Exact public channel-country label | none |
| `uploadedWithinDays` | Approximate recent-activity limit | none |
| `requirePublicContact` | Require an email, website, or social profile | `false` |
| `crawlLinkedWebsites` | Check the first public non-social website for emails/socials | `false` |
| `maxWebsitePages` | Website pages checked when enrichment is on | `2` |
| `languageHint` / `countryHint` | YouTube locale hints | `en` / `US` |

### Output

Each billed row is one unique channel that passed the selected filters:

```json
{
  "recordType": "youtube_creator",
  "channelId": "UCfpTQQtvqLhHG_GWhk3Xp4A",
  "handle": "@MillCityRoasters",
  "title": "Mill City Roasters®",
  "url": "https://www.youtube.com/channel/UCfpTQQtvqLhHG_GWhk3Xp4A",
  "canonicalUrl": "https://www.youtube.com/@MillCityRoasters",
  "description": "...",
  "subscriberCount": 42500,
  "videoCount": 201,
  "totalViewCount": 2538445,
  "country": "United States",
  "joinedDateText": "Joined 7 Feb 2014",
  "verified": false,
  "websiteUrls": ["https://millcityroasters.com"],
  "socialProfiles": {
    "instagram": "https://instagram.com/millcityroasters",
    "facebook": "https://facebook.com/millcityroasters",
    "tiktok": "https://tiktok.com/@millcityroasters"
  },
  "publicEmails": [],
  "businessEmailRequiresLogin": true,
  "latestVideo": {
    "videoId": "...",
    "title": "...",
    "publishedText": "2 months ago",
    "ageDaysEstimate": 60,
    "viewCount": 841
  },
  "discoveryQuery": "coffee roasting",
  "discoveryRank": 1,
  "scrapedAt": "2026-08-12T00:00:00Z"
}
```

YouTube's login-gated business email is not bypassed. `businessEmailRequiresLogin: true` means YouTube displays that gate; it is not reported as an email. `publicEmails` contains only addresses visible in public descriptions or, when explicitly enabled, public linked websites.

### Common workflows

- Source micro- and mid-tier creators for campaign review.
- Build niche channel lists for sponsorship research.
- Find active podcasts, educators, reviewers, or B2B experts.
- Compare creator supply across countries or topics.
- Enrich known channel URLs for CRM or research pipelines.
- Schedule recurring discovery and compare new channel IDs over time.

### Pricing and cost control

The entry tier is **$0.0025 per qualifying creator**. Rejected candidates, duplicates, inaccessible pages, and filters that produce no result are not charged. BRONZE, SILVER, and GOLD reduce the unit price for volume.

Set strict result caps and test one keyword first. Website contact enrichment adds requests, so keep it disabled unless public website emails are useful to the workflow.

### Limitations and troubleshooting

- Public data only. The Actor does not bypass logins, private channels, hidden subscriber counts, or YouTube's business-email gate.
- Activity is an estimate from YouTube's relative label such as `2 months ago`; months are normalized to 30 days and years to 365 days for filtering.
- Channels with hidden fields fail filters that require those fields.
- External links are whatever the channel publicly exposes. Verify identity and permission before outreach.
- Website enrichment checks at most three public pages on the first non-social site. Private-network addresses and unsafe redirects are refused.
- Search rankings and available channels vary by locale and over time.
- YouTube can change its internal page payloads. If a previously working input returns no rows, attach the run URL to an Actor issue.

Use public contact data lawfully. Follow applicable anti-spam, privacy, data-protection, and platform rules before contacting anyone.

# Actor input Schema

## `searchTerms` (type: `array`):

Search terms such as <code>coffee roasting</code>, <code>indie game development</code>, or <code>Indian personal finance</code>.

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

Optional YouTube @handle or /channel/UC... URLs. These are enriched and filtered alongside keyword discoveries.

## `maxCreatorsPerSearch` (type: `integer`):

Maximum qualifying channels saved for each keyword. Channels rejected by filters do not count toward this limit.

## `maxTotalCreators` (type: `integer`):

Global safety limit across keyword discoveries and known channel URLs.

## `minSubscribers` (type: `integer`):

Save only channels at or above this public subscriber count. Leave empty for no minimum.

## `maxSubscribers` (type: `integer`):

Save only channels at or below this public subscriber count. Useful for micro- and mid-tier creator lists.

## `minVideos` (type: `integer`):

Save only channels with at least this many public videos.

## `country` (type: `string`):

Optional exact public country label shown by YouTube, such as <code>United States</code> or <code>India</code>.

## `uploadedWithinDays` (type: `integer`):

Optional activity filter based on the relative age of the newest public video. For example, <code>90</code> keeps channels active in roughly the last three months.

## `requirePublicContact` (type: `boolean`):

Save only channels with a public email, external website, or social profile exposed in the channel description/about data.

## `crawlLinkedWebsites` (type: `boolean`):

Optionally check the first public non-social website linked by each channel plus a contact/about page. This is slower; private-network and unsafe redirect targets are blocked.

## `maxWebsitePages` (type: `integer`):

Maximum pages checked on the first linked public website when website enrichment is enabled.

## `languageHint` (type: `string`):

Two-letter page-language hint, such as <code>en</code>.

## `countryHint` (type: `string`):

Two-letter YouTube country hint, such as <code>US</code> or <code>IN</code>.

## Actor input object example

```json
{
  "searchTerms": [
    "coffee roasting"
  ],
  "maxCreatorsPerSearch": 20,
  "maxTotalCreators": 100,
  "requirePublicContact": false,
  "crawlLinkedWebsites": false,
  "maxWebsitePages": 2,
  "languageHint": "en",
  "countryHint": "US"
}
```

# 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 = {
    "searchTerms": [
        "coffee roasting"
    ],
    "maxCreatorsPerSearch": 20,
    "maxTotalCreators": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("thirdwatch/youtube-creator-finder-scraper").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 = {
    "searchTerms": ["coffee roasting"],
    "maxCreatorsPerSearch": 20,
    "maxTotalCreators": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("thirdwatch/youtube-creator-finder-scraper").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 '{
  "searchTerms": [
    "coffee roasting"
  ],
  "maxCreatorsPerSearch": 20,
  "maxTotalCreators": 100
}' |
apify call thirdwatch/youtube-creator-finder-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/c9FtvgusP7o48NU3a/builds/eY1InljmhWAmWURwE/openapi.json
