GitHubLog in
YouTube Channel Monitor API

YouTube Channel Monitor API

Creates a monitor that checks a YouTube channel on a schedule and reports each new video, by a signed webhook POST or through the events endpoint. tab chooses uploads, Shorts or live streams, interval_minutes sets how often the channel is checked, and transcripts set to true attaches each new video's transcript. The same endpoint watches TikTok and Instagram profiles.

Each check1 creditNew videos or not; plus 1 per caption transcript
Creating a monitor1 creditIts first check, which records what is already there
AI Fallback Transcription1 / 5 minBilled on delivery, per started 5 minutes
Supported URLs@handlehandle URLUC… id/channel//c//user/All URL formats
Monitors & webhooks guide
POST/api/v2/monitorsidempotent

Body parameters

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.

curl https://transcriptfetch.com/api/v2/monitors \
  -H "Authorization: Bearer $TRANSCRIPTFETCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"target":"@lexfridman","webhook_url":"https://example.com/hooks/transcriptfetch","interval_minutes":60,"transcripts":true,"name":"Lex Fridman uploads"}'
CreatedExample response envelope
{
  "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

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.