Monitor YT API
Everything Monitor YT records about the channels you track, as JSON. Pipe your feed into dashboards, alerts, spreadsheets, or your own tools.
Getting started
The API is read-only and serves the same feed you see in the app: new
uploads, title rewrites, thumbnail swaps, A/B tests, and channel-level
moves across every channel you track. All requests go to
https://monitoryt.com and return JSON.
You need a Monitor YT account with at least one tracked channel, and a personal API key.
Authentication
Generate your API key in
Settings inside the
app. Keys start with myt_ and are sent as a Bearer token:
Authorization: Bearer myt_your_api_key
Each account has one key. Regenerating it in Settings revokes the old key immediately, so rotate it if it ever leaks. Treat it like a password: it grants read access to your whole feed.
Fetch your feed
/api/public-feed
Returns your feed events, newest first, with cursor pagination.
Query parameters
| Parameter | Type | Description |
|---|---|---|
limit |
integer, optional | Events per page. Defaults to 50, capped at 200. |
cursor |
string, optional |
The nextCursor value from the previous
page. Omit it for the first page.
|
Example request
curl -H "Authorization: Bearer myt_your_api_key" \
"https://monitoryt.com/api/public-feed?limit=50"
Example response
{
"events": [
{
"id": "665f21c09b1d8a4f30aa1234",
"type": "video_published",
"createdAt": 1783100000000,
"channel": {
"id": "665f21c09b1d8a4f30aa5678",
"youtubeChannelId": "UCBJycsmduvYEL83R_U4JriQ",
"title": "Example Channel",
"thumbnailUrl": "https://yt3.ggpht.com/..."
},
"video": {
"youtubeVideoId": "dQw4w9WgXcQ",
"currentTitle": "Our biggest video yet",
"currentThumbnailUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg",
"publishedAt": 1783099000000,
"isMembersOnly": false,
"viewCount": 12345,
"likeCount": 678,
"commentCount": 90
}
}
],
"nextCursor": "665f21c09b1d8a4f30aa1234"
}
Timestamps (createdAt, publishedAt) are Unix
epoch milliseconds. To page through older events, pass
nextCursor back as ?cursor=… and repeat until
nextCursor is null.
Event types
Every event carries id, type,
createdAt, and channel. Video events also
carry a video object; the remaining fields depend on
type:
| Type | Extra fields | Meaning |
|---|---|---|
video_published |
video (with stats) |
A new upload was discovered. |
title_changed |
oldTitle, newTitle |
A video's title was rewritten. |
thumbnail_changed |
oldThumbnailUrl,
newThumbnailUrl
|
A video's thumbnail was swapped. |
title_ab_test |
titles |
A title is rotating between several variants. |
title_ab_test_concluded |
titles, finalTitle |
The title rotation settled on a winner. |
thumbnail_ab_test |
thumbnailUrls |
A thumbnail is rotating between several variants. |
thumbnail_ab_test_concluded |
thumbnailUrls,
finalThumbnailUrl
|
The thumbnail rotation settled on a winner. |
members_only_changed |
isMembersOnly |
A video switched between public and members-only. |
subscriber_change |
oldSubscriberCount,
newSubscriberCount
|
The channel crossed a subscriber milestone. |
channel_renamed |
oldChannelTitle,
newChannelTitle
|
The channel changed its display name. |
channel_avatar_changed |
oldAvatarUrl, newAvatarUrl
|
The channel changed its avatar. |
Channels are polled on a rolling schedule (as often as every 15 minutes for fresh videos), so events land in the feed shortly after they happen on YouTube.
Rate limits and errors
The API allows 20 requests per minute per key. Responses use standard status codes:
| Status | Meaning |
|---|---|
200 |
Success. Body is { events, nextCursor }.
|
400 |
Invalid query parameters. The body's
details field says which.
|
401 |
Missing, malformed, or revoked API key. |
429 |
Rate limit exceeded. Honor the
Retry-After header before retrying.
|
Questions or need a higher limit? Get in touch.
Add the channels in your niche and Monitor YT records every upload, title rewrite, thumbnail swap, and A/B test, ready for the app and the API.