{"openapi":"3.1.0","info":{"title":"The Theatre Podcast — LLM API","version":"1.0.0","description":"Public, read-only API for LLMs and agents to query The Theatre Podcast with Alan Seales: site info, episode search, and everything needed to play an episode (direct audio stream URL + a deep link into the site player). No auth required. Rate limited per IP (60/min, 1000/hour); exceeding it returns HTTP 429 with a Retry-After header.","contact":{"name":"The Theatre Podcast","url":"https://thetheatrepodcast.com"}},"servers":[{"url":"https://thetheatrepodcast.com/api/llm","description":"Production"}],"paths":{"/info":{"get":{"operationId":"getSiteInfo","summary":"Podcast and site information","description":"One call to ground answers about the show: name, description, host, listening platforms, social links, key pages, episode count, and the latest episode.","responses":{"200":{"description":"Site info","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteInfo"}}}}}}},"/episodes":{"get":{"operationId":"searchEpisodes","summary":"Search or list episodes","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Free-text search over title, description, and guest names."},{"name":"guest","in":"query","required":false,"schema":{"type":"string"},"description":"Filter to episodes whose guest names contain this text."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["newest","oldest"],"default":"newest"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"minimum":0}}],"responses":{"200":{"description":"Matching episodes","content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":["string","null"]},"total":{"type":"integer"},"hasMore":{"type":"boolean"},"episodes":{"type":"array","items":{"$ref":"#/components/schemas/EpisodeSummary"}}}}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/episodes/{idOrSlug}":{"get":{"operationId":"getEpisode","summary":"Get a single episode by id or slug","parameters":[{"name":"idOrSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Episode slug (e.g. \"alex-brightman-446\") or internal id."}],"responses":{"200":{"description":"Episode detail","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpisodeDetail"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}}},"components":{"responses":{"RateLimited":{"description":"Too many requests. Retry after the number of seconds in Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying."},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]},"Platform":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string","format":"uri"}}},"Playback":{"type":"object","description":"Everything needed to play the episode.","properties":{"audioUrl":{"type":"string","format":"uri","description":"Direct audio stream (renderable by audio-capable hosts)."},"playerUrl":{"type":"string","format":"uri","description":"Deep link that opens the episode cued in the site player, auto-playing where the browser allows (otherwise one tap to play)."},"webUrl":{"type":"string","format":"uri"},"durationSeconds":{"type":"integer"},"durationFormatted":{"type":"string"},"imageUrl":{"type":"string","format":"uri"}}},"EpisodeSummary":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"episodeNumber":{"type":["integer","null"]},"guests":{"type":"array","items":{"type":"string"}},"publishedAt":{"type":"string","format":"date-time"},"description":{"type":"string","description":"Plain-text summary (truncated)."},"imageUrl":{"type":"string","format":"uri"},"url":{"type":"string","format":"uri"},"playback":{"$ref":"#/components/schemas/Playback"}}},"EpisodeDetail":{"allOf":[{"$ref":"#/components/schemas/EpisodeSummary"},{"type":"object","properties":{"description":{"type":"string","description":"Full plain-text description."},"descriptionHtml":{"type":"string"},"season":{"type":["integer","null"]},"showTitle":{"type":["string","null"]},"topics":{"type":"array","items":{"type":"string"}},"guestDetails":{"type":"array","items":{"type":"object"}},"chapterMarkers":{"type":"array","items":{"type":"object","properties":{"time":{"type":"number"},"title":{"type":"string"}}}}}}]},"SiteInfo":{"type":"object","properties":{"name":{"type":"string"},"tagline":{"type":"string"},"description":{"type":"string"},"host":{"type":"string"},"location":{"type":"string"},"url":{"type":"string","format":"uri"},"episodeCount":{"type":"integer"},"latestEpisode":{"$ref":"#/components/schemas/EpisodeSummary"},"platforms":{"type":"array","items":{"$ref":"#/components/schemas/Platform"}},"socialLinks":{"type":"object","additionalProperties":{"type":"string"}},"pages":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"url":{"type":"string"}}}},"api":{"type":"object","additionalProperties":{"type":"string"}}}}}}}