Channel endpoints
Five metric sets describe a single channel over a time window. Every single-channel endpoint costs 1 credit per request — standard, extra, paid subscribers, chat analytics. The one exception is the joint audience set (geography + demographics), which costs 2. One request returns data for a single channel; because a name can exist on several platforms, platform={name} is required.
For YouTube, pass the channel ID rather than a handle, e.g. /channels/UC1dGHGJTXU_dkiR8tW3qQgg?platform=youtube.
Standard stats
Aggregate performance metrics for a single channel. Available on all active platforms.
| Set of metrics | Availability | Cost / request |
|---|---|---|
| Standard | All platforms | 1 |
REQUESTCURLcurl -X GET https://streamscharts.com/api/v2/channels/shroud?platform=twitch \ -H 'Client-ID: XXXXXXXXXXXX' -H 'Token: YYYYYYYYYYYYYY'
RESPONSEJSON{ "data": { "platform": "twitch", "channel_name": "shroud", "channel_display_name": "shroud", "channel_id": "37402112", "hours_watched": 2554370, "peak_viewers": 33925, "average_viewers": 16262, "airtime_in_m": 9425, "followers_gain": 9574, "followers_gain_per_h": 61, "total_followers": 10602496, "stream_count": 18, "streams_list": [ { "id": "48882015229", "name": "life of a gamer !mggiveaway", "date": "2023-07-16 20:45:00" } ], "games_count": 3, "top_5_games_by_hw": [ { "name": "Diablo IV", "hours_watched": 2488439, "%_of_hours_watched": 97.4 } ], "stream_days": 25, "avatar_url": "https://static-cdn.jtvnw.net/jtv_user_pictures/7ed5e0c6-...-300x300.png", "channel_country": "CA", "stream_language": "en", "partnership_status": "partner", "channel_type": "Male" } }
Response fields
| Field | Type | Description |
|---|---|---|
| channel_display_name | string | Display name as shown on the platform. |
| hours_watched | integer | Total hours watched across the window. |
| peak_viewers | integer | Highest concurrent viewers reached. |
| average_viewers | integer | Average concurrent viewers. |
| airtime_in_m | integer | Total minutes live. |
| followers_gain | integer | Net followers gained in the window. |
| followers_gain_per_h | number | Average followers gained per hour live. |
| total_followers | integer | Total followers as of the window's end. |
| stream_count | integer | Number of broadcasts in the window. |
| streams_list | array | Broadcasts in the window — id, title, start date. |
| games_count | integer | Distinct games/categories streamed. |
| top_5_games_by_hw | array | Top 5 games by hours watched, with share. |
| stream_days | integer | Distinct calendar days the channel was live. |
| avatar_url | string | Channel avatar image URL. |
| channel_country | string | ISO 3166 Alpha-2 country (user-contributed). |
| stream_language | string | ISO 639-1 broadcast language. |
| partnership_status | string | partner, affiliate, or none. |
| channel_type | string | Male, Female, or Organization (user-contributed). |
Field availability by platform
| Platform(s) | Fields not returned |
|---|---|
| NimoTV, Bigo LIVE, SOOP Korea, CHZZK, SOOP, SteamTV | followers_gain, followers_gain_per_h, total_followers, partnership_status |
| YouTube, Trovo | partnership_status |
| Rumble | followers_gain, followers_gain_per_h, total_followers, games_count, top_5_games_by_hw |
Supported time periods
Use time={value} — default 30-days. Presets: today, 7-days, 30-days, 90-days, this-month, last-month, this-year, last-year, or a custom range YYYY-MM-DD,YYYY-MM-DD. For minute-level precision pass YYYY-MM-DD HH:MM,YYYY-MM-DD HH:MM (max 7-day span). See time periods.
Extra metrics TWITCH
Returns the full standard set plus an extra_metrics object with authorized-viewer and audience-quality signals. Twitch only. Use route /api/v2/channels-extra/{name}.
| Set of metrics | Availability | Cost / request |
|---|---|---|
| Extra | Twitch only | 1 |
RESPONSE · extra_metricsJSON// standard fields, then: "extra_metrics": { "live_views": 17636629, "unique_viewers": 3210179, "unique_auth_viewers": 2696550, "auth_viewers_average_view_duration_in_m": 76, "authorized_to_all_viewers_ratio_%": 84, "avg_daily_estimated_audience": 234358, "avg_daily_estimated_audience_average_view_duration_in_m": 47 }
authorized_to_all_viewers_ratio_% is the strongest audience-quality signal. From April 3 2023, Authorized and Unique Viewers are collected only for channels authorized on Streams Charts via Twitch — and only for the period a channel has been authorized. Windows before that return null for these fields however large the channel, so an empty extra_metrics block means the channel was not authorized then, not that it had no viewers.
live_views is always null when time carries hours and minutes: the metric is counted once per broadcast, not over an arbitrary slice of one. That is the documented answer for minute-level windows, not missing data — read live_views from a request without time, or from the stream endpoints.
Paid subscribers TWITCH
Subscriber counts, tiers, and estimated income for a single channel. Twitch only.
| Set of metrics | Availability | Cost / request |
|---|---|---|
| Paid subscribers | Twitch only | 1 |
RESPONSEJSON{ "data": { "platform": "twitch", "channel_name": "shroud", "channel_display_name": "shroud", "channel_id": "37402112", "avatar_url": "https://static-cdn.jtvnw.net/.../7ed5e0c6-...-300x300.png", "stream_language": "en", "partnership_status": "partner", "total_subs": 3429, "min_income_from_subs_in_$": 5083, "max_income_from_subs_in_$": 8889, "paid_subs": 2180, "gifted_subs": 1249, "prime_subs": 1388, "tier_1_subs": 2018, "tier_2_subs": 1, "tier_3_subs": 22 } }
Subscriber figures are Streams Charts estimates, not verified by streamers, and may differ from Twitch's own numbers. Subscriptions while offline are generally not counted, and auto-renewals are tracked only when the viewer announces them in chat.
Chat analytics
Chat volume and engagement for a single channel. Available for Twitch, Kick, and YouTube.
| Set of metrics | Availability | Cost / request |
|---|---|---|
| Chat analytics | twitch, kick, youtube | 1 |
RESPONSE · TwitchJSON{ "data": { "platform": "twitch", "channel_name": "shroud", "channel_display_name": "shroud", "channel_id": "37402112", "avatar_url": "https://static-cdn.jtvnw.net/.../300x300.png", "stream_language": "en", "partnership_status": "partner", "total_messages": 258088, "total_words_count": 1213817, "active_chatters": 47609, "avg_daily_passive_chatters": 134091, "avg_daily_engagement_rate_%": 2.5, "messages_per_chatter": 5.4, "chatters_with_1_message": 23780, "chatters_with_2+_message": 23829, "cheer_messages": 9, "cheer_chatters": 9, "total_bits": 12000, "income_from_bits_in_$": 120, "bits_per_cheered_message": 1333, "bits_per_cheered_chatter": 1333 } }
RESPONSE · Kick / YouTubeJSON{ "data": { "platform": "kick", "channel_name": "xqc", "total_messages": 890938, "total_words_count": 2550177, "active_chatters": 32501, "messages_per_chatter": 27.4, "chatters_with_1_message": 9416, "chatters_with_2+_message": 23085, "active_chatters_to_viewers_ratio_%": 2.2 } }
Twitch chat data covers 200,000+ channels since January 2022. Kick covers 70,000+ channels since July 2025; YouTube covers top Gaming channels since July 2025. Kick and YouTube responses omit bits/cheer fields and add active_chatters_to_viewers_ratio_%. For YouTube, pass the channel ID. Chat supports the standard time presets.
Audience geography & demographics
Who watches the channel: viewer distribution by country with average view duration, plus audience composition — annual income, interests, family status, occupation, age, gender, and language. Both sets come back from one request. Available for Twitch, Kick, and YouTube.
| Set of metrics | Availability | Cost / request |
|---|---|---|
| Audience geography + demographics | twitch, kick, youtube | 2 |
REQUESTCURLcurl -X GET https://streamscharts.com/api/v2/channels-extra/xqc/audience?platform=kick \ -H 'Client-ID: XXXXXXXXXXXX' -H 'Token: YYYYYYYYYYYYYY'
RESPONSEJSON{ "data": { "platform": "twitch", "channel_name": "xqc", "channel_display_name": "xQc", "channel_id": "71092938", "avatar_url": "https://static-cdn.jtvnw.net/.../xqc-...-300x300.jpeg", "stream_language": "en", "partnership_status": "partner", "viewers_by_country": [ { "country_name": "USA", "country_iso": "US", "%_of_viewers": 35.9, "daily_avg_view_duration_m": 18 }, { "country_name": "Canada", "country_iso": "CA", "%_of_viewers": 8.3, "daily_avg_view_duration_m": 18 } ], "audience_annual_income_range": { "10k_20k": 25, "20k_30k": 18, "50k_75k": 12, "30k_40k": 10, "40k_50k": 8 }, "audience_interests": { "video_games": 95, "streaming_influencers": 80, "esports": 70, "computers_electronics": 65, "music_art": 50 }, "audience_family_status": { "single": 55, "married": 30, "parents": 15 }, "audience_occupations": { "white_collar": 25, "students": 20, "stem_it": 18, "freelancers": 7, "service_retail": 6 }, "audience_age_ranges": { "20_to_24": 30, "25_to_29": 28, "30_to_34": 18, "17_to_19": 12, "35_to_39": 6 }, "audience_gender": { "male": 90, "female": 8, "non_binary": 2 }, "audience_languages": { "English": 90, "French": 3, "Other": 3, "German": 2, "Spanish": 2 } } }
Kick and YouTube return the same fields as Twitch — one viewers_by_country array plus all seven audience_* blocks — for the same 2 credits. Two values differ by platform; everything else is identical.
Platform differences
| Difference | Twitch | Kick | YouTube |
|---|---|---|---|
| Path parameter | channel name | channel name | channel ID (UC…), not a handle |
audience_languages keys | English language names — English, French | ISO 639-1 codes — en, fr | ISO 639-1 codes — en, es |
partnership_status | partner / affiliate | partner / affiliate | always null |
Any other platform answers 422 invalid_parameter — No audience data for this type of platform.
Response blocks
Every audience_* block is a JSON object mapping a bucket name to its percentage share — not an array. Bucket sets are fixed per block; buckets with no data are omitted.
| Field | Type | Description |
|---|---|---|
| viewers_by_country | array | Array of objects — country_name, country_iso, %_of_viewers, daily_avg_view_duration_m. Countries below the reporting threshold are pooled into a single row where both country_name and country_iso are the literal string Other, so country_iso is not always a valid ISO code. daily_avg_view_duration_m is null when there is not enough data for that country. |
| audience_annual_income_range | object | Share of the audience per income bracket. |
| audience_interests | object | Affinity score per interest category. |
| audience_family_status | object | Single / married / parents split. |
| audience_occupations | object | Share per occupation group. |
| audience_age_ranges | object | Share per age bracket. |
| audience_gender | object | Gender split of the audience. |
| audience_languages | object | Share per audience language. |
Audience data exists only for channels with enough measured viewership, and coverage is thinner outside Twitch — on YouTube in particular, many large channels have none. A channel without it returns 404 not_found — This channel does not have audience data in our database. Like every non-2xx response, it is not charged, so probing a list of channels for coverage costs nothing until one answers.
Selecting a time period is not available for audience data. It is current as of today and aggregated over the channel’s full history. All percentages are shares of the channel’s audience.
Audience geography and demographics used to be Twitch-only. The same endpoint, the same response shape and the same 2-credit cost now cover Kick and YouTube as well. See the changelog.
Geography and demographics used to be two endpoints at 2 credits each. They are now one request at 2 credits total returning both blocks — half the cost and one round trip. See the changelog.