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 from its audio instead, billed on delivery at the AI rate (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 transcription is used: a caption transcript costs 1 credit where a 20-minute video transcribed from audio costs 4. TikTok and Instagram videos without captions go straight to AI 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_mupg15j4pc2oe60o",
"type": "channel",
"platform": "instagram",
"target": "https://www.instagram.com/nasa/",
"options": {},
"name": "NASA Reels",
"status": "active",
"has_new": false,
"last_event_id": null,
"interval_minutes": 60,
"transcripts": true,
"webhook_url": null,
"next_check_at": "2026-10-01T12:21:28.630Z",
"last_checked_at": null,
"last_error": null,
"created_at": "2026-10-01T11:21:02.280Z",
"updated_at": "2026-10-01T11:21:02.280Z",
"webhook_secret": "whsec_…",
"baseline_count": 30
},
"usage": {
"credits_spent": 0,
"balance": 655
}
}Every Instagram endpoint
- POSTTranscriptFetch an Instagram Reel's transcript over REST: the request, every parameter, a real Reel response transcribed from audio with timestamped segments, and curl, Python and Node examples.
- POSTSearchSearch Instagram Reels by keyword over REST: the request, the platform parameter, a real Instagram response with play counts, and curl, Python and Node examples.
- POSTProfile ReelsList an Instagram account's Reels over REST without the Graph API: the request with a profile URL, since_video_id polling, a real response with play counts, and curl, Python and Node examples.
- POSTProfile MonitorWatch an Instagram account for new Reels over REST: create a monitor on a profile URL, receive each new Reel 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 APIYouTube Channel Monitor API
Frequently asked questions
How do I get each new Reel an account posts?
Create a monitor with the account's profile URL as target. Each check that finds new Reels raises a monitor.videos event, delivered to webhook_url if you set one and listed by the events endpoint either way.
What does an Instagram monitor cost?
Every check costs 1 credit, the price of one listing page, whether or not it finds new Reels. With transcripts true, each Reel is transcribed from its audio and billed at the audio rate on delivery.
Can a monitor watch a private Instagram account?
No. Only public accounts can be listed, so only public accounts can be monitored.
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.