Body parameters
Optional; "channel" is the only type and the default. Monitors watch a YouTube channel or a TikTok or Instagram profile. "playlist" and "search" are refused: read those on demand with the playlist and search endpoints.
The YouTube channel (@handle, UC… id or URL) or the TikTok or Instagram profile URL, in any form the channel endpoint accepts. The platform is read from it. Fixed for the life of the monitor.
Not needed: the platform is read from target. If you send it anyway it must agree with the target.
YouTube channel monitors only: which tab to watch. videos (the default) is the channel's uploads, shorts its Shorts, live its live streams (past and upcoming). A creator who posts only Shorts has an empty Videos tab, so a monitor on their uploads never fires: watch their shorts. Refused on TikTok and Instagram, like the channel endpoint refuses it; fixed once the monitor is created.
Where to POST each event. The body is the event object (the same object the events endpoint lists, without its delivery block); X-TranscriptFetch-Event carries its type and X-TranscriptFetch-Delivery its id, which stays the same across retries of one event. Every delivery is signed: X-TranscriptFetch-Signature is sha256= followed by the hex HMAC-SHA256 of the raw request body, keyed with the monitor's webhook_secret (the whole string, whsec_ prefix included). Verify it over the exact bytes you received, before parsing, and compare in constant time. Answer with any 2xx within 10 seconds. A failed attempt (another status, a timeout, a redirect, which is never followed, or an unreachable host) is retried after 1, 5, 30, 120 and 720 minutes, then the delivery is marked failed; each event's delivery block shows where it stands. With transcripts: true a delivery carries the full transcripts, so accept bodies of several megabytes. Must be a public https URL on the standard port. It is checked when saved and again before every delivery, so an address that stops resolving publicly receives nothing. Optional: every event is also readable from the events endpoint. Send null on PATCH to remove it.
Minutes between checks; default 60, or the plan's shortest interval when that is longer (1440 without a paid plan). Accounts without a paid plan may use 1440; any paid plan also 15, 60, 360. A new interval takes effect from the moment it is saved. Should the account leave its paid plan, a monitor keeps its setting but is not checked more often than the plan then allows.
Also deliver each new video's transcript, fetched the way a batch entry is in "auto" mode. Caption transcripts arrive inline in the monitor.videos event and cost 1 credit each. A video with no captions is transcribed by AI Fallback Transcription instead, billed on delivery (1 credit per started 5 minutes of audio, minimum 1), and its transcript follows in its own monitor.transcript event; until then its entry reads "processing". Brand-new YouTube uploads usually have no automatic captions yet, so YouTube captions are retried every 15 minutes for up to 60 minutes after the video is found before AI Fallback Transcription is used: a caption transcript costs 1 credit where a 20-minute video through AI Fallback Transcription costs 4. TikTok and Instagram videos without captions go straight to AI Fallback Transcription. An upcoming or ongoing live stream has no transcript until its recording exists: it is looked for every 30 minutes for up to 7 days, and the caption grace period starts when the stream has ended. A caption transcript the balance cannot cover is not sent: it waits for credits for up to 7 days, then is reported as failed with insufficient_credits. A key with the captions-only policy never transcribes audio, here as anywhere: transcripts it turned on, or that a check it ran left owed, are captions only, and a video still without captions after the grace period is reported as failed (no_captions). Default false.
Your label for the monitor, returned on the monitor and in every event it produces.
{
"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
- POSTTranscriptFetch a YouTube video's transcript over REST: the request, every parameter, the JSON response with timestamped segments, and curl, Python and Node examples.
- POSTSearchSearch YouTube over REST without a Data API key or quota: the request, the upload date, duration, captions and sort filters, a real response, and curl, Python and Node examples.
- POSTChannel VideosList a YouTube channel's videos over REST without a Data API key: the request, the tab, sort and query options, since_video_id polling, a real response, and curl, Python and Node examples.
- POSTPlaylistList a YouTube playlist's videos over REST without a Data API key: the request with a playlist URL or PL id, cursor paging, a real response, and curl, Python and Node examples.
- POSTShortsList and transcribe a channel's YouTube Shorts over REST: the channel endpoint with tab shorts, a real Shorts listing, how a Short's transcript is fetched, and curl, Python and Node examples.
- POSTChannel MonitorWatch a YouTube channel for new videos over REST: create a monitor, receive each upload by signed webhook or from the events list, optionally with its transcript, with curl, Python and Node examples.
Same call, other platforms:TikTok Profile Monitor APIInstagram Profile Monitor API
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?
Every check costs 1 credit, the price of one listing page, whether or not it finds new videos, plus 1 credit per caption transcript when transcripts is true; AI Fallback Transcription is billed at its 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 AI Fallback Transcription, because a caption transcript costs 1 credit where a long video through AI Fallback Transcription costs more.