---
title: Channel endpoints
slug: channels
eyebrow: Channels
nav_group: Channels
nav_label: Channels
nav_order: 100
nav_expanded: true
---

# 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](#channel-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.

> [!INFO] YouTube uses channel IDs
> For YouTube, pass the channel ID rather than a handle, e.g. `/channels/UC1dGHGJTXU_dkiR8tW3qQgg?platform=youtube`.

## Standard stats {#channel-standard}

Aggregate performance metrics for a single channel. Available on all active platforms.

```endpoint
GET /api/v2/channels/{name}?platform={platform}
```

| Set of metrics | Availability | Cost / request |
| --- | --- | --- |
| Standard | All platforms | 1 |

```curl REQUEST
curl -X GET https://streamscharts.com/api/v2/channels/shroud?platform=twitch \
  -H 'Client-ID: XXXXXXXXXXXX' -H 'Token: YYYYYYYYYYYYYY'
```

```json RESPONSE
{
  "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](/api/docs/requests#timeperiods).

## Extra metrics {twitch #channel-extra}

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}`.

```endpoint
GET /api/v2/channels-extra/{name}?platform=twitch
```

| Set of metrics | Availability | Cost / request |
| --- | --- | --- |
| Extra | Twitch only | 1 |

```json RESPONSE · extra_metrics
// 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
}
```

> [!INFO] Authorized vs. all viewers
> `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.

> [!INFO] Under an exact-time window
> `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](/api/docs/streams).

## Paid subscribers {twitch #channel-subs}

Subscriber counts, tiers, and estimated income for a single channel. Twitch only.

```endpoint
GET /api/v2/channels-extra/{name}/subs?platform=twitch
```

| Set of metrics | Availability | Cost / request |
| --- | --- | --- |
| Paid subscribers | Twitch only | 1 |

```json RESPONSE
{
  "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
  }
}
```

> [!WARNING] Methodology note
> 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 {#channel-chat}

Chat volume and engagement for a single channel. Available for Twitch, Kick, and YouTube.

```endpoint
GET /api/v2/channels-extra/{name}/chat?platform={platform}
```

| Set of metrics | Availability | Cost / request |
| --- | --- | --- |
| Chat analytics | twitch, kick, youtube | 1 |

```json RESPONSE · Twitch
{
  "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
  }
}
```

```json RESPONSE · Kick / YouTube
{
  "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
  }
}
```

> [!INFO] Coverage
> 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 {#channel-audience}

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.

```endpoint
GET /api/v2/channels-extra/{name}/audience?platform={platform}
```

| Set of metrics | Availability | Cost / request |
| --- | --- | --- |
| Audience geography + demographics | twitch, kick, youtube | 2 |

```curl REQUEST
curl -X GET https://streamscharts.com/api/v2/channels-extra/xqc/audience?platform=kick \
  -H 'Client-ID: XXXXXXXXXXXX' -H 'Token: YYYYYYYYYYYYYY'
```

```json RESPONSE
{
  "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 }
  }
}
```

> [!INFO] Same response on every supported platform
> 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. |

> [!WARNING] Not every channel has audience data
> 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.

> [!INFO] No time parameter
> 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.

> [!NEW] Now available on Kick and YouTube
> 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](/api/docs/changelog).

> [!NEW] Replaces /geo and /demo
> 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](/api/docs/changelog).