Docs
Thumbnail & Title Changes
Thumbnail and title changes Algrow watched happen, judged on each video's own daily views: won, lost, reverted.
Thumbnail and title changes Algrow watched happen on YouTube videos, each judged on the video's own daily views. Only changes Algrow watched happen itself are shown, dated to the second for thumbnails (the CDN's own change time) and to a ~7 hour window for titles; nothing is backfilled from archives. A change is shown only when the daily pace after it is at least 3x the pace before (a win) or at most 1/3 of it (a loss), the change bought or cost at least 10,000 views, there are at least 2 days of daily views on each side, the change is dated on or after 13 October 2026, and Algrow holds the before image or text from before the change. Reverted changes are shown too. Wins and reverts only for now: a flat before-pace reads a new video's normal launch decay as a loss, so losses stay hidden until the pace model handles decay. Everything else is logged and scored but never returned. Each change carries the before and after, the verdict (won or reverted), the multiple, the views it bought, how many days the new pace held, and whether the score is settled (day 28).
GET/api/v2/changes/video/:video_id
Every thumbnail and title change of one video, oldest first. Only changes Algrow watched happen itself are returned, dated to the second for thumbnails and to a ~7 hour window for titles, judged on the video's own daily views. A change is returned only when the daily pace after it is at least 3x the pace before or at most 1/3 of it, it bought or cost at least 10,000 views, there are at least 2 days of daily views on each side, it is dated on or after 13 October 2026, and Algrow holds the before image or text from before the change; reverted changes are returned too. Wins and reverts only for now: a flat before-pace reads a new video's normal launch decay as a loss, so losses stay hidden (rule.show_losses is false) until the pace model handles decay. Everything else is logged and scored but never returned. The thresholds come back in rule. Thumbnail before/after are image URLs; title ones are the texts.
Path Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| video_id | string | Required | — | YouTube video id, 11 characters. |
400 Bad video id
{
"success": true,
"rule": { "min_multiple": 3, "min_views": 10000, "floor_date": "2026-10-13", "show_losses": false, "min_days_before": 2, "min_days_after": 2 },
"video_id": "k3VxQ9pLm2A",
"count": 1,
"changes": [
{
"change_id": 4812,
"video_id": "k3VxQ9pLm2A",
"title": "We Baked 100 Year Old Bread Recipes",
"url": "https://www.youtube.com/watch?v=k3VxQ9pLm2A",
"channel": { "id": "UC7lmZqZ9Q8-0yBZ5f4bOcKw", "name": "Oven Hour", "handle": "@ovenhour", "subs": 212000 },
"kind": "thumbnail",
"seq": 1,
"changed_at": "2026-10-15T14:03:22+00:00",
"changed_after": null,
"before": "https://audio.algrow.online/thumbs/k3VxQ9pLm2A/1760000000.jpg",
"after": "https://audio.algrow.online/thumbs/k3VxQ9pLm2A/1760538202.jpg",
"verdict": "won",
"multiple": 4.2,
"views_bought": 38400,
"pace_before": 1200,
"pace_after": 5040,
"held_days": 6,
"days_before": 2,
"days_after": 10,
"settled": false,
"reverted": false,
"reverts_change_id": null,
"tags": {}
}
]
}curl "https://api.algrow.online/api/v2/changes/video/k3VxQ9pLm2A" \ -H "Authorization: Bearer YOUR_API_KEY"
GET/api/v2/changes/channel/:channel_id
A channel's thumbnail and title changes in the last days days, newest first, plus its nightly roll-up in stats (swaps, won, lost, reverted over 90 days). win_rate_90d is null until 50 swaps are behind it. Same certain-only rule as above; every change has the same fields as /api/v2/changes/video.
Query Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| days | integer | Optional | 90 | How far back to look, in days. Max 365. |
400 Bad channel id
{
"success": true,
"rule": { "min_multiple": 3, "min_views": 10000, "floor_date": "2026-10-13", "show_losses": false, "min_days_before": 2, "min_days_after": 2 },
"channel_id": "UC7lmZqZ9Q8-0yBZ5f4bOcKw",
"days": 90,
"count": 3,
"stats": {
"as_of": "2026-10-19",
"swaps_90d": 12,
"won_90d": 5,
"lost_90d": 2,
"reverted_90d": 1,
"win_rate_90d": null,
"rate_needs_swaps": 50
},
"changes": [ ...same fields as /api/v2/changes/video... ]
}curl "https://api.algrow.online/api/v2/changes/channel/UC7lmZqZ9Q8-0yBZ5f4bOcKw?days=30" \ -H "Authorization: Bearer YOUR_API_KEY"
GET/api/v2/changes/recent
The feed of thumbnail and title changes across every watched video in the last days days, most views bought first. Filter by niche, kind and verdict. Same certain-only rule and the same change fields as /api/v2/changes/video.
Query Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| niche | string | Optional | all | Only videos in this niche (the niche names used by the viral feed). |
| kind | string | Optional | both | thumbnail or title. |
| verdict | string | Optional | all | won or reverted. lost is refused (400) while losses are hidden. |
| min_multiple | number | Optional | 3 | Only changes where the daily pace moved at least this many times, up or down. The 3x floor always applies. |
| days | integer | Optional | 30 | How far back to look, in days. Max 365. |
| limit | integer | Optional | 25 | Results to return, max 100. |
400 Bad kind, verdict or min_multiple
{
"success": true,
"rule": { ... },
"count": 25,
"changes": [ ...same fields as /api/v2/changes/video... ]
}curl "https://api.algrow.online/api/v2/changes/recent?niche=Cooking&kind=thumbnail&verdict=won&days=7" \ -H "Authorization: Bearer YOUR_API_KEY"
GET/api/v2/changes/like
Thumbnail and title changes on videos like ref, each with a match score per match kind. still compares the change's before and after images with the reference thumbnail; subject compares what the videos are about; title_format compares the title's shape. A row must pass every match you ask for; rows are sorted by the mean score. Same certain-only rule and change fields as /api/v2/changes/video.
Query Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| ref | string | Required | — | A YouTube video id or URL, or a thumbnail image URL. An image URL can only match on still. |
| match | string | Optional | still | Comma-separated, any of still, subject, title_format. |
| kind | string | Optional | both | thumbnail or title. |
| verdict | string | Optional | all | won or reverted. lost is refused (400) while losses are hidden. |
| niche | string | Optional | all | Only videos in this niche. |
| days | integer | Optional | 90 | How far back to look, in days. Max 365. |
| limit | integer | Optional | 25 | Results to return, max 100. |
400 Bad ref or match, or the video is not indexed
{
"success": true,
"rule": { ... },
"ref": { "kind": "video", "value": "k3VxQ9pLm2A", "subject": "sourdough bread" },
"match": ["still", "subject"],
"days": 90,
"count": 8,
"changes": [
{ ...same fields as /api/v2/changes/video, plus:
"match": { "still": 0.81, "subject": 0.92 }
}
]
}curl "https://api.algrow.online/api/v2/changes/like?ref=k3VxQ9pLm2A&match=still,subject" \ -H "Authorization: Bearer YOUR_API_KEY"
GET/api/v2/changes/format-swaps
Title changes grouped by title format family before and after (plain_subject to question_hook, number_list to how_to, and so on). Each group has its swap count, won and reverted counts, the typical multiple, three real examples, and a win rate once 50 swaps are behind it. Titles without a cached format are classified on the spot, at most 100 per call; past that partial is true and unclassified counts the changes left out. Call again to classify more. families lists every family name you can pass. Same certain-only rule as /api/v2/changes/video.
Query Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| from_format | string | Optional | any | Title format family the title moved from. |
| to_format | string | Optional | any | Title format family the title moved to. |
| niche | string | Optional | all | Only videos in this niche. |
| days | integer | Optional | 90 | How far back to look, in days. Max 365. |
| limit | integer | Optional | 100 | Title changes to read before grouping, max 100. |
400 Unknown format family
{
"success": true,
"rule": { ... },
"from_format": "plain_subject",
"to_format": null,
"days": 90,
"families": ["plain_subject", "number_list", "how_to", ...],
"partial": false,
"unclassified": 0,
"classify_cap": 100,
"count": 2,
"groups": [
{
"from_format": "plain_subject",
"to_format": "question_hook",
"swaps": 14,
"won": 9,
"lost": 3,
"reverted": 2,
"typical_multiple": 3.6,
"win_rate": null,
"rate_needs_swaps": 50,
"examples": [ ...up to 3 changes, each with before_format and after_format... ]
}
]
}curl "https://api.algrow.online/api/v2/changes/format-swaps?from_format=plain_subject&niche=History" \ -H "Authorization: Bearer YOUR_API_KEY"
