# Channel › Videos (/docs/api-reference/youtube/channel-videos)

`GET https://api.insightsocial.app/v1/youtube/channel/videos`

Returns recent videos published by a channel, each with title, view count, duration, thumbnail, and publish date; pass includeExtras=true to add like and comment counts.

Use it for a channel's regular uploads; channel/shorts covers Shorts, channel/lives covers streams, channel/community-posts covers text posts.

**Metered: 10–20 credits.** We reserve the ceiling when the call starts and charge what it actually used when it finishes.

Paginates by `cursor`: see [Pagination](https://www.insightsocial.app/docs/pagination).

Send your key in the `x-api-key` header.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `channelId` | string | no | YouTube channel ID. Provide at least one of: `channelId`, `handle`. |
| `handle` | string | no | YouTube channel handle without the @ symbol. Provide at least one of: `channelId`, `handle`. |
| `since` | string | no | Only videos published on or after this date: YYYY-MM-DD (midnight UTC) or an ISO 8601 timestamp. Older videos are left off the page, and the page that reaches one ends the walk: `next_cursor` is not returned and `pagination.stopped_at` is `since`. Pinned videos sit out of date order and never end the walk. The page still costs what a page costs, so a daily poll pays for the pages it walks and no more. |
| `stop_at_id` | string | no | The id (`post.id`) or URL (`post.url`) of the newest video you already hold. The page stops just before it: that video and everything after it are left off, `next_cursor` is not returned, and `pagination.stopped_at` is `known_id`. A pinned video never counts as the stop point. If it is not on this page the page is returned in full with its cursor, so keep walking. `pagination.stopped_at` is `end` when the list ran out first and `null` while there is more to walk. |
| `sort` | string | no | Sort by latest or popular One of: latest, popular. |
| `includeExtras` | string | no | Set to `true` to add the like count and comment count (`post.engagement.likes` / `.comments`) and the video description (`post.ext.description`). For the full per-video detail use /v1/youtube/video. Slows the response slightly. |
| `is_paid_promotions` | string | no | Set to 'true' to search YouTube's public paid product placement / sponsorship / endorsement surface: returns normal videos where the creator disclosed a paid promotion. |
| `include` | string | no | Set to `channel` (one token only) to add the channel's subscriber count to every row (`post.ext.author_followers`, YouTube's own figure, rounded to three significant figures above 1,000) plus `post.author.display_name`, `.avatar_url` and `author.id` where missing. Adds well under a second (never more than 8). One of: channel. |
| `exact_dates` | string | no | Exact publish dates are on by default and free. Set to `false` to skip the lookup: rows then carry YouTube's own date estimate (a day-granular or coarser label truncated to midnight UTC), marked by `post.ext.published_precision` and `post.ext.published_label`, and the listing title, marked by `post.ext.title_maybe_translated`. One of: true, false. |
| `until` | string | no | Only rows published on or before this date: YYYY-MM-DD (that whole UTC day is included) or an ISO 8601 timestamp. Newer rows are left off each page and the walk does not stop, so older pages follow. A row with no date is kept. |
| `cursor` | string | no | The `pagination.next_cursor` from the previous page, sent back unchanged. Omit it for the first page. |
| `dry_run` | string | no | Set to 1 to get the price of this call without making it: data.dry_run carries credits_min and credits_max. Nothing is charged. One of: 1. |
