Youtube Monetization Checker
Pricing
$30.00/month + usage
Youtube Monetization Checker
Check if YouTube videos or channel are monetized. This actor returns monetization status plus all the key information about the video/channel.
Pricing
$30.00/month + usage
Rating
0.0
(0)
Developer

AI Tools Max
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Find out if Monetization is On or Off for any YouTube channel, video, or Short — from URLs.
No user-provided API key required — this Actor works out of the box.
Quickstart (30 seconds)
- Paste YouTube URLs into the
urlsinput. - Run the Actor.
- Open the Dataset output and filter by
monetizationLevel(orerror.code).
Minimal input:
{"urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","https://www.youtube.com/@MrBeast"]}
What you get per URL:
monetizationLevel:FULL | PARTIAL | NONE | UNKNOWNisMonetized:true | false | nulldata: detailed metrics for the video or channel (rich nested object)metadata: response metadata (timestamps/version/requestId when present)error: per-item error object when a URL can't be processed
Use Cases
- Marketers: Analyze competitor monetization strategies
- Content creators: Verify your content's monetization status
- Researchers: Study YouTube monetization patterns at scale
- Developers: Integrate monetization data into your workflows
Examples (Output)
Video example
{"inputUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","type": "VIDEO","id": "dQw4w9WgXcQ","isMonetized": true,"monetizationLevel": "FULL","monetizationStatus": "ENABLED","data": {"details": { "title": "...", "channelId": "UC...", "publishedAt": "..." },"monetization": { "status": "ENABLED", "isMonetized": true, "isPartiallyMonetized": false },"ads": { "adMetrics": { "totalAds": 12, "midRollCount": 11 } },"revenue": { "revenue": { "estimated": 12345.67, "range": { "min": 10000, "max": 16000 } } }},"metadata": { "timestamp": "2026-01-06T12:00:00Z", "version": "1.0", "requestId": "req-..." }}
Channel example (handle resolved to channel ID)
{"inputUrl": "https://www.youtube.com/@MrBeast","type": "CHANNEL","id": "@MrBeast","resolvedChannelId": "UCX6OQ3DkcsbYNE6H8uQQuVA","isMonetized": true,"monetizationLevel": "FULL","monetizationStatus": "ENABLED","data": {"details": { "channelId": "UC...", "channelTitle": "...", "country": "..." },"subscriberCount": 350000000,"videoCount": 850,"revenue": { "revenue": { "estimated": 123456.78, "range": { "min": 100000, "max": 180000 } } }},"metadata": { "timestamp": "2026-01-06T12:00:00Z", "version": "1.0", "requestId": "req-..." }}
Error example (invalid/unsupported URL)
{"inputUrl": "https://www.youtube.com/playlist?list=...","type": null,"id": null,"isMonetized": null,"monetizationLevel": "UNKNOWN","data": null,"metadata": null,"error": { "code": "INVALID_INPUT", "message": "..." }}
Common workflows
- Bulk audit: paste 100–1,000 competitor video/channel URLs and export results.
- Watchlist: re-run daily/weekly and diff the dataset over time.
- Lead qualification: check if a channel is monetized before outreach.
- Automation: trigger runs via Apify API, then consume dataset items in your pipeline.
Features
- Checks monetization status for YouTube videos, Shorts, and channels
- Processes up to 10,000 URLs per run
- Parallel processing (
maxConcurrency1–10) with a global 10 req/sec limiter - Detailed run summary in key-value store record
OUTPUT - Per-URL error reporting (does not fail the whole run on bad inputs)
Input
{"urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","https://youtu.be/jNQXAC9IVRw","https://www.youtube.com/channel/UC-lHJZR3Gqxm24_Vd_AJ5Yw","https://www.youtube.com/@MrBeast"],"mode": null,"maxConcurrency": 5,"maxItems": 0}
Input Fields
| Field | Required | Default | Description |
|---|---|---|---|
urls | Yes | - | YouTube URLs to check (max 10,000 URLs, each max 2,048 characters) |
mode | No | null | Restrict to "video" or "channel" only. Leave empty for mixed URLs. |
maxConcurrency | No | 5 | Parallel processing (1-10). Higher = faster but more memory. |
maxItems | No | 0 | Limit URLs to process. 0 = unlimited. |
Supported URL Formats
Videos:
youtube.com/watch?v=VIDEO_IDyoutu.be/VIDEO_IDyoutube.com/shorts/VIDEO_ID
Channels:
youtube.com/channel/UCXXXXXX(direct channel ID)youtube.com/@handle(handle - resolved to channel ID)youtube.com/c/customname(custom URL - resolved to channel ID)youtube.com/user/username(legacy username - resolved to channel ID)
Unsupported URL Formats
youtube.com/channelname(direct path without prefix)- YouTube home page, playlists, search results
These return INVALID_INPUT error per item.
Output
Each input URL produces one dataset item:
{"inputUrl": "https://www.youtube.com/@MrBeast","type": "CHANNEL","id": "@MrBeast","resolvedChannelId": "UCX6OQ3DkcsbYNE6H8uQQuVA","isMonetized": true,"monetizationLevel": "FULL","monetizationStatus": "ENABLED","data": { "subscriberCount": 350000000, "videoCount": 850 },"metadata": { "fetchedAt": "2026-01-06T12:00:00Z" }}
Output Fields
| Field | Description |
|---|---|
inputUrl | Original URL from input |
type | VIDEO or CHANNEL |
id | Video ID or channel identifier (handle/name/UC ID) |
resolvedChannelId | Resolved UC channel ID (only present for @handle, /c/, /user/ URLs) |
isMonetized | true, false, or null |
monetizationLevel | FULL, PARTIAL, NONE, or UNKNOWN |
monetizationStatus | Status string (e.g., ENABLED, LIMITED, PARTNER) |
data | Detailed metrics for the video or channel (rich object or null) |
metadata | Response metadata (timestamps/version/requestId when present) (object or null) |
error | Error object if failed, null if success |
Monetization Levels
| Level | Meaning |
|---|---|
FULL | Fully monetized |
PARTIAL | Partially monetized (video only) |
NONE | Not monetized |
UNKNOWN | Cannot determine (data missing or fetch failed) |
Error Codes
| Code | Description |
|---|---|
INVALID_INPUT | URL malformed or not a YouTube URL |
CHANNEL_ID_NOT_FOUND | Handle or channel name could not be resolved to a channel ID |
MODE_MISMATCH | URL type doesn't match mode field |
BACKEND_AUTH | Authentication failed (401/403) |
NOT_FOUND | Content not found (404) |
RATE_LIMITED | Too many requests (429) |
BACKEND_ERROR | Service error (5xx) or malformed response |
NETWORK_ERROR | Connection failure or timeout (30s) |
PROCESSING_ERROR | Unexpected internal processing error |
Accuracy & revenue estimate disclaimer
- Monetization status accuracy: In our internal benchmarking, the monetization status matched ground truth in ~99.6% of cases. Accuracy can vary by channel/video and may change over time as YouTube changes behavior and signals. If you need guaranteed results for a specific use case, validate with a small sample first.
- Revenue estimation: If the returned payload includes any revenue-related fields, treat them as estimates only. Revenue depends on many factors (ad inventory, geography, language, category/CPM, niche, seasonality, viewer behavior, and more). Our algorithm estimates revenue by analyzing ad placement and contextual signals, but it can be inaccurate. Not financial advice.
FAQ
Why do channels sometimes take longer than videos? Channel checks can be heavier: the service may analyze recent videos and additional signals. Large channel lists will therefore take longer than the same number of video URLs.
What does UNKNOWN mean?
The Actor couldn't determine monetization for that URL at this time (missing data, temporary service/network issues, or the content doesn't expose enough signals).
Will the run fail if some URLs are invalid?
No. Invalid URLs produce a dataset item with error.code (e.g., INVALID_INPUT) and the run continues.
Run Summary (OUTPUT)
After each run, a summary is written to the key-value store as OUTPUT.
Location: Output tab in Apify Console, or https://api.apify.com/v2/key-value-stores/{storeId}/records/OUTPUT
{"startedAt": "2026-01-04T10:00:00.000Z","finishedAt": "2026-01-04T10:00:05.000Z","durationMs": 5000,"totalInput": 100,"totalProcessed": 95,"aborted": false,"abortReason": null,"byType": { "VIDEO": 80, "CHANNEL": 10, "null": 5 },"byLevel": { "FULL": 60, "PARTIAL": 10, "NONE": 20, "UNKNOWN": 5 },"byErrorCode": { "INVALID_INPUT": 3, "NOT_FOUND": 2 },"config": { "mode": null, "maxItems": 0, "maxConcurrency": 5 }}
Summary Fields
| Field | Description |
|---|---|
totalInput | URLs in input (before maxItems filter) |
totalProcessed | URLs actually processed |
aborted | Whether run was aborted early |
abortReason | Reason for abort (BACKEND_AUTH or PROCESSING_ERROR) |
byType | Count by URL type |
byLevel | Count by monetization level |
byErrorCode | Count by error code |
Limitations
- Accuracy: Monetization status reflects data available at query time. Status can change.
- Rate limit: 10 requests/second enforced. Large URL lists are processed accordingly.
- Timeout: Requests timeout after 30 seconds (with automatic retry).
- Handle resolution: Handles and custom names are resolved per-run. If a handle is renamed, cached results may be stale until next run.
Security & Privacy
- No personal data stored: Only input URLs and returned public metrics are processed.
- Public data only: Returns publicly available monetization information.
- No tokens logged: Sensitive credentials are never written to logs or datasets.
Abort Behavior
The run may abort early in certain conditions:
BACKEND_AUTH: Authentication failure (401/403)
- Stops scheduling new URLs
- Completes in-flight requests
- Writes OUTPUT summary
- Fails the run
PROCESSING_ERROR: Unexpected exception
- Writes OUTPUT summary
- Rethrows error to fail the run
In both cases, OUTPUT is always written before failure, preserving statistics.