{"openapi":"3.1.0","info":{"title":"Groove Public API","version":"1.0.0","description":"Read-only public API for live-music acts on Groove: song repertoire and its tags as JSON. No authentication required. The {tenant} path parameter is the act’s slug — the left-most label of the act’s site hostname."},"servers":[{"url":"https://api.findmusicians.co.uk"}],"components":{"schemas":{"SongList":{"type":"object","properties":{"tenant":{"type":"string"},"meta":{"type":"object","properties":{"total":{"type":"number"}},"required":["total"]},"items":{"type":"array","items":{"$ref":"#/components/schemas/Song"}}},"required":["tenant","meta","items"]},"Song":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"artist":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}}},"required":["id","title","artist","tags"]},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["TENANT_NOT_FOUND","NOT_FOUND","INTERNAL"]},"message":{"type":"string"}},"required":["code","message"]}},"required":["error"]},"TagList":{"type":"object","properties":{"tenant":{"type":"string"},"meta":{"type":"object","properties":{"total":{"type":"number"}},"required":["total"]},"items":{"type":"array","items":{"type":"object","properties":{"tag":{"type":"string"},"count":{"type":"number"}},"required":["tag","count"]}}},"required":["tenant","meta","items"]}},"parameters":{}},"paths":{"/{tenant}/songs":{"get":{"summary":"List all songs for a tenant","tags":["songs"],"parameters":[{"schema":{"type":"string","example":"amba-strings","description":"Tenant (act/band) slug"},"required":true,"description":"Tenant (act/band) slug","name":"tenant","in":"path"},{"schema":{"type":"string","description":"Case-insensitive search over song title and artist"},"required":false,"description":"Case-insensitive search over song title and artist","name":"q","in":"query"},{"schema":{"type":"string","example":"pop","description":"Only songs carrying this exact tag (lowercase); an unknown tag lists nothing"},"required":false,"description":"Only songs carrying this exact tag (lowercase); an unknown tag lists nothing","name":"tag","in":"query"}],"responses":{"200":{"description":"The tenant's full public song repertoire","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SongList"}}}},"404":{"description":"Tenant not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/{tenant}/tags":{"get":{"summary":"List the tags for a tenant","tags":["tags"],"parameters":[{"schema":{"type":"string","example":"amba-strings","description":"Tenant (act/band) slug"},"required":true,"description":"Tenant (act/band) slug","name":"tenant","in":"path"}],"responses":{"200":{"description":"The tags on the public repertoire, with song counts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagList"}}}},"404":{"description":"Tenant not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}