{"openapi":"3.1.0","info":{"title":"Wax Monkey read API","version":"1.0.0","description":"Read-only, unauthenticated JSON about Wax Monkey: shows, releases, merch, the band itself and its FAQ. Every response is public information that also appears in visible text on the site. CORS is open to any origin. The five request-reading routes — `/api/v1/shows`, `/api/v1/shows/{handle}`, `/api/v1/releases`, `/api/v1/releases/{handle}` and `/api/v1/merch` — are rate limited to 60 requests a minute per IP and carry `X-RateLimit-*` headers; `/api/v1`, `/api/v1/band` and `/api/v1/faq` are prerendered static responses and are not counted. Prose versions of the same pages are at `/llms.txt`, and every page answers `Accept: text/markdown`.","contact":{"name":"Wax Monkey booking","email":"booking@atlas-touring.com","url":"https://waxmonkeyband.com/booking"}},"servers":[{"url":"https://waxmonkeyband.com"}],"paths":{"/api/v1":{"get":{"operationId":"getApiIndex","summary":"API index","description":"The endpoints below, with this document and `/llms.txt` linked from it.","responses":{"200":{"description":"The API index.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}}}}},"/api/v1/band":{"get":{"operationId":"getBand","summary":"Band facts","description":"Who the band is, where it is from, what it sounds like, who plays what, what the press said, and how to book it — the same facts `/band` and `/for-agents` print.","responses":{"200":{"description":"The band facts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BandFacts"}}}}}}},"/api/v1/shows":{"get":{"operationId":"listShows","summary":"Shows","description":"Public shows: upcoming soonest-first, then past shows most-recent-first. With `near`, nearest-first instead.","parameters":[{"name":"state","in":"query","required":false,"description":"Two-letter state or province code, e.g. `AL`. Case-insensitive.","schema":{"type":"string","pattern":"^[A-Za-z]{2}$"}},{"name":"near","in":"query","required":false,"description":"Latitude and longitude in degrees, `lat,lng`. Answers only shows at venues within 322 km of that point, nearest first; a venue with no coordinates is not returned.","schema":{"type":"string","examples":["33.2098,-87.5692"]}},{"name":"limit","in":"query","required":false,"description":"How many shows to return, 1 to 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}],"responses":{"200":{"description":"Matching shows.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowList"}}}},"400":{"description":"A query parameter was invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: more than 60 requests in a minute from one IP. Retry after the number of seconds in `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"The request could not be served. The body is `{ \"error\": \"internal error\" }` and carries no detail.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"The rate limiter could not be reached, so the request was not counted and was not served. The body is `{ \"error\": \"service unavailable\" }`. Retry after the number of seconds in `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/shows/{handle}":{"get":{"operationId":"getShow","summary":"One show","description":"One public show, with doors, support, ticketing and presale links.","parameters":[{"name":"handle","in":"path","required":true,"description":"The entry’s handle, as it appears in its page URL.","schema":{"type":"string"}}],"responses":{"200":{"description":"The show.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowDetail"}}}},"404":{"description":"No public show has that handle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: more than 60 requests in a minute from one IP. Retry after the number of seconds in `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"The request could not be served. The body is `{ \"error\": \"internal error\" }` and carries no detail.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"The rate limiter could not be reached, so the request was not counted and was not served. The body is `{ \"error\": \"service unavailable\" }`. Retry after the number of seconds in `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/releases":{"get":{"operationId":"listReleases","summary":"Releases","description":"The discography, newest first.","responses":{"200":{"description":"The releases.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseList"}}}},"429":{"description":"Rate limited: more than 60 requests in a minute from one IP. Retry after the number of seconds in `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"The request could not be served. The body is `{ \"error\": \"internal error\" }` and carries no detail.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"The rate limiter could not be reached, so the request was not counted and was not served. The body is `{ \"error\": \"service unavailable\" }`. Retry after the number of seconds in `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/releases/{handle}":{"get":{"operationId":"getRelease","summary":"One release","description":"One release, its track listing and where to hear it.","parameters":[{"name":"handle","in":"path","required":true,"description":"The entry’s handle, as it appears in its page URL.","schema":{"type":"string"}}],"responses":{"200":{"description":"The release.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseDetail"}}}},"404":{"description":"No release has that handle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: more than 60 requests in a minute from one IP. Retry after the number of seconds in `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"The request could not be served. The body is `{ \"error\": \"internal error\" }` and carries no detail.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"The rate limiter could not be reached, so the request was not counted and was not served. The body is `{ \"error\": \"service unavailable\" }`. Retry after the number of seconds in `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/merch":{"get":{"operationId":"listMerch","summary":"Merch","description":"Products on sale now. A product in a drop appears only once the drop has opened to everyone.","parameters":[{"name":"collection","in":"query","required":false,"description":"A collection handle — one of the store's catalog collections (`tees`, `posters`, `music`, …) or a drop's own collection. Omit it for the whole store; a handle nothing is in answers an empty list.","schema":{"type":"string","examples":["tees"]}}],"responses":{"200":{"description":"The products.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductList"}}}},"429":{"description":"Rate limited: more than 60 requests in a minute from one IP. Retry after the number of seconds in `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"The request could not be served. The body is `{ \"error\": \"internal error\" }` and carries no detail.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"The rate limiter could not be reached, so the request was not counted and was not served. The body is `{ \"error\": \"service unavailable\" }`. Retry after the number of seconds in `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/faq":{"get":{"operationId":"listFaq","summary":"FAQ","description":"Every frequently asked question the band publishes, with the pages each one appears on (`showOn`: `for-agents`, `booking`, `band`) and the answer as Markdown text.","responses":{"200":{"description":"The questions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FaqList"}}}}}}}},"components":{"schemas":{"ApiError":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false},"ApiIndex":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string","const":"v1"},"openapi":{"type":"string","format":"uri"},"llms":{"type":"string","format":"uri"},"endpoints":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"description":{"type":"string"}},"required":["path","description"],"additionalProperties":false}}},"required":["name","version","openapi","llms","endpoints"],"additionalProperties":false},"BandFacts":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string","format":"uri"},"tagline":{"type":"string"},"summary":{"type":"string"},"bio":{"type":"string"},"hometown":{"type":"string"},"formedYear":{"type":["string","null"]},"genres":{"type":"array","items":{"type":"string"}},"soundsLike":{"type":"array","items":{"type":"string"}},"socials":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string"},"url":{"type":"string"}},"required":["platform","url"],"additionalProperties":false}},"bookingAgency":{"type":"string"},"bookingEmail":{"type":"string"},"members":{"type":"array","items":{"type":"object","properties":{"handle":{"type":"string"},"name":{"type":"string"},"instruments":{"type":"array","items":{"type":"string"}},"bio":{"type":["string","null"]},"hometown":{"type":["string","null"]},"instagramUrl":{"type":["string","null"]}},"required":["handle","name","instruments","bio","hometown","instagramUrl"],"additionalProperties":false}},"press":{"type":"array","items":{"type":"object","properties":{"handle":{"type":"string"},"quote":{"type":"string"},"outlet":{"type":"string"},"author":{"type":["string","null"]},"title":{"type":["string","null"]},"url":{"type":["string","null"]},"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"type":{"type":"string","enum":["Quote","Feature","Review","Interview","Preview"]},"featured":{"type":"boolean"}},"required":["handle","quote","outlet","author","title","url","date","type","featured"],"additionalProperties":false}}},"required":["name","url","tagline","summary","bio","hometown","formedYear","genres","soundsLike","socials","bookingAgency","bookingEmail","members","press"],"additionalProperties":false},"BookingInfo":{"type":"object","properties":{"agency":{"type":"string"},"email":{"type":"string"},"hometown":{"type":"string"},"url":{"type":"string","format":"uri"},"routing":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"handledBy":{"type":"string"},"needsEventDetail":{"type":"boolean"}},"required":["type","handledBy","needsEventDetail"],"additionalProperties":false}},"responseTime":{"type":"string"},"faq":{"type":"array","items":{"type":"object","properties":{"handle":{"type":"string"},"question":{"type":"string"},"answer":{"type":"string"},"showOn":{"type":"array","items":{"type":"string"}}},"required":["handle","question","answer","showOn"],"additionalProperties":false}}},"required":["agency","email","hometown","url","routing","responseTime","faq"],"additionalProperties":false},"ShowList":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"handle":{"type":"string"},"title":{"type":["string","null"]},"url":{"type":"string","format":"uri"},"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"startsAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"timezone":{"type":"string"},"status":{"type":"string","enum":["scheduled","presale","on_sale","free","at_the_door","sold_out","cancelled","postponed","rescheduled","played"]},"venue":{"type":"object","properties":{"name":{"type":"string"},"city":{"type":"string"},"region":{"type":"string"},"country":{"type":"string"},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]}},"required":["name","city","region","country","lat","lng"],"additionalProperties":false},"ticketUrl":{"type":["string","null"]},"priceFrom":{"type":["number","null"]},"ageRestriction":{"type":["string","null"]},"presaleCode":{"type":["string","null"]}},"required":["handle","title","url","date","startsAt","timezone","status","venue","ticketUrl","priceFrom","ageRestriction","presaleCode"],"additionalProperties":false}},"total":{"type":"number","description":"How many shows this response carries (`limit` caps it)."}},"required":["items","total"],"additionalProperties":false},"ShowDetail":{"type":"object","properties":{"handle":{"type":"string"},"title":{"type":["string","null"]},"url":{"type":"string","format":"uri"},"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"startsAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"timezone":{"type":"string"},"status":{"type":"string","enum":["scheduled","presale","on_sale","free","at_the_door","sold_out","cancelled","postponed","rescheduled","played"]},"venue":{"type":"object","properties":{"name":{"type":"string"},"city":{"type":"string"},"region":{"type":"string"},"country":{"type":"string"},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]}},"required":["name","city","region","country","lat","lng"],"additionalProperties":false},"ticketUrl":{"type":["string","null"]},"priceFrom":{"type":["number","null"]},"ageRestriction":{"type":["string","null"]},"presaleCode":{"type":["string","null"]},"endDate":{"anyOf":[{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},{"type":"null"}]},"startTime":{"type":["string","null"]},"doorsTime":{"type":["string","null"]},"onSaleAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"ticketVendor":{"type":["string","null"]},"presaleUrl":{"type":["string","null"]},"statusNote":{"type":["string","null"]},"support":{"type":"array","items":{"type":"string"}},"eventType":{"type":"string"},"festivalName":{"type":["string","null"]},"bandsintownUrl":{"type":["string","null"]},"resaleUrl":{"type":["string","null"]},"setlist":{"anyOf":[{"type":"object","properties":{"title":{"type":"string"},"sets":{"type":"array","items":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"note":{"type":"string"},"segue":{"type":"boolean"}},"required":["title"],"additionalProperties":false}}},"encore":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"note":{"type":"string"},"segue":{"type":"boolean"}},"required":["title"],"additionalProperties":false}},"guests":{"type":"array","items":{"type":"string"}},"notes":{"type":["string","null"]},"sourceUrl":{"type":["string","null"]},"incomplete":{"type":"boolean"},"taper":{"type":["string","null"]}},"required":["title","sets","encore","guests","notes","sourceUrl","incomplete","taper"],"additionalProperties":false},{"type":"null"}]}},"required":["handle","title","url","date","startsAt","timezone","status","venue","ticketUrl","priceFrom","ageRestriction","presaleCode","endDate","startTime","doorsTime","onSaleAt","ticketVendor","presaleUrl","statusNote","support","eventType","festivalName","bandsintownUrl","resaleUrl","setlist"],"additionalProperties":false},"ReleaseList":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"handle":{"type":"string"},"title":{"type":"string"},"url":{"type":"string","format":"uri"},"type":{"type":"string","enum":["LP","EP","Single","Live"]},"releaseDate":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"coverUrl":{"type":["string","null"]},"featured":{"type":"boolean"}},"required":["handle","title","url","type","releaseDate","coverUrl","featured"],"additionalProperties":false}},"total":{"type":"number","description":"How many releases this response carries."}},"required":["items","total"],"additionalProperties":false},"ReleaseDetail":{"type":"object","properties":{"handle":{"type":"string"},"title":{"type":"string"},"url":{"type":"string","format":"uri"},"type":{"type":"string","enum":["LP","EP","Single","Live"]},"releaseDate":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"coverUrl":{"type":["string","null"]},"featured":{"type":"boolean"},"label":{"type":["string","null"]},"links":{"type":"object","properties":{"spotify":{"type":["string","null"]},"apple":{"type":["string","null"]},"youtube":{"type":["string","null"]},"amazon":{"type":["string","null"]},"tidal":{"type":["string","null"]},"bandcamp":{"type":["string","null"]}},"required":["spotify","apple","youtube","amazon","tidal","bandcamp"],"additionalProperties":false},"tracks":{"type":"array","items":{"type":"object","properties":{"trackNumber":{"type":"number"},"title":{"type":"string"},"duration":{"type":["string","null"]}},"required":["trackNumber","title","duration"],"additionalProperties":false}}},"required":["handle","title","url","type","releaseDate","coverUrl","featured","label","links","tracks"],"additionalProperties":false},"ProductList":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"handle":{"type":"string"},"title":{"type":"string"},"url":{"type":"string","format":"uri"},"productType":{"type":"string"},"priceFrom":{"type":"number"},"priceTo":{"type":"number"},"available":{"type":"boolean"},"badge":{"type":["string","null"]},"imageUrl":{"type":["string","null"]}},"required":["handle","title","url","productType","priceFrom","priceTo","available","badge","imageUrl"],"additionalProperties":false}},"total":{"type":"number","description":"How many products this response carries."}},"required":["items","total"],"additionalProperties":false},"FaqList":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"handle":{"type":"string"},"question":{"type":"string"},"answer":{"type":"string"},"showOn":{"type":"array","items":{"type":"string"}}},"required":["handle","question","answer","showOn"],"additionalProperties":false}},"total":{"type":"number","description":"How many questions this response carries."}},"required":["items","total"],"additionalProperties":false}}},"x-llms-txt":"/llms.txt"}