YouTube Channel Monitor API
A monitor watches a YouTube channel on a schedule and reports every new video, by a signed webhook POST or from the events endpoint, optionally with the video's transcript attached. Create one with the channel as target; tab chooses its uploads, Shorts or live streams; interval_minutes sets how often it is checked; transcripts true delivers each new video's transcript as well. The same endpoint watches TikTok and Instagram profiles.
Creating a monitor is free, and so is every check that finds nothing new. A check that finds videos costs 1 credit, plus 1 per caption transcript with transcripts true; a transcript that has to come from audio is billed on delivery at 1 credit per started 5 minutes of audio.
On this platform
- target takes the channel in any form the channel endpoint accepts: @handle, UC… id or URL. The platform is read from it.
- Every webhook delivery is signed with HMAC-SHA256 over the raw body, keyed with the monitor's webhook_secret; verify before parsing.
- New uploads usually have no automatic captions yet, so captions are retried for a grace period before audio transcription is used.
/api/v2/monitorsidempotentCreate a monitor for new videos
Watch a YouTube channel or a TikTok or Instagram profile, and receive every new video as an event, by webhook and from the events endpoint. Creation reads the target once, free, to learn what is already there.
- Baseline: a channel or profile that does not exist answers 404 not_found. Everything on its first page today is recorded as already seen, baseline_count says how many, so only videos that appear later are reported.
- Each check, every interval_minutes, reads the newest 30 rows and reports the ones it has not seen as one monitor.videos event, sent to webhook_url when one is set and always readable from the events endpoint. One check reports at most 50 videos; any more are reported by the next checks.
- Billing: a check that finds nothing new is free. One that finds new videos costs 1 credit, the price of one listing page (plus 1 per caption transcript with transcripts: true), charged before the event is recorded or delivered.
- An account that cannot pay records nothing: the videos are not marked seen, last_error reads insufficient_credits, the monitor stays active, and the same videos are delivered by the first check after credits return.
- Limits: 5 monitors and a 60-minute minimum interval without a paid plan, 100 monitors and 15 minutes on any paid plan. Creating past the cap answers monitor_limit_reached.
- A monitor does not report a video published more than 24 hours before it was created (pinned posts and reordered tabs keep resurfacing old videos).
- YouTube channels: tab chooses the uploads (default), the Shorts or the live streams; a creator who posts only Shorts needs tab: "shorts". Fixed once created.
- Monitors watch channels and profiles only. A playlist or search type is refused with invalid_request; read those on demand with the playlist and search endpoints.
- The 201 response carries webhook_secret, the key every delivery is signed with. It is shown this once: store it.
Body parameters
type"channel"optionaltargetstringrequiredplatformstring (enum)optionaltab"videos" | "shorts" | "live"optionalwebhook_urlstring (https URL) | nulloptionalinterval_minutes15 | 60 | 360 | 1440optionaltranscriptsbooleanoptionalnamestring (up to 100) | nulloptionalRequest example
Responses
{
"ok": true,
"request_id": "req_…",
"data": {
"kind": "monitor",
"id": "mon_m3k1x9qz4vb2p7",
"type": "channel",
"platform": "youtube",
"target": "@lexfridman",
"options": {
"tab": "videos"
},
"name": "Lex Fridman uploads",
"status": "active",
"has_new": true,
"last_event_id": "mev_m3k1xa0b7c8d9e",
"interval_minutes": 60,
"transcripts": true,
"webhook_url": "https://example.com/hooks/transcriptfetch",
"next_check_at": "2026-09-25T15:00:12.000Z",
"last_checked_at": null,
"last_error": null,
"created_at": "2026-09-24T09:12:40.000Z",
"updated_at": "2026-09-24T09:12:40.000Z",
"webhook_secret": "whsec_…",
"baseline_count": 30
},
"usage": {
"credits_spent": 0,
"balance": 250
}
}Every YouTube endpoint
Frequently asked questions
- How is this different from polling the channel endpoint with since_video_id?
- Polling is a call you schedule and pay a credit for whenever something is new. A monitor runs the schedule for you, pushes each new video to your webhook or the events list, and can fetch the transcript on your behalf. Use polling for one script, a monitor for a product.
- What does a monitor cost?
- A check that finds nothing new costs nothing. A check that finds new videos costs 1 credit, the price of one listing page, plus 1 credit per caption transcript when transcripts is true; audio transcription is billed at the audio rate on delivery. Monitor and interval limits depend on the plan and are stated on the endpoint.
- Can a monitor watch a channel's Shorts or live streams?
- Yes. Create it with tab shorts or tab live. A creator who posts only Shorts has an empty Videos tab, so a monitor on their uploads never fires; watch their shorts instead. The tab is fixed once the monitor exists.
- How do I verify a webhook came from TranscriptFetch?
- Compute HMAC-SHA256 of the exact request bytes with the monitor's webhook_secret and compare it, in constant time, with the X-TranscriptFetch-Signature header (sha256= followed by the hex digest). X-TranscriptFetch-Delivery identifies the delivery across retries.
- Why does a brand-new upload take a while to get a transcript?
- YouTube's automatic captions usually appear some minutes after publishing. The monitor retries captions for a grace period before falling back to audio transcription, because a caption transcript costs 1 credit where a long video transcribed from audio costs more.