Spotify API endpoint
Returns the chapters of a Spotify audiobook by URI, `open.spotify.com` URL or id, with `offset` and `limit` (1-50, default 50). Each chapter has its name, description, duration in milliseconds, release date, explicit and playable flags, Spotify URI, external URL and images; `total` gives the chapter count.
/spotify/audiobook/chaptersuri: Spotify audiobook/show URI or open.spotify.com/show/... URL.id: Spotify show ID. Used when uri is omitted.offset: Chapter offset. Defaults to 0.limit: Chapter limit, clamped to 1-50. Defaults to 50.The endpoint uses Spotify's queryBookChapters private operation. Invalid identifiers return 400; upstream private API failures return 503.
| Field | Filled in, of 10 checked | Values in the sample |
|---|---|---|
| uri | 10 | “spotify:episode:4vxkqkMeYRgpMzQa7yyKN0” and 9 other values |
| type | 10 | Chapter in all 10 |
| name | 10 | “Opening Credits” and 9 other values |
| durationMs | 10 | 17,589 to 1,490,041, median 921,327 |
| imageUrl | 10 | i.scdn.co |
| images | 10 | median 3 entries |
| externalUrl | 10 | open.spotify.com |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| uri | string | No | Spotify audiobook/show URI or open.spotify.com show URL | spotify:show:76GTo4lM62dFR11VuALF01 | |
| id | string | No | Spotify show ID | 76GTo4lM62dFR11VuALF01 | |
| offset | integer | No | Chapter offset | 0 | |
| limit | integer | No | Chapter limit, clamped to 1-50 | 10 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/spotify/audiobook/chapters?limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"uri": "spotify:show:76GTo4lM62dFR11VuALF01",
"chapters": [
{
"uri": "spotify:episode:example",
"name": "Chapter 1"
}
],
"meta": {
"operationName": "queryBookChapters",
"count": 1,
"fetchedAt": "2026-05-13T20:41:13Z"
}
}
}Request schema
No body schema
Response schema
#/definitions/spotify.audiobookChaptersResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | Code is the HTTP status code or a custom code used to indicate the result of the request @example 200 | |||
| data | spotify.AudiobookChaptersResponse | No | ||||
| data.chapters | array | No | Chapters returned for the audiobook. | |||
| data.chapters[].description | string | No | A new adventure from the Stinky Dragon crew. | Description text of the episode. | ||
| data.chapters[].durationMs | integer | No | 3600000 | Episode length in milliseconds. | ||
| data.chapters[].externalUrl | string | No | https://open.spotify.com/episode/2C2Y5kNq7qCVOVhbA0G3os | Link to the episode on open.spotify.com. | ||
| data.chapters[].imageUrl | string | No | https://i.scdn.co/image/ab6765630000ba8ab0484f8ee2933eceab32bac0 | URL of the main cover image for the episode. | ||
| data.chapters[].images | array | No | Cover images available for the episode, with their sizes. | |||
| data.chapters[].images[].height | integer | No | 640 | Image height in pixels. | ||
| data.chapters[].images[].url | string | No | https://i.scdn.co/image/ab6765630000ba8ab0484f8ee2933eceab32bac0 | URL of the image. | ||
| data.chapters[].images[].width | integer | No | 640 | Image width in pixels. | ||
| data.chapters[].isExplicit | boolean | No | false | Whether Spotify marks the episode as explicit. | ||
| data.chapters[].isPlayable | boolean | No | true | Whether the episode can be played. | ||
| data.chapters[].name | string | No | Tales from the Stinky Dragon | Episode title as Spotify shows it. | ||
| data.chapters[].releaseDate | string | No | 2026-05-13 | Date the episode was released, as Spotify returns it. | ||
| data.chapters[].type | string | No | Episode | Kind of item as Spotify labels it, for example `Episode`. | ||
| data.chapters[].uri | string | No | spotify:episode:2C2Y5kNq7qCVOVhbA0G3os | Spotify URI of the episode. | ||
| data.id | string | No | Spotify ID of the audiobook. | |||
| data.limit | integer | No | Maximum number of chapters requested. | |||
| data.meta | object | No | Details about this response. | |||
| data.meta.appVersion | string | No | Version of the Spotify web player the data was read from. | |||
| data.meta.count | integer | No | Number of chapters returned. | |||
| data.meta.fetchedAt | string | No | Time the data was fetched, in UTC (RFC 3339). | |||
| data.meta.operationName | string | No | Name of the Spotify web player operation that returned the data. | |||
| data.offset | integer | No | Position of the first chapter returned. | |||
| data.total | integer | No | Total number of chapters in the audiobook. | |||
| data.uri | string | No | Spotify URI of the audiobook. | |||
| msg | unknown | No | Msg is the message that describes the result of the request @example "Request successful" |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/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/spotify/audiobook/chapters?limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"