Bandcamp API endpoint
Pages through Bandcamp Discover albums. Filter by one to five tags (genres from bandcamp_filters, subgenres from bandcamp_related_tags), physical format (vinyl, CD, cassette), sort (best-selling, new arrivals, random), a time window, and a GeoNames place id. Each album carries artist, location, price, release date, track count, duration, cover art and any physical formats. Page with the returned next_cursor.
/bandcamp/discoverPages through Bandcamp (bandcamp.com) Discover, the site's browse feed of albums. Every parameter is optional.
tags is a comma-separated list of up to 5 tag slugs that an album must carry all of (for example ambient,drone). Tags are lowercase but not limited to ASCII: 日本, música, español, électronique, русский and são-paulo are real tags. The 27 top-level genre slugs are listed by bandcamp-filters; subgenres and location tags come from bandcamp-related-tags. An unknown tag returns zero results rather than an error.
format selects a physical-format listing: all (default), vinyl, cd or cassette. sort is best_selling (default), new (new arrivals) or random. time_facet is a time-window id from 0 to 7 as listed by bandcamp-filters; Bandcamp does not publish labels for the windows, so the ids are returned unlabeled. geoname_id restricts to artists in a GeoNames place (for example 5368361 for Los Angeles).
size is the number of albums per page, 1 to 100 (default 24). Pass the returned next_cursor as cursor to fetch the next page; when next_cursor is absent the feed has ended. A cursor that Bandcamp did not issue is rejected with 400.
Notable response behavior:
total is the number of albums matching the filters (millions with no filter).price.amount: 5 is 5.00 in price.currency). A price of 0 is a name-your-price album with a zero minimum, and free_download is Bandcamp's own flag, so check both. release_date is RFC 3339 UTC, like the release endpoint (a future date is a pre-order).*.bandcamp.com; bandcamp-release does not accept those URLs. formats lists the physical packages (vinyl, CD, cassette, t-shirt) with their own prices.url and artist_url are cleaned of Bandcamp's tracking query string; pass url to bandcamp-release.| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| id | 40 | |
| title | 40 | “Tin Of Drum [ext. edit.]” and 39 other values |
| url | 40 | zoharum.bandcamp.com and 37 other hosts |
| artist | 40 | “RAPOON” and 38 other values |
| artist_id | 40 | |
| artist_url | 40 | zoharum.bandcamp.com and 37 other hosts |
| location | 36 | “Poland” and 32 other values |
| price | 40 | |
| free_download | 40 | true in 0 of 40 |
| set_price | 40 | true in 0 of 40 |
| preorder | 40 | true in 10 of 40 |
| release_date | 40 | 2010-03-01 to 2027-02-01 |
| track_count | 39 | 1 to 27, median 4 |
| duration_seconds | 39 | 261.82 to 13,229.51, median 1,140.71 |
| image_url | 40 | f4.bcbits.com |
| formats | 5 | median 1 entry |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| tags | string | No | Comma-separated tag slugs, up to 5, all of which an album must carry | ambient,drone | |
| format | string | No | Physical format Allowed values: all, vinyl, cd, cassette. | ||
| sort | string | No | Sort order Allowed values: best_selling, new, random. | ||
| time_facet | integer | No | Time-window id from bandcamp_filters Minimum: 0. Maximum: 7. | ||
| geoname_id | integer | No | GeoNames place id | 5368361 | |
| cursor | string | No | next_cursor from the previous page | ||
| size | integer | No | Albums per page Minimum: 1. Maximum: 100. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/bandcamp/discover?format=all&sort=best_selling" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"total": 18140,
"size": 4,
"next_cursor": "AoN4n/uuyaEDCD9MzM0rYTExMjg3MDQwNzc=",
"albums": [
{
"id": 4095136132,
"title": "Dissolve",
"url": "https://freewhenever.bandcamp.com/album/dissolve",
"artist": "Free Whenever",
"artist_id": 514420660,
"artist_url": "https://freewhenever.bandcamp.com",
"location": "Brooklyn, New York",
"price": {
"amount": 9,
"currency": "USD"
},
"free_download": false,
"set_price": false,
"preorder": true,
"release_date": "2026-12-11 00:00:00 UTC",
"track_count": 9,
"duration_seconds": 2175.608612060547,
"image_url": "https://f4.bcbits.com/img/a2286414320_10.jpg",
"formats": [
{
"format": "vinyl",
"title": "12\" Vinyl First Pressing",
"price": {
"amount": 30,
"currency": "USD"
}
}
]
}
]
},
"msg": "OK"
}Request schema
No body schema
Response schema
#/definitions/bandcamp.discoverResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | bandcamp.DiscoverResponse | No | ||||
| data.albums | array | No | ||||
| data.albums[].artist | string | No | ||||
| data.albums[].artist_id | integer | No | ||||
| data.albums[].artist_url | string | No | ||||
| data.albums[].duration_seconds | number | No | ||||
| data.albums[].formats | array | No | ||||
| data.albums[].formats[].format | string | No | ||||
| data.albums[].formats[].price | bandcamp.Price | No | ||||
| data.albums[].formats[].price.amount | number | No | ||||
| data.albums[].formats[].price.currency | string | No | ||||
| data.albums[].formats[].title | string | No | ||||
| data.albums[].free_download | boolean | No | ||||
| data.albums[].id | integer | No | ||||
| data.albums[].image_url | string | No | ||||
| data.albums[].location | string | No | ||||
| data.albums[].preorder | boolean | No | ||||
| data.albums[].price | bandcamp.Price | No | ||||
| data.albums[].price.amount | number | No | ||||
| data.albums[].price.currency | string | No | ||||
| data.albums[].release_date | string | No | ||||
| data.albums[].set_price | boolean | No | ||||
| data.albums[].title | string | No | ||||
| data.albums[].track_count | integer | No | ||||
| data.albums[].url | string | No | ||||
| data.next_cursor | string | No | ||||
| data.size | integer | No | ||||
| data.total | integer | No | ||||
| msg | string | No | OK |
| 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/bandcamp/discover?format=all&sort=best_selling" \
-H "x-api-key: $CRAWLORA_API_KEY"