Bandcamp API endpoint
Runs Bandcamp's site search and returns artists and labels, albums and tracks in Bandcamp's relevance order, each with its id, name, url and artwork (albums and tracks also carry the artist, tracks the album), plus any tags and genre that match the text. Bandcamp returns at most 50 hits (25 for artists) and does not page, so may_have_more reports when the cap was reached; narrow the text or pick a type to see more. Fan accounts are never returned. Pass a result's url to bandcamp_release or bandcamp_artist, and a tag's slug to bandcamp_discover.
/bandcamp/searchRuns Bandcamp's site search and returns artists and labels, albums and tracks in Bandcamp's relevance order, with the tags and genre that match the text. It reads the JSON route behind the search box, so it needs no page rendering.
q is required: 1 to 100 characters (for example radiohead, dub techno or 日本). type selects what to return: all (default) mixes artists, albums and tracks; artists returns artists and labels; albums; tracks.
Notable response behavior:
artists). may_have_more is true when that cap was reached; narrow the text or choose a type to see further hits. total is the number of hits returned, not the number of matches on Bandcamp.results[].type is artist, album or track, and rank is the position in Bandcamp's order. In all, the order mixes the types, so a popular artist's albums can fill most of the 50.location, genre, tags, is_label (true for labels) and url (the https://{subdomain}.bandcamp.com page). Album rows carry artist_id, artist_name, artist_url and tags. Track rows also carry album_id and album_name, which are empty for a single.url is accepted by bandcamp-release (albums and tracks) and bandcamp-artist (artists). image_url is a Bandcamp artwork URL.tags lists tags whose name matches the text (name, the tag slug that bandcamp-discover accepts, and count of tagged releases). genre appears when the text is a genre Bandcamp recognizes (for example jazz). Both are empty for typed searches.total: 0 and empty lists.Example request: /api/v1/bandcamp/search?q=radiohead&type=all
Example response (trimmed to three of the 50 hits):
{
"code": 200,
"data": {
"query": "radiohead",
"type": "all",
"total": 50,
"may_have_more": true,
"results": [
{
"rank": 1,
"type": "artist",
"id": 3957198221,
"name": "Radiohead",
"url": "https://radiohead.bandcamp.com",
"location": "Oxford, UK",
"genre": "Alternative",
"tags": ["Alternative"],
"image_url": "https://f4.bcbits.com/img/0047220904_23.jpg"
},
{
"rank": 2,
"type": "album",
"id": 3317386587,
"name": "KID A MNESIA",
"url": "https://radiohead.bandcamp.com/album/kid-a-mnesia",
"artist_id": 3957198221,
"artist_name": "Radiohead",
"artist_url": "https://radiohead.bandcamp.com",
"tags": ["Alternative", "England", "Oxford", "United Kingdom"],
"image_url": "https://f4.bcbits.com/img/3185643660_3.jpg"
},
{
"rank": 24,
"type": "track",
"id": 3131312045,
"name": "All I Need (Radiohead Cover)",
"url": "https://spotlights.bandcamp.com/track/all-i-need-radiohead-cover",
"artist_id": 1516729353,
"artist_name": "Spotlights",
"artist_url": "https://spotlights.bandcamp.com",
"image_url": "https://f4.bcbits.com/img/3207173692_3.jpg"
}
],
"tags": [
{
"name": "RadioHead",
"tag": "radiohead",
"count": 8
}
]
},
"msg": "OK"
}
Type values: all, artists, albums, tracks.
| Field | Filled in, of 25 checked | Values in the sample |
|---|---|---|
| rank | 25 | 1 to 25, median 13 |
| type | 25 | artist in all 25 |
| id | 25 | |
| name | 25 | “Radiohead” and 24 other values |
| url | 25 | radiohead.bandcamp.com and 24 other hosts |
| location | 24 | “Oxford, UK” and 23 other values |
| genre | 25 | “Alternative” and 10 other values |
| tags | 25 | median 3 entries |
| image_url | 25 | f4.bcbits.com |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | Yes | Text to search, 1 to 100 characters | radiohead | |
| type | string | No | Kind of hit to return: all (default), artists (artists and labels), albums or tracks Allowed values: all, artists, albums, tracks. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/bandcamp/search?q=radiohead&type=all" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"query": "radiohead",
"type": "all",
"total": 50,
"may_have_more": true,
"results": [
{
"rank": 1,
"type": "artist",
"id": 3957198221,
"name": "Radiohead",
"url": "https://radiohead.bandcamp.com",
"location": "Oxford, UK",
"genre": "Alternative",
"tags": [
"Alternative"
],
"image_url": "https://f4.bcbits.com/img/0047220904_23.jpg"
},
{
"rank": 2,
"type": "album",
"id": 3317386587,
"name": "KID A MNESIA",
"url": "https://radiohead.bandcamp.com/album/kid-a-mnesia",
"artist_id": 3957198221,
"artist_name": "Radiohead",
"artist_url": "https://radiohead.bandcamp.com",
"tags": [
"Alternative",
"England",
"Oxford",
"United Kingdom"
],
"image_url": "https://f4.bcbits.com/img/3185643660_3.jpg"
},
{
"rank": 24,
"type": "track",
"id": 3131312045,
"name": "All I Need (Radiohead Cover)",
"url": "https://spotlights.bandcamp.com/track/all-i-need-radiohead-cover",
"artist_id": 1516729353,
"artist_name": "Spotlights",
"artist_url": "https://spotlights.bandcamp.com",
"image_url": "https://f4.bcbits.com/img/3207173692_3.jpg"
}
],
"tags": [
{
"name": "RadioHead",
"tag": "radiohead",
"count": 8
}
]
},
"msg": "OK"
}Request schema
No body schema
Response schema
#/definitions/bandcamp.searchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | bandcamp.SearchResponse | No | ||||
| data.genre | bandcamp.SearchGenre | No | ||||
| data.genre.genre | string | No | ||||
| data.genre.subgenre | string | No | ||||
| data.may_have_more | boolean | No | ||||
| data.query | string | No | ||||
| data.results | array | No | ||||
| data.results[].album_id | integer | No | ||||
| data.results[].album_name | string | No | ||||
| data.results[].artist_id | integer | No | ||||
| data.results[].artist_name | string | No | ||||
| data.results[].artist_url | string | No | ||||
| data.results[].genre | string | No | ||||
| data.results[].id | integer | No | ||||
| data.results[].image_url | string | No | ||||
| data.results[].is_label | boolean | No | ||||
| data.results[].location | string | No | ||||
| data.results[].name | string | No | ||||
| data.results[].rank | integer | No | ||||
| data.results[].tags | array | No | ||||
| data.results[].type | string | No | ||||
| data.results[].url | string | No | ||||
| data.tags | array | No | ||||
| data.tags[].count | integer | No | ||||
| data.tags[].name | string | No | ||||
| data.tags[].tag | string | No | ||||
| data.total | integer | No | ||||
| data.type | string | 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/search?q=radiohead&type=all" \
-H "x-api-key: $CRAWLORA_API_KEY"