Algrow

Docs

Channel Data

Pull About info, format overview, daily analytics, videos, shorts, and playlists for any channel.

Look up rich metadata for any YouTube channel by ID. All endpoints take a 24-char channel ID (UCxxxxxxxxxxxxxxxxxxxxxx). If you only have a @handle or URL, resolve it first via one of the search endpoints or the resolve endpoint.

GET/api/channels/:channel_id/about

Everything from a channel's About page in one call — name, description, subscriber and view counts, country, language, join date, topics, social links, trailer, banner, and more.

Path Parameters

NameTypeDescription
channel_idstring24-char YouTube channel ID (starts with UC).

200 Success 400 Invalid channel_id 404 Channel not found 429 Rate limit

Example Response
{
  "success": true,
  "channel": {
    "channel_id": "UCXoyny_UIW-02UwiNPUZT-w",
    "title": "The Geo Network",
    "handle": "@TheGeoNetwork",
    "description": "...",
    "url": "https://www.youtube.com/channel/UCXoyny_UIW-02UwiNPUZT-w",
    "country": { "code": "TR", "name": "Türkiye" },
    "default_language": "en",
    "avatar_url": "...",
    "banner_url": "...",
    "subscriber_count": { "raw": 125000, "display": "125K" },
    "view_count": { "raw": 27325762, "display": "27.3M" },
    "video_count": { "raw": 95, "display": "95" },
    "avg_views_per_video": { "raw": 287639, "display": "287.6K" },
    "joined": {
      "iso": "2019-10-12T00:00:00+00:00",
      "formatted": "Oct 12, 2019",
      "relative": "6 years ago",
      "age_days": 2378
    },
    "privacy_status": "public",
    "made_for_kids": false,
    "hidden_subscribers": false,
    "keywords": "...",
    "topic_categories": ["Military", "Politics"],
    "trailer_video_id": "abc123",
    "uploads_playlist_id": "UUXoyny_UIW-02UwiNPUZT-w",
    "tabs": ["Home", "Videos", "Shorts", "Playlists", "Posts"],
    "has_contact_email": true,
    "social_links": [
      { "platform": "instagram", "url": "instagram.com/thegeonetwork_tgn" }
    ],
    "available_countries_count": 245
  }
}
Example Request
curl -H "Authorization: Bearer algrow_..." \
"https://algrow.online/api/channels/UCXoyny_UIW-02UwiNPUZT-w/about"

GET/api/formats/:slug/overview

Aggregate stats for one of Algrow's 24 canonical channel formats — how many channels are tracked in the niche, average and median subscriber counts, and the biggest channels. The channel About endpoint returns each channel's format slug; feed it here.

Path Parameters

NameTypeDescription
slugstringOne of the 24 canonical format slugs (e.g. documentary, kids_content, challenge_videos).

200 Success 404 Unknown format slug 429 Rate limit

Example Response
{
  "success": true,
  "format": { "slug": "challenge_videos", "display_name": "Challenge Videos" },
  "channels_tracked": 18265,
  "avg_subscribers": 70840,
  "median_subscribers": 7060,
  "top_channels": [
    {
      "channel_id": "UCX6OQ3DkcsbYNE6H8uQQuVA",
      "name": "MrBeast",
      "subscribers": 511000000,
      "profile_picture": "...",
      "url": "https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA"
    }
  ]
}
Example Request
curl -H "Authorization: Bearer algrow_..." \
"https://algrow.online/api/formats/challenge_videos/overview"

GET/api/channels/:channel_id/daily-analytics

See how a channel has grown day-by-day across any date range you pick — subscribers, views, and uploads, plus a summary with total growth over the window.

Query Parameters

NameTypeRequiredDefaultDescription
start_datestringOptional30 days agoISO YYYY-MM-DD.
end_datestringOptionaltodayISO YYYY-MM-DD. Max window 365 days (clamped).

200 Success 400 Invalid date 404 No data in range

Example Response
{
  "success": true,
  "channel_id": "UCXoyny_UIW-02UwiNPUZT-w",
  "channel_title": "The Geo Network",
  "channel_type": "longform",
  "start_date": "2026-03-16",
  "end_date": "2026-04-15",
  "days_requested": 31,
  "days_with_data": 30,
  "summary": {
    "sub_growth": 12500,
    "view_growth": 8450000,
    "video_growth": 12,
    "starting_subs": 125000,
    "ending_subs": 137500,
    "starting_views": 27000000,
    "ending_views": 35450000
  },
  "days": [
    {
      "date": "2026-03-16",
      "total_subs": 125000,
      "total_views": 27000000,
      "total_videos": 95,
      "sub_increase_24h": 420,
      "view_increase_24h": 215000,
      "video_increase_24h": 0
    }
  ]
}
Example Request
curl -G "https://algrow.online/api/channels/UCXoyny_UIW-02UwiNPUZT-w/daily-analytics" \
-H "Authorization: Bearer algrow_..." \
-d "start_date=2026-03-01&end_date=2026-04-15"

GET/api/channels/:channel_id/uploads

What is driving a channel's views. Every upload Algrow holds for the channel, most views gained in the last 24 or 48 hours first, plus the channel's views per UTC day as the sum of its uploads' gains, each day with its top 3 uploads. Pass day to get every upload that gained views that day instead, most first. Reads Algrow's daily view counts (not YouTube live), so the channel must be one Algrow tracks. gained_24h / gained_48h are null for an upload with no reading in the last 2 days. Counts toward daily analytics; asking about the same channel again within 24 hours is free.

Query Parameters

NameTypeRequiredDefaultDescription
content_typestringOptionallongformlongform or shorts.
sortstringOptionalgained_24hgained_24h or gained_48h: most views gained in the last 24 / 48 hours first.
limitintegerOptional30Uploads to return, 1–100. total_videos counts them all.
daysintegerOptional30How many full UTC days the days series covers, ending yesterday, 1–365.
daystringOptional—A UTC day, YYYY-MM-DD. Returns every upload that gained views that day, each with gained, and the day's total views; sort and days are ignored.

200 Success 400 Invalid channel_id, content_type, sort or day 404 No uploads held for the channel

Response200
{
  "success": true,
  "channel_id": "UCXoyny_UIW-02UwiNPUZT-w",
  "content_type": "longform",
  "sort": "gained_24h",
  "total_videos": 412,
  "videos": [
    {
      "video_id": "R-NK5pa7KAU",
      "title": "The Collapse Has Begun...",
      "url": "https://www.youtube.com/watch?v=R-NK5pa7KAU",
      "thumbnail_url": "...",
      "view_count": 1806657,
      "upload_date": "2026-10-27T16:00:00+00:00",
      "duration": 1111,
      "outlier_score": 4.21,
      "gained_24h": 312904,
      "gained_48h": 655120
    }
  ],
  "days": [
    {
      "date": "2026-10-30",
      "views": 498230,
      "top": [
        {
          "video_id": "R-NK5pa7KAU",
          "gained": 312904,
          "title": "The Collapse Has Begun..."
        }
      ]
    }
  ]
}
Response 200 (day) 200
{
  "success": true,
  "channel_id": "UCXoyny_UIW-02UwiNPUZT-w",
  "content_type": "longform",
  "day": "2026-10-14",
  "views": 1310422,
  "count": 38,
  "videos": [
    {
      "video_id": "R-NK5pa7KAU",
      "title": "The Collapse Has Begun...",
      "view_count": 1806657,
      "gained_24h": 312904,
      "gained_48h": 655120,
      "gained": 540118
    }
  ]
}
Example
curl "https://api.algrow.online/api/channels/UCXoyny_UIW-02UwiNPUZT-w/uploads?sort=gained_24h&limit=10" \
-H "Authorization: Bearer YOUR_API_KEY"

GET/api/channels/:channel_id/videos

Browse a channel's longform uploads, newest first — with titles, view counts, durations, upload dates, and thumbnails.

Query Parameters

NameTypeRequiredDefaultDescription
limitintegerOptional30Max videos (1–100).

200 Success 400 Invalid channel_id

Example Response
{
  "success": true,
  "channel_id": "UCXoyny_UIW-02UwiNPUZT-w",
  "limit": 30,
  "count": 30,
  "has_more": true,
  "videos": [
    {
      "video_id": "R-NK5pa7KAU",
      "title": "The Collapse Has Begun...",
      "url": "https://www.youtube.com/watch?v=R-NK5pa7KAU",
      "published_text": "5 hours ago",
      "duration_text": "18:31",
      "duration_seconds": 1111,
      "view_count": 106657,
      "view_count_text": "106,657 views",
      "thumbnail_url": "..."
    }
  ]
}
Example Request
curl -G "https://algrow.online/api/channels/UCXoyny_UIW-02UwiNPUZT-w/videos" \
-H "Authorization: Bearer algrow_..." -d "limit=50"

GET/api/channels/:channel_id/shorts

Browse a channel's Shorts, newest first — the real Shorts tab, not short-duration regular videos.

Query Parameters

NameTypeRequiredDefaultDescription
limitintegerOptional30Max shorts (1–100).

200 Success 400 Invalid channel_id

Example Response
{
  "success": true,
  "channel_id": "UCXoyny_UIW-02UwiNPUZT-w",
  "limit": 30,
  "count": 3,
  "has_more": false,
  "shorts": [
    {
      "video_id": "5YKwSHccYTA",
      "title": "Detaylı tarif...",
      "url": "https://www.youtube.com/shorts/5YKwSHccYTA",
      "view_count": 942,
      "view_count_text": "942 views",
      "thumbnail_url": "..."
    }
  ]
}
Example Request
curl -H "Authorization: Bearer algrow_..." \
"https://algrow.online/api/channels/UCXoyny_UIW-02UwiNPUZT-w/shorts?limit=20"

GET/api/channels/:channel_id/playlists

See every public playlist on a channel — title, description, video count, and thumbnail for each. Paginates in batches of 50.

Query Parameters

NameTypeRequiredDefaultDescription
page_tokenstringOptional—Pass the next_page_token from a previous response for subsequent pages.

200 Success 400 Invalid channel_id 429 Rate limit

Example Response
{
  "success": true,
  "channel_id": "UCXoyny_UIW-02UwiNPUZT-w",
  "count": 17,
  "next_page_token": null,
  "playlists": [
    {
      "playlist_id": "PL069L7PbBcLx_O3Zv3gzUbScKtRrcMR76",
      "title": "pide tarifleri",
      "description": "",
      "published_at": "2020-08-31T19:26:11Z",
      "video_count": 4,
      "thumbnail_url": "...",
      "url": "https://www.youtube.com/playlist?list=PL069L7PbBcLx_O3Zv3gzUbScKtRrcMR76"
    }
  ]
}
Example Request
curl -H "Authorization: Bearer algrow_..." \
"https://algrow.online/api/channels/UCXoyny_UIW-02UwiNPUZT-w/playlists"

POST/api/channels/bulk-stats

Subscriber counts — and channel-average views where we hold them — for many channels in one call. Channels already in the Algrow index are answered from our database and cost you nothing; anything we don't hold is resolved live from YouTube in batches. Use this instead of looping a per-channel endpoint when you are annotating a feed.

Request Body (JSON)

NameTypeRequiredDefaultDescription
channel_idsstring[]Required—Channel IDs to look up. Must start with UC and be 24 characters. Duplicates and malformed entries are dropped silently; at most 300 per call.

Partial results are normal. Compare resolved against requested — a channel we can't resolve is simply absent from stats rather than present with zeroes. Each entry carries a source of algrow (from our index) or youtube (resolved live). avg_views_per_video is null for channels we haven't measured.

200 Success 400 Empty, invalid, or over 300 IDs 429 Rate limit

Example Response
{
  "success": true,
  "requested": 3,
  "resolved": 2,
  "stats": {
    "UCXoyny_UIW-02UwiNPUZT-w": {
      "subscriber_count": 1240000,
      "avg_views_per_video": 84210.5,
      "source": "algrow"
    },
    "UC_x5XG1OV2P6uZZ5FSM9Ttw": {
      "subscriber_count": 2310000,
      "avg_views_per_video": null,
      "source": "youtube"
    }
  }
}
Example Request
curl -X POST "https://algrow.online/api/channels/bulk-stats" \
-H "Authorization: Bearer algrow_..." \
-H "Content-Type: application/json" \
-d '{"channel_ids": ["UCXoyny_UIW-02UwiNPUZT-w", "UC_x5XG1OV2P6uZZ5FSM9Ttw"]}'

GET/api/channels/:channel_id/video-deltas

Daily view counts and day-over-day movement for each of a channel's tracked videos. Use it to see which videos are still picking up views and which have gone flat.

Query Parameters

NameTypeRequiredDefaultDescription
daysintegerOptional30How far back to read, from 1 to 365 days.

Coverage is not universal. Daily tracking runs for channels our users have opened, so a channel nobody has looked at yet returns videos: []. That is an empty series, not an error — render it as "not tracked yet" rather than treating it as a failure.

viewIncrease24h can be null. Null means there is no earlier day to measure against, so the movement is unknown. It never means zero. likes and comments follow the same rule.

200 Success 400 Invalid channel id or days out of range 429 Rate limit

Example Response
{
  "channelId": "UCXoyny_UIW-02UwiNPUZT-w",
  "days": 30,
  "videos": [
    {
      "videoId": "dQw4w9WgXcQ",
      "samples": [
        {
          "date": "2026-08-18",
          "views": 412880,
          "viewIncrease24h": null,
          "likes": 18204,
          "comments": 1332
        },
        {
          "date": "2026-08-19",
          "views": 431905,
          "viewIncrease24h": 19025,
          "likes": 18911,
          "comments": 1388
        }
      ]
    }
  ]
}
Example Request
curl -H "Authorization: Bearer algrow_..." \
"https://algrow.online/api/channels/UCXoyny_UIW-02UwiNPUZT-w/video-deltas?days=14"

The channel's typical view curve by video age — a low and high band for how many cumulative views a video on this channel usually has at a given number of minutes after publication. Plot a video's real curve against this band to see whether it is over- or under-performing for its own channel.

Request Body (JSON)

NameTypeRequiredDefaultDescription
videoIdsstring[]Optional—Restrict the band to these videos. Omit to use the whole channel. Every entry must be a valid video id or the call returns 400.

Read the estimated flag before you trust the band. When we hold enough sampled history it is false and the band is a real 25th-to-75th percentile of that channel's own videos. When we don't, it is true and the band is synthesized from what we do know — still useful for shape, but not a measurement. A channel with no usable videos returns trends: [].

200 Success 400 Invalid channel id or videoIds 429 Rate limit

Example Response
{
  "channelId": "UCXoyny_UIW-02UwiNPUZT-w",
  "estimated": false,
  "trends": [
    {"minutesSincePublication": 60, "min": 1420, "max": 8830},
    {"minutesSincePublication": 1440, "min": 24100, "max": 96400}
  ]
}
Example Request
curl -X POST "https://algrow.online/api/channels/UCXoyny_UIW-02UwiNPUZT-w/videos/performance-trends" \
-H "Authorization: Bearer algrow_..." \
-H "Content-Type: application/json" \
-d '{}'

GET/api/videos/:video_id/stats-history

The sampled time series for one video: views, likes and comments at each point we recorded, plus the views-per-hour rate between consecutive points. Returns the last sample in each bucket, oldest first.

Query Parameters

NameTypeRequiredDefaultDescription
granularitystringOptionalhourlyBucket size. One of hourly, daily, monthly.
fromstringOptional—Start of the window. Omit for the earliest sample we hold.
tostringOptional—End of the window. Omit for the most recent sample.

History is sampled, not continuous. A video only has points from the moment we started seeing it, so samples is empty for videos we have never recorded. vph is computed between the returned points, which means a wider granularity gives a smoother, lower-resolution rate.

200 Success 400 Invalid video id or granularity 429 Rate limit

Example Response
{
  "videoId": "dQw4w9WgXcQ",
  "granularity": "hourly",
  "samples": [
    {
      "timestamp": "2026-08-19T14:00:00Z",
      "views": 412880,
      "likes": 18204,
      "comments": 1332,
      "vph": null
    },
    {
      "timestamp": "2026-08-19T15:00:00Z",
      "views": 414012,
      "likes": 18251,
      "comments": 1339,
      "vph": 1132
    }
  ]
}
Example Request
curl -H "Authorization: Bearer algrow_..." \
"https://algrow.online/api/videos/dQw4w9WgXcQ/stats-history?granularity=daily"

GET/api/videos/:video_id/daily-views

One video's views per day, oldest first: the count Algrow read each UTC day (view_count), the views gained since the reading before (views_gained, null on the first day) and when it was read (captured_at). Long-form and Shorts. Days Algrow missed have no row. For sub-daily samples of a long-form video use stats-history. Counts toward daily analytics; asking about the same video again within 24 hours is free.

Path Parameters

NameTypeDescription
video_idstring11-character YouTube video ID.

Query Parameters

NameTypeRequiredDefaultDescription
content_typestringOptionallongformlongform or shorts. A Short is only found with shorts.

200 Success 400 Invalid video_id or content_type 404 No daily views held for the video

Response200
{
  "video_id": "dQw4w9WgXcQ",
  "content_type": "longform",
  "days": [
    {
      "day": "2026-10-29",
      "view_count": 412880,
      "views_gained": null,
      "captured_at": "2026-10-29T03:12:45+00:00"
    },
    {
      "day": "2026-10-30",
      "view_count": 431905,
      "views_gained": 19025,
      "captured_at": "2026-10-30T03:10:02+00:00"
    }
  ]
}
Example
curl "https://api.algrow.online/api/videos/dQw4w9WgXcQ/daily-views?content_type=longform" \
-H "Authorization: Bearer YOUR_API_KEY"

POST/api/videos/:video_id/observations

Record one point-in-time reading of a video's stats. This is the write side of stats-history — every observation you post becomes a point in that video's series.

Request Body (JSON)

NameTypeRequiredDefaultDescription
viewCountintegerRequired—The video's view count at the moment you read it. Must be a whole number.
likeCountintegerOptional—Like count. Negative or non-integer values are stored as null rather than rejected.
commentCountintegerOptional—Comment count. Same handling as likeCount.

At most one sample per video per 10 minutes. Posting more often is safe but the extra readings are discarded. recorded tells you which happened: true means a new point was stored, false means one already existed inside the window. Neither is an error.

200 Success 400 Invalid video id or missing viewCount 429 Rate limit

Example Response
{
  "videoId": "dQw4w9WgXcQ",
  "recorded": true
}
Example Request
curl -X POST "https://algrow.online/api/videos/dQw4w9WgXcQ/observations" \
-H "Authorization: Bearer algrow_..." \
-H "Content-Type: application/json" \
-d '{"viewCount": 414012, "likeCount": 18251, "commentCount": 1339}'

GET/api/channels/:channel_id/youtube-recommends

The channels YouTube suggests next to a channel's videos. Algrow reads the Up next list beside the channel's last 10 long-form videos as a signed-out viewer in the US, so no one person's watch history shapes it, and returns the channels in it closest first. beside is how many of the videos a channel was suggested next to, slots how many suggestions it got in all, and example one of its suggested videos. everywhere: true marks channels YouTube suggests next to almost anything (big podcasts, late-night TV). own and mixes count suggestions that were the channel's own videos or playlists; hidden_small counts channels left out for averaging under 2K views a video. in_algrow is longform or shorts when Algrow holds the channel, else null. Cached for two hours; a first read takes about 10 seconds. Shorts-only channels have no long-form videos to read (videos_used: 0).

Path Parameters

NameTypeDescription
channel_idstring24-char YouTube channel ID (starts with UC). Use POST /api/channels/resolve first for a @handle or URL.

Query Parameters

NameTypeRequiredDefaultDescription
limitintegerOptional50Max channels returned, closest first, up to 300. total counts them all.
refreshstringOptional—1 reads YouTube again once the cached copy is stale (two hours old).

400 Invalid id 503 YouTube unreachable, try again

Response200
{
  "success": true,
  "channel_id": "UCIjw46txjW6oD4NU6FHaj_w",
  "channel_name": "Panlasang Pinoy",
  "videos_used": 10,
  "slots": 599,
  "own": 129,
  "mixes": 12,
  "rows": [
    {
      "id": "UCvQrjgLj841wiQAKDgtKFOw",
      "name": "Ninong Ry",
      "avatar": "https://yt3.ggpht.com/...",
      "beside": 10,
      "slots": 18,
      "example": {
        "video_id": "5X_Bc7gADOA",
        "title": "LONGGANISA LEVEL-UP | Ninong Ry",
        "views": "471K",
        "age": "8d ago"
      },
      "everywhere": false,
      "in_algrow": "longform",
      "subscribers": 2800000,
      "views_48h": 642398
    }
  ],
  "total": 149,
  "hidden_small": 19,
  "checked_at": "2026-10-31T10:09:47+01:00",
  "stale": false,
  "can_refresh_at": "2026-10-31T12:09:47+01:00"
}
Example
curl "https://api.algrow.online/api/channels/UCIjw46txjW6oD4NU6FHaj_w/youtube-recommends?limit=20" \
-H "Authorization: Bearer YOUR_API_KEY"

GET/api/videos/:video_id/youtube-recommends

The videos YouTube suggests next to one long-form video. YouTube shuffles the Up next list on every visit, so Algrow reads the whole list as 3 fresh signed-out viewers in the US and orders what came up by seen (how many of the reads showed it) and then place (its average position). Each video carries its channel, own: true when it is from the same channel, outlier (Algrow's outlier multiple, or null when Algrow doesn't have the video), everywhere: true when its channel is one YouTube suggests next to almost anything, and in_algrow for the channel. mixes counts playlists and mixes. Cached for two hours; a first read takes 20 to 30 seconds. Next to a Short, YouTube suggests long-form videos, not the Shorts feed.

Path Parameters

NameTypeDescription
video_idstring11-character YouTube video ID.

Query Parameters

NameTypeRequiredDefaultDescription
limitintegerOptional50Max videos returned, most consistent first, up to 300. total counts them all.
refreshstringOptional—1 reads YouTube again once the cached copy is stale (two hours old).

400 Invalid id 503 YouTube unreachable, try again

Response200
{
  "success": true,
  "video_id": "P-j3S-Qvfo4",
  "title": "My Summer Holiday 155 Days Building 1M Dollars Water Slide Park into Underground Swimming Pool House",
  "channel_id": "UCIfT6SDOfHsFJqWQ7LPg_vQ",
  "reads": 3,
  "pages": 10,
  "mixes": 6,
  "rows": [
    {
      "video_id": "yOrtCDX73Go",
      "title": "Awesome Build Three Story Boat Villa House & Beautiful Swimming Pool",
      "views": "45M",
      "age": "5y ago",
      "channel_id": "UClo-U5gvXPRy-4VqWEkkRDg",
      "channel_name": "Primitive Building",
      "avatar": "https://yt3.ggpht.com/...",
      "own": false,
      "seen": 3,
      "place": 1.0,
      "outlier": null,
      "everywhere": false,
      "in_algrow": "longform",
      "adding": null
    }
  ],
  "total": 258,
  "checked_at": "2026-10-30T14:59:28+01:00",
  "stale": false,
  "can_refresh_at": "2026-10-30T16:59:28+01:00"
}
Example
curl "https://api.algrow.online/api/videos/P-j3S-Qvfo4/youtube-recommends?limit=20" \
-H "Authorization: Bearer YOUR_API_KEY"