Twitch API endpoint
Returns one page of a Twitch VOD's chat replay (past-broadcast chat messages), starting at a given point in the video's timeline. Paginate forward by re-requesting with the last returned comment's offset_seconds.
/twitch/vod-commentsReturns one page of a Twitch VOD's chat replay -- past-broadcast chat messages, ordered by their offset into the video's timeline.
Query parameters:
video (required) — a Twitch VOD/video id (the numeric id from
twitch.tv/videos/{id}, not a URL).offset (optional) — start the page from this point in the VOD's
timeline, in seconds (default 0, the start of the broadcast).Notable response behavior:
offset_seconds (or next_offset_seconds) as the next request's
offset to page forward. Twitch's own cursor-based paging mode for
this operation requires a device-integrity token this endpoint does
not carry, so it is not exposed here.message is the comment's flattened plain text; fragments breaks
it into text/emote runs, with emote_id set on emote fragments.has_more reflects whether Twitch has additional comments after
this page's last offset.200 with an empty comments list.404. A missing video returns 400
before any upstream request is made.| Field | Filled in, of 57 checked | Values in the sample |
|---|---|---|
| id | 57 | |
| commenter | 57 | |
| offset_seconds | 57 | |
| created_at | 57 | 2026-08-14 |
| message | 57 | |
| fragments | 57 | median 1 entry |
| user_color | 48 | |
| badges | 42 | median 1 entry |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| video | string | Yes | Twitch VOD/video id (the numeric id from twitch.tv/videos/{id}) | 2845804307 | |
| offset | integer | No | Start the page from this point in the VOD's timeline, in seconds (default 0) | 0 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/twitch/vod-comments?video=2845804307" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"video_id": "2845804307",
"offset_seconds": 0,
"count": 55,
"has_more": true,
"next_offset_seconds": 140,
"comments": [
{
"id": "d19286b9-dd9c-45b7-91eb-1fff28926f2c",
"commenter": {
"id": "271911711",
"login": "mrfluffernuts",
"display_name": "mrfluffernuts"
},
"offset_seconds": 53,
"created_at": "2026-08-14T07:19:45.217Z",
"message": "I'm going to spend my 50million during game 5 of worlds so you have to end stream @caedrel",
"fragments": [
{
"text": "I'm going to spend my 50million during game 5 of worlds so you have to end stream @caedrel"
}
]
}
]
}
}Request schema
No body schema
Response schema
#/definitions/twitch.vodCommentsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | twitch.VodCommentsResponse | No | ||||
| data.comments | array | No | ||||
| data.comments[].badges | array | No | ||||
| data.comments[].commenter | twitch.VodCommentCommenter | No | ||||
| data.comments[].commenter.display_name | string | No | ||||
| data.comments[].commenter.id | string | No | ||||
| data.comments[].commenter.login | string | No | ||||
| data.comments[].created_at | string | No | 2026-08-14T07:20:39Z | |||
| data.comments[].fragments | array | No | ||||
| data.comments[].fragments[].emote_id | string | No | ||||
| data.comments[].fragments[].text | string | No | ||||
| data.comments[].id | string | No | ||||
| data.comments[].message | string | No | ||||
| data.comments[].offset_seconds | integer | No | 113 | |||
| data.comments[].user_color | string | No | #0000FF | |||
| data.count | integer | No | 55 | |||
| data.has_more | boolean | No | true | |||
| data.next_offset_seconds | integer | No | 140 | |||
| data.offset_seconds | integer | No | 0 | |||
| data.video_id | string | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/twitch/vod-comments?video=2845804307" \
-H "x-api-key: $CRAWLORA_API_KEY"