├── .gitignore ├── README.md └── data ├── bandcamp.json └── bandcamp.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | .vstags 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Bandcamp-API 2 | My attempt at documenting the un-documented [Bandcamp.com](https://bandcamp.com) web API. Unfortunately they even removed documentation for the previously documented endpoints. [Today's devs pages](https://bandcamp.com/developer) only cover high level APIs, none dealing with the actual content. 3 | 4 | Thanks to [the Internet Archive](https://web.archive.org/web/) we can still find an old copy of the legacy [Bandcamp API](https://web.archive.org/web/20160512171900/http://bandcamp.com:80/developer). 5 | 6 | The API definition is stored as JSON and YAML files in [Open API v3.0 format](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md) in the `data` folder. Use eg. the [swagger.io editor](https://editor.swagger.io) to import and edit, or other [swagger.io tools](https://swagger.io) to process the files. 7 | 8 | Check out the [interactive API documentation](https://michaelherger.github.io/Bandcamp-API/). 9 | -------------------------------------------------------------------------------- /data/bandcamp.json: -------------------------------------------------------------------------------- 1 | { 2 | "openapi": "3.0.0", 3 | "info": { 4 | "description": "bandcamp", 5 | "version": "1.0.0", 6 | "title": "Bandcamp" 7 | }, 8 | "servers": [ 9 | { 10 | "url": "https://bandcamp.com", 11 | "description": "API endpoint. Does NOT serve any artwork." 12 | }, 13 | { 14 | "url": "https://f0.bcbits.com", 15 | "description": "Artwork serving & resizing. Does NOT serve the API. f0 can vary to f1, f4 etc." 16 | } 17 | ], 18 | "tags": [ 19 | { 20 | "name": "To be figured out", 21 | "description": "end-points I have no clue about. Have fun!" 22 | } 23 | ], 24 | "paths": { 25 | "/api/band/3/search": { 26 | "get": { 27 | "summary": "Search for bands.", 28 | "tags": [ 29 | "Bands" 30 | ], 31 | "parameters": [ 32 | { 33 | "$ref": "#/components/parameters/DevKey" 34 | }, 35 | { 36 | "in": "query", 37 | "name": "name", 38 | "schema": { 39 | "type": "string" 40 | }, 41 | "required": true, 42 | "example": "hermann" 43 | } 44 | ], 45 | "responses": { 46 | "200": { 47 | "description": "the bands", 48 | "content": { 49 | "application/json": { 50 | "schema": { 51 | "type": "object", 52 | "properties": { 53 | "results": { 54 | "type": "array", 55 | "items": { 56 | "type": "object", 57 | "description": "a search result", 58 | "properties": { 59 | "name": { 60 | "$ref": "#/components/schemas/ArtistName" 61 | }, 62 | "band_id": { 63 | "$ref": "#/components/schemas/ArtistID" 64 | }, 65 | "subdomain": { 66 | "$ref": "#/components/schemas/SubDomain" 67 | }, 68 | "url": { 69 | "$ref": "#/components/schemas/ArtistURL" 70 | }, 71 | "offsite_url": { 72 | "type": "string", 73 | "format": "URI", 74 | "description": "the artist's online presence outside bandcamp.com", 75 | "example": "http://facebook.com/hermannmusik" 76 | } 77 | } 78 | } 79 | } 80 | } 81 | } 82 | } 83 | } 84 | } 85 | } 86 | } 87 | }, 88 | "/api/band/3/discography": { 89 | "get": { 90 | "summary": "Get a band's discography.", 91 | "tags": [ 92 | "Bands" 93 | ], 94 | "parameters": [ 95 | { 96 | "$ref": "#/components/parameters/DevKey" 97 | }, 98 | { 99 | "in": "query", 100 | "name": "band_id", 101 | "schema": { 102 | "type": "integer" 103 | }, 104 | "required": true, 105 | "example": 2240734681 106 | } 107 | ], 108 | "responses": { 109 | "200": { 110 | "description": "the band's discography", 111 | "content": { 112 | "application/json": { 113 | "schema": { 114 | "type": "object", 115 | "properties": { 116 | "results": { 117 | "type": "array", 118 | "items": { 119 | "type": "object", 120 | "description": "a discography item", 121 | "properties": { 122 | "title": { 123 | "$ref": "#/components/schemas/AlbumTitle" 124 | }, 125 | "artist": { 126 | "$ref": "#/components/schemas/ArtistName" 127 | }, 128 | "band_id": { 129 | "$ref": "#/components/schemas/ArtistID" 130 | }, 131 | "subdomain": { 132 | "$ref": "#/components/schemas/SubDomain" 133 | }, 134 | "url": { 135 | "$ref": "#/components/schemas/AlbumURL" 136 | }, 137 | "art_id": { 138 | "$ref": "#/components/schemas/ArtworkID" 139 | }, 140 | "large_art_url": { 141 | "$ref": "#/components/schemas/ArtworkURL" 142 | }, 143 | "small_art_url": { 144 | "$ref": "#/components/schemas/ArtworkURL" 145 | }, 146 | "downloadable": { 147 | "$ref": "#/components/schemas/DownloadableFlag" 148 | }, 149 | "release_date": { 150 | "$ref": "#/components/schemas/Timestamp" 151 | }, 152 | "album_id": { 153 | "$ref": "#/components/schemas/AlbumID" 154 | } 155 | } 156 | } 157 | } 158 | } 159 | } 160 | } 161 | } 162 | } 163 | } 164 | } 165 | }, 166 | "/api/album/2/info": { 167 | "get": { 168 | "summary": "Get album information.", 169 | "description": "unfortunately this call would not return all playable items, even if an identity cookie or the like was used.", 170 | "tags": [ 171 | "Albums" 172 | ], 173 | "parameters": [ 174 | { 175 | "$ref": "#/components/parameters/DevKey" 176 | }, 177 | { 178 | "in": "query", 179 | "name": "album_id", 180 | "schema": { 181 | "type": "string" 182 | }, 183 | "required": true, 184 | "example": 793714377 185 | } 186 | ], 187 | "responses": { 188 | "200": { 189 | "description": "the album", 190 | "content": { 191 | "application/json": { 192 | "schema": { 193 | "type": "object", 194 | "properties": { 195 | "results": { 196 | "type": "array", 197 | "items": { 198 | "type": "object", 199 | "description": "a discography item", 200 | "properties": { 201 | "title": { 202 | "$ref": "#/components/schemas/AlbumTitle" 203 | }, 204 | "about": { 205 | "type": "string", 206 | "description": "a description of the given album", 207 | "example": "„Es gseht us, als wär d’Zyt still gstande, was an sich reizvoll wär, aber s’esch die falschi Zyt gsi...“ (Stillstand) \r\n\r\nHerzstück von Hermanns minimaler Mundart-Musik ist der Rhythm Ace FR-1. Mit seinen einfachen Rhythmen und dem warmen, analogen Klang liefert der 50-jährige Drumcomputer das ideale klangliche Gerüst für die drei Musiker, die auf der Suche nach einem neuen Sound waren. Das Gerät zwang ihnen die einfache Frage auf: wie füllt man die stoische Motorik mit Leben? Hermanns Antwort: Mit einfachen erzählenden Texten, die Ausflüge ins Politische, Alltagsphilosophische und Absurde unternehmen. Mit Gitarren- und Synthie-Sounds, die gleichermassen für stimmige Flächen wie für melodiöse Einfälle zuständig sind. Und mit einem Bass, der das stete Treiben des Rhythm Ace elegant mit dem musikalischen Überbau verbindet. All dies ergibt eine stimmungsvolle, punktgenaue Musik, die den Kopf gen oben öffnet, ohne dass die Füsse den Boden verlassen möchten." 208 | }, 209 | "album_id": { 210 | "$ref": "#/components/schemas/AlbumID" 211 | }, 212 | "band_id": { 213 | "$ref": "#/components/schemas/ArtistID" 214 | }, 215 | "large_art_url": { 216 | "$ref": "#/components/schemas/ArtworkURL" 217 | }, 218 | "small_art_url": { 219 | "$ref": "#/components/schemas/ArtworkURL" 220 | }, 221 | "downloadable": { 222 | "$ref": "#/components/schemas/DownloadableFlag" 223 | }, 224 | "release_date": { 225 | "$ref": "#/components/schemas/Timestamp" 226 | }, 227 | "url": { 228 | "$ref": "#/components/schemas/AlbumURL" 229 | }, 230 | "credits": { 231 | "type": "string", 232 | "description": "free text credits of the album", 233 | "example": "Hermann: Hannes Herger (Bass), Dani Hug (Synths), Jonathan Winkler (Gesang, Gitarre, Rhythm Ace FR-1)\r\nAufnahme & Mix: Timo Keller, StudioVomDach\r\nMastering: Dave Hofmann, Somastudios.ch\r\nDesign: hugototal.ch" 234 | }, 235 | "tracks": { 236 | "type": "array", 237 | "items": { 238 | "$ref": "#/components/schemas/Track" 239 | } 240 | } 241 | } 242 | } 243 | } 244 | } 245 | } 246 | } 247 | } 248 | } 249 | } 250 | } 251 | }, 252 | "/api/track/3/info": { 253 | "get": { 254 | "summary": "Get track information.", 255 | "tags": [ 256 | "Tracks" 257 | ], 258 | "parameters": [ 259 | { 260 | "$ref": "#/components/parameters/DevKey" 261 | }, 262 | { 263 | "in": "query", 264 | "name": "track_id", 265 | "schema": { 266 | "type": "string" 267 | }, 268 | "required": true, 269 | "example": 5020296 270 | } 271 | ], 272 | "responses": { 273 | "200": { 274 | "description": "the track", 275 | "content": { 276 | "application/json": { 277 | "schema": { 278 | "$ref": "#/components/schemas/Track" 279 | } 280 | } 281 | } 282 | } 283 | } 284 | } 285 | }, 286 | "/api/fancollection/1/followers": { 287 | "post": { 288 | "summary": "Get a user's followers", 289 | "tags": [ 290 | "Fan Collection" 291 | ], 292 | "requestBody": { 293 | "$ref": "#/components/requestBodies/FanCollectionBody" 294 | }, 295 | "responses": { 296 | "200": { 297 | "$ref": "#/components/responses/FanCollection" 298 | } 299 | } 300 | } 301 | }, 302 | "/api/fancollection/1/following_bands": { 303 | "post": { 304 | "summary": "Get the bands a user is following", 305 | "tags": [ 306 | "Fan Collection" 307 | ], 308 | "requestBody": { 309 | "$ref": "#/components/requestBodies/FanCollectionBody" 310 | }, 311 | "responses": { 312 | "200": { 313 | "$ref": "#/components/responses/FanCollection" 314 | } 315 | } 316 | } 317 | }, 318 | "/api/fancollection/1/following_fans": { 319 | "post": { 320 | "summary": "Get the fans a user is following", 321 | "tags": [ 322 | "Fan Collection" 323 | ], 324 | "requestBody": { 325 | "$ref": "#/components/requestBodies/FanCollectionBody" 326 | }, 327 | "responses": { 328 | "200": { 329 | "$ref": "#/components/responses/FanCollection" 330 | } 331 | } 332 | } 333 | }, 334 | "/api/fancollection/1/collection_items": { 335 | "post": { 336 | "summary": "Get a user's collection", 337 | "tags": [ 338 | "Fan Collection" 339 | ], 340 | "parameters": [ 341 | { 342 | "$ref": "#/components/parameters/IdentityCookie" 343 | } 344 | ], 345 | "requestBody": { 346 | "$ref": "#/components/requestBodies/FanCollectionBody" 347 | }, 348 | "responses": { 349 | "200": { 350 | "$ref": "#/components/responses/ItemCollection" 351 | } 352 | } 353 | } 354 | }, 355 | "/api/fancollection/1/wishlist_items": { 356 | "post": { 357 | "summary": "Get a user's wishlist", 358 | "tags": [ 359 | "Fan Collection" 360 | ], 361 | "requestBody": { 362 | "$ref": "#/components/requestBodies/FanCollectionBody" 363 | }, 364 | "responses": { 365 | "200": { 366 | "$ref": "#/components/responses/ItemCollection" 367 | } 368 | } 369 | } 370 | }, 371 | "/api/fancollection/1/fan_suggestions": { 372 | "post": { 373 | "summary": "Get a user's suggestions? Don't know, really.", 374 | "tags": [ 375 | "Fan Collection", 376 | "To be figured out" 377 | ], 378 | "requestBody": { 379 | "$ref": "#/components/requestBodies/FanCollectionBody" 380 | }, 381 | "responses": { 382 | "200": { 383 | "description": "The suggestions" 384 | } 385 | } 386 | } 387 | }, 388 | "/api/fancollection/1/gifts_given": { 389 | "post": { 390 | "summary": "Get the gifts a user has given?? Don't know, really.", 391 | "tags": [ 392 | "Fan Collection", 393 | "To be figured out" 394 | ], 395 | "requestBody": { 396 | "$ref": "#/components/requestBodies/FanCollectionBody" 397 | }, 398 | "responses": { 399 | "200": { 400 | "description": "The gifts" 401 | } 402 | } 403 | } 404 | }, 405 | "/api/fan/2/collection_summary": { 406 | "get": { 407 | "summary": "get a rough summary of the user's collection (items bought etc.)", 408 | "tags": [ 409 | "Fan Collection" 410 | ], 411 | "parameters": [ 412 | { 413 | "in": "header", 414 | "schema": { 415 | "type": "string" 416 | }, 417 | "name": "Cookie", 418 | "example": "identity=6%0909ddd7b4f6eca8250cedc5f42546bd39%09%7B%22id%22%3A1712700664%2C%22h1%22%3A%220a36b7aa8ce0b80c36b86d5bc4d0e735%22%2C%22ex%22%3A0%7D;" 419 | } 420 | ], 421 | "responses": { 422 | "200": { 423 | "description": "a summary of the user's collection", 424 | "content": { 425 | "application/json": { 426 | "schema": { 427 | "type": "object", 428 | "properties": { 429 | "fan_id": { 430 | "$ref": "#/components/schemas/FanID" 431 | }, 432 | "collection_summary": { 433 | "type": "object", 434 | "properties": { 435 | "fan_id": { 436 | "$ref": "#/components/schemas/FanID" 437 | }, 438 | "tralbum_lookup": { 439 | "type": "object", 440 | "properties": { 441 | "": { 442 | "type": "object", 443 | "description": "the key is something like 'a1234', where 'a' is for albums - see ItemType?", 444 | "properties": { 445 | "item_id": { 446 | "anyOf": [ 447 | { 448 | "$ref": "#/components/schemas/AlbumID" 449 | }, 450 | { 451 | "$ref": "#/components/schemas/TrackID" 452 | } 453 | ] 454 | }, 455 | "band_id": { 456 | "$ref": "#/components/schemas/ArtistID" 457 | }, 458 | "purchased": { 459 | "type": "string", 460 | "description": "formatted timestamp of purchase, or null if not purchased (wishlist?)" 461 | }, 462 | "item_type": { 463 | "$ref": "#/components/schemas/ItemType" 464 | } 465 | } 466 | } 467 | } 468 | }, 469 | "follows": { 470 | "type": "object", 471 | "properties": { 472 | "following": { 473 | "type": "object", 474 | "properties": { 475 | "": { 476 | "description": "keys are the followed fans/bands' IDs", 477 | "type": "boolean" 478 | } 479 | } 480 | } 481 | } 482 | }, 483 | "url": { 484 | "type": "string", 485 | "format": "URL", 486 | "description": "the fan's home on bandcamp.com", 487 | "example": "https://bandcamp.com/michaelherger" 488 | }, 489 | "username": { 490 | "type": "string", 491 | "example": "michaelherger" 492 | } 493 | } 494 | } 495 | } 496 | } 497 | } 498 | } 499 | } 500 | } 501 | } 502 | }, 503 | "/fan_feed_poll": { 504 | "post": { 505 | "summary": "get the user's \"Music Feed\"", 506 | "tags": [ 507 | "To be figured out" 508 | ], 509 | "parameters": [ 510 | { 511 | "in": "header", 512 | "schema": { 513 | "type": "string" 514 | }, 515 | "name": "Cookie", 516 | "example": "__utma=241114640.1402729518.1499081724.1519889216.1520672370.21; __utmb=241114640.2.10.1520672370; __utmc=241114640; __utmz=241114640.1519881502.19.8.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); __utmt=1; session=1%09t%3A1520672367%09bp%3A1%09r%3A%5B%22nilZ0f0x1520672367%22%2C%2239731231s0a793714377x1519890154%22%2C%2239731231s0i2240734681x1519890153%22%5D; BACKENDID=bender01-3; fan_visits=10236z4679z188671z482972; identity=6%0909ddd7b4f6eca8250cedc5f42546bd39%09%7B%22id%22%3A1712700664%2C%22h1%22%3A%220a36b7aa8ce0b80c36b86d5bc4d0e735%22%2C%22ex%22%3A0%7D; logout=%7B%22username%22%3A%22paypal%40herger.net%22%7D; want_https=1; __qca=P0-412173266-1499081724027; client_id=D38AB1D81E70CC68504277E9FE450FABC8D939D402E73A4D4A8212974965AAF4" 517 | } 518 | ], 519 | "requestBody": { 520 | "description": "JSON data of yet to understand data", 521 | "required": true, 522 | "content": { 523 | "application/x-www-form-urlencoded": { 524 | "schema": { 525 | "type": "object", 526 | "properties": { 527 | "since": { 528 | "$ref": "#/components/schemas/Timestamp" 529 | }, 530 | "crumb": { 531 | "type": "string", 532 | "description": "XXX", 533 | "example": "|fan_feed_poll|1520674192|JQgsXLOGnRKBBslOCPQXqpTCKJ0=" 534 | } 535 | } 536 | } 537 | } 538 | } 539 | }, 540 | "responses": { 541 | "200": { 542 | "description": "the feed" 543 | } 544 | } 545 | } 546 | }, 547 | "/fan_dash_feed_updates": { 548 | "post": { 549 | "summary": "The user's \"Music Feed\" of music suggestions", 550 | "tags": [ 551 | "Music Feed" 552 | ], 553 | "parameters": [ 554 | { 555 | "$ref": "#/components/parameters/IdentityCookie" 556 | } 557 | ], 558 | "requestBody": { 559 | "description": "JSON data of yet to understand data", 560 | "required": true, 561 | "content": { 562 | "application/x-www-form-urlencoded": { 563 | "schema": { 564 | "type": "object", 565 | "properties": { 566 | "older_than": { 567 | "allOf": [ 568 | { 569 | "$ref": "#/components/schemas/Timestamp" 570 | }, 571 | { 572 | "description": "the unix timestamp from when the stream should start" 573 | } 574 | ] 575 | }, 576 | "fan_id": { 577 | "$ref": "#/components/schemas/FanID" 578 | } 579 | } 580 | } 581 | } 582 | } 583 | }, 584 | "responses": { 585 | "200": { 586 | "description": "the Music Feed", 587 | "content": { 588 | "application/json": { 589 | "schema": { 590 | "type": "object", 591 | "properties": { 592 | "stories": { 593 | "type": "object", 594 | "properties": { 595 | "entries": { 596 | "description": "the stream's items", 597 | "type": "array", 598 | "items": { 599 | "description": "a Music Stream item", 600 | "type": "object", 601 | "properties": { 602 | "item_type": { 603 | "$ref": "#/components/schemas/ItemType" 604 | } 605 | } 606 | } 607 | }, 608 | "track_list": { 609 | "description": "the list of playable items from the Music Stream?", 610 | "type": "object", 611 | "properties": { 612 | "entries": { 613 | "description": "the stream's items", 614 | "type": "array", 615 | "items": { 616 | "anyOf": [ 617 | { 618 | "$ref": "#/components/schemas/Track" 619 | } 620 | ] 621 | } 622 | } 623 | } 624 | }, 625 | "query_times": { 626 | "description": "the times spent on the various queries required to compile the Music Stream. \"Query\":\"Time\" pairs", 627 | "type": "object" 628 | }, 629 | "oldest_story_date": { 630 | "$ref": "#/components/schemas/Timestamp" 631 | }, 632 | "feed_timestamp": { 633 | "$ref": "#/components/schemas/Timestamp" 634 | }, 635 | "newest_story_date": { 636 | "allOf": [ 637 | { 638 | "$ref": "#/components/schemas/Timestamp" 639 | }, 640 | { 641 | "description": "the timestamp of the most recent story in the result list" 642 | } 643 | ] 644 | } 645 | } 646 | }, 647 | "fan_info": { 648 | "description": "information about the fans featured in the stream", 649 | "type": "object", 650 | "properties": { 651 | "": { 652 | "$ref": "#/components/schemas/Fan" 653 | } 654 | } 655 | }, 656 | "band_info": { 657 | "description": "information about the bands featured in the stream", 658 | "type": "object", 659 | "properties": { 660 | "": { 661 | "type": "object", 662 | "properties": { 663 | "name": { 664 | "$ref": "#/components/schemas/ArtistName" 665 | }, 666 | "band_id": { 667 | "$ref": "#/components/schemas/ArtistID" 668 | }, 669 | "image_id": { 670 | "$ref": "#/components/schemas/ArtworkID" 671 | }, 672 | "genre_id": { 673 | "type": "integer" 674 | }, 675 | "followed": { 676 | "type": "integer" 677 | }, 678 | "no_index": { 679 | "$ref": "#/components/schemas/UnknownProperty" 680 | }, 681 | "latest_art_id": { 682 | "$ref": "#/components/schemas/UnknownProperty" 683 | } 684 | } 685 | } 686 | } 687 | }, 688 | "story_collectors": { 689 | "description": "fans of one of the stream items?", 690 | "type": "array", 691 | "items": { 692 | "$ref": "#/components/schemas/UnknownProperty" 693 | } 694 | }, 695 | "item_lookup": { 696 | "description": "unknown, just empty?", 697 | "type": "object" 698 | } 699 | } 700 | } 701 | } 702 | } 703 | } 704 | } 705 | } 706 | }, 707 | "/api/bcweekly/2/list": { 708 | "get": { 709 | "summary": "Get a list of the Weekly shows.", 710 | "tags": [ 711 | "Weekly" 712 | ], 713 | "responses": { 714 | "200": { 715 | "description": "the list of available Weekly shows", 716 | "content": { 717 | "application/json": { 718 | "schema": { 719 | "type": "object", 720 | "properties": { 721 | "results": { 722 | "type": "array", 723 | "items": { 724 | "type": "object", 725 | "properties": { 726 | "published_date": { 727 | "type": "string", 728 | "description": "a formatted timestamp", 729 | "example": "27 Sep 2016 00:00:00 GMT" 730 | }, 731 | "date": { 732 | "type": "string", 733 | "description": "a formatted timestamp", 734 | "example": "27 Sep 2016 00:00:00 GMT" 735 | }, 736 | "image_caption": { 737 | "$ref": "#/components/schemas/ImageCaption" 738 | }, 739 | "subtitle": { 740 | "type": "string", 741 | "example": "All in the Family" 742 | }, 743 | "desc": { 744 | "$ref": "#/components/schemas/ShowDescription" 745 | }, 746 | "image_id": { 747 | "type": "integer", 748 | "description": "smallest?" 749 | }, 750 | "v2_image_id": { 751 | "type": "integer", 752 | "description": "largest?" 753 | }, 754 | "screen_image_id": { 755 | "type": "integer", 756 | "description": "middle size, still 1000px?" 757 | }, 758 | "id": { 759 | "type": "integer", 760 | "example": 198 761 | }, 762 | "button_color": { 763 | "type": "string", 764 | "description": "a HTML/CSS color definition, likely matching the artwork", 765 | "example": "f03b2b" 766 | } 767 | } 768 | } 769 | } 770 | } 771 | } 772 | } 773 | } 774 | } 775 | } 776 | } 777 | }, 778 | "/api/bcweekly/2/get": { 779 | "get": { 780 | "summary": "Get information about a Weekly show.", 781 | "tags": [ 782 | "Weekly" 783 | ], 784 | "parameters": [ 785 | { 786 | "in": "query", 787 | "name": "id", 788 | "schema": { 789 | "type": "integer" 790 | }, 791 | "example": 270, 792 | "required": true 793 | } 794 | ], 795 | "responses": { 796 | "200": { 797 | "description": "the list of available Weekly shows", 798 | "content": { 799 | "application/json": { 800 | "schema": { 801 | "type": "object", 802 | "properties": { 803 | "show_id": { 804 | "type": "integer", 805 | "example": 198 806 | }, 807 | "title": { 808 | "type": "string", 809 | "description": "always the same?", 810 | "example": "Bandcamp Weekly" 811 | }, 812 | "subtitle": { 813 | "type": "string", 814 | "example": "All in the Family" 815 | }, 816 | "desc": { 817 | "$ref": "#/components/schemas/ShowDescription" 818 | }, 819 | "short_desc": { 820 | "type": "string", 821 | "example": "Goat & Reginald Omas Mamode IV" 822 | }, 823 | "audio_title": { 824 | "type": "string", 825 | "example": "BC Weekly 183 September 27th 2016" 826 | }, 827 | "show_screen_image_id": { 828 | "type": "integer", 829 | "example": 8380257 830 | }, 831 | "show_v2_image_id": { 832 | "type": "integer", 833 | "example": 8387090 834 | }, 835 | "show_image_id": { 836 | "type": "integer", 837 | "example": 8387090 838 | }, 839 | "audio_track_id": { 840 | "type": "integer", 841 | "description": "pointing to single file for whole podcast" 842 | }, 843 | "audio_duration": { 844 | "type": "number", 845 | "example": 5388.41 846 | }, 847 | "audio_stream": { 848 | "type": "object", 849 | "description": "pointing to single file for whole podcast", 850 | "properties": { 851 | "mp3-128": { 852 | "type": "string", 853 | "format": "url", 854 | "example": "https://bandcamp.com/stream_redirect?enc=mp3-128&track_id=1447643114&ts=1521207419&t=5852f1d29b7d9d8e11b62bae086245d3a65c70ef" 855 | }, 856 | "opus-lo": { 857 | "type": "string", 858 | "format": "url", 859 | "example": "https://popplers5.bandcamp.com/download/track?enc=opus-lo&fsig=7e1214cff8a4c7dffef134ca8a52e880&id=1447643114&stream=1&ts=1521207420.0" 860 | } 861 | } 862 | }, 863 | "audio_url_hash": { 864 | "$ref": "#/components/schemas/URLHints" 865 | }, 866 | "tracks": { 867 | "type": "array", 868 | "description": "list of track metadata, unfortunately without the streaming URL", 869 | "items": { 870 | "type": "object", 871 | "properties": { 872 | "title": { 873 | "type": "string", 874 | "example": "The League of Frightened Men" 875 | }, 876 | "is_purchasable": { 877 | "type": "boolean" 878 | }, 879 | "label": { 880 | "type": "string", 881 | "example": "Western Vinyl" 882 | }, 883 | "url_hints": { 884 | "$ref": "#/components/schemas/URLHints" 885 | }, 886 | "album_url": { 887 | "$ref": "#/components/schemas/URLHints" 888 | }, 889 | "location_text": { 890 | "type": "string", 891 | "example": "Philadelphia, Pennsylvania" 892 | }, 893 | "album_id": { 894 | "$ref": "#/components/schemas/AlbumID" 895 | }, 896 | "track_id": { 897 | "$ref": "#/components/schemas/TrackID" 898 | }, 899 | "track_art_id": { 900 | "$ref": "#/components/schemas/ArtworkID" 901 | }, 902 | "track_url": { 903 | "type": "string", 904 | "example": "http://lushlifemedia.bandcamp.com/track/the-league-of-frightened-men" 905 | }, 906 | "artist": { 907 | "type": "string", 908 | "example": "Lushlife" 909 | }, 910 | "is_preorder": { 911 | "type": "boolean" 912 | }, 913 | "price": { 914 | "type": "number" 915 | }, 916 | "merch_ids": { 917 | "$ref": "#/components/schemas/MerchIDs" 918 | }, 919 | "currency": { 920 | "$ref": "#/components/schemas/Currency" 921 | }, 922 | "band_id": { 923 | "$ref": "#/components/schemas/ArtistID" 924 | }, 925 | "bio_image_id": { 926 | "$ref": "#/components/schemas/ArtworkID" 927 | }, 928 | "package_image_ids": { 929 | "type": "array", 930 | "description": "no idea", 931 | "items": { 932 | "type": "string" 933 | } 934 | }, 935 | "timecode": { 936 | "type": "number" 937 | }, 938 | "is_set_price": { 939 | "type": "boolean" 940 | }, 941 | "require_email": { 942 | "type": "boolean" 943 | }, 944 | "url": { 945 | "type": "string", 946 | "format": "url", 947 | "example": "http://lushlifemedia.bandcamp.com/album/no-dead-languages" 948 | }, 949 | "album_title": { 950 | "type": "string", 951 | "example": "No Dead Languages" 952 | } 953 | } 954 | } 955 | }, 956 | "image_caption": { 957 | "$ref": "#/components/schemas/ImageCaption" 958 | }, 959 | "stream_infos": { 960 | "type": "object", 961 | "properties": { 962 | "metadata_crc": { 963 | "type": "string" 964 | }, 965 | "encodings_id": { 966 | "type": "integer", 967 | "example": 3474371285 968 | }, 969 | "format": { 970 | "type": "integer", 971 | "example": 101 972 | }, 973 | "file_id": { 974 | "type": "integer", 975 | "example": 3596572293 976 | } 977 | } 978 | }, 979 | "date": { 980 | "type": "string", 981 | "description": "a formatted timestamp", 982 | "example": "27 Sep 2016 00:00:00 GMT" 983 | }, 984 | "published_date": { 985 | "type": "string", 986 | "description": "a formatted timestamp", 987 | "example": "27 Sep 2016 00:00:00 GMT" 988 | }, 989 | "dark_mode": { 990 | "type": "string" 991 | } 992 | } 993 | } 994 | } 995 | } 996 | } 997 | } 998 | } 999 | }, 1000 | "/api/url/1/info": { 1001 | "get": { 1002 | "summary": "Get information about content on a given bandcamp.com URL.", 1003 | "tags": [ 1004 | "URLs" 1005 | ], 1006 | "parameters": [ 1007 | { 1008 | "$ref": "#/components/parameters/DevKey" 1009 | }, 1010 | { 1011 | "in": "query", 1012 | "name": "url", 1013 | "schema": { 1014 | "type": "string", 1015 | "format": "URI" 1016 | }, 1017 | "example": "https://hrmnn.bandcamp.com", 1018 | "required": true 1019 | } 1020 | ], 1021 | "responses": { 1022 | "200": { 1023 | "description": "information about the given URL", 1024 | "content": { 1025 | "application/json": { 1026 | "schema": { 1027 | "oneOf": [ 1028 | { 1029 | "type": "object", 1030 | "properties": { 1031 | "error_message": { 1032 | "type": "string", 1033 | "example": "unknown url" 1034 | }, 1035 | "error": { 1036 | "type": "boolean" 1037 | } 1038 | } 1039 | }, 1040 | { 1041 | "type": "object", 1042 | "properties": { 1043 | "band_id": { 1044 | "$ref": "#/components/schemas/ArtistID" 1045 | } 1046 | } 1047 | }, 1048 | { 1049 | "type": "object", 1050 | "properties": { 1051 | "band_id": { 1052 | "$ref": "#/components/schemas/ArtistID" 1053 | }, 1054 | "track_id": { 1055 | "$ref": "#/components/schemas/TrackID" 1056 | } 1057 | } 1058 | }, 1059 | { 1060 | "type": "object", 1061 | "properties": { 1062 | "band_id": { 1063 | "$ref": "#/components/schemas/ArtistID" 1064 | }, 1065 | "album_id": { 1066 | "$ref": "#/components/schemas/AlbumID" 1067 | } 1068 | } 1069 | } 1070 | ] 1071 | } 1072 | } 1073 | } 1074 | } 1075 | } 1076 | } 1077 | }, 1078 | "/img/{type}{id}_{format}.jpg": { 1079 | "get": { 1080 | "summary": "Endpoint on https://f0.bcbits.com/ to get various pieces of artwork.", 1081 | "description": "Not really another endpoint, but its own server... here for completeness' sake. *Make sure you use this on https://f0.bcbits.com/!*", 1082 | "tags": [ 1083 | "Artwork" 1084 | ], 1085 | "parameters": [ 1086 | { 1087 | "in": "path", 1088 | "name": "type", 1089 | "schema": { 1090 | "type": "string", 1091 | "enum": [ 1092 | "a", 1093 | "t", 1094 | "p" 1095 | ] 1096 | }, 1097 | "description": "- a: Album artwork\n- t: Track artwork\n- p: merchandising? Not sure about this one", 1098 | "required": true, 1099 | "example": "a" 1100 | }, 1101 | { 1102 | "in": "path", 1103 | "name": "id", 1104 | "schema": { 1105 | "type": "string" 1106 | }, 1107 | "description": "The image ID is left padded with 0 and then truncated to 10 characters.", 1108 | "required": true, 1109 | "example": 1386391961 1110 | }, 1111 | { 1112 | "in": "path", 1113 | "name": "format", 1114 | "schema": { 1115 | "type": "integer", 1116 | "enum": [ 1117 | 0, 1118 | 1, 1119 | 2, 1120 | 3, 1121 | 4, 1122 | 5, 1123 | 7, 1124 | 8, 1125 | 9, 1126 | 20, 1127 | 22, 1128 | 41, 1129 | 42 1130 | ] 1131 | }, 1132 | "description": "An integer defining the resulting size. One of the following:\n- 0 => original (size & format, don't use extension)\n- 1 => fullsize (dito, use .original?, even heavier?!?)\n- 2 => 350x350 jpg\n- 3 => 100x100 jpg\n- 4 => 300x300 jpg\n- 5 => 700x700 jpg\n- 7 => 150x150 jpg\n- 8 => 124x124 jpg\n- 9 => 210x210 jpg\n- 10 => 1200x1200 jpg\n\nNon-artwork related, but working?\n- 20 => 1024x1024 jpg\n- 22 => 25x25 jpg\n- 41 => 210x210 jpg\n- 42 => 50x50 jpg", 1133 | "required": true, 1134 | "example": 2 1135 | } 1136 | ], 1137 | "responses": { 1138 | "200": { 1139 | "description": "the artwork", 1140 | "content": { 1141 | "image/*": { 1142 | "schema": { 1143 | "type": "string", 1144 | "format": "binary" 1145 | } 1146 | } 1147 | } 1148 | } 1149 | } 1150 | } 1151 | }, 1152 | "/api/salesfeed/1/get": { 1153 | "get": { 1154 | "summary": "get currently selling items", 1155 | "tags": [ 1156 | "Editorial" 1157 | ], 1158 | "parameters": [ 1159 | { 1160 | "in": "query", 1161 | "name": "start_date", 1162 | "schema": { 1163 | "type": "integer" 1164 | }, 1165 | "description": "timestamp of the moment you want sales data from" 1166 | } 1167 | ], 1168 | "responses": { 1169 | "200": { 1170 | "description": "a list of currently selling albums", 1171 | "content": { 1172 | "application/json": { 1173 | "schema": { 1174 | "type": "object", 1175 | "properties": { 1176 | "server_time": { 1177 | "$ref": "#/components/schemas/Timestamp" 1178 | }, 1179 | "end_date": { 1180 | "$ref": "#/components/schemas/Timestamp" 1181 | }, 1182 | "data_delay_sec": { 1183 | "$ref": "#/components/schemas/UnknownProperty" 1184 | }, 1185 | "events": { 1186 | "type": "array", 1187 | "items": { 1188 | "anyOf": [ 1189 | { 1190 | "$ref": "#/components/schemas/SaleEvent" 1191 | }, 1192 | { 1193 | "$ref": "#/components/schemas/DownloadEvent" 1194 | } 1195 | ] 1196 | } 1197 | }, 1198 | "start_date": { 1199 | "$ref": "#/components/schemas/Timestamp" 1200 | }, 1201 | "home_page_values": { 1202 | "type": "object", 1203 | "properties": { 1204 | "sales_count_all_time": { 1205 | "allOf": [ 1206 | { 1207 | "$ref": "#/components/schemas/UnknownProperty" 1208 | }, 1209 | { 1210 | "example": 40981326 1211 | } 1212 | ] 1213 | }, 1214 | "downloads_count_all_time": { 1215 | "allOf": [ 1216 | { 1217 | "$ref": "#/components/schemas/UnknownProperty" 1218 | }, 1219 | { 1220 | "example": 182798723 1221 | } 1222 | ] 1223 | }, 1224 | "revenue_total": { 1225 | "allOf": [ 1226 | { 1227 | "$ref": "#/components/schemas/UnknownProperty" 1228 | }, 1229 | { 1230 | "example": 277276436 1231 | } 1232 | ] 1233 | }, 1234 | "revenue_30d": { 1235 | "allOf": [ 1236 | { 1237 | "$ref": "#/components/schemas/UnknownProperty" 1238 | }, 1239 | { 1240 | "example": 7291052 1241 | } 1242 | ] 1243 | } 1244 | } 1245 | } 1246 | } 1247 | } 1248 | } 1249 | } 1250 | } 1251 | } 1252 | } 1253 | }, 1254 | "/api/discover/3/get_web": { 1255 | "get": { 1256 | "summary": "get a list of discovery items", 1257 | "description": "get a list of discovery items: `top` selling, staff `pic`ks, `new` arrivals, `most` recommended", 1258 | "tags": [ 1259 | "Editorial" 1260 | ], 1261 | "parameters": [ 1262 | { 1263 | "in": "query", 1264 | "name": "p", 1265 | "schema": { 1266 | "type": "integer" 1267 | }, 1268 | "description": "Page?", 1269 | "example": 0 1270 | }, 1271 | { 1272 | "in": "query", 1273 | "name": "s", 1274 | "schema": { 1275 | "$ref": "#/components/schemas/DiscoveryType" 1276 | }, 1277 | "example": "top" 1278 | } 1279 | ], 1280 | "responses": { 1281 | "200": { 1282 | "description": "the items", 1283 | "content": { 1284 | "application/json": { 1285 | "schema": { 1286 | "type": "object", 1287 | "properties": { 1288 | "total_count": { 1289 | "type": "integer" 1290 | }, 1291 | "items": { 1292 | "type": "array", 1293 | "items": { 1294 | "$ref": "#/components/schemas/Album" 1295 | } 1296 | }, 1297 | "timestamp": { 1298 | "type": "string", 1299 | "example": "05 Mar 2018 16:52:23 GMT" 1300 | }, 1301 | "data_sig": { 1302 | "$ref": "#/components/schemas/UnknownProperty" 1303 | }, 1304 | "spec_id": { 1305 | "$ref": "#/components/schemas/UnknownProperty" 1306 | }, 1307 | "ui_sig": { 1308 | "$ref": "#/components/schemas/UnknownProperty" 1309 | }, 1310 | "args": { 1311 | "type": "object", 1312 | "properties": { 1313 | "s": { 1314 | "$ref": "#/components/schemas/DiscoveryType" 1315 | }, 1316 | "p": { 1317 | "type": "integer" 1318 | }, 1319 | "g": { 1320 | "type": "string", 1321 | "example": "all" 1322 | }, 1323 | "r": { 1324 | "$ref": "#/components/schemas/UnknownProperty" 1325 | }, 1326 | "following": { 1327 | "type": "boolean", 1328 | "description": "wheter a user is following this item or not" 1329 | }, 1330 | "w": { 1331 | "type": "integer" 1332 | }, 1333 | "f": { 1334 | "type": "string", 1335 | "example": "all" 1336 | } 1337 | } 1338 | } 1339 | } 1340 | } 1341 | } 1342 | } 1343 | } 1344 | } 1345 | } 1346 | } 1347 | }, 1348 | "components": { 1349 | "parameters": { 1350 | "DevKey": { 1351 | "in": "query", 1352 | "name": "key", 1353 | "description": "a dev key which was provided by bandcamp.com. Unfortunately they no longer hand them out.", 1354 | "schema": { 1355 | "type": "string" 1356 | }, 1357 | "required": true 1358 | }, 1359 | "IdentityCookie": { 1360 | "in": "header", 1361 | "description": "the identity cookie can only be received by logging in to the web site. Unfortunately I haven't found a way to log in programmatically yet. But that identity cookie seems to be rather long-lived (several days at least).", 1362 | "schema": { 1363 | "type": "string" 1364 | }, 1365 | "name": "Cookie", 1366 | "example": "identity=9%0909ddd7b4f6eca8250cedc5f42546bd39%09%7B%22id%22%3A1712700664%2C%22h1%22%3A%220a36b7aa8ce0b80c36b86d5bc4d0e735%22%2C%22ex%22%3A0%7D;" 1367 | } 1368 | }, 1369 | "requestBodies": { 1370 | "FanCollectionBody": { 1371 | "description": "JSON data of yet to understand data", 1372 | "required": true, 1373 | "content": { 1374 | "application/json": { 1375 | "schema": { 1376 | "type": "object", 1377 | "properties": { 1378 | "fan_id": { 1379 | "$ref": "#/components/schemas/FanID" 1380 | }, 1381 | "older_than_token": { 1382 | "type": "string", 1383 | "description": "The older_than_token string's structure is still unknown to me. It's being used to page through results. The first part of it seems to be some kind of timestamp. Starting with the current time you'd get the last token of the result set, which in turn could be used to fetch more results.", 1384 | "example": "1504691191:1603563167:a::" 1385 | }, 1386 | "count": { 1387 | "type": "integer", 1388 | "example": 10, 1389 | "description": "The number of items to return. There's no known limit: I've run queries with up to 5000 results. Use carefully!\n" 1390 | } 1391 | } 1392 | } 1393 | } 1394 | } 1395 | } 1396 | }, 1397 | "schemas": { 1398 | "ArtistName": { 1399 | "type": "string", 1400 | "description": "the artist name", 1401 | "example": "Hermann" 1402 | }, 1403 | "ArtistID": { 1404 | "type": "integer", 1405 | "example": 2240734681 1406 | }, 1407 | "ArtistURL": { 1408 | "type": "string", 1409 | "format": "URI", 1410 | "example": "http://hrmnn.bandcamp.com" 1411 | }, 1412 | "AlbumURL": { 1413 | "type": "string", 1414 | "format": "URI", 1415 | "example": "http://hrmnn.bandcamp.com/album/hermann?pk=391" 1416 | }, 1417 | "AlbumTitle": { 1418 | "type": "string", 1419 | "description": "the album title", 1420 | "example": "Hermann" 1421 | }, 1422 | "AlbumID": { 1423 | "type": "integer", 1424 | "example": 793714377 1425 | }, 1426 | "Album": { 1427 | "type": "object", 1428 | "description": "an album object", 1429 | "properties": { 1430 | "primary_text": { 1431 | "allOf": [ 1432 | { 1433 | "$ref": "#/components/schemas/AlbumTitle" 1434 | }, 1435 | { 1436 | "description": "the primary text to be shown with an item, eg. its albun title" 1437 | } 1438 | ] 1439 | }, 1440 | "secondary_text": { 1441 | "allOf": [ 1442 | { 1443 | "$ref": "#/components/schemas/UnknownProperty" 1444 | }, 1445 | { 1446 | "example": "TESD4Implants2" 1447 | } 1448 | ] 1449 | }, 1450 | "id": { 1451 | "$ref": "#/components/schemas/AlbumID" 1452 | }, 1453 | "package_title": { 1454 | "allOf": [ 1455 | { 1456 | "$ref": "#/components/schemas/UnknownProperty" 1457 | }, 1458 | { 1459 | "type": "string" 1460 | } 1461 | ] 1462 | }, 1463 | "genre_text": { 1464 | "type": "string", 1465 | "description": "some genre description, afaik pretty much free form", 1466 | "example": "podcasts" 1467 | }, 1468 | "art_id": { 1469 | "$ref": "#/components/schemas/ArtworkID" 1470 | }, 1471 | "alt_art_image_id": { 1472 | "$ref": "#/components/schemas/ArtworkID" 1473 | }, 1474 | "band_id": { 1475 | "$ref": "#/components/schemas/ArtistID" 1476 | }, 1477 | "bio_image": { 1478 | "type": "object", 1479 | "properties": { 1480 | "width": { 1481 | "type": "integer" 1482 | }, 1483 | "image_id": { 1484 | "type": "integer" 1485 | }, 1486 | "height": { 1487 | "type": "integer" 1488 | } 1489 | } 1490 | }, 1491 | "featured_track": { 1492 | "type": "object", 1493 | "properties": { 1494 | "title": { 1495 | "type": "string", 1496 | "example": "Hermann" 1497 | }, 1498 | "id": { 1499 | "type": "integer", 1500 | "example": 3056958565 1501 | }, 1502 | "encodings_id": { 1503 | "$ref": "#/components/schemas/UnknownProperty" 1504 | }, 1505 | "duration": { 1506 | "type": "number", 1507 | "example": 60.694 1508 | }, 1509 | "file": { 1510 | "type": "object", 1511 | "properties": { 1512 | "mp3-128": { 1513 | "$ref": "#/components/schemas/StreamURL" 1514 | } 1515 | } 1516 | } 1517 | } 1518 | }, 1519 | "category": { 1520 | "allOf": [ 1521 | { 1522 | "$ref": "#/components/schemas/UnknownProperty" 1523 | }, 1524 | { 1525 | "example": "solr_hack" 1526 | } 1527 | ] 1528 | }, 1529 | "package_art1": { 1530 | "$ref": "#/components/schemas/UnknownProperty" 1531 | }, 1532 | "package_art2": { 1533 | "$ref": "#/components/schemas/UnknownProperty" 1534 | }, 1535 | "package_art3": { 1536 | "$ref": "#/components/schemas/UnknownProperty" 1537 | }, 1538 | "package_art4": { 1539 | "$ref": "#/components/schemas/UnknownProperty" 1540 | }, 1541 | "publish_date": { 1542 | "type": "string", 1543 | "example": "05 Mar 2018 04:55:34 GMT" 1544 | }, 1545 | "item_type_id": { 1546 | "allOf": [ 1547 | { 1548 | "$ref": "#/components/schemas/UnknownProperty" 1549 | }, 1550 | { 1551 | "example": "a3672525499solr_hack" 1552 | } 1553 | ] 1554 | }, 1555 | "is_preorder": { 1556 | "type": "boolean" 1557 | }, 1558 | "recommendations": { 1559 | "$ref": "#/components/schemas/UnknownProperty" 1560 | }, 1561 | "url_hints": { 1562 | "$ref": "#/components/schemas/URLHints" 1563 | }, 1564 | "location_text": { 1565 | "type": "string", 1566 | "example": "New York, New York" 1567 | }, 1568 | "extras": { 1569 | "$ref": "#/components/schemas/UnknownProperty" 1570 | }, 1571 | "score": { 1572 | "allOf": [ 1573 | { 1574 | "$ref": "#/components/schemas/UnknownProperty" 1575 | }, 1576 | { 1577 | "type": "number" 1578 | } 1579 | ] 1580 | }, 1581 | "type": { 1582 | "type": "string", 1583 | "description": "`a` for Album", 1584 | "example": "a" 1585 | } 1586 | } 1587 | }, 1588 | "DownloadEvent": { 1589 | "type": "object", 1590 | "description": "a download event", 1591 | "properties": { 1592 | "utc_date": { 1593 | "type": "number" 1594 | }, 1595 | "event_type": { 1596 | "type": "string", 1597 | "enum": [ 1598 | "download" 1599 | ] 1600 | } 1601 | } 1602 | }, 1603 | "SaleEvent": { 1604 | "type": "object", 1605 | "description": "a sale event, can have multiple sales", 1606 | "properties": { 1607 | "utc_date": { 1608 | "type": "number" 1609 | }, 1610 | "event_type": { 1611 | "type": "string", 1612 | "enum": [ 1613 | "sale" 1614 | ] 1615 | }, 1616 | "items": { 1617 | "type": "array", 1618 | "items": { 1619 | "$ref": "#/components/schemas/SaleItem" 1620 | } 1621 | } 1622 | } 1623 | }, 1624 | "SaleItem": { 1625 | "type": "object", 1626 | "description": "an item sold", 1627 | "properties": { 1628 | "utc_date": { 1629 | "type": "number" 1630 | }, 1631 | "amount_paid_fmt": { 1632 | "type": "string", 1633 | "description": "formatted amount paid for the item", 1634 | "example": "$6 CAD" 1635 | }, 1636 | "amount_paid": { 1637 | "type": "number", 1638 | "example": 6 1639 | }, 1640 | "currency": { 1641 | "$ref": "#/components/schemas/Currency" 1642 | }, 1643 | "amount_paid_usd": { 1644 | "type": "number", 1645 | "description": "the paid amount in USD", 1646 | "example": 4.64 1647 | }, 1648 | "art_id": { 1649 | "$ref": "#/components/schemas/ArtworkID" 1650 | }, 1651 | "package_image_id": { 1652 | "$ref": "#/components/schemas/UnknownProperty" 1653 | }, 1654 | "item_description": { 1655 | "type": "string", 1656 | "description": "Cast of Static and Smoke" 1657 | }, 1658 | "track_album_slug_text": { 1659 | "type": "string" 1660 | }, 1661 | "artist_name": { 1662 | "type": "string", 1663 | "description": "Vile Creature" 1664 | }, 1665 | "slug_type": { 1666 | "type": "string", 1667 | "description": "`a` for artist etc.?", 1668 | "example": "a" 1669 | }, 1670 | "releases": { 1671 | "$ref": "#/components/schemas/UnknownProperty" 1672 | }, 1673 | "country_code": { 1674 | "type": "string", 1675 | "example": "us" 1676 | }, 1677 | "item_type": { 1678 | "$ref": "#/components/schemas/ItemType" 1679 | }, 1680 | "item_price": { 1681 | "type": "number" 1682 | }, 1683 | "country": { 1684 | "type": "string", 1685 | "example": "United States" 1686 | }, 1687 | "art_url": { 1688 | "$ref": "#/components/schemas/ArtworkURL" 1689 | }, 1690 | "album_title": { 1691 | "type": "string" 1692 | }, 1693 | "url": { 1694 | "type": "string", 1695 | "format": "URL", 1696 | "description": "the URL where the item can be found", 1697 | "example": "//vilecreature.bandcamp.com/album/cast-of-static-and-smoke" 1698 | } 1699 | } 1700 | }, 1701 | "Track": { 1702 | "type": "object", 1703 | "properties": { 1704 | "title": { 1705 | "$ref": "#/components/schemas/TrackTitle" 1706 | }, 1707 | "band_id": { 1708 | "$ref": "#/components/schemas/ArtistID" 1709 | }, 1710 | "large_art_url": { 1711 | "$ref": "#/components/schemas/ArtworkURL" 1712 | }, 1713 | "small_art_url": { 1714 | "$ref": "#/components/schemas/ArtworkURL" 1715 | }, 1716 | "streaming_url": { 1717 | "$ref": "#/components/schemas/StreamURL" 1718 | }, 1719 | "downloadable": { 1720 | "$ref": "#/components/schemas/DownloadableFlag" 1721 | }, 1722 | "number": { 1723 | "type": "integer" 1724 | }, 1725 | "duration": { 1726 | "type": "number" 1727 | }, 1728 | "album_id": { 1729 | "$ref": "#/components/schemas/AlbumID" 1730 | }, 1731 | "url": { 1732 | "type": "string", 1733 | "description": "the track URL - despite its name not a full URL, but only it's path part!", 1734 | "example": "/track/kellner?pk=391" 1735 | }, 1736 | "track_id": { 1737 | "$ref": "#/components/schemas/TrackID" 1738 | }, 1739 | "credits": { 1740 | "type": "string" 1741 | }, 1742 | "lyrics": { 1743 | "type": "string" 1744 | }, 1745 | "about": { 1746 | "type": "string" 1747 | } 1748 | } 1749 | }, 1750 | "TrackID": { 1751 | "type": "integer", 1752 | "example": 2484061734 1753 | }, 1754 | "TrackTitle": { 1755 | "type": "string", 1756 | "example": "Kellner" 1757 | }, 1758 | "ArtworkID": { 1759 | "type": "integer", 1760 | "description": "the artwork ID", 1761 | "example": 1386391961 1762 | }, 1763 | "ArtworkURL": { 1764 | "type": "string", 1765 | "format": "URI", 1766 | "example": "https://f4.bcbits.com/img/a1386391961_3.jpg" 1767 | }, 1768 | "SubDomain": { 1769 | "type": "string", 1770 | "description": "the subdomain where the artist is at home on bandcamp.com", 1771 | "example": "hrmnn" 1772 | }, 1773 | "FollowerList": { 1774 | "type": "object", 1775 | "properties": { 1776 | "more_available": { 1777 | "type": "boolean" 1778 | }, 1779 | "last_token": { 1780 | "type": "string", 1781 | "description": "the token of the last item returned in this response, starting point for a follow up request?", 1782 | "example": "1358631543:14628" 1783 | }, 1784 | "followeers": { 1785 | "type": "array", 1786 | "items": { 1787 | "$ref": "#/components/schemas/Follower" 1788 | } 1789 | } 1790 | } 1791 | }, 1792 | "Follower": { 1793 | "type": "object", 1794 | "properties": { 1795 | "location": { 1796 | "$ref": "#/components/schemas/Location" 1797 | }, 1798 | "band_id": { 1799 | "$ref": "#/components/schemas/ArtistID" 1800 | }, 1801 | "is_following": { 1802 | "type": "boolean" 1803 | }, 1804 | "is_subscribe": { 1805 | "type": "boolean" 1806 | }, 1807 | "name": { 1808 | "type": "string", 1809 | "example": "Michael Herger" 1810 | }, 1811 | "trackpipe_url": { 1812 | "$ref": "#/components/schemas/TrackpipeURL" 1813 | }, 1814 | "art_id": { 1815 | "$ref": "#/components/schemas/ArtworkID" 1816 | }, 1817 | "image_id": { 1818 | "$ref": "#/components/schemas/ArtworkID" 1819 | }, 1820 | "fan_id": { 1821 | "$ref": "#/components/schemas/FanID" 1822 | }, 1823 | "token": { 1824 | "type": "string", 1825 | "example": "1432068324:195872" 1826 | }, 1827 | "date_followed": { 1828 | "$ref": "#/components/schemas/Timestamp" 1829 | }, 1830 | "fan_url": { 1831 | "type": "string", 1832 | "format": "URL" 1833 | }, 1834 | "url_hints": { 1835 | "$ref": "#/components/schemas/URLHints" 1836 | } 1837 | } 1838 | }, 1839 | "FanID": { 1840 | "type": "integer", 1841 | "example": 10236 1842 | }, 1843 | "Fan": { 1844 | "type": "object", 1845 | "properties": { 1846 | "location": { 1847 | "$ref": "#/components/schemas/Location" 1848 | }, 1849 | "bio": { 1850 | "type": "string", 1851 | "example": "King Crimson biographer among oher things." 1852 | }, 1853 | "collection_size": { 1854 | "type": "integer" 1855 | }, 1856 | "followed": { 1857 | "type": "integer" 1858 | }, 1859 | "num_items_in_common": { 1860 | "type": "integer" 1861 | }, 1862 | "fav_genre_name": { 1863 | "type": "string", 1864 | "example": "Alternative" 1865 | }, 1866 | "fav_genre_id": { 1867 | "type": "integer", 1868 | "example": 2 1869 | }, 1870 | "followed_by": { 1871 | "$ref": "#/components/schemas/FollowerList" 1872 | }, 1873 | "trackpipe_url": { 1874 | "$ref": "#/components/schemas/TrackpipeURL" 1875 | }, 1876 | "name": { 1877 | "type": "string", 1878 | "example": "Carlos Romeo" 1879 | }, 1880 | "collection_art": { 1881 | "type": "array", 1882 | "items": { 1883 | "type": "object", 1884 | "properties": { 1885 | "": { 1886 | "type": "object", 1887 | "properties": { 1888 | "art_info": { 1889 | "type": "object", 1890 | "properties": { 1891 | "art_id": { 1892 | "type": "integer", 1893 | "example": 1058221488 1894 | } 1895 | } 1896 | }, 1897 | "tralbum_type": { 1898 | "$ref": "#/components/schemas/TrAlbumType" 1899 | }, 1900 | "tralbum_id": { 1901 | "oneOf": [ 1902 | { 1903 | "$ref": "#/components/schemas/AlbumID" 1904 | }, 1905 | { 1906 | "$ref": "#/components/schemas/TrackID" 1907 | } 1908 | ] 1909 | } 1910 | } 1911 | } 1912 | } 1913 | } 1914 | }, 1915 | "image_id": { 1916 | "type": "integer", 1917 | "example": 878604 1918 | }, 1919 | "fan_id": { 1920 | "allOf": [ 1921 | { 1922 | "$ref": "#/components/schemas/FanID" 1923 | }, 1924 | { 1925 | "example": 4679 1926 | } 1927 | ] 1928 | }, 1929 | "is_montage_image": { 1930 | "$ref": "#/components/schemas/UnknownProperty" 1931 | }, 1932 | "username": { 1933 | "type": "string", 1934 | "example": "ignacioc" 1935 | } 1936 | } 1937 | }, 1938 | "TrAlbumType": { 1939 | "type": "string", 1940 | "enum": [ 1941 | "a", 1942 | "t?" 1943 | ], 1944 | "description": "whether this is an album or track?" 1945 | }, 1946 | "TrackpipeURL": { 1947 | "type": "string", 1948 | "format": "URI", 1949 | "description": "the user's profile URL", 1950 | "example": "http://bandcamp.com/michaelherger" 1951 | }, 1952 | "ItemType": { 1953 | "type": "string", 1954 | "enum": [ 1955 | "a" 1956 | ], 1957 | "description": "the type can be `a`lbum" 1958 | }, 1959 | "DiscoveryType": { 1960 | "type": "string", 1961 | "enum": [ 1962 | "top", 1963 | "pic", 1964 | "new", 1965 | "most" 1966 | ] 1967 | }, 1968 | "Currency": { 1969 | "type": "string", 1970 | "description": "three character currency description", 1971 | "example": "CHF" 1972 | }, 1973 | "StreamURL": { 1974 | "type": "string", 1975 | "format": "URI", 1976 | "example": "https://bandcamp.com/stream_redirect?enc=mp3-128&track_id=2484061734&ts=1520430789&t=85bce9f8b951fd3eb5decdbe48a17724eadc3c83" 1977 | }, 1978 | "URLHints": { 1979 | "type": "object", 1980 | "properties": { 1981 | "custom_domain_verified": { 1982 | "$ref": "#/components/schemas/UnknownProperty" 1983 | }, 1984 | "custom_domain": { 1985 | "type": "string", 1986 | "description": "an artist's own, custom domain name" 1987 | }, 1988 | "subdomain": { 1989 | "type": "string", 1990 | "description": "the artist's subdomain on bandcamp.com", 1991 | "example": "hrmnn" 1992 | }, 1993 | "item_type": { 1994 | "type": "string", 1995 | "enum": [ 1996 | "a", 1997 | "t" 1998 | ], 1999 | "description": "the type can be `a`lbum, `t`rack" 2000 | }, 2001 | "slug": { 2002 | "type": "string", 2003 | "example": "hermann" 2004 | } 2005 | } 2006 | }, 2007 | "Timestamp": { 2008 | "type": "integer", 2009 | "description": "a timestamp in unix time", 2010 | "example": 1520400480 2011 | }, 2012 | "DownloadableFlag": { 2013 | "allOf": [ 2014 | { 2015 | "$ref": "#/components/schemas/UnknownProperty" 2016 | }, 2017 | { 2018 | "example": 2 2019 | } 2020 | ] 2021 | }, 2022 | "MerchIDs": { 2023 | "type": "array", 2024 | "items": { 2025 | "type": "number" 2026 | }, 2027 | "example": [ 2028 | 214158844, 2029 | 833475221 2030 | ] 2031 | }, 2032 | "Location": { 2033 | "type": "string", 2034 | "example": "Switzerland" 2035 | }, 2036 | "ShowDescription": { 2037 | "type": "string", 2038 | "example": "Featuring interviews with Sweden's mysterious Goat, and Reginald Omas Mamode IV of London’s prolific 22a crew. " 2039 | }, 2040 | "ImageCaption": { 2041 | "type": "string", 2042 | "description": "HTML formatted caption", 2043 | "example": "Hosted by Andrew Jervis. Illustration of Goat by Niklas Åkerblad." 2044 | }, 2045 | "UnknownProperty": { 2046 | "type": "string", 2047 | "description": "unknown?" 2048 | } 2049 | }, 2050 | "responses": { 2051 | "FanCollection": { 2052 | "description": "The followers", 2053 | "content": { 2054 | "application/json": { 2055 | "schema": { 2056 | "$ref": "#/components/schemas/FollowerList" 2057 | } 2058 | } 2059 | } 2060 | }, 2061 | "ItemCollection": { 2062 | "description": "The collection", 2063 | "content": { 2064 | "application/json": { 2065 | "schema": { 2066 | "type": "object", 2067 | "properties": { 2068 | "more_available": { 2069 | "type": "boolean" 2070 | }, 2071 | "purchase_infos": { 2072 | "type": "object" 2073 | }, 2074 | "last_token": { 2075 | "type": "string", 2076 | "example": "1301406176:1500067389:a:2:" 2077 | }, 2078 | "item_lookup": { 2079 | "type": "object" 2080 | }, 2081 | "redownload_urls": { 2082 | "type": "object" 2083 | }, 2084 | "collectors": { 2085 | "type": "object" 2086 | }, 2087 | "track_list": { 2088 | "type": "array", 2089 | "description": "featured tracks of the \"items\"?", 2090 | "items": { 2091 | "type": "object", 2092 | "properties": { 2093 | "currency": { 2094 | "$ref": "#/components/schemas/Currency" 2095 | }, 2096 | "has_digital_download": { 2097 | "type": "boolean" 2098 | }, 2099 | "album_title": { 2100 | "$ref": "#/components/schemas/AlbumTitle" 2101 | }, 2102 | "encodings_id": { 2103 | "allOf": [ 2104 | { 2105 | "$ref": "#/components/schemas/UnknownProperty" 2106 | }, 2107 | { 2108 | "type": "number" 2109 | }, 2110 | { 2111 | "example": 18647555 2112 | } 2113 | ] 2114 | }, 2115 | "track_id": { 2116 | "$ref": "#/components/schemas/TrackID" 2117 | }, 2118 | "merch_ids": { 2119 | "$ref": "#/components/schemas/MerchIDs" 2120 | }, 2121 | "album_id": { 2122 | "$ref": "#/components/schemas/AlbumID" 2123 | }, 2124 | "duration": { 2125 | "type": "number" 2126 | }, 2127 | "title": { 2128 | "$ref": "#/components/schemas/TrackTitle" 2129 | }, 2130 | "label_id": { 2131 | "$ref": "#/components/schemas/UnknownProperty" 2132 | }, 2133 | "merch_sold_out": { 2134 | "type": "boolean" 2135 | }, 2136 | "price": { 2137 | "type": "number" 2138 | }, 2139 | "has_lyrics": { 2140 | "type": "boolean" 2141 | }, 2142 | "art_id": { 2143 | "$ref": "#/components/schemas/ArtworkID" 2144 | }, 2145 | "band_id": { 2146 | "$ref": "#/components/schemas/ArtistID" 2147 | }, 2148 | "label": { 2149 | "$ref": "#/components/schemas/UnknownProperty" 2150 | }, 2151 | "track_num": { 2152 | "type": "integer" 2153 | }, 2154 | "is_purchasable": { 2155 | "type": "boolean" 2156 | }, 2157 | "is_set_price": { 2158 | "type": "boolean" 2159 | }, 2160 | "streaming_url": { 2161 | "type": "object", 2162 | "properties": { 2163 | "mp3-128": { 2164 | "$ref": "#/components/schemas/StreamURL" 2165 | } 2166 | } 2167 | }, 2168 | "require_email": { 2169 | "type": "boolean" 2170 | }, 2171 | "is_streamable": { 2172 | "type": "boolean" 2173 | }, 2174 | "band_name": { 2175 | "$ref": "#/components/schemas/ArtistName" 2176 | } 2177 | } 2178 | } 2179 | }, 2180 | "items": { 2181 | "type": "array", 2182 | "items": { 2183 | "type": "object", 2184 | "properties": { 2185 | "currency": { 2186 | "$ref": "#/components/schemas/Currency" 2187 | }, 2188 | "has_digital_download": { 2189 | "type": "boolean" 2190 | }, 2191 | "album_title": { 2192 | "$ref": "#/components/schemas/AlbumTitle" 2193 | }, 2194 | "gift_recipient_name": { 2195 | "$ref": "#/components/schemas/UnknownProperty" 2196 | }, 2197 | "featured_track_duration": { 2198 | "type": "number" 2199 | }, 2200 | "item_url": { 2201 | "$ref": "#/components/schemas/AlbumURL" 2202 | }, 2203 | "url_hints": { 2204 | "$ref": "#/components/schemas/URLHints" 2205 | }, 2206 | "tralbum_type": { 2207 | "$ref": "#/components/schemas/TrAlbumType" 2208 | }, 2209 | "fan_id": { 2210 | "$ref": "#/components/schemas/FanID" 2211 | }, 2212 | "is_subscription_item": { 2213 | "type": "boolean" 2214 | }, 2215 | "item_art_id": { 2216 | "$ref": "#/components/schemas/ArtworkID" 2217 | }, 2218 | "item_id": { 2219 | "type": "integer" 2220 | }, 2221 | "merch_ids": { 2222 | "$ref": "#/components/schemas/MerchIDs" 2223 | }, 2224 | "album_id": { 2225 | "$ref": "#/components/schemas/AlbumID" 2226 | }, 2227 | "featured_track_encodings_id": { 2228 | "allOf": [ 2229 | { 2230 | "$ref": "#/components/schemas/UnknownProperty" 2231 | }, 2232 | { 2233 | "type": "integer" 2234 | } 2235 | ] 2236 | }, 2237 | "tralbum_id": { 2238 | "oneOf": [ 2239 | { 2240 | "$ref": "#/components/schemas/AlbumID" 2241 | }, 2242 | { 2243 | "$ref": "#/components/schemas/TrackID" 2244 | } 2245 | ] 2246 | }, 2247 | "sale_item_id": { 2248 | "allOf": [ 2249 | { 2250 | "$ref": "#/components/schemas/UnknownProperty" 2251 | }, 2252 | { 2253 | "type": "integer" 2254 | } 2255 | ] 2256 | }, 2257 | "label_id": { 2258 | "allOf": [ 2259 | { 2260 | "$ref": "#/components/schemas/UnknownProperty" 2261 | }, 2262 | { 2263 | "type": "integer" 2264 | } 2265 | ] 2266 | }, 2267 | "band_location": { 2268 | "$ref": "#/components/schemas/Location" 2269 | }, 2270 | "is_subscriber_only": { 2271 | "type": "boolean" 2272 | }, 2273 | "featured_track_url": { 2274 | "$ref": "#/components/schemas/StreamURL" 2275 | }, 2276 | "item_art_url": { 2277 | "$ref": "#/components/schemas/ArtworkURL" 2278 | }, 2279 | "hidden": { 2280 | "type": "boolean", 2281 | "description": "an item which had been sold at some point, but is no longer available?" 2282 | }, 2283 | "merch_sold_out": { 2284 | "allOf": [ 2285 | { 2286 | "$ref": "#/components/schemas/UnknownProperty" 2287 | }, 2288 | { 2289 | "type": "boolean" 2290 | } 2291 | ] 2292 | }, 2293 | "price": { 2294 | "type": "number" 2295 | }, 2296 | "is_preorder": { 2297 | "type": "boolean" 2298 | }, 2299 | "package_details": { 2300 | "$ref": "#/components/schemas/UnknownProperty" 2301 | }, 2302 | "item_title": { 2303 | "oneOf": [ 2304 | { 2305 | "$ref": "#/components/schemas/ArtistName" 2306 | }, 2307 | { 2308 | "$ref": "#/components/schemas/AlbumTitle" 2309 | }, 2310 | { 2311 | "$ref": "#/components/schemas/TrackTitle" 2312 | } 2313 | ] 2314 | }, 2315 | "band_image_id": { 2316 | "$ref": "#/components/schemas/ArtworkID" 2317 | }, 2318 | "gift_id": { 2319 | "$ref": "#/components/schemas/UnknownProperty" 2320 | }, 2321 | "is_private": { 2322 | "type": "boolean", 2323 | "description": "an item which had been sold at some point, but is no longer available" 2324 | }, 2325 | "featured_track_number": { 2326 | "type": "integer" 2327 | }, 2328 | "band_url": { 2329 | "$ref": "#/components/schemas/ArtistURL" 2330 | }, 2331 | "item_art": { 2332 | "type": "object", 2333 | "properties": { 2334 | "thumb_url": { 2335 | "$ref": "#/components/schemas/ArtworkURL" 2336 | }, 2337 | "art_id": { 2338 | "$ref": "#/components/schemas/ArtworkID" 2339 | }, 2340 | "url": { 2341 | "$ref": "#/components/schemas/ArtworkURL" 2342 | } 2343 | } 2344 | }, 2345 | "item_art_ids": { 2346 | "$ref": "#/components/schemas/UnknownProperty" 2347 | }, 2348 | "num_streamable_tracks": { 2349 | "type": "integer" 2350 | }, 2351 | "sale_item_type": { 2352 | "type": "string", 2353 | "enum": [ 2354 | "p" 2355 | ], 2356 | "description": "`p`urchase?" 2357 | }, 2358 | "purchased": { 2359 | "$ref": "#/components/schemas/Timestamp" 2360 | }, 2361 | "added": { 2362 | "$ref": "#/components/schemas/Timestamp" 2363 | }, 2364 | "band_id": { 2365 | "$ref": "#/components/schemas/ArtistID" 2366 | }, 2367 | "label": { 2368 | "$ref": "#/components/schemas/UnknownProperty" 2369 | }, 2370 | "release_count": { 2371 | "$ref": "#/components/schemas/UnknownProperty" 2372 | }, 2373 | "featured_track_title": { 2374 | "$ref": "#/components/schemas/TrackTitle" 2375 | }, 2376 | "index": { 2377 | "$ref": "#/components/schemas/UnknownProperty" 2378 | }, 2379 | "is_set_price": { 2380 | "type": "boolean" 2381 | }, 2382 | "gift_sender_name": { 2383 | "$ref": "#/components/schemas/UnknownProperty" 2384 | }, 2385 | "service_url_fragment": { 2386 | "$ref": "#/components/schemas/UnknownProperty" 2387 | }, 2388 | "is_purchasable": { 2389 | "type": "boolean" 2390 | }, 2391 | "why": { 2392 | "$ref": "#/components/schemas/UnknownProperty" 2393 | }, 2394 | "featured_track": { 2395 | "$ref": "#/components/schemas/TrackID" 2396 | }, 2397 | "updated": { 2398 | "$ref": "#/components/schemas/Timestamp" 2399 | }, 2400 | "token": { 2401 | "type": "string", 2402 | "example": "1505295591:793714377:a::" 2403 | }, 2404 | "releases": { 2405 | "$ref": "#/components/schemas/UnknownProperty" 2406 | }, 2407 | "message_count": { 2408 | "$ref": "#/components/schemas/UnknownProperty" 2409 | }, 2410 | "featured_track_is_custom": { 2411 | "type": "boolean" 2412 | }, 2413 | "genre_id": { 2414 | "type": "integer" 2415 | }, 2416 | "discount": { 2417 | "$ref": "#/components/schemas/UnknownProperty" 2418 | }, 2419 | "require_email": { 2420 | "allOf": [ 2421 | { 2422 | "$ref": "#/components/schemas/UnknownProperty" 2423 | }, 2424 | { 2425 | "type": "boolean" 2426 | } 2427 | ] 2428 | }, 2429 | "gift_sender_note": { 2430 | "$ref": "#/components/schemas/UnknownProperty" 2431 | }, 2432 | "service_name": { 2433 | "$ref": "#/components/schemas/UnknownProperty" 2434 | }, 2435 | "is_giftable": { 2436 | "type": "boolean" 2437 | }, 2438 | "band_name": { 2439 | "$ref": "#/components/schemas/ArtistName" 2440 | }, 2441 | "also_collected_count": { 2442 | "allOf": [ 2443 | { 2444 | "$ref": "#/components/schemas/UnknownProperty" 2445 | }, 2446 | { 2447 | "type": "integer" 2448 | } 2449 | ] 2450 | }, 2451 | "item_type": { 2452 | "type": "string", 2453 | "enum": [ 2454 | "album" 2455 | ] 2456 | } 2457 | } 2458 | } 2459 | } 2460 | } 2461 | } 2462 | } 2463 | } 2464 | } 2465 | } 2466 | }, 2467 | "externalDocs": { 2468 | "description": "Find out more about Swagger", 2469 | "url": "http://swagger.io" 2470 | } 2471 | } -------------------------------------------------------------------------------- /data/bandcamp.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.0.0 2 | info: 3 | description: bandcamp 4 | version: 1.0.0 5 | title: Bandcamp 6 | servers: 7 | - url: 'https://bandcamp.com' 8 | description: API endpoint. Does NOT serve any artwork. 9 | - url: 'https://f0.bcbits.com' 10 | description: >- 11 | Artwork serving & resizing. Does NOT serve the API. f0 can vary to f1, f4 12 | etc. 13 | tags: 14 | - name: To be figured out 15 | description: end-points I have no clue about. Have fun! 16 | paths: 17 | /api/band/3/search: 18 | get: 19 | summary: Search for bands. 20 | tags: 21 | - Bands 22 | parameters: 23 | - $ref: '#/components/parameters/DevKey' 24 | - in: query 25 | name: name 26 | schema: 27 | type: string 28 | required: true 29 | example: hermann 30 | responses: 31 | '200': 32 | description: the bands 33 | content: 34 | application/json: 35 | schema: 36 | type: object 37 | properties: 38 | results: 39 | type: array 40 | items: 41 | type: object 42 | description: a search result 43 | properties: 44 | name: 45 | $ref: '#/components/schemas/ArtistName' 46 | band_id: 47 | $ref: '#/components/schemas/ArtistID' 48 | subdomain: 49 | $ref: '#/components/schemas/SubDomain' 50 | url: 51 | $ref: '#/components/schemas/ArtistURL' 52 | offsite_url: 53 | type: string 54 | format: URI 55 | description: the artist's online presence outside bandcamp.com 56 | example: 'http://facebook.com/hermannmusik' 57 | /api/band/3/discography: 58 | get: 59 | summary: Get a band's discography. 60 | tags: 61 | - Bands 62 | parameters: 63 | - $ref: '#/components/parameters/DevKey' 64 | - in: query 65 | name: band_id 66 | schema: 67 | type: integer 68 | required: true 69 | example: 2240734681 70 | responses: 71 | '200': 72 | description: the band's discography 73 | content: 74 | application/json: 75 | schema: 76 | type: object 77 | properties: 78 | results: 79 | type: array 80 | items: 81 | type: object 82 | description: a discography item 83 | properties: 84 | title: 85 | $ref: '#/components/schemas/AlbumTitle' 86 | artist: 87 | $ref: '#/components/schemas/ArtistName' 88 | band_id: 89 | $ref: '#/components/schemas/ArtistID' 90 | subdomain: 91 | $ref: '#/components/schemas/SubDomain' 92 | url: 93 | $ref: '#/components/schemas/AlbumURL' 94 | art_id: 95 | $ref: '#/components/schemas/ArtworkID' 96 | large_art_url: 97 | $ref: '#/components/schemas/ArtworkURL' 98 | small_art_url: 99 | $ref: '#/components/schemas/ArtworkURL' 100 | downloadable: 101 | $ref: '#/components/schemas/DownloadableFlag' 102 | release_date: 103 | $ref: '#/components/schemas/Timestamp' 104 | album_id: 105 | $ref: '#/components/schemas/AlbumID' 106 | /api/album/2/info: 107 | get: 108 | summary: Get album information. 109 | description: >- 110 | unfortunately this call would not return all playable items, even if an 111 | identity cookie or the like was used. 112 | tags: 113 | - Albums 114 | parameters: 115 | - $ref: '#/components/parameters/DevKey' 116 | - in: query 117 | name: album_id 118 | schema: 119 | type: string 120 | required: true 121 | example: 793714377 122 | responses: 123 | '200': 124 | description: the album 125 | content: 126 | application/json: 127 | schema: 128 | type: object 129 | properties: 130 | results: 131 | type: array 132 | items: 133 | type: object 134 | description: a discography item 135 | properties: 136 | title: 137 | $ref: '#/components/schemas/AlbumTitle' 138 | about: 139 | type: string 140 | description: a description of the given album 141 | example: "„Es gseht us, als wär d’Zyt still gstande, was an sich reizvoll wär, aber s’esch die falschi Zyt gsi...“ (Stillstand) \r\n\r\nHerzstück von Hermanns minimaler Mundart-Musik ist der Rhythm Ace FR-1. Mit seinen einfachen Rhythmen und dem warmen, analogen Klang liefert der 50-jährige Drumcomputer das ideale klangliche Gerüst für die drei Musiker, die auf der Suche nach einem neuen Sound waren. Das Gerät zwang ihnen die einfache Frage auf: wie füllt man die stoische Motorik mit Leben? Hermanns Antwort: Mit einfachen erzählenden Texten, die Ausflüge ins Politische, Alltagsphilosophische und Absurde unternehmen. Mit Gitarren- und Synthie-Sounds, die gleichermassen für stimmige Flächen wie für melodiöse Einfälle zuständig sind. Und mit einem Bass, der das stete Treiben des Rhythm Ace elegant mit dem musikalischen Überbau verbindet. All dies ergibt eine stimmungsvolle, punktgenaue Musik, die den Kopf gen oben öffnet, ohne dass die Füsse den Boden verlassen möchten." 142 | album_id: 143 | $ref: '#/components/schemas/AlbumID' 144 | band_id: 145 | $ref: '#/components/schemas/ArtistID' 146 | large_art_url: 147 | $ref: '#/components/schemas/ArtworkURL' 148 | small_art_url: 149 | $ref: '#/components/schemas/ArtworkURL' 150 | downloadable: 151 | $ref: '#/components/schemas/DownloadableFlag' 152 | release_date: 153 | $ref: '#/components/schemas/Timestamp' 154 | url: 155 | $ref: '#/components/schemas/AlbumURL' 156 | credits: 157 | type: string 158 | description: free text credits of the album 159 | example: "Hermann: Hannes Herger (Bass), Dani Hug (Synths), Jonathan Winkler (Gesang, Gitarre, Rhythm Ace FR-1)\r\nAufnahme & Mix: Timo Keller, StudioVomDach\r\nMastering: Dave Hofmann, Somastudios.ch\r\nDesign: hugototal.ch" 160 | tracks: 161 | type: array 162 | items: 163 | $ref: '#/components/schemas/Track' 164 | /api/track/3/info: 165 | get: 166 | summary: Get track information. 167 | tags: 168 | - Tracks 169 | parameters: 170 | - $ref: '#/components/parameters/DevKey' 171 | - in: query 172 | name: track_id 173 | schema: 174 | type: string 175 | required: true 176 | example: 5020296 177 | responses: 178 | '200': 179 | description: the track 180 | content: 181 | application/json: 182 | schema: 183 | $ref: '#/components/schemas/Track' 184 | /api/fancollection/1/followers: 185 | post: 186 | summary: Get a user's followers 187 | tags: 188 | - Fan Collection 189 | requestBody: 190 | $ref: '#/components/requestBodies/FanCollectionBody' 191 | responses: 192 | '200': 193 | $ref: '#/components/responses/FanCollection' 194 | /api/fancollection/1/following_bands: 195 | post: 196 | summary: Get the bands a user is following 197 | tags: 198 | - Fan Collection 199 | requestBody: 200 | $ref: '#/components/requestBodies/FanCollectionBody' 201 | responses: 202 | '200': 203 | $ref: '#/components/responses/FanCollection' 204 | /api/fancollection/1/following_fans: 205 | post: 206 | summary: Get the fans a user is following 207 | tags: 208 | - Fan Collection 209 | requestBody: 210 | $ref: '#/components/requestBodies/FanCollectionBody' 211 | responses: 212 | '200': 213 | $ref: '#/components/responses/FanCollection' 214 | /api/fancollection/1/collection_items: 215 | post: 216 | summary: Get a user's collection 217 | tags: 218 | - Fan Collection 219 | parameters: 220 | - $ref: '#/components/parameters/IdentityCookie' 221 | requestBody: 222 | $ref: '#/components/requestBodies/FanCollectionBody' 223 | responses: 224 | '200': 225 | $ref: '#/components/responses/ItemCollection' 226 | /api/fancollection/1/wishlist_items: 227 | post: 228 | summary: Get a user's wishlist 229 | tags: 230 | - Fan Collection 231 | requestBody: 232 | $ref: '#/components/requestBodies/FanCollectionBody' 233 | responses: 234 | '200': 235 | $ref: '#/components/responses/ItemCollection' 236 | /api/fancollection/1/fan_suggestions: 237 | post: 238 | summary: 'Get a user''s suggestions? Don''t know, really.' 239 | tags: 240 | - Fan Collection 241 | - To be figured out 242 | requestBody: 243 | $ref: '#/components/requestBodies/FanCollectionBody' 244 | responses: 245 | '200': 246 | description: The suggestions 247 | /api/fancollection/1/gifts_given: 248 | post: 249 | summary: 'Get the gifts a user has given?? Don''t know, really.' 250 | tags: 251 | - Fan Collection 252 | - To be figured out 253 | requestBody: 254 | $ref: '#/components/requestBodies/FanCollectionBody' 255 | responses: 256 | '200': 257 | description: The gifts 258 | /api/fan/2/collection_summary: 259 | get: 260 | summary: get a rough summary of the user's collection (items bought etc.) 261 | tags: 262 | - Fan Collection 263 | parameters: 264 | - in: header 265 | schema: 266 | type: string 267 | name: Cookie 268 | example: >- 269 | identity=6%0909ddd7b4f6eca8250cedc5f42546bd39%09%7B%22id%22%3A1712700664%2C%22h1%22%3A%220a36b7aa8ce0b80c36b86d5bc4d0e735%22%2C%22ex%22%3A0%7D; 270 | responses: 271 | '200': 272 | description: a summary of the user's collection 273 | content: 274 | application/json: 275 | schema: 276 | type: object 277 | properties: 278 | fan_id: 279 | $ref: '#/components/schemas/FanID' 280 | collection_summary: 281 | type: object 282 | properties: 283 | fan_id: 284 | $ref: '#/components/schemas/FanID' 285 | tralbum_lookup: 286 | type: object 287 | properties: 288 | : 289 | type: object 290 | description: >- 291 | the key is something like 'a1234', where 'a' is 292 | for albums - see ItemType? 293 | properties: 294 | item_id: 295 | anyOf: 296 | - $ref: '#/components/schemas/AlbumID' 297 | - $ref: '#/components/schemas/TrackID' 298 | band_id: 299 | $ref: '#/components/schemas/ArtistID' 300 | purchased: 301 | type: string 302 | description: >- 303 | formatted timestamp of purchase, or null if 304 | not purchased (wishlist?) 305 | item_type: 306 | $ref: '#/components/schemas/ItemType' 307 | follows: 308 | type: object 309 | properties: 310 | following: 311 | type: object 312 | properties: 313 | : 314 | description: keys are the followed fans/bands' IDs 315 | type: boolean 316 | url: 317 | type: string 318 | format: URL 319 | description: the fan's home on bandcamp.com 320 | example: 'https://bandcamp.com/michaelherger' 321 | username: 322 | type: string 323 | example: michaelherger 324 | /fan_feed_poll: 325 | post: 326 | summary: get the user's "Music Feed" 327 | tags: 328 | - To be figured out 329 | parameters: 330 | - in: header 331 | schema: 332 | type: string 333 | name: Cookie 334 | example: >- 335 | __utma=241114640.1402729518.1499081724.1519889216.1520672370.21; 336 | __utmb=241114640.2.10.1520672370; __utmc=241114640; 337 | __utmz=241114640.1519881502.19.8.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); 338 | __utmt=1; 339 | session=1%09t%3A1520672367%09bp%3A1%09r%3A%5B%22nilZ0f0x1520672367%22%2C%2239731231s0a793714377x1519890154%22%2C%2239731231s0i2240734681x1519890153%22%5D; 340 | BACKENDID=bender01-3; fan_visits=10236z4679z188671z482972; 341 | identity=6%0909ddd7b4f6eca8250cedc5f42546bd39%09%7B%22id%22%3A1712700664%2C%22h1%22%3A%220a36b7aa8ce0b80c36b86d5bc4d0e735%22%2C%22ex%22%3A0%7D; 342 | logout=%7B%22username%22%3A%22paypal%40herger.net%22%7D; 343 | want_https=1; __qca=P0-412173266-1499081724027; 344 | client_id=D38AB1D81E70CC68504277E9FE450FABC8D939D402E73A4D4A8212974965AAF4 345 | requestBody: 346 | description: JSON data of yet to understand data 347 | required: true 348 | content: 349 | application/x-www-form-urlencoded: 350 | schema: 351 | type: object 352 | properties: 353 | since: 354 | $ref: '#/components/schemas/Timestamp' 355 | crumb: 356 | type: string 357 | description: XXX 358 | example: '|fan_feed_poll|1520674192|JQgsXLOGnRKBBslOCPQXqpTCKJ0=' 359 | responses: 360 | '200': 361 | description: the feed 362 | /fan_dash_feed_updates: 363 | post: 364 | summary: The user's "Music Feed" of music suggestions 365 | tags: 366 | - Music Feed 367 | parameters: 368 | - $ref: '#/components/parameters/IdentityCookie' 369 | requestBody: 370 | description: JSON data of yet to understand data 371 | required: true 372 | content: 373 | application/x-www-form-urlencoded: 374 | schema: 375 | type: object 376 | properties: 377 | older_than: 378 | allOf: 379 | - $ref: '#/components/schemas/Timestamp' 380 | - description: the unix timestamp from when the stream should start 381 | fan_id: 382 | $ref: '#/components/schemas/FanID' 383 | responses: 384 | '200': 385 | description: the Music Feed 386 | content: 387 | application/json: 388 | schema: 389 | type: object 390 | properties: 391 | stories: 392 | type: object 393 | properties: 394 | entries: 395 | description: the stream's items 396 | type: array 397 | items: 398 | description: a Music Stream item 399 | type: object 400 | properties: 401 | item_type: 402 | $ref: '#/components/schemas/ItemType' 403 | track_list: 404 | description: the list of playable items from the Music Stream? 405 | type: object 406 | properties: 407 | entries: 408 | description: the stream's items 409 | type: array 410 | items: 411 | anyOf: 412 | - $ref: '#/components/schemas/Track' 413 | query_times: 414 | description: >- 415 | the times spent on the various queries required to 416 | compile the Music Stream. "Query":"Time" pairs 417 | type: object 418 | oldest_story_date: 419 | $ref: '#/components/schemas/Timestamp' 420 | feed_timestamp: 421 | $ref: '#/components/schemas/Timestamp' 422 | newest_story_date: 423 | allOf: 424 | - $ref: '#/components/schemas/Timestamp' 425 | - description: >- 426 | the timestamp of the most recent story in the 427 | result list 428 | fan_info: 429 | description: information about the fans featured in the stream 430 | type: object 431 | properties: 432 | : 433 | $ref: '#/components/schemas/Fan' 434 | band_info: 435 | description: information about the bands featured in the stream 436 | type: object 437 | properties: 438 | : 439 | type: object 440 | properties: 441 | name: 442 | $ref: '#/components/schemas/ArtistName' 443 | band_id: 444 | $ref: '#/components/schemas/ArtistID' 445 | image_id: 446 | $ref: '#/components/schemas/ArtworkID' 447 | genre_id: 448 | type: integer 449 | followed: 450 | type: integer 451 | no_index: 452 | $ref: '#/components/schemas/UnknownProperty' 453 | latest_art_id: 454 | $ref: '#/components/schemas/UnknownProperty' 455 | story_collectors: 456 | description: fans of one of the stream items? 457 | type: array 458 | items: 459 | $ref: '#/components/schemas/UnknownProperty' 460 | item_lookup: 461 | description: 'unknown, just empty?' 462 | type: object 463 | /api/bcweekly/2/list: 464 | get: 465 | summary: Get a list of the Weekly shows. 466 | tags: 467 | - Weekly 468 | responses: 469 | '200': 470 | description: the list of available Weekly shows 471 | content: 472 | application/json: 473 | schema: 474 | type: object 475 | properties: 476 | results: 477 | type: array 478 | items: 479 | type: object 480 | properties: 481 | published_date: 482 | type: string 483 | description: a formatted timestamp 484 | example: '27 Sep 2016 00:00:00 GMT' 485 | date: 486 | type: string 487 | description: a formatted timestamp 488 | example: '27 Sep 2016 00:00:00 GMT' 489 | image_caption: 490 | $ref: '#/components/schemas/ImageCaption' 491 | subtitle: 492 | type: string 493 | example: All in the Family 494 | desc: 495 | $ref: '#/components/schemas/ShowDescription' 496 | image_id: 497 | type: integer 498 | description: smallest? 499 | v2_image_id: 500 | type: integer 501 | description: largest? 502 | screen_image_id: 503 | type: integer 504 | description: 'middle size, still 1000px?' 505 | id: 506 | type: integer 507 | example: 198 508 | button_color: 509 | type: string 510 | description: >- 511 | a HTML/CSS color definition, likely matching the 512 | artwork 513 | example: f03b2b 514 | /api/bcweekly/2/get: 515 | get: 516 | summary: Get information about a Weekly show. 517 | tags: 518 | - Weekly 519 | parameters: 520 | - in: query 521 | name: id 522 | schema: 523 | type: integer 524 | example: 270 525 | required: true 526 | responses: 527 | '200': 528 | description: the list of available Weekly shows 529 | content: 530 | application/json: 531 | schema: 532 | type: object 533 | properties: 534 | show_id: 535 | type: integer 536 | example: 198 537 | title: 538 | type: string 539 | description: always the same? 540 | example: Bandcamp Weekly 541 | subtitle: 542 | type: string 543 | example: All in the Family 544 | desc: 545 | $ref: '#/components/schemas/ShowDescription' 546 | short_desc: 547 | type: string 548 | example: Goat & Reginald Omas Mamode IV 549 | audio_title: 550 | type: string 551 | example: BC Weekly 183 September 27th 2016 552 | show_screen_image_id: 553 | type: integer 554 | example: 8380257 555 | show_v2_image_id: 556 | type: integer 557 | example: 8387090 558 | show_image_id: 559 | type: integer 560 | example: 8387090 561 | audio_track_id: 562 | type: integer 563 | description: pointing to single file for whole podcast 564 | audio_duration: 565 | type: number 566 | example: 5388.41 567 | audio_stream: 568 | type: object 569 | description: pointing to single file for whole podcast 570 | properties: 571 | mp3-128: 572 | type: string 573 | format: url 574 | example: >- 575 | https://bandcamp.com/stream_redirect?enc=mp3-128&track_id=1447643114&ts=1521207419&t=5852f1d29b7d9d8e11b62bae086245d3a65c70ef 576 | opus-lo: 577 | type: string 578 | format: url 579 | example: >- 580 | https://popplers5.bandcamp.com/download/track?enc=opus-lo&fsig=7e1214cff8a4c7dffef134ca8a52e880&id=1447643114&stream=1&ts=1521207420.0 581 | audio_url_hash: 582 | $ref: '#/components/schemas/URLHints' 583 | tracks: 584 | type: array 585 | description: >- 586 | list of track metadata, unfortunately without the 587 | streaming URL 588 | items: 589 | type: object 590 | properties: 591 | title: 592 | type: string 593 | example: The League of Frightened Men 594 | is_purchasable: 595 | type: boolean 596 | label: 597 | type: string 598 | example: Western Vinyl 599 | url_hints: 600 | $ref: '#/components/schemas/URLHints' 601 | album_url: 602 | $ref: '#/components/schemas/URLHints' 603 | location_text: 604 | type: string 605 | example: 'Philadelphia, Pennsylvania' 606 | album_id: 607 | $ref: '#/components/schemas/AlbumID' 608 | track_id: 609 | $ref: '#/components/schemas/TrackID' 610 | track_art_id: 611 | $ref: '#/components/schemas/ArtworkID' 612 | track_url: 613 | type: string 614 | example: >- 615 | http://lushlifemedia.bandcamp.com/track/the-league-of-frightened-men 616 | artist: 617 | type: string 618 | example: Lushlife 619 | is_preorder: 620 | type: boolean 621 | price: 622 | type: number 623 | merch_ids: 624 | $ref: '#/components/schemas/MerchIDs' 625 | currency: 626 | $ref: '#/components/schemas/Currency' 627 | band_id: 628 | $ref: '#/components/schemas/ArtistID' 629 | bio_image_id: 630 | $ref: '#/components/schemas/ArtworkID' 631 | package_image_ids: 632 | type: array 633 | description: no idea 634 | items: 635 | type: string 636 | timecode: 637 | type: number 638 | is_set_price: 639 | type: boolean 640 | require_email: 641 | type: boolean 642 | url: 643 | type: string 644 | format: url 645 | example: >- 646 | http://lushlifemedia.bandcamp.com/album/no-dead-languages 647 | album_title: 648 | type: string 649 | example: No Dead Languages 650 | image_caption: 651 | $ref: '#/components/schemas/ImageCaption' 652 | stream_infos: 653 | type: object 654 | properties: 655 | metadata_crc: 656 | type: string 657 | encodings_id: 658 | type: integer 659 | example: 3474371285 660 | format: 661 | type: integer 662 | example: 101 663 | file_id: 664 | type: integer 665 | example: 3596572293 666 | date: 667 | type: string 668 | description: a formatted timestamp 669 | example: '27 Sep 2016 00:00:00 GMT' 670 | published_date: 671 | type: string 672 | description: a formatted timestamp 673 | example: '27 Sep 2016 00:00:00 GMT' 674 | dark_mode: 675 | type: string 676 | /api/url/1/info: 677 | get: 678 | summary: Get information about content on a given bandcamp.com URL. 679 | tags: 680 | - URLs 681 | parameters: 682 | - $ref: '#/components/parameters/DevKey' 683 | - in: query 684 | name: url 685 | schema: 686 | type: string 687 | format: URI 688 | example: 'https://hrmnn.bandcamp.com' 689 | required: true 690 | responses: 691 | '200': 692 | description: information about the given URL 693 | content: 694 | application/json: 695 | schema: 696 | oneOf: 697 | - type: object 698 | properties: 699 | error_message: 700 | type: string 701 | example: unknown url 702 | error: 703 | type: boolean 704 | - type: object 705 | properties: 706 | band_id: 707 | $ref: '#/components/schemas/ArtistID' 708 | - type: object 709 | properties: 710 | band_id: 711 | $ref: '#/components/schemas/ArtistID' 712 | track_id: 713 | $ref: '#/components/schemas/TrackID' 714 | - type: object 715 | properties: 716 | band_id: 717 | $ref: '#/components/schemas/ArtistID' 718 | album_id: 719 | $ref: '#/components/schemas/AlbumID' 720 | '/img/{type}{id}_{format}.jpg': 721 | get: 722 | summary: 'Endpoint on https://f0.bcbits.com/ to get various pieces of artwork.' 723 | description: >- 724 | Not really another endpoint, but its own server... here for 725 | completeness' sake. *Make sure you use this on https://f0.bcbits.com/!* 726 | tags: 727 | - Artwork 728 | parameters: 729 | - in: path 730 | name: type 731 | schema: 732 | type: string 733 | enum: 734 | - a 735 | - t 736 | - p 737 | description: |- 738 | - a: Album artwork 739 | - t: Track artwork 740 | - p: merchandising? Not sure about this one 741 | required: true 742 | example: a 743 | - in: path 744 | name: id 745 | schema: 746 | type: string 747 | description: >- 748 | The image ID is left padded with 0 and then truncated to 10 749 | characters. 750 | required: true 751 | example: 1386391961 752 | - in: path 753 | name: format 754 | schema: 755 | type: integer 756 | enum: 757 | - 0 758 | - 1 759 | - 2 760 | - 3 761 | - 4 762 | - 5 763 | - 7 764 | - 8 765 | - 9 766 | - 20 767 | - 22 768 | - 41 769 | - 42 770 | description: |- 771 | An integer defining the resulting size. One of the following: 772 | - 0 => original (size & format, don't use extension) 773 | - 1 => fullsize (dito, use .original?, even heavier?!?) 774 | - 2 => 350x350 jpg 775 | - 3 => 100x100 jpg 776 | - 4 => 300x300 jpg 777 | - 5 => 700x700 jpg 778 | - 7 => 150x150 jpg 779 | - 8 => 124x124 jpg 780 | - 9 => 210x210 jpg 781 | - 10 => 1200x1200 jpg 782 | 783 | Non-artwork related, but working? 784 | - 20 => 1024x1024 jpg 785 | - 22 => 25x25 jpg 786 | - 41 => 210x210 jpg 787 | - 42 => 50x50 jpg 788 | required: true 789 | example: 2 790 | responses: 791 | '200': 792 | description: the artwork 793 | content: 794 | image/*: 795 | schema: 796 | type: string 797 | format: binary 798 | /api/salesfeed/1/get: 799 | get: 800 | summary: get currently selling items 801 | tags: 802 | - Editorial 803 | parameters: 804 | - in: query 805 | name: start_date 806 | schema: 807 | type: integer 808 | description: timestamp of the moment you want sales data from 809 | responses: 810 | '200': 811 | description: a list of currently selling albums 812 | content: 813 | application/json: 814 | schema: 815 | type: object 816 | properties: 817 | server_time: 818 | $ref: '#/components/schemas/Timestamp' 819 | end_date: 820 | $ref: '#/components/schemas/Timestamp' 821 | data_delay_sec: 822 | $ref: '#/components/schemas/UnknownProperty' 823 | events: 824 | type: array 825 | items: 826 | anyOf: 827 | - $ref: '#/components/schemas/SaleEvent' 828 | - $ref: '#/components/schemas/DownloadEvent' 829 | start_date: 830 | $ref: '#/components/schemas/Timestamp' 831 | home_page_values: 832 | type: object 833 | properties: 834 | sales_count_all_time: 835 | allOf: 836 | - $ref: '#/components/schemas/UnknownProperty' 837 | - example: 40981326 838 | downloads_count_all_time: 839 | allOf: 840 | - $ref: '#/components/schemas/UnknownProperty' 841 | - example: 182798723 842 | revenue_total: 843 | allOf: 844 | - $ref: '#/components/schemas/UnknownProperty' 845 | - example: 277276436 846 | revenue_30d: 847 | allOf: 848 | - $ref: '#/components/schemas/UnknownProperty' 849 | - example: 7291052 850 | /api/discover/3/get_web: 851 | get: 852 | summary: get a list of discovery items 853 | description: >- 854 | get a list of discovery items: `top` selling, staff `pic`ks, `new` 855 | arrivals, `most` recommended 856 | tags: 857 | - Editorial 858 | parameters: 859 | - in: query 860 | name: p 861 | schema: 862 | type: integer 863 | description: Page? 864 | example: 0 865 | - in: query 866 | name: s 867 | schema: 868 | $ref: '#/components/schemas/DiscoveryType' 869 | example: top 870 | responses: 871 | '200': 872 | description: the items 873 | content: 874 | application/json: 875 | schema: 876 | type: object 877 | properties: 878 | total_count: 879 | type: integer 880 | items: 881 | type: array 882 | items: 883 | $ref: '#/components/schemas/Album' 884 | timestamp: 885 | type: string 886 | example: '05 Mar 2018 16:52:23 GMT' 887 | data_sig: 888 | $ref: '#/components/schemas/UnknownProperty' 889 | spec_id: 890 | $ref: '#/components/schemas/UnknownProperty' 891 | ui_sig: 892 | $ref: '#/components/schemas/UnknownProperty' 893 | args: 894 | type: object 895 | properties: 896 | s: 897 | $ref: '#/components/schemas/DiscoveryType' 898 | p: 899 | type: integer 900 | g: 901 | type: string 902 | example: all 903 | r: 904 | $ref: '#/components/schemas/UnknownProperty' 905 | following: 906 | type: boolean 907 | description: wheter a user is following this item or not 908 | w: 909 | type: integer 910 | f: 911 | type: string 912 | example: all 913 | components: 914 | parameters: 915 | DevKey: 916 | in: query 917 | name: key 918 | description: >- 919 | a dev key which was provided by bandcamp.com. Unfortunately they no 920 | longer hand them out. 921 | schema: 922 | type: string 923 | required: true 924 | IdentityCookie: 925 | in: header 926 | description: >- 927 | the identity cookie can only be received by logging in to the web site. 928 | Unfortunately I haven't found a way to log in programmatically yet. But 929 | that identity cookie seems to be rather long-lived (several days at 930 | least). 931 | schema: 932 | type: string 933 | name: Cookie 934 | example: identity=9%0909ddd7b4f6eca8250cedc5f42546bd39%09%7B%22id%22%3A1712700664%2C%22h1%22%3A%220a36b7aa8ce0b80c36b86d5bc4d0e735%22%2C%22ex%22%3A0%7D; 935 | requestBodies: 936 | FanCollectionBody: 937 | description: JSON data of yet to understand data 938 | required: true 939 | content: 940 | application/json: 941 | schema: 942 | type: object 943 | properties: 944 | fan_id: 945 | $ref: '#/components/schemas/FanID' 946 | older_than_token: 947 | type: string 948 | description: >- 949 | The older_than_token string's structure is still unknown to 950 | me. It's being used to page through results. The first part of 951 | it seems to be some kind of timestamp. Starting with the 952 | current time you'd get the last token of the result set, which 953 | in turn could be used to fetch more results. 954 | example: '1504691191:1603563167:a::' 955 | count: 956 | type: integer 957 | example: 10 958 | description: > 959 | The number of items to return. There's no known limit: I've 960 | run queries with up to 5000 results. Use carefully! 961 | schemas: 962 | ArtistName: 963 | type: string 964 | description: the artist name 965 | example: Hermann 966 | ArtistID: 967 | type: integer 968 | example: 2240734681 969 | ArtistURL: 970 | type: string 971 | format: URI 972 | example: 'http://hrmnn.bandcamp.com' 973 | AlbumURL: 974 | type: string 975 | format: URI 976 | example: 'http://hrmnn.bandcamp.com/album/hermann?pk=391' 977 | AlbumTitle: 978 | type: string 979 | description: the album title 980 | example: Hermann 981 | AlbumID: 982 | type: integer 983 | example: 793714377 984 | Album: 985 | type: object 986 | description: an album object 987 | properties: 988 | primary_text: 989 | allOf: 990 | - $ref: '#/components/schemas/AlbumTitle' 991 | - description: 'the primary text to be shown with an item, eg. its albun title' 992 | secondary_text: 993 | allOf: 994 | - $ref: '#/components/schemas/UnknownProperty' 995 | - example: TESD4Implants2 996 | id: 997 | $ref: '#/components/schemas/AlbumID' 998 | package_title: 999 | allOf: 1000 | - $ref: '#/components/schemas/UnknownProperty' 1001 | - type: string 1002 | genre_text: 1003 | type: string 1004 | description: 'some genre description, afaik pretty much free form' 1005 | example: podcasts 1006 | art_id: 1007 | $ref: '#/components/schemas/ArtworkID' 1008 | alt_art_image_id: 1009 | $ref: '#/components/schemas/ArtworkID' 1010 | band_id: 1011 | $ref: '#/components/schemas/ArtistID' 1012 | bio_image: 1013 | type: object 1014 | properties: 1015 | width: 1016 | type: integer 1017 | image_id: 1018 | type: integer 1019 | height: 1020 | type: integer 1021 | featured_track: 1022 | type: object 1023 | properties: 1024 | title: 1025 | type: string 1026 | example: Hermann 1027 | id: 1028 | type: integer 1029 | example: 3056958565 1030 | encodings_id: 1031 | $ref: '#/components/schemas/UnknownProperty' 1032 | duration: 1033 | type: number 1034 | example: 60.694 1035 | file: 1036 | type: object 1037 | properties: 1038 | mp3-128: 1039 | $ref: '#/components/schemas/StreamURL' 1040 | category: 1041 | allOf: 1042 | - $ref: '#/components/schemas/UnknownProperty' 1043 | - example: solr_hack 1044 | package_art1: 1045 | $ref: '#/components/schemas/UnknownProperty' 1046 | package_art2: 1047 | $ref: '#/components/schemas/UnknownProperty' 1048 | package_art3: 1049 | $ref: '#/components/schemas/UnknownProperty' 1050 | package_art4: 1051 | $ref: '#/components/schemas/UnknownProperty' 1052 | publish_date: 1053 | type: string 1054 | example: '05 Mar 2018 04:55:34 GMT' 1055 | item_type_id: 1056 | allOf: 1057 | - $ref: '#/components/schemas/UnknownProperty' 1058 | - example: a3672525499solr_hack 1059 | is_preorder: 1060 | type: boolean 1061 | recommendations: 1062 | $ref: '#/components/schemas/UnknownProperty' 1063 | url_hints: 1064 | $ref: '#/components/schemas/URLHints' 1065 | location_text: 1066 | type: string 1067 | example: 'New York, New York' 1068 | extras: 1069 | $ref: '#/components/schemas/UnknownProperty' 1070 | score: 1071 | allOf: 1072 | - $ref: '#/components/schemas/UnknownProperty' 1073 | - type: number 1074 | type: 1075 | type: string 1076 | description: '`a` for Album' 1077 | example: a 1078 | DownloadEvent: 1079 | type: object 1080 | description: a download event 1081 | properties: 1082 | utc_date: 1083 | type: number 1084 | event_type: 1085 | type: string 1086 | enum: 1087 | - download 1088 | SaleEvent: 1089 | type: object 1090 | description: 'a sale event, can have multiple sales' 1091 | properties: 1092 | utc_date: 1093 | type: number 1094 | event_type: 1095 | type: string 1096 | enum: 1097 | - sale 1098 | items: 1099 | type: array 1100 | items: 1101 | $ref: '#/components/schemas/SaleItem' 1102 | SaleItem: 1103 | type: object 1104 | description: an item sold 1105 | properties: 1106 | utc_date: 1107 | type: number 1108 | amount_paid_fmt: 1109 | type: string 1110 | description: formatted amount paid for the item 1111 | example: $6 CAD 1112 | amount_paid: 1113 | type: number 1114 | example: 6 1115 | currency: 1116 | $ref: '#/components/schemas/Currency' 1117 | amount_paid_usd: 1118 | type: number 1119 | description: the paid amount in USD 1120 | example: 4.64 1121 | art_id: 1122 | $ref: '#/components/schemas/ArtworkID' 1123 | package_image_id: 1124 | $ref: '#/components/schemas/UnknownProperty' 1125 | item_description: 1126 | type: string 1127 | description: Cast of Static and Smoke 1128 | track_album_slug_text: 1129 | type: string 1130 | artist_name: 1131 | type: string 1132 | description: Vile Creature 1133 | slug_type: 1134 | type: string 1135 | description: '`a` for artist etc.?' 1136 | example: a 1137 | releases: 1138 | $ref: '#/components/schemas/UnknownProperty' 1139 | country_code: 1140 | type: string 1141 | example: us 1142 | item_type: 1143 | $ref: '#/components/schemas/ItemType' 1144 | item_price: 1145 | type: number 1146 | country: 1147 | type: string 1148 | example: United States 1149 | art_url: 1150 | $ref: '#/components/schemas/ArtworkURL' 1151 | album_title: 1152 | type: string 1153 | url: 1154 | type: string 1155 | format: URL 1156 | description: the URL where the item can be found 1157 | example: //vilecreature.bandcamp.com/album/cast-of-static-and-smoke 1158 | Track: 1159 | type: object 1160 | properties: 1161 | title: 1162 | $ref: '#/components/schemas/TrackTitle' 1163 | band_id: 1164 | $ref: '#/components/schemas/ArtistID' 1165 | large_art_url: 1166 | $ref: '#/components/schemas/ArtworkURL' 1167 | small_art_url: 1168 | $ref: '#/components/schemas/ArtworkURL' 1169 | streaming_url: 1170 | $ref: '#/components/schemas/StreamURL' 1171 | downloadable: 1172 | $ref: '#/components/schemas/DownloadableFlag' 1173 | number: 1174 | type: integer 1175 | duration: 1176 | type: number 1177 | album_id: 1178 | $ref: '#/components/schemas/AlbumID' 1179 | url: 1180 | type: string 1181 | description: >- 1182 | the track URL - despite its name not a full URL, but only it's path 1183 | part! 1184 | example: /track/kellner?pk=391 1185 | track_id: 1186 | $ref: '#/components/schemas/TrackID' 1187 | credits: 1188 | type: string 1189 | lyrics: 1190 | type: string 1191 | about: 1192 | type: string 1193 | TrackID: 1194 | type: integer 1195 | example: 2484061734 1196 | TrackTitle: 1197 | type: string 1198 | example: Kellner 1199 | ArtworkID: 1200 | type: integer 1201 | description: the artwork ID 1202 | example: 1386391961 1203 | ArtworkURL: 1204 | type: string 1205 | format: URI 1206 | example: 'https://f4.bcbits.com/img/a1386391961_3.jpg' 1207 | SubDomain: 1208 | type: string 1209 | description: the subdomain where the artist is at home on bandcamp.com 1210 | example: hrmnn 1211 | FollowerList: 1212 | type: object 1213 | properties: 1214 | more_available: 1215 | type: boolean 1216 | last_token: 1217 | type: string 1218 | description: >- 1219 | the token of the last item returned in this response, starting point 1220 | for a follow up request? 1221 | example: '1358631543:14628' 1222 | followeers: 1223 | type: array 1224 | items: 1225 | $ref: '#/components/schemas/Follower' 1226 | Follower: 1227 | type: object 1228 | properties: 1229 | location: 1230 | $ref: '#/components/schemas/Location' 1231 | band_id: 1232 | $ref: '#/components/schemas/ArtistID' 1233 | is_following: 1234 | type: boolean 1235 | is_subscribe: 1236 | type: boolean 1237 | name: 1238 | type: string 1239 | example: Michael Herger 1240 | trackpipe_url: 1241 | $ref: '#/components/schemas/TrackpipeURL' 1242 | art_id: 1243 | $ref: '#/components/schemas/ArtworkID' 1244 | image_id: 1245 | $ref: '#/components/schemas/ArtworkID' 1246 | fan_id: 1247 | $ref: '#/components/schemas/FanID' 1248 | token: 1249 | type: string 1250 | example: '1432068324:195872' 1251 | date_followed: 1252 | $ref: '#/components/schemas/Timestamp' 1253 | fan_url: 1254 | type: string 1255 | format: URL 1256 | url_hints: 1257 | $ref: '#/components/schemas/URLHints' 1258 | FanID: 1259 | type: integer 1260 | example: 10236 1261 | Fan: 1262 | type: object 1263 | properties: 1264 | location: 1265 | $ref: '#/components/schemas/Location' 1266 | bio: 1267 | type: string 1268 | example: King Crimson biographer among oher things. 1269 | collection_size: 1270 | type: integer 1271 | followed: 1272 | type: integer 1273 | num_items_in_common: 1274 | type: integer 1275 | fav_genre_name: 1276 | type: string 1277 | example: Alternative 1278 | fav_genre_id: 1279 | type: integer 1280 | example: 2 1281 | followed_by: 1282 | $ref: '#/components/schemas/FollowerList' 1283 | trackpipe_url: 1284 | $ref: '#/components/schemas/TrackpipeURL' 1285 | name: 1286 | type: string 1287 | example: Carlos Romeo 1288 | collection_art: 1289 | type: array 1290 | items: 1291 | type: object 1292 | properties: 1293 | : 1294 | type: object 1295 | properties: 1296 | art_info: 1297 | type: object 1298 | properties: 1299 | art_id: 1300 | type: integer 1301 | example: 1058221488 1302 | tralbum_type: 1303 | $ref: '#/components/schemas/TrAlbumType' 1304 | tralbum_id: 1305 | oneOf: 1306 | - $ref: '#/components/schemas/AlbumID' 1307 | - $ref: '#/components/schemas/TrackID' 1308 | image_id: 1309 | type: integer 1310 | example: 878604 1311 | fan_id: 1312 | allOf: 1313 | - $ref: '#/components/schemas/FanID' 1314 | - example: 4679 1315 | is_montage_image: 1316 | $ref: '#/components/schemas/UnknownProperty' 1317 | username: 1318 | type: string 1319 | example: ignacioc 1320 | TrAlbumType: 1321 | type: string 1322 | enum: 1323 | - a 1324 | - t? 1325 | description: whether this is an album or track? 1326 | TrackpipeURL: 1327 | type: string 1328 | format: URI 1329 | description: the user's profile URL 1330 | example: 'http://bandcamp.com/michaelherger' 1331 | ItemType: 1332 | type: string 1333 | enum: 1334 | - a 1335 | description: the type can be `a`lbum 1336 | DiscoveryType: 1337 | type: string 1338 | enum: 1339 | - top 1340 | - pic 1341 | - new 1342 | - most 1343 | Currency: 1344 | type: string 1345 | description: three character currency description 1346 | example: CHF 1347 | StreamURL: 1348 | type: string 1349 | format: URI 1350 | example: >- 1351 | https://bandcamp.com/stream_redirect?enc=mp3-128&track_id=2484061734&ts=1520430789&t=85bce9f8b951fd3eb5decdbe48a17724eadc3c83 1352 | URLHints: 1353 | type: object 1354 | properties: 1355 | custom_domain_verified: 1356 | $ref: '#/components/schemas/UnknownProperty' 1357 | custom_domain: 1358 | type: string 1359 | description: 'an artist''s own, custom domain name' 1360 | subdomain: 1361 | type: string 1362 | description: the artist's subdomain on bandcamp.com 1363 | example: hrmnn 1364 | item_type: 1365 | type: string 1366 | enum: 1367 | - a 1368 | - t 1369 | description: 'the type can be `a`lbum, `t`rack' 1370 | slug: 1371 | type: string 1372 | example: hermann 1373 | Timestamp: 1374 | type: integer 1375 | description: a timestamp in unix time 1376 | example: 1520400480 1377 | DownloadableFlag: 1378 | allOf: 1379 | - $ref: '#/components/schemas/UnknownProperty' 1380 | - example: 2 1381 | MerchIDs: 1382 | type: array 1383 | items: 1384 | type: number 1385 | example: 1386 | - 214158844 1387 | - 833475221 1388 | Location: 1389 | type: string 1390 | example: Switzerland 1391 | ShowDescription: 1392 | type: string 1393 | example: >- 1394 | Featuring interviews with Sweden's mysterious Goat, and Reginald Omas 1395 | Mamode IV of London’s prolific 22a crew. 1396 | ImageCaption: 1397 | type: string 1398 | description: HTML formatted caption 1399 | example: >- 1400 | Hosted by Andrew Jervis. 1401 | Illustration of Goat by Niklas Åkerblad. 1403 | UnknownProperty: 1404 | type: string 1405 | description: unknown? 1406 | responses: 1407 | FanCollection: 1408 | description: The followers 1409 | content: 1410 | application/json: 1411 | schema: 1412 | $ref: '#/components/schemas/FollowerList' 1413 | ItemCollection: 1414 | description: The collection 1415 | content: 1416 | application/json: 1417 | schema: 1418 | type: object 1419 | properties: 1420 | more_available: 1421 | type: boolean 1422 | purchase_infos: 1423 | type: object 1424 | last_token: 1425 | type: string 1426 | example: '1301406176:1500067389:a:2:' 1427 | item_lookup: 1428 | type: object 1429 | redownload_urls: 1430 | type: object 1431 | collectors: 1432 | type: object 1433 | track_list: 1434 | type: array 1435 | description: featured tracks of the "items"? 1436 | items: 1437 | type: object 1438 | properties: 1439 | currency: 1440 | $ref: '#/components/schemas/Currency' 1441 | has_digital_download: 1442 | type: boolean 1443 | album_title: 1444 | $ref: '#/components/schemas/AlbumTitle' 1445 | encodings_id: 1446 | allOf: 1447 | - $ref: '#/components/schemas/UnknownProperty' 1448 | - type: number 1449 | - example: 18647555 1450 | track_id: 1451 | $ref: '#/components/schemas/TrackID' 1452 | merch_ids: 1453 | $ref: '#/components/schemas/MerchIDs' 1454 | album_id: 1455 | $ref: '#/components/schemas/AlbumID' 1456 | duration: 1457 | type: number 1458 | title: 1459 | $ref: '#/components/schemas/TrackTitle' 1460 | label_id: 1461 | $ref: '#/components/schemas/UnknownProperty' 1462 | merch_sold_out: 1463 | type: boolean 1464 | price: 1465 | type: number 1466 | has_lyrics: 1467 | type: boolean 1468 | art_id: 1469 | $ref: '#/components/schemas/ArtworkID' 1470 | band_id: 1471 | $ref: '#/components/schemas/ArtistID' 1472 | label: 1473 | $ref: '#/components/schemas/UnknownProperty' 1474 | track_num: 1475 | type: integer 1476 | is_purchasable: 1477 | type: boolean 1478 | is_set_price: 1479 | type: boolean 1480 | streaming_url: 1481 | type: object 1482 | properties: 1483 | mp3-128: 1484 | $ref: '#/components/schemas/StreamURL' 1485 | require_email: 1486 | type: boolean 1487 | is_streamable: 1488 | type: boolean 1489 | band_name: 1490 | $ref: '#/components/schemas/ArtistName' 1491 | items: 1492 | type: array 1493 | items: 1494 | type: object 1495 | properties: 1496 | currency: 1497 | $ref: '#/components/schemas/Currency' 1498 | has_digital_download: 1499 | type: boolean 1500 | album_title: 1501 | $ref: '#/components/schemas/AlbumTitle' 1502 | gift_recipient_name: 1503 | $ref: '#/components/schemas/UnknownProperty' 1504 | featured_track_duration: 1505 | type: number 1506 | item_url: 1507 | $ref: '#/components/schemas/AlbumURL' 1508 | url_hints: 1509 | $ref: '#/components/schemas/URLHints' 1510 | tralbum_type: 1511 | $ref: '#/components/schemas/TrAlbumType' 1512 | fan_id: 1513 | $ref: '#/components/schemas/FanID' 1514 | is_subscription_item: 1515 | type: boolean 1516 | item_art_id: 1517 | $ref: '#/components/schemas/ArtworkID' 1518 | item_id: 1519 | type: integer 1520 | merch_ids: 1521 | $ref: '#/components/schemas/MerchIDs' 1522 | album_id: 1523 | $ref: '#/components/schemas/AlbumID' 1524 | featured_track_encodings_id: 1525 | allOf: 1526 | - $ref: '#/components/schemas/UnknownProperty' 1527 | - type: integer 1528 | tralbum_id: 1529 | oneOf: 1530 | - $ref: '#/components/schemas/AlbumID' 1531 | - $ref: '#/components/schemas/TrackID' 1532 | sale_item_id: 1533 | allOf: 1534 | - $ref: '#/components/schemas/UnknownProperty' 1535 | - type: integer 1536 | label_id: 1537 | allOf: 1538 | - $ref: '#/components/schemas/UnknownProperty' 1539 | - type: integer 1540 | band_location: 1541 | $ref: '#/components/schemas/Location' 1542 | is_subscriber_only: 1543 | type: boolean 1544 | featured_track_url: 1545 | $ref: '#/components/schemas/StreamURL' 1546 | item_art_url: 1547 | $ref: '#/components/schemas/ArtworkURL' 1548 | hidden: 1549 | type: boolean 1550 | description: >- 1551 | an item which had been sold at some point, but is no 1552 | longer available? 1553 | merch_sold_out: 1554 | allOf: 1555 | - $ref: '#/components/schemas/UnknownProperty' 1556 | - type: boolean 1557 | price: 1558 | type: number 1559 | is_preorder: 1560 | type: boolean 1561 | package_details: 1562 | $ref: '#/components/schemas/UnknownProperty' 1563 | item_title: 1564 | oneOf: 1565 | - $ref: '#/components/schemas/ArtistName' 1566 | - $ref: '#/components/schemas/AlbumTitle' 1567 | - $ref: '#/components/schemas/TrackTitle' 1568 | band_image_id: 1569 | $ref: '#/components/schemas/ArtworkID' 1570 | gift_id: 1571 | $ref: '#/components/schemas/UnknownProperty' 1572 | is_private: 1573 | type: boolean 1574 | description: >- 1575 | an item which had been sold at some point, but is no 1576 | longer available 1577 | featured_track_number: 1578 | type: integer 1579 | band_url: 1580 | $ref: '#/components/schemas/ArtistURL' 1581 | item_art: 1582 | type: object 1583 | properties: 1584 | thumb_url: 1585 | $ref: '#/components/schemas/ArtworkURL' 1586 | art_id: 1587 | $ref: '#/components/schemas/ArtworkID' 1588 | url: 1589 | $ref: '#/components/schemas/ArtworkURL' 1590 | item_art_ids: 1591 | $ref: '#/components/schemas/UnknownProperty' 1592 | num_streamable_tracks: 1593 | type: integer 1594 | sale_item_type: 1595 | type: string 1596 | enum: 1597 | - p 1598 | description: '`p`urchase?' 1599 | purchased: 1600 | $ref: '#/components/schemas/Timestamp' 1601 | added: 1602 | $ref: '#/components/schemas/Timestamp' 1603 | band_id: 1604 | $ref: '#/components/schemas/ArtistID' 1605 | label: 1606 | $ref: '#/components/schemas/UnknownProperty' 1607 | release_count: 1608 | $ref: '#/components/schemas/UnknownProperty' 1609 | featured_track_title: 1610 | $ref: '#/components/schemas/TrackTitle' 1611 | index: 1612 | $ref: '#/components/schemas/UnknownProperty' 1613 | is_set_price: 1614 | type: boolean 1615 | gift_sender_name: 1616 | $ref: '#/components/schemas/UnknownProperty' 1617 | service_url_fragment: 1618 | $ref: '#/components/schemas/UnknownProperty' 1619 | is_purchasable: 1620 | type: boolean 1621 | why: 1622 | $ref: '#/components/schemas/UnknownProperty' 1623 | featured_track: 1624 | $ref: '#/components/schemas/TrackID' 1625 | updated: 1626 | $ref: '#/components/schemas/Timestamp' 1627 | token: 1628 | type: string 1629 | example: '1505295591:793714377:a::' 1630 | releases: 1631 | $ref: '#/components/schemas/UnknownProperty' 1632 | message_count: 1633 | $ref: '#/components/schemas/UnknownProperty' 1634 | featured_track_is_custom: 1635 | type: boolean 1636 | genre_id: 1637 | type: integer 1638 | discount: 1639 | $ref: '#/components/schemas/UnknownProperty' 1640 | require_email: 1641 | allOf: 1642 | - $ref: '#/components/schemas/UnknownProperty' 1643 | - type: boolean 1644 | gift_sender_note: 1645 | $ref: '#/components/schemas/UnknownProperty' 1646 | service_name: 1647 | $ref: '#/components/schemas/UnknownProperty' 1648 | is_giftable: 1649 | type: boolean 1650 | band_name: 1651 | $ref: '#/components/schemas/ArtistName' 1652 | also_collected_count: 1653 | allOf: 1654 | - $ref: '#/components/schemas/UnknownProperty' 1655 | - type: integer 1656 | item_type: 1657 | type: string 1658 | enum: 1659 | - album 1660 | externalDocs: 1661 | description: Find out more about Swagger 1662 | url: 'http://swagger.io' 1663 | --------------------------------------------------------------------------------