Analysis Tools
Monetization checks, video analysis, and terminated-channel search.
Full external monetization profile for one channel — what it sells, each method with its own evidence and source link, products, store URLs, and funnel metrics like member counts, sales counts, ratings and prices per platform. By default this always runs the full classifier live (≤60s) so the answer reflects the channel's current state, and persists the result on the way through. Use the query parameters below when freshness matters less than latency. For a live check of whether the channel runs YouTube ads, use /api/channel-monetized/:channel_id instead.
GET /api/channel-external-monetization/:channel_id. Same endpoint, same response — the longer name says plainly that this covers what a channel sells off-platform, not its ad revenue.| Name | Type | Required | Description |
|---|---|---|---|
| channel_id | string | Required | YouTube channel id (UC…, 24 chars). Use /api/channels/resolve for handles/URLs. |
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| skip_live | boolean | Optional | false | Skip the live classifier entirely and return whatever is already stored. Fast, but the answer can be stale, and returns classified: false if we hold nothing. Best for bulk reads. |
| cached_ok_secs | integer | Optional | — | Middle ground between the two. Reuse the stored result only when it is fresher than this many seconds and already at the current classifier version; otherwise re-run live. |
Is this channel actually running YouTube ads right now? We check live rather than reading a cached label: we pull the channel's newest longform watch pages and look for the decisive signal that ads are served. The verdict is stored, so repeat callers and our own sweep stay in agreement.
| Name | Type | Required | Description |
|---|---|---|---|
| channel_id | string | Required | YouTube channel id (UC…, 24 chars). Use /api/channels/resolve for handles and URLs. |
monetized has three states, not two. true means ads were confirmed on recent content. false means we read the pages cleanly and found none. null means no verdict this run — every fetch was blocked or the channel isn't in our longform index yet. Treat null as "unknown, ask again", never as "not monetized". The reason field says which case you got in plain words, and hint appears only when the verdict is null.previous is the state before this check. It carries the last stored verdict and the timestamps of the last time the channel was seen monetized, seen demonetized, and last checked. Compare it against monetized to detect a flip. It is null for channels we have never held.Check whether a channel is run through a CMS / multi-channel network — is it managed, which network runs it, and what other channels that network operates. Backed by a database of 327,000+ pre-checked longform channels, so most lookups return instantly. A channel we haven't checked yet triggers a live check (10–60 seconds) and the verdict is saved for next time; pass ?refresh=1 to force a fresh live check on an already-checked channel. Pass ?full_network=1 to get the network's complete roster instead of the 5-channel sample.
| Name | Type | Required | Description |
|---|---|---|---|
| channel_id | string | Required | YouTube channel id (UC…, 24 chars). Use /api/channels/resolve for handles/URLs. |
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| refresh | boolean | Optional | false | Run a fresh live check even if the channel already has a stored verdict. Counts against the hourly live-check limit. |
| full_network | boolean | Optional | false | Return the complete network roster as network.members — every managed channel we know under this owner, no cap — instead of the 5-channel other_members_sample. Professional and Ultimate only; ignored on Starter. |
owner.oid values match. Use the oid, not the name, to group channels.network object. Over the limit returns 429 with code upgrade_required (Starter daily cap) or rate_limited (hourly live-check cap).| Field | Type | Description |
|---|---|---|
| success | boolean | Whether the request succeeded |
| channel_id | string | YouTube channel ID that was checked |
| status | string | managed, not_managed, or unchecked. Unchecked responses include a hint explaining how to get a verdict (retry, or pass ?refresh=1). |
| checked_at | string | When the verdict was recorded (ISO 8601) |
| checked_live | boolean | Whether this request ran a live check (vs a stored verdict) |
| owner | object | The network running the channel: oid (stable owner id), name, and the owner's type / industry. name can be null for a network we've never seen before. |
| note | string | Occasional plain-language line explaining a verdict that could otherwise look surprising. |
| network | object | Managed channels only: member_count plus other_members_sample — the 5 biggest other channels the same network operates, each with channel_id, name, subscribers, avg_views. With ?full_network=1 the sample is replaced by members — the complete roster, same fields per channel. Not included on Starter. |
Browse and search CMS / multi-channel networks directly — the network-centric counterpart to /api/channel-cms, which starts from a channel. By default you get a list of networks matching your filters; pass ?oid= to switch to detail mode and see one network with its top member channels (up to 100, biggest first). Counts include only channels verified as managed by that owner. Owner emails are never included.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| q | string | Optional | — | Filter networks by name (case-insensitive substring match). |
| oid | string | Optional | — | Switch to detail mode: return that one network plus its top member channels, up to 100, biggest first. Use the oid values from list responses or from /api/channel-cms. |
| min_channels | integer | Optional | 2 | List mode: only include networks with at least this many known channels. |
| sort | string | Optional | channels | List mode ordering: channels (most member channels first) or subscribers (largest combined subscriber count first). |
| limit | integer | Optional | 25 | List mode: number of networks to return, max 100. |
upgrade_required.| Field | Type | Description |
|---|---|---|
| success | boolean | Whether the request succeeded |
| count | integer | List mode: number of networks returned |
| networks | array | List mode: networks matching your filters, each with oid, name, type, industry, member_count, total_subscribers. |
| network | object | Detail mode (?oid=): one network with the same fields as a list entry plus members — its member channels, up to 100, biggest first, each with channel_id, name, subscribers, avg_views, language, category. |
Analyze a YouTube video with AI vision — hooks, pacing, visual storytelling, on-screen text, B-roll usage, content strategy, and any other prompt-driven breakdown. Returns structured analysis text. Currently free during preview — no credit cost, no plan requirement — only an API key and the per-user concurrency cap apply. Repeat prompts on the same video within 2 hours reuse a cached upload automatically (faster on the backend, returns cached: true).
| Name | Type | Required | Description |
|---|---|---|---|
| video_url | string | Required | YouTube video URL. Accepts watch links, youtu.be short links, and Shorts URLs. |
| prompt | string | Required | Plain-English instruction describing what to analyze. Max 4,000 characters. |
| media_resolution | string | Optional | Analysis fidelity: low (default, recommended for hook / pacing / strategy prompts) or default (higher visual detail at greater backend cost — useful when fine on-screen text or subtle visual cues matter). |
/api/job-status/:job_id every 5 seconds for updates.video_url within 2 hours, the source video is reused from cache — the response includes cached: true. Cache is keyed per (user, video) so each user pays the cold-path cost once per video per 2 hours.Search terminated/deleted YouTube channels. Returns channel metadata, growth metrics at time of termination, and up to 3 top videos per channel. Supports keyword matching and advanced filters. Available on all plans.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| q | string | Required | — | Search query. Matches against channel titles and video titles. Comma-separated for multiple keywords. |
| languages | string | Optional | — | Filter by language. Comma-separated (e.g. English,Spanish) |
| sort | string | Optional | date_desc | Sort field and direction. Format: {field}_{asc|desc}. Fields: subs, views, videos, age, views_24h, subs_24h, views_48h, date, similarity (when using q) |
| page | integer | Optional | 1 | Page number (1-indexed, max 20) |
| per_page | integer | Optional | 20 | Results per page (max 50) |
| min_subs | integer | Optional | — | Minimum subscriber count |
| max_subs | integer | Optional | — | Maximum subscriber count |
| min_views | integer | Optional | — | Minimum total view count |
| max_views | integer | Optional | — | Maximum total view count |
| min_avg_views | integer | Optional | — | Minimum average views per video |
| max_avg_views | integer | Optional | — | Maximum average views per video |
| min_age | integer | Optional | — | Minimum channel age in days |
| max_age | integer | Optional | — | Maximum channel age in days |
| min_uploads | integer | Optional | — | Minimum number of videos |
| max_uploads | integer | Optional | — | Maximum number of videos |
| monetized | string | Optional | — | Filter by monetization status: yes or no |
| min_views_24h | integer | Optional | — | Minimum views gained in last 24h before termination |
| max_views_24h | integer | Optional | — | Maximum views gained in last 24h before termination |
| min_views_48h | integer | Optional | — | Minimum views gained in last 48h before termination |
| max_views_48h | integer | Optional | — | Maximum views gained in last 48h before termination |
| Field | Type | Description |
|---|---|---|
| channel_id | string | YouTube channel ID |
| channel_title | string | Channel name at time of termination |
| subscriber_count | integer | Subscriber count at termination |
| view_count | integer | Total channel views at termination |
| avg_views_per_video | integer | Average views per video |
| total_videos | integer | Number of videos on the channel |
| primary_language | string | Detected content language |
| monetized | boolean | Whether the channel was monetized |
| is_low_quality | boolean | Whether the channel was flagged as low quality |
| thumbnail_url | string | Channel profile picture URL |
| first_upload_date | string | Date of the channel's first upload (ISO 8601) |
| terminated_date | string | Date the channel was terminated (ISO 8601) |
| terminated_days_ago | integer | Days since the channel was terminated |
| view_increase_24h | integer|null | Views gained in last 24h before termination |
| sub_increase_24h | integer|null | Subscribers gained in last 24h before termination |
| view_increase_48h | integer|null | Views gained in last 48h before termination |
| sub_increase_48h | integer|null | Subscribers gained in last 48h before termination |
| similarity_score | integer|null | Similarity score (0–100) when using q search |
| recent_videos | array | Top 3 videos by views with video_id, title, view_count, thumbnail_url, url |
Algrow
Shorts Channels