{
	"openapi": "3.1.0",
	"info": {
		"title": "show.fm API",
		"version": "v1",
		"description": "Public, keyless reads of published podcasts and episodes, and keyed access to your own podcasts under `/v1/me`: read-only, except the connected-site routes the show.fm WordPress plugin uses. Keyed requests send `Authorization: Bearer showfm_live_…` from a server; browsers are refused.\n\n## Import provenance fingerprints (normalisation v1)\n\nHash the UTF-8 bytes of the normalised string with SHA-256 and encode all 32 bytes as 64 lowercase hexadecimal characters. Null stays null; never hash the word \"null\".\n\nEnclosure URL:\n\n1. Trim surrounding ECMAScript whitespace. Reject an empty value, internal ASCII whitespace/control characters, backslashes, a missing absolute HTTP(S) scheme/authority or an invalid URL. Parse the authority using WHATWG URL rules (including IDNA and IPv6). Preserve the original path separately so dot segments are not resolved.\n2. Repeatedly remove only the exact host/path prefixes listed below. Hosts are case-insensitive; paths are case-sensitive; ID and FORMAT each mean one non-empty path segment. Only default ports match. An explicit nested http:// or https:// scheme wins. A schemeless target inherits the wrapper scheme, except OP3 targets default to https. A target starting // uses that same default scheme. Do not percent-decode a nested target. Reject a matched prefix with an empty or invalid target. Allow at most 32 prefix removals; return null if another recognised prefix remains. Never follow HTTP redirects.\n3. Drop userinfo, query and fragment. Lowercase scheme and host, remove default ports (80 for http, 443 for https), and retain any other port. Keep the path's case, repeated slashes, dot segments and Unicode exactly. Uppercase the two hex digits in each percent escape; do not decode even unreserved characters. Reject malformed path escapes. Use / for an empty path. The result is scheme://host[:port]/path.\n\nRecognised prefixes:\n\n- dts.podtrac.com/redirect.FORMAT/\n- www.podtrac.com/pts/redirect.FORMAT/\n- chrt.fm/track/ID/\n- chtbl.com/track/ID/\n- op3.dev/e/ or op3.dev/e,pg=ID/\n- pdst.fm/e/\n- pfx.vpixl.com/ID/\n- mgln.ai/e/ID/\n- arttrk.com/p/ID/\n- verifi.podscribe.com/rss/p/\n- pscrb.fm/rss/p/\n- claritaspod.com/measure/\n\nUnknown hosts and non-matching paths are kept. injector.simplecastaudio.com is an audio host, not a removable prefix.\n\nGUID: trim surrounding ECMAScript whitespace only; an empty result is null. Preserve case, internal whitespace, URL syntax, percent escapes and Unicode without any further normalisation. ECMAScript whitespace is U+0009..U+000D, U+0020, U+00A0, U+1680, U+2000..U+200A, U+2028, U+2029, U+202F, U+205F, U+3000 and U+FEFF (not U+0085).\n\nThese are matching fingerprints, not downloadable URLs. Query removal can merge distinct source URLs; keep ambiguous matches for manual review. The source fields never return raw values. guid_sha256 is available for authorised reads of unpublished episodes, and is null when the source GUID carries a credential. enclosure_sha256 and rss_guid are null unless the episode is published and its publication time has passed. rss_guid is the GUID in the show's public RSS feed, which for imported episodes is usually the original GUID; existing credential restrictions still apply.\n\n### Parity vectors\n\n```json\n[\n  {\n    \"name\": \"public\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://media.example/Audio/episode.mp3\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"authority and credentials\",\n    \"kind\": \"enclosure\",\n    \"input\": \" HTTPS://alice:secret@MEDIA.Example:443/Audio/episode.mp3?jwt=private#play \",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"http default port\",\n    \"kind\": \"enclosure\",\n    \"input\": \"http://MEDIA.example:80/episode.mp3\",\n    \"normalised\": \"http://media.example/episode.mp3\",\n    \"sha256\": \"0c60dfcfb9d80f44292b8d0a97a1276001168eeb46e6561d603e2454ebdfff07\"\n  },\n  {\n    \"name\": \"nondefault port\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://MEDIA.example:8443/episode.mp3\",\n    \"normalised\": \"https://media.example:8443/episode.mp3\",\n    \"sha256\": \"61b34996b8b9a147da2ee0163b7997ecc4eac57a1d05944393b07d39325b59ed\"\n  },\n  {\n    \"name\": \"empty path\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://media.example?auth=x\",\n    \"normalised\": \"https://media.example/\",\n    \"sha256\": \"fc0a3d7b9689b14182d9bb12abe2dd7c2329d00cfd2566938fe72a66fffe3aed\"\n  },\n  {\n    \"name\": \"escaped path\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://media.example/%7euser/a%2fb%3fc%23d.mp3\",\n    \"normalised\": \"https://media.example/%7Euser/a%2Fb%3Fc%23d.mp3\",\n    \"sha256\": \"a1c2d875ed4c825c7f208c17af5426d9420befd3074c3e929adbce548401b471\"\n  },\n  {\n    \"name\": \"dot segments preserved\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://media.example/a/.././%2e%2e/episode.mp3\",\n    \"normalised\": \"https://media.example/a/.././%2E%2E/episode.mp3\",\n    \"sha256\": \"3ecfb6dc2429795a6942ea7bd141070a015e9df3e107962af1af137cfc3b881c\"\n  },\n  {\n    \"name\": \"repeated slashes\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://media.example//A///episode.mp3\",\n    \"normalised\": \"https://media.example//A///episode.mp3\",\n    \"sha256\": \"474ffea6ca23f3e15c2066142b7cf2533569fa3603a99856cebb7aecda4fbe39\"\n  },\n  {\n    \"name\": \"unicode path\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://media.example/épisode.mp3\",\n    \"normalised\": \"https://media.example/épisode.mp3\",\n    \"sha256\": \"88280925e19615a8e0ee18344bd35cba8976d75eaafd67a480eb63be7353ebfc\"\n  },\n  {\n    \"name\": \"international host\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://BÜCHER.example/Audio.mp3\",\n    \"normalised\": \"https://xn--bcher-kva.example/Audio.mp3\",\n    \"sha256\": \"0c4d3120d305ee9084a4d7bde64b7dab551569776e49274edc53bdd2f661b9f9\"\n  },\n  {\n    \"name\": \"ipv6\",\n    \"kind\": \"enclosure\",\n    \"input\": \"http://[2001:DB8::1]:80/A.mp3\",\n    \"normalised\": \"http://[2001:db8::1]/A.mp3\",\n    \"sha256\": \"a4c7b786ab89c6b589e7e16d9beced491186856d32e64e55c0d1446e517b692f\"\n  },\n  {\n    \"name\": \"podtrac\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://dts.podtrac.com/redirect.mp3/media.example/Audio/episode.mp3?token=secret\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"legacy podtrac\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://www.podtrac.com/pts/redirect.m4a/media.example/Audio/episode.mp3?token=secret\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"chartable chrt\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://chrt.fm/track/ABC123/media.example/Audio/episode.mp3?token=secret\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"chartable chtbl\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://chtbl.com/track/XYZ789/media.example/Audio/episode.mp3?token=secret\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"op3\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://op3.dev/e/media.example/Audio/episode.mp3?token=secret\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"op3 podcast guid\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://op3.dev/e,pg=00000000-0000-0000-0000-000000000001/media.example/Audio/episode.mp3?token=secret\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"podsights\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://pdst.fm/e/media.example/Audio/episode.mp3?token=secret\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"vpixl\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://pfx.vpixl.com/abc12/media.example/Audio/episode.mp3?token=secret\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"magellan\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://mgln.ai/e/42/media.example/Audio/episode.mp3?token=secret\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"arttrk\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://arttrk.com/p/ABC12/media.example/Audio/episode.mp3?token=secret\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"podscribe legacy\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://verifi.podscribe.com/rss/p/media.example/Audio/episode.mp3?token=secret\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"podscribe\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://pscrb.fm/rss/p/media.example/Audio/episode.mp3?token=secret\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"claritas\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://claritaspod.com/measure/media.example/Audio/episode.mp3?token=secret\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"nested chain\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://dts.podtrac.com/redirect.mp3/pdst.fm/e/chrt.fm/track/ABC123/op3.dev/e,pg=123/media.example/Audio/episode.mp3?auth=x\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"explicit nested http\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://op3.dev/e/http://media.example:80/Audio/episode.mp3\",\n    \"normalised\": \"http://media.example/Audio/episode.mp3\",\n    \"sha256\": \"0eece6ce614678e46292a5b1038ba08e02306a5a767aeb25d12b4437be3927d8\"\n  },\n  {\n    \"name\": \"op3 default https\",\n    \"kind\": \"enclosure\",\n    \"input\": \"http://op3.dev/e/media.example/Audio/episode.mp3\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"other prefixes inherit http\",\n    \"kind\": \"enclosure\",\n    \"input\": \"http://pdst.fm/e/media.example/Audio/episode.mp3\",\n    \"normalised\": \"http://media.example/Audio/episode.mp3\",\n    \"sha256\": \"0eece6ce614678e46292a5b1038ba08e02306a5a767aeb25d12b4437be3927d8\"\n  },\n  {\n    \"name\": \"explicit nested https\",\n    \"kind\": \"enclosure\",\n    \"input\": \"http://chrt.fm/track/ABC/https://media.example/Audio/episode.mp3\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"protocol relative target\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://pdst.fm/e///media.example/Audio/episode.mp3\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  },\n  {\n    \"name\": \"injector is audio host\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://injector.simplecastaudio.com/abc/episodes/123/audio.mp3?token=x\",\n    \"normalised\": \"https://injector.simplecastaudio.com/abc/episodes/123/audio.mp3\",\n    \"sha256\": \"c1574b56ff2788e320909924ad7e505d0a28e3d5da5efdce1dbe9836042bbf8a\"\n  },\n  {\n    \"name\": \"unknown prefix retained\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://unknown.example/e/media.example/A.mp3?sig=x\",\n    \"normalised\": \"https://unknown.example/e/media.example/A.mp3\",\n    \"sha256\": \"81b1e6c17c3e5815e0939d92e6dbb28895163acd79c4361d9f63017721409b38\"\n  },\n  {\n    \"name\": \"lookalike host retained\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://op3.dev.evil.example/e/media.example/A.mp3\",\n    \"normalised\": \"https://op3.dev.evil.example/e/media.example/A.mp3\",\n    \"sha256\": \"d8884b12df0985e2397a6bf412f3217e512b75756c45e51c7c59bd7c3c239334\"\n  },\n  {\n    \"name\": \"prefix path case retained\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://pdst.fm/E/media.example/A.mp3\",\n    \"normalised\": \"https://pdst.fm/E/media.example/A.mp3\",\n    \"sha256\": \"6e166777d6da0961e6e1f6abdffa43d8048e039183baa15ea39fac527a1674d3\"\n  },\n  {\n    \"name\": \"prefix custom port retained\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://pdst.fm:8443/e/media.example/A.mp3\",\n    \"normalised\": \"https://pdst.fm:8443/e/media.example/A.mp3\",\n    \"sha256\": \"36ce9ad4528bc0adb2f5c1f86707264c0207290c02f343c6aae9699510240379\"\n  },\n  {\n    \"name\": \"path secret stays hashed\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://media.example/token/private/A.mp3?session=x\",\n    \"normalised\": \"https://media.example/token/private/A.mp3\",\n    \"sha256\": \"cc78510a5e10f70a7bbee7d583ad3db287d226a948b08599af16fa785a417b2c\"\n  },\n  {\n    \"name\": \"unknown\",\n    \"kind\": \"enclosure\",\n    \"input\": null,\n    \"normalised\": null,\n    \"sha256\": null\n  },\n  {\n    \"name\": \"empty\",\n    \"kind\": \"enclosure\",\n    \"input\": \"  \",\n    \"normalised\": null,\n    \"sha256\": null\n  },\n  {\n    \"name\": \"relative\",\n    \"kind\": \"enclosure\",\n    \"input\": \"/A.mp3\",\n    \"normalised\": null,\n    \"sha256\": null\n  },\n  {\n    \"name\": \"unsafe scheme\",\n    \"kind\": \"enclosure\",\n    \"input\": \"javascript:alert(1)\",\n    \"normalised\": null,\n    \"sha256\": null\n  },\n  {\n    \"name\": \"ftp scheme\",\n    \"kind\": \"enclosure\",\n    \"input\": \"ftp://media.example/A.mp3\",\n    \"normalised\": null,\n    \"sha256\": null\n  },\n  {\n    \"name\": \"invalid host\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://[invalid]/A.mp3\",\n    \"normalised\": null,\n    \"sha256\": null\n  },\n  {\n    \"name\": \"bad escape\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://media.example/%zz/A.mp3\",\n    \"normalised\": null,\n    \"sha256\": null\n  },\n  {\n    \"name\": \"backslash\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://media.example/a\\\\b.mp3\",\n    \"normalised\": null,\n    \"sha256\": null\n  },\n  {\n    \"name\": \"internal whitespace\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://media.example/a b.mp3\",\n    \"normalised\": null,\n    \"sha256\": null\n  },\n  {\n    \"name\": \"empty target\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://op3.dev/e/\",\n    \"normalised\": null,\n    \"sha256\": null\n  },\n  {\n    \"name\": \"nested unsafe scheme\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://pdst.fm/e/ftp://media.example/A.mp3\",\n    \"normalised\": null,\n    \"sha256\": null\n  },\n  {\n    \"name\": \"encoded nested URL\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://op3.dev/e/https%3A%2F%2Fmedia.example/A.mp3\",\n    \"normalised\": null,\n    \"sha256\": null\n  },\n  {\n    \"name\": \"plain guid\",\n    \"kind\": \"guid\",\n    \"input\": \"episode-42\",\n    \"normalised\": \"episode-42\",\n    \"sha256\": \"c92bc000b32a460ac49a0517e1981879dfda7336e10302cd713088318ba07644\"\n  },\n  {\n    \"name\": \"trim guid\",\n    \"kind\": \"guid\",\n    \"input\": \" \\t episode-42\\r\\n\",\n    \"normalised\": \"episode-42\",\n    \"sha256\": \"c92bc000b32a460ac49a0517e1981879dfda7336e10302cd713088318ba07644\"\n  },\n  {\n    \"name\": \"case sensitive guid\",\n    \"kind\": \"guid\",\n    \"input\": \"Episode-42\",\n    \"normalised\": \"Episode-42\",\n    \"sha256\": \"7728dcf71e11042c5ab2a46d5f5e46478d760d6297e794447c16f875932febde\"\n  },\n  {\n    \"name\": \"internal whitespace guid\",\n    \"kind\": \"guid\",\n    \"input\": \" a  b\\tc \",\n    \"normalised\": \"a  b\\tc\",\n    \"sha256\": \"402f6be5f2d039717df7ca09f2814b72ed0e49bc12ec2af38796606bf3a9c30f\"\n  },\n  {\n    \"name\": \"credential URL guid\",\n    \"kind\": \"guid\",\n    \"input\": \" https://alice:secret@media.example/a?token=private#x \",\n    \"normalised\": \"https://alice:secret@media.example/a?token=private#x\",\n    \"sha256\": \"985d428bbd8d669b8a33840dd099f427047e5afe1ff453ea73b2d6c35fc00c7f\"\n  },\n  {\n    \"name\": \"escaped guid\",\n    \"kind\": \"guid\",\n    \"input\": \" https://EXAMPLE.com/%2f \",\n    \"normalised\": \"https://EXAMPLE.com/%2f\",\n    \"sha256\": \"fccf6307014437b3af6147060610206f94037a2275bfb06a497ce840c13891fd\"\n  },\n  {\n    \"name\": \"unicode guid\",\n    \"kind\": \"guid\",\n    \"input\": \" é \",\n    \"normalised\": \"é\",\n    \"sha256\": \"4a99557e4033c3539de2eb65472017cad5f9557f7a0625a09f1c3f6e2ba69c4c\"\n  },\n  {\n    \"name\": \"decomposed unicode guid\",\n    \"kind\": \"guid\",\n    \"input\": \" é \",\n    \"normalised\": \"é\",\n    \"sha256\": \"bf12767b0f2a56b2190075bae8169f656e3ce8d6357d4aff184bc6c7ea48f9f6\"\n  },\n  {\n    \"name\": \"unicode trim\",\n    \"kind\": \"guid\",\n    \"input\": \"﻿ guid　\",\n    \"normalised\": \"guid\",\n    \"sha256\": \"4b565f53a6d8d395e073616f5ab41e3610b618f7c386def2f25ffeef28dded0e\"\n  },\n  {\n    \"name\": \"nontrim unicode\",\n    \"kind\": \"guid\",\n    \"input\": \"guid\",\n    \"normalised\": \"guid\",\n    \"sha256\": \"1f5fc592808aea0a7e93724c633438924bb4b0b83323e2825f244f1bbd3a69bf\"\n  },\n  {\n    \"name\": \"empty guid\",\n    \"kind\": \"guid\",\n    \"input\": \" \\t \",\n    \"normalised\": null,\n    \"sha256\": null\n  },\n  {\n    \"name\": \"unknown guid\",\n    \"kind\": \"guid\",\n    \"input\": null,\n    \"normalised\": null,\n    \"sha256\": null\n  },\n  {\n    \"name\": \"constructor host\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://constructor/A.mp3\",\n    \"normalised\": \"https://constructor/A.mp3\",\n    \"sha256\": \"2e44faa9d8cef0da4b6b168109eba292688364ca5345dd41abec38ce66c47de6\"\n  },\n  {\n    \"name\": \"prototype host\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://__proto__/A.mp3\",\n    \"normalised\": \"https://__proto__/A.mp3\",\n    \"sha256\": \"761bb666cfd2f6fcf41badc4a2fb7cc69b7ce2f864d4978666cc4eed84cd60cd\"\n  },\n  {\n    \"name\": \"invalid port\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://media.example:99999/A.mp3\",\n    \"normalised\": null,\n    \"sha256\": null\n  },\n  {\n    \"name\": \"prefix host case and default port\",\n    \"kind\": \"enclosure\",\n    \"input\": \"https://PDST.FM:443/e/media.example/Audio/episode.mp3\",\n    \"normalised\": \"https://media.example/Audio/episode.mp3\",\n    \"sha256\": \"cd540f580eaf17f5f1de9864e4b7ad7307a47184c563de7489cd908333ad1d09\"\n  }\n]\n```",
		"contact": {
			"name": "show.fm support",
			"url": "https://show.fm/docs/developers/"
		}
	},
	"servers": [
		{
			"url": "https://api.show.fm"
		}
	],
	"tags": [
		{
			"name": "Podcasts (public)"
		},
		{
			"name": "Episodes (public)"
		},
		{
			"name": "oEmbed"
		},
		{
			"name": "Account",
			"description": "Keyed."
		},
		{
			"name": "Your podcasts",
			"description": "Keyed."
		},
		{
			"name": "Analytics",
			"description": "Keyed. Requires permission to see live analytics and use the analytics API (`analytics.view`)."
		},
		{
			"name": "Episodes",
			"description": "Keyed."
		},
		{
			"name": "Connected sites",
			"description": "For the show.fm WordPress plugin. Site keys only, except the code exchange."
		}
	],
	"paths": {
		"/v1/podcasts/{slug}": {
			"get": {
				"operationId": "getPodcast",
				"summary": "Get a public podcast",
				"description": "A public podcast by its UUID or slug. No key needed; responses are cached publicly.",
				"tags": [
					"Podcasts (public)"
				],
				"security": [],
				"parameters": [
					{
						"name": "slug",
						"in": "path",
						"required": true,
						"description": "The podcast UUID or slug (its show.fm address). UUIDs resolve to the current slug and share its cached payload. Malformed references return HTTP 400; well-formed unknown references return HTTP 404.",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/Podcast"
										}
									},
									"required": [
										"data"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"400": {
						"description": "`invalid_request`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`unavailable`: This episode can't be played right now. Returned only for an overage-suspended show whose requested content otherwise passes every visibility gate. Scheduled and unknown episodes still return the identical 404. Cache-Control: no-store.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`. Unknown or non-public content, including scheduled, unpublished, archived or deleted episodes.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/podcasts/{slug}/episodes": {
			"get": {
				"operationId": "listEpisodes",
				"summary": "List published episodes",
				"description": "Newest first, cursor-paginated. Filtered pages bypass the payload cache. Keep the same season and type filters on every page; changing them returns HTTP 400.",
				"tags": [
					"Episodes (public)"
				],
				"security": [],
				"parameters": [
					{
						"name": "slug",
						"in": "path",
						"required": true,
						"description": "The podcast UUID or slug (its show.fm address). UUIDs resolve to the current slug and share its cached payload. Malformed references return HTTP 400; well-formed unknown references return HTTP 404.",
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "limit",
						"in": "query",
						"required": false,
						"description": "Page size, 1 to 50. Default 20.",
						"schema": {
							"type": "integer",
							"minimum": 1,
							"maximum": 50,
							"default": 20
						}
					},
					{
						"name": "cursor",
						"in": "query",
						"required": false,
						"description": "The `pagination.next_cursor` value from the previous page.",
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "season",
						"in": "query",
						"required": false,
						"description": "Include only this season (0 to 9999).",
						"schema": {
							"type": "integer",
							"minimum": 0,
							"maximum": 9999
						}
					},
					{
						"name": "type",
						"in": "query",
						"required": false,
						"description": "Comma-separated include list of full, trailer and bonus. For example full,bonus. Invalid or empty values return HTTP 400.",
						"schema": {
							"type": "string",
							"pattern": "^(full|trailer|bonus)(,(full|trailer|bonus))*$"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/EpisodeListItem"
											}
										},
										"pagination": {
											"$ref": "#/components/schemas/Pagination"
										}
									},
									"required": [
										"data",
										"pagination"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"400": {
						"description": "`invalid_request`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`unavailable`: This episode can't be played right now. Returned only for an overage-suspended show whose requested content otherwise passes every visibility gate. Scheduled and unknown episodes still return the identical 404. Cache-Control: no-store.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`. Unknown or non-public content, including scheduled, unpublished, archived or deleted episodes.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/podcasts/{slug}/episodes/latest": {
			"get": {
				"operationId": "getLatestEpisode",
				"summary": "Get the latest published episode",
				"description": "The most recently published episode of a podcast.",
				"tags": [
					"Episodes (public)"
				],
				"security": [],
				"parameters": [
					{
						"name": "slug",
						"in": "path",
						"required": true,
						"description": "The podcast UUID or slug (its show.fm address). UUIDs resolve to the current slug and share its cached payload. Malformed references return HTTP 400; well-formed unknown references return HTTP 404.",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/Episode"
										}
									},
									"required": [
										"data"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"400": {
						"description": "`invalid_request`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`unavailable`: This episode can't be played right now. Returned only for an overage-suspended show whose requested content otherwise passes every visibility gate. Scheduled and unknown episodes still return the identical 404. Cache-Control: no-store.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`. Unknown or non-public content, including scheduled, unpublished, archived or deleted episodes.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/podcasts/{slug}/episodes/{ref}": {
			"get": {
				"operationId": "getEpisodeByRef",
				"summary": "Get a published episode by slug or id",
				"description": "An episode of a podcast by its episode slug or id. For an old podcast slug and an episode UUID, a visible episode of that podcast redirects to the current slug. If that podcast is suspended, otherwise-visible episodes return HTTP 403. Hidden or foreign episodes return HTTP 404.",
				"tags": [
					"Episodes (public)"
				],
				"security": [],
				"parameters": [
					{
						"name": "slug",
						"in": "path",
						"required": true,
						"description": "The podcast UUID or slug (its show.fm address). UUIDs resolve to the current slug and share its cached payload. Malformed references return HTTP 400; well-formed unknown references return HTTP 404.",
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "ref",
						"in": "path",
						"required": true,
						"description": "Episode slug or UUID. Malformed references return HTTP 400; well-formed unknown references return HTTP 404.",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/Episode"
										}
									},
									"required": [
										"data"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"400": {
						"description": "`invalid_request`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`unavailable`: This episode can't be played right now. Returned only for an overage-suspended show whose requested content otherwise passes every visibility gate. Scheduled and unknown episodes still return the identical 404. Cache-Control: no-store.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`. Unknown or non-public content, including scheduled, unpublished, archived or deleted episodes.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/episodes/{id}": {
			"get": {
				"operationId": "getEpisode",
				"summary": "Get a published episode by id",
				"description": "A published episode by its id.",
				"tags": [
					"Episodes (public)"
				],
				"security": [],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "Episode id (UUID).",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/Episode"
										}
									},
									"required": [
										"data"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"400": {
						"description": "`invalid_request`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`unavailable`: This episode can't be played right now. Returned only for an overage-suspended show whose requested content otherwise passes every visibility gate. Scheduled and unknown episodes still return the identical 404. Cache-Control: no-store.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`. Unknown or non-public content, including scheduled, unpublished, archived or deleted episodes.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/oembed": {
			"get": {
				"operationId": "oembed",
				"summary": "oEmbed for a show.fm page",
				"description": "An embeddable player for a podcast or episode listen URL.",
				"tags": [
					"oEmbed"
				],
				"security": [],
				"parameters": [
					{
						"name": "url",
						"in": "query",
						"required": true,
						"description": "A show.fm listen URL.",
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "maxwidth",
						"in": "query",
						"required": false,
						"schema": {
							"type": "integer"
						}
					},
					{
						"name": "maxheight",
						"in": "query",
						"required": false,
						"schema": {
							"type": "integer"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Oembed"
								}
							}
						}
					},
					"400": {
						"description": "`invalid_request`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`. Unknown or non-public content, including scheduled, unpublished, archived or deleted episodes.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me": {
			"get": {
				"operationId": "getMe",
				"summary": "The key and the user it acts for",
				"description": "Needs only a valid key. Use it to check a key works and see what it can reach.",
				"tags": [
					"Account"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							},
							"ETag": {
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/Me"
										}
									},
									"required": [
										"data"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"304": {
						"description": "Not modified (matching `If-None-Match`)."
					},
					"400": {
						"description": "`invalid_request`: a bad parameter, or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`forbidden`: accept the current Terms in the app first.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/podcasts": {
			"get": {
				"operationId": "listMyPodcasts",
				"summary": "List the podcasts this key can read",
				"description": "Podcasts on the key that you can access through a show role, an account role or account ownership, and whose plan includes the API. Team keys must be enabled unless you have permission to control API keys on the show (`show.api_access`). Oldest first.\n\nScope: `podcasts:read`.",
				"tags": [
					"Your podcasts"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "limit",
						"in": "query",
						"required": false,
						"description": "Page size, 1 to 100. Default 20.",
						"schema": {
							"type": "integer",
							"minimum": 1,
							"maximum": 100,
							"default": 20
						}
					},
					{
						"name": "cursor",
						"in": "query",
						"required": false,
						"description": "The `pagination.next_cursor` value from the previous page.",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							},
							"ETag": {
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/KeyedPodcast"
											}
										},
										"pagination": {
											"$ref": "#/components/schemas/Pagination"
										}
									},
									"required": [
										"data",
										"pagination"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"304": {
						"description": "Not modified (matching `If-None-Match`)."
					},
					"400": {
						"description": "`invalid_request`: a bad parameter, or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/podcasts/{podcast_id}": {
			"get": {
				"operationId": "getMyPodcast",
				"summary": "Get one of your podcasts",
				"description": "404 for any podcast the key cannot reach, whether it exists or not. 403 `forbidden` if team keys are turned off and you do not have permission to control API keys on the show (`show.api_access`).\n\nScope: `podcasts:read`.",
				"tags": [
					"Your podcasts"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "podcast_id",
						"in": "path",
						"required": true,
						"description": "The podcast id (UUID).",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							},
							"ETag": {
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/KeyedPodcast"
										}
									},
									"required": [
										"data"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"304": {
						"description": "Not modified (matching `If-None-Match`)."
					},
					"400": {
						"description": "`invalid_request`: a bad parameter, or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/podcasts/{podcast_id}/analytics/downloads": {
			"get": {
				"operationId": "getPodcastDownloads",
				"summary": "Downloads for a podcast over time",
				"description": "A dense series of downloads per day, week or month, with unique listeners per day (never summed: weeks and months give the peak single day) and totals. Requires permission to see live analytics and use the analytics API (`analytics.view`). Every analytics response carries `meta.range` (the window used, after your plan's history limit), `meta.freshness` (how complete the figures are) and `meta.methodology`. A range ending before your plan's history is 400 with `details[0].reason = \"outside_retention\"`.\n\nScope: `analytics:read`.",
				"tags": [
					"Analytics"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "podcast_id",
						"in": "path",
						"required": true,
						"description": "The podcast id (UUID).",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					},
					{
						"name": "preset",
						"in": "query",
						"required": false,
						"description": "A named range ending today (UTC): `7d`, `30d`, `90d`, `12m` or `all`. Default `30d`. Do not combine with `from` or `to`.",
						"schema": {
							"type": "string",
							"enum": [
								"7d",
								"30d",
								"90d",
								"12m",
								"all"
							]
						}
					},
					{
						"name": "from",
						"in": "query",
						"required": false,
						"description": "First UTC day, `YYYY-MM-DD`. Not after today.",
						"schema": {
							"type": "string",
							"format": "date"
						}
					},
					{
						"name": "to",
						"in": "query",
						"required": false,
						"description": "Last UTC day, `YYYY-MM-DD`. Needs `from`. Default today.",
						"schema": {
							"type": "string",
							"format": "date"
						}
					},
					{
						"name": "interval",
						"in": "query",
						"required": false,
						"description": "`day` (default), `week` (ISO weeks, Monday start) or `month`, in UTC. A daily series is limited to 1,100 days.",
						"schema": {
							"type": "string",
							"enum": [
								"day",
								"week",
								"month"
							],
							"default": "day"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							},
							"ETag": {
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/PodcastDownloads"
										},
										"meta": {
											"$ref": "#/components/schemas/AnalyticsMeta"
										}
									},
									"required": [
										"data",
										"meta"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"304": {
						"description": "Not modified (matching `If-None-Match`)."
					},
					"400": {
						"description": "`invalid_request`: a bad parameter, or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/podcasts/{podcast_id}/analytics/episodes": {
			"get": {
				"operationId": "listEpisodeAnalytics",
				"summary": "Downloads per episode",
				"description": "Every published episode, and any unpublished episode that has downloads, newest first: downloads in the range, all time and in the first seven days. Requires permission to see live analytics and use the analytics API (`analytics.view`). Every analytics response carries `meta.range` (the window used, after your plan's history limit), `meta.freshness` (how complete the figures are) and `meta.methodology`.\n\nScope: `analytics:read`.",
				"tags": [
					"Analytics"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "podcast_id",
						"in": "path",
						"required": true,
						"description": "The podcast id (UUID).",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					},
					{
						"name": "preset",
						"in": "query",
						"required": false,
						"description": "A named range ending today (UTC): `7d`, `30d`, `90d`, `12m` or `all`. Default `30d`. Do not combine with `from` or `to`.",
						"schema": {
							"type": "string",
							"enum": [
								"7d",
								"30d",
								"90d",
								"12m",
								"all"
							]
						}
					},
					{
						"name": "from",
						"in": "query",
						"required": false,
						"description": "First UTC day, `YYYY-MM-DD`. Not after today.",
						"schema": {
							"type": "string",
							"format": "date"
						}
					},
					{
						"name": "to",
						"in": "query",
						"required": false,
						"description": "Last UTC day, `YYYY-MM-DD`. Needs `from`. Default today.",
						"schema": {
							"type": "string",
							"format": "date"
						}
					},
					{
						"name": "limit",
						"in": "query",
						"required": false,
						"description": "Page size, 1 to 100. Default 20.",
						"schema": {
							"type": "integer",
							"minimum": 1,
							"maximum": 100,
							"default": 20
						}
					},
					{
						"name": "cursor",
						"in": "query",
						"required": false,
						"description": "The `pagination.next_cursor` value from the previous page.",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							},
							"ETag": {
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/EpisodeAnalytics"
											}
										},
										"pagination": {
											"$ref": "#/components/schemas/Pagination"
										},
										"meta": {
											"$ref": "#/components/schemas/AnalyticsMeta"
										}
									},
									"required": [
										"data",
										"pagination",
										"meta"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"304": {
						"description": "Not modified (matching `If-None-Match`)."
					},
					"400": {
						"description": "`invalid_request`: a bad parameter, or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/podcasts/{podcast_id}/analytics/breakdowns": {
			"get": {
				"operationId": "getPodcastBreakdown",
				"summary": "Downloads by app, country, device, source or referrer",
				"description": "A ranked list at the dashboard's depth: the top 5, or the top 15 with advanced analytics, with the rest folded into `other`. `devices` needs advanced analytics. A podcast hosted elsewhere returns `available: false`. Requires permission to see live analytics and use the analytics API (`analytics.view`). Every analytics response carries `meta.range` (the window used, after your plan's history limit), `meta.freshness` (how complete the figures are) and `meta.methodology`.\n\nScope: `analytics:read`.",
				"tags": [
					"Analytics"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "podcast_id",
						"in": "path",
						"required": true,
						"description": "The podcast id (UUID).",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					},
					{
						"name": "dimension",
						"in": "query",
						"required": true,
						"schema": {
							"type": "string",
							"enum": [
								"apps",
								"countries",
								"devices",
								"sources",
								"referrers"
							]
						}
					},
					{
						"name": "preset",
						"in": "query",
						"required": false,
						"description": "A named range ending today (UTC): `7d`, `30d`, `90d`, `12m` or `all`. Default `30d`. Do not combine with `from` or `to`.",
						"schema": {
							"type": "string",
							"enum": [
								"7d",
								"30d",
								"90d",
								"12m",
								"all"
							]
						}
					},
					{
						"name": "from",
						"in": "query",
						"required": false,
						"description": "First UTC day, `YYYY-MM-DD`. Not after today.",
						"schema": {
							"type": "string",
							"format": "date"
						}
					},
					{
						"name": "to",
						"in": "query",
						"required": false,
						"description": "Last UTC day, `YYYY-MM-DD`. Needs `from`. Default today.",
						"schema": {
							"type": "string",
							"format": "date"
						}
					},
					{
						"name": "episode_id",
						"in": "query",
						"required": false,
						"description": "Limit the breakdown to one episode of this podcast.",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							},
							"ETag": {
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/Breakdown"
										},
										"meta": {
											"$ref": "#/components/schemas/AnalyticsMeta"
										}
									},
									"required": [
										"data",
										"meta"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"304": {
						"description": "Not modified (matching `If-None-Match`)."
					},
					"400": {
						"description": "`invalid_request`: a bad parameter, or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/podcasts/{podcast_id}/analytics/platforms": {
			"get": {
				"operationId": "getPlatformMetrics",
				"summary": "Apple and Spotify engagement imports",
				"description": "The latest Apple Podcasts or Spotify export you imported in the app, show-level and per episode. Each import replaces the previous one for that source, so there is no date range. Requires permission to see live analytics and use the analytics API (`analytics.view`), and a plan with engagement imports.\n\nScope: `analytics:read`.",
				"tags": [
					"Analytics"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "podcast_id",
						"in": "path",
						"required": true,
						"description": "The podcast id (UUID).",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					},
					{
						"name": "source",
						"in": "query",
						"required": true,
						"schema": {
							"type": "string",
							"enum": [
								"apple",
								"spotify"
							]
						}
					},
					{
						"name": "limit",
						"in": "query",
						"required": false,
						"description": "Page size, 1 to 100. Default 20.",
						"schema": {
							"type": "integer",
							"minimum": 1,
							"maximum": 100,
							"default": 20
						}
					},
					{
						"name": "cursor",
						"in": "query",
						"required": false,
						"description": "The `pagination.next_cursor` value from the previous page.",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							},
							"ETag": {
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/PlatformMetrics"
										},
										"pagination": {
											"$ref": "#/components/schemas/Pagination"
										}
									},
									"required": [
										"data",
										"pagination"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"304": {
						"description": "Not modified (matching `If-None-Match`)."
					},
					"400": {
						"description": "`invalid_request`: a bad parameter, or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/episodes/{episode_id}/analytics/downloads": {
			"get": {
				"operationId": "getEpisodeDownloads",
				"summary": "Downloads for an episode over time",
				"description": "As the podcast series, for one episode, plus its all-time and first-week totals. Requires permission to see live analytics and use the analytics API (`analytics.view`). Every analytics response carries `meta.range` (the window used, after your plan's history limit), `meta.freshness` (how complete the figures are) and `meta.methodology`.\n\nScope: `analytics:read`.",
				"tags": [
					"Analytics"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "episode_id",
						"in": "path",
						"required": true,
						"description": "The episode id (UUID).",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					},
					{
						"name": "preset",
						"in": "query",
						"required": false,
						"description": "A named range ending today (UTC): `7d`, `30d`, `90d`, `12m` or `all`. Default `30d`. Do not combine with `from` or `to`.",
						"schema": {
							"type": "string",
							"enum": [
								"7d",
								"30d",
								"90d",
								"12m",
								"all"
							]
						}
					},
					{
						"name": "from",
						"in": "query",
						"required": false,
						"description": "First UTC day, `YYYY-MM-DD`. Not after today.",
						"schema": {
							"type": "string",
							"format": "date"
						}
					},
					{
						"name": "to",
						"in": "query",
						"required": false,
						"description": "Last UTC day, `YYYY-MM-DD`. Needs `from`. Default today.",
						"schema": {
							"type": "string",
							"format": "date"
						}
					},
					{
						"name": "interval",
						"in": "query",
						"required": false,
						"description": "`day` (default), `week` (ISO weeks, Monday start) or `month`, in UTC. A daily series is limited to 1,100 days.",
						"schema": {
							"type": "string",
							"enum": [
								"day",
								"week",
								"month"
							],
							"default": "day"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							},
							"ETag": {
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/EpisodeDownloads"
										},
										"meta": {
											"$ref": "#/components/schemas/AnalyticsMeta"
										}
									},
									"required": [
										"data",
										"meta"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"304": {
						"description": "Not modified (matching `If-None-Match`)."
					},
					"400": {
						"description": "`invalid_request`: a bad parameter, or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/podcasts/{podcast_id}/episodes": {
			"get": {
				"operationId": "listMyEpisodes",
				"summary": "List episodes of one of your podcasts",
				"description": "Every episode when you have permission to see every episode (`episodes.view_all`); otherwise only episodes you are on. Newest first. Drafts and scheduled episodes are included; media URLs never are in this list.\n\nScope: `episodes:read`.",
				"tags": [
					"Episodes"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "podcast_id",
						"in": "path",
						"required": true,
						"description": "The podcast id (UUID).",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					},
					{
						"name": "status",
						"in": "query",
						"required": false,
						"schema": {
							"type": "string",
							"enum": [
								"pending_confirmation",
								"draft",
								"scheduled",
								"published",
								"archived"
							]
						}
					},
					{
						"name": "limit",
						"in": "query",
						"required": false,
						"description": "Page size, 1 to 100. Default 20.",
						"schema": {
							"type": "integer",
							"minimum": 1,
							"maximum": 100,
							"default": 20
						}
					},
					{
						"name": "cursor",
						"in": "query",
						"required": false,
						"description": "The `pagination.next_cursor` value from the previous page.",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							},
							"ETag": {
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/KeyedEpisodeListItem"
											}
										},
										"pagination": {
											"$ref": "#/components/schemas/Pagination"
										}
									},
									"required": [
										"data",
										"pagination"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"304": {
						"description": "Not modified (matching `If-None-Match`)."
					},
					"400": {
						"description": "`invalid_request`: a bad parameter, or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/episodes/{episode_id}": {
			"get": {
				"operationId": "getMyEpisode",
				"summary": "Get an episode",
				"description": "With plain-text description and show notes, and sanitised show-notes HTML. `media` holds the published audio, cover, chapters and transcript URLs only once the episode is public. 404 for any episode the key cannot see, including an episode you are not on when you lack permission to see every episode (`episodes.view_all`).\n\nScope: `episodes:read`.",
				"tags": [
					"Episodes"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "episode_id",
						"in": "path",
						"required": true,
						"description": "The episode id (UUID).",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							},
							"ETag": {
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/KeyedEpisode"
										}
									},
									"required": [
										"data"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"304": {
						"description": "Not modified (matching `If-None-Match`)."
					},
					"400": {
						"description": "`invalid_request`: a bad parameter, or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/episodes/{episode_id}/people": {
			"get": {
				"operationId": "listEpisodePeople",
				"summary": "An episode's roster",
				"description": "Who is on the episode: name, role and source. No contact details.\n\nScope: `episodes:read`.",
				"tags": [
					"Episodes"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "episode_id",
						"in": "path",
						"required": true,
						"description": "The episode id (UUID).",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					},
					{
						"name": "limit",
						"in": "query",
						"required": false,
						"description": "Page size, 1 to 100. Default 20.",
						"schema": {
							"type": "integer",
							"minimum": 1,
							"maximum": 100,
							"default": 20
						}
					},
					{
						"name": "cursor",
						"in": "query",
						"required": false,
						"description": "The `pagination.next_cursor` value from the previous page.",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							},
							"ETag": {
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/EpisodePerson"
											}
										},
										"pagination": {
											"$ref": "#/components/schemas/Pagination"
										}
									},
									"required": [
										"data",
										"pagination"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"304": {
						"description": "Not modified (matching `If-None-Match`)."
					},
					"400": {
						"description": "`invalid_request`: a bad parameter, or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/episodes/{episode_id}/credits": {
			"get": {
				"operationId": "listEpisodeCredits",
				"summary": "An episode's credits",
				"description": "The credits the RSS feed publishes. A bio and an avatar appear only once the episode is public.\n\nScope: `episodes:read`.",
				"tags": [
					"Episodes"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "episode_id",
						"in": "path",
						"required": true,
						"description": "The episode id (UUID).",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					},
					{
						"name": "limit",
						"in": "query",
						"required": false,
						"description": "Page size, 1 to 100. Default 20.",
						"schema": {
							"type": "integer",
							"minimum": 1,
							"maximum": 100,
							"default": 20
						}
					},
					{
						"name": "cursor",
						"in": "query",
						"required": false,
						"description": "The `pagination.next_cursor` value from the previous page.",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							},
							"ETag": {
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/EpisodeCredit"
											}
										},
										"pagination": {
											"$ref": "#/components/schemas/Pagination"
										}
									},
									"required": [
										"data",
										"pagination"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"304": {
						"description": "Not modified (matching `If-None-Match`)."
					},
					"400": {
						"description": "`invalid_request`: a bad parameter, or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/episodes/{episode_id}/transcript": {
			"get": {
				"operationId": "getEpisodeTranscript",
				"summary": "An episode's transcript",
				"description": "Segments with speaker names, up to 100 a page. Links carrying a token are removed from the text. Without permission to control transcript access (`episodes.transcript_settings`), you can read a transcript only when the episode shares it through its Co-host access setting.\n\nScope: `transcripts:read`.",
				"tags": [
					"Episodes"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "episode_id",
						"in": "path",
						"required": true,
						"description": "The episode id (UUID).",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					},
					{
						"name": "limit",
						"in": "query",
						"required": false,
						"description": "Page size, 1 to 100. Default 20.",
						"schema": {
							"type": "integer",
							"minimum": 1,
							"maximum": 100,
							"default": 20
						}
					},
					{
						"name": "cursor",
						"in": "query",
						"required": false,
						"description": "The `pagination.next_cursor` value from the previous page.",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							},
							"ETag": {
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/TranscriptPage"
										},
										"pagination": {
											"$ref": "#/components/schemas/Pagination"
										}
									},
									"required": [
										"data",
										"pagination"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"304": {
						"description": "Not modified (matching `If-None-Match`)."
					},
					"400": {
						"description": "`invalid_request`: a bad parameter, or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/sites": {
			"post": {
				"operationId": "registerSite",
				"summary": "Register a site with a WP-CLI key",
				"description": "For `wp showfm connect`. Binds an unregistered site key, created in show.fm within the last 24 hours, to its site. show.fm builds the `showfm/v1/challenge` URL from `rest_root`, with `state` as a separate query parameter, and fetches it during this request. It binds the key only if the plugin answers with `code_challenge` in a JSON response. Until then the key can call nothing else. The ping secret is returned once.\n\nScope: `sites:write`.",
				"tags": [
					"Connected sites"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/RegisterSiteRequest"
							}
						}
					}
				},
				"responses": {
					"201": {
						"description": "Created",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/RegisteredSite"
										}
									},
									"required": [
										"data"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"400": {
						"description": "`invalid_request`: a bad body (see `error.details`), or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/sites/exchange": {
			"post": {
				"operationId": "exchangeSiteCode",
				"summary": "Exchange a connect code for a site key",
				"description": "For the show.fm WordPress plugin, server to server, after the browser returns to wp-admin with `code` and `state`. No API key: the one-time code is the credential, and it is bound to the S256 challenge the connection started with. A code works once, for five minutes; any attempt uses it up. Answers the site key, the ping secret and the expiry once, never cached. Limited to 30 requests a minute per IP address.",
				"tags": [
					"Connected sites"
				],
				"security": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/SiteExchangeRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/SiteExchange"
										}
									},
									"required": [
										"data"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"400": {
						"description": "`invalid_request`: a malformed body, or a code that is invalid, used or expired.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/sites/{site_id}/verify": {
			"post": {
				"operationId": "verifySite",
				"summary": "Report in and go live",
				"description": "Call it right after the code exchange or WP-CLI registration, with the plugin, WordPress and PHP versions. The site becomes active; `activated` is true only for the call that made it live. Any other site's id is 404.\n\nScope: `sites:write`.",
				"tags": [
					"Connected sites"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "site_id",
						"in": "path",
						"required": true,
						"description": "Your site's id (UUID), from the code exchange or WP-CLI registration. Only the calling site key's own site.",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/VerifySiteRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/VerifiedSite"
										}
									},
									"required": [
										"data"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"400": {
						"description": "`invalid_request`: a bad body (see `error.details`), or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/sites/{site_id}/disconnect": {
			"post": {
				"operationId": "disconnectSite",
				"summary": "Disconnect your site",
				"description": "Send an empty JSON object using the site's own key. Revokes that key and marks its site revoked, just like Disconnect site in show.fm. Existing WordPress posts are retained. Another site's id is 404. A subsequent call with the revoked key returns the normal 401 invalid_api_key response. The usual IP and per-user rate limits apply; no podcast access or paid plan is required to disconnect.\n\nScope: `sites:write`.",
				"tags": [
					"Connected sites"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "site_id",
						"in": "path",
						"required": true,
						"description": "Your site's id (UUID), from the code exchange or WP-CLI registration. Only the calling site key's own site.",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/DisconnectSiteRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/DisconnectedSite"
										}
									},
									"required": [
										"data"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"400": {
						"description": "`invalid_request`: a bad body (see `error.details`), or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/sites/{site_id}/health": {
			"post": {
				"operationId": "reportSiteHealth",
				"summary": "Report the site's health",
				"description": "Versions, when the plugin last finished a sync, and how many sync errors it counted since its last report. Shown in Connected sites in show.fm.\n\nScope: `sites:write`.",
				"tags": [
					"Connected sites"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "site_id",
						"in": "path",
						"required": true,
						"description": "Your site's id (UUID), from the code exchange or WP-CLI registration. Only the calling site key's own site.",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/SiteHealthRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/SiteHealthRecorded"
										}
									},
									"required": [
										"data"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"400": {
						"description": "`invalid_request`: a bad body (see `error.details`), or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/sites/{site_id}/episodes/{episode_id}/post": {
			"post": {
				"operationId": "reportSitePost",
				"summary": "Report the WordPress post for an episode",
				"description": "Idempotent: reporting again for the same episode updates the same record. Only an episode in this site's change feed can be reported; any other is 404. `post_url` must be https on the site's own host.\n\nScope: `sites:write`.",
				"tags": [
					"Connected sites"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "site_id",
						"in": "path",
						"required": true,
						"description": "Your site's id (UUID), from the code exchange or WP-CLI registration. Only the calling site key's own site.",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					},
					{
						"name": "episode_id",
						"in": "path",
						"required": true,
						"description": "The episode id (UUID).",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ReportPostRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"data": {
											"$ref": "#/components/schemas/ReportedPost"
										}
									},
									"required": [
										"data"
									],
									"additionalProperties": false
								}
							}
						}
					},
					"400": {
						"description": "`invalid_request`: a bad body (see `error.details`), or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		},
		"/v1/me/sites/{site_id}/changes": {
			"get": {
				"operationId": "listSiteChanges",
				"summary": "List the site's changes",
				"description": "The episodes this site posts, in `seq` order after `after`: each one either the episode as its post should show it (`upsert`) or a `tombstone`. Send the `next` you last applied as `after`; every call records it, and an unchanged page answers 304. A lapsed plan answers 403 `plan_upgrade_required` until it is restored.\n\nScope: `episodes:read`.",
				"tags": [
					"Connected sites"
				],
				"security": [
					{
						"apiKey": []
					}
				],
				"parameters": [
					{
						"name": "site_id",
						"in": "path",
						"required": true,
						"description": "Your site's id (UUID), from the code exchange or WP-CLI registration. Only the calling site key's own site.",
						"schema": {
							"type": "string",
							"format": "uuid"
						}
					},
					{
						"name": "after",
						"in": "query",
						"required": false,
						"description": "The last `seq` you applied. Default 0.",
						"schema": {
							"type": "integer",
							"minimum": 0,
							"default": 0
						}
					},
					{
						"name": "limit",
						"in": "query",
						"required": false,
						"description": "Page size, 1 to 100. Default 20.",
						"schema": {
							"type": "integer",
							"minimum": 1,
							"maximum": 100,
							"default": 20
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"headers": {
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							},
							"ETag": {
								"schema": {
									"type": "string"
								}
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SiteChanges"
								}
							}
						}
					},
					"304": {
						"description": "Not modified (matching `If-None-Match`)."
					},
					"400": {
						"description": "`invalid_request`: a bad parameter, or a key sent in the URL.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"401": {
						"description": "`unauthorized` (no Bearer key) or `invalid_api_key`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"403": {
						"description": "`insufficient_scope`, `forbidden` (role or team-key setting) or `plan_upgrade_required`.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"404": {
						"description": "`not_found`: the key cannot reach this resource.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"429": {
						"description": "`rate_limited`. Wait for `Retry-After` seconds.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						},
						"headers": {
							"Retry-After": {
								"schema": {
									"type": "integer"
								}
							},
							"RateLimit-Policy": {
								"description": "The bucket that applied, e.g. `\"account\";q=60;w=60`.",
								"schema": {
									"type": "string"
								}
							},
							"RateLimit": {
								"description": "Requests left and seconds to reset, e.g. `\"account\";r=59;t=42`.",
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"500": {
						"description": "`internal_error`. Retry; quote `X-Request-Id` if it persists.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					},
					"503": {
						"description": "`service_unavailable`. Retry shortly.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Error"
								}
							}
						}
					}
				}
			}
		}
	},
	"components": {
		"schemas": {
			"AnalyticsFreshness": {
				"type": "object",
				"properties": {
					"source": {
						"type": "string",
						"enum": [
							"show.fm",
							"transistor",
							"external"
						]
					},
					"verified_from": {
						"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"
							}
						],
						"description": "The first day of the run show.fm has counted with no gap. Earlier days are not verified."
					},
					"complete_through": {
						"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"
							}
						],
						"description": "The last day of that run: every day from `verified_from` to here is fully counted."
					},
					"revisable_days": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991,
						"description": "How many days up to `complete_through` a later count may still revise."
					},
					"today_partial": {
						"type": "boolean"
					},
					"last_updated_at": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"source",
					"verified_from",
					"complete_through",
					"revisable_days",
					"today_partial",
					"last_updated_at"
				],
				"additionalProperties": false
			},
			"AnalyticsMeta": {
				"type": "object",
				"properties": {
					"range": {
						"$ref": "#/components/schemas/AnalyticsRange"
					},
					"freshness": {
						"$ref": "#/components/schemas/AnalyticsFreshness"
					},
					"methodology": {
						"$ref": "#/components/schemas/AnalyticsMethodology"
					}
				},
				"required": [
					"range",
					"freshness",
					"methodology"
				],
				"additionalProperties": false
			},
			"AnalyticsMethodology": {
				"type": "object",
				"properties": {
					"source": {
						"type": "string",
						"enum": [
							"show.fm",
							"transistor",
							"external"
						]
					},
					"guideline": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"certified": {
						"type": "boolean",
						"const": false
					},
					"download_definition": {
						"type": "string"
					},
					"unique_listener_definition": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"day_boundary": {
						"type": "string"
					},
					"docs_url": {
						"type": "string"
					}
				},
				"required": [
					"source",
					"guideline",
					"certified",
					"download_definition",
					"unique_listener_definition",
					"day_boundary",
					"docs_url"
				],
				"additionalProperties": false
			},
			"AnalyticsRange": {
				"type": "object",
				"properties": {
					"requested_from": {
						"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"
							}
						],
						"description": "The start you asked for; null for `preset=all`."
					},
					"requested_to": {
						"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])))$"
					},
					"from": {
						"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])))$",
						"description": "The start actually used, after the plan and collection limits."
					},
					"to": {
						"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])))$"
					},
					"clamped": {
						"type": "boolean"
					},
					"clamp_reason": {
						"anyOf": [
							{
								"type": "string",
								"enum": [
									"retention",
									"collection_start"
								]
							},
							{
								"type": "null"
							}
						]
					},
					"retention_days": {
						"anyOf": [
							{
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							{
								"type": "null"
							}
						],
						"description": "Null means unlimited history."
					},
					"data_start": {
						"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"
							}
						],
						"description": "The first UTC day with any recorded download."
					}
				},
				"required": [
					"requested_from",
					"requested_to",
					"from",
					"to",
					"clamped",
					"clamp_reason",
					"retention_days",
					"data_start"
				],
				"additionalProperties": false
			},
			"Breakdown": {
				"type": "object",
				"properties": {
					"dimension": {
						"type": "string",
						"enum": [
							"apps",
							"countries",
							"devices",
							"sources",
							"referrers"
						]
					},
					"episode_id": {
						"anyOf": [
							{
								"type": "string",
								"format": "uuid",
								"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
							},
							{
								"type": "null"
							}
						]
					},
					"available": {
						"type": "boolean"
					},
					"reason": {
						"anyOf": [
							{
								"type": "string",
								"const": "host_does_not_share"
							},
							{
								"type": "null"
							}
						]
					},
					"depth": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991
					},
					"items": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"key": {
									"type": "string"
								},
								"downloads": {
									"type": "integer",
									"minimum": -9007199254740991,
									"maximum": 9007199254740991
								}
							},
							"required": [
								"key",
								"downloads"
							],
							"additionalProperties": false
						}
					}
				},
				"required": [
					"dimension",
					"episode_id",
					"available",
					"reason",
					"depth",
					"items"
				],
				"additionalProperties": false
			},
			"DisconnectedSite": {
				"type": "object",
				"properties": {
					"site_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"disconnected": {
						"type": "boolean",
						"const": true
					}
				},
				"required": [
					"site_id",
					"disconnected"
				],
				"additionalProperties": false
			},
			"DisconnectSiteRequest": {
				"type": "object",
				"properties": {},
				"additionalProperties": false,
				"description": "Send an empty JSON object. The authenticated site key and the site ID in the path select the connection to disconnect; no identity or options are accepted in the body."
			},
			"DownloadsPeriod": {
				"type": "object",
				"properties": {
					"period_start": {
						"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])))$"
					},
					"period_end": {
						"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])))$"
					},
					"downloads": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991
					},
					"unique_listeners": {
						"description": "Day interval only. Null when the host does not share listeners.",
						"anyOf": [
							{
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							{
								"type": "null"
							}
						]
					},
					"peak_daily_unique_listeners": {
						"description": "Week and month intervals: the highest single-day figure.",
						"anyOf": [
							{
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							{
								"type": "null"
							}
						]
					},
					"partial": {
						"type": "boolean"
					}
				},
				"required": [
					"period_start",
					"period_end",
					"downloads",
					"partial"
				],
				"additionalProperties": false
			},
			"Episode": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"slug": {
						"type": "string"
					},
					"title": {
						"type": "string"
					},
					"description": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"season_number": {
						"anyOf": [
							{
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							{
								"type": "null"
							}
						]
					},
					"episode_number": {
						"anyOf": [
							{
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							{
								"type": "null"
							}
						]
					},
					"episode_type": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"explicit": {
						"type": "boolean"
					},
					"published_at": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
					},
					"audio": {
						"type": "object",
						"properties": {
							"url": {
								"anyOf": [
									{
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"content_type": {
								"anyOf": [
									{
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"duration_seconds": {
								"anyOf": [
									{
										"type": "number"
									},
									{
										"type": "null"
									}
								]
							},
							"size_bytes": {
								"anyOf": [
									{
										"type": "number"
									},
									{
										"type": "null"
									}
								]
							}
						},
						"required": [
							"url",
							"content_type",
							"duration_seconds",
							"size_bytes"
						],
						"additionalProperties": false
					},
					"artwork": {
						"type": "object",
						"properties": {
							"url": {
								"anyOf": [
									{
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"own": {
								"description": "True when the episode has its own cover; false when it uses the podcast cover. Missing on older cached payloads means unknown.",
								"type": "boolean"
							}
						},
						"required": [
							"url"
						],
						"additionalProperties": false
					},
					"links": {
						"type": "object",
						"properties": {
							"listen": {
								"type": "string"
							},
							"embed": {
								"type": "string"
							}
						},
						"required": [
							"listen",
							"embed"
						],
						"additionalProperties": false
					},
					"people": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"name": {
									"type": "string"
								},
								"role": {
									"anyOf": [
										{
											"type": "string"
										},
										{
											"type": "null"
										}
									]
								},
								"photo_url": {
									"description": "The person's photo: the one on their credit, else the one on their show.fm profile. Null when they have none. Missing on older cached payloads means unknown.",
									"anyOf": [
										{
											"type": "string"
										},
										{
											"type": "null"
										}
									]
								}
							},
							"required": [
								"name",
								"role"
							],
							"additionalProperties": false
						}
					},
					"transcript": {
						"anyOf": [
							{
								"type": "object",
								"properties": {
									"url": {
										"type": "string"
									},
									"type": {
										"type": "string"
									}
								},
								"required": [
									"url",
									"type"
								],
								"additionalProperties": false
							},
							{
								"type": "null"
							}
						]
					},
					"podcast": {
						"$ref": "#/components/schemas/PodcastSummary"
					}
				},
				"required": [
					"id",
					"slug",
					"title",
					"description",
					"season_number",
					"episode_number",
					"episode_type",
					"explicit",
					"published_at",
					"audio",
					"artwork",
					"links",
					"people",
					"transcript",
					"podcast"
				],
				"additionalProperties": false
			},
			"EpisodeAnalytics": {
				"type": "object",
				"properties": {
					"episode_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"title": {
						"type": "string"
					},
					"published_at": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
							},
							{
								"type": "null"
							}
						]
					},
					"downloads": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991,
						"description": "Downloads inside the range."
					},
					"downloads_all_time": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991
					},
					"first_week_downloads": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991
					},
					"first_day": {
						"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"
							}
						]
					}
				},
				"required": [
					"episode_id",
					"title",
					"published_at",
					"downloads",
					"downloads_all_time",
					"first_week_downloads",
					"first_day"
				],
				"additionalProperties": false
			},
			"EpisodeCredit": {
				"type": "object",
				"properties": {
					"name": {
						"type": "string"
					},
					"role_label": {
						"type": "string"
					},
					"external_url": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"display_order": {
						"anyOf": [
							{
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							{
								"type": "null"
							}
						]
					},
					"bio": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Only once the episode is public."
					},
					"avatar_url": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Only once the episode is public."
					}
				},
				"required": [
					"name",
					"role_label",
					"external_url",
					"display_order",
					"bio",
					"avatar_url"
				],
				"additionalProperties": false
			},
			"EpisodeDownloads": {
				"type": "object",
				"properties": {
					"podcast_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"interval": {
						"type": "string",
						"enum": [
							"day",
							"week",
							"month"
						]
					},
					"periods": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/DownloadsPeriod"
						}
					},
					"totals": {
						"type": "object",
						"properties": {
							"downloads": {
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							"peak_daily_unique_listeners": {
								"anyOf": [
									{
										"type": "integer",
										"minimum": -9007199254740991,
										"maximum": 9007199254740991
									},
									{
										"type": "null"
									}
								]
							}
						},
						"required": [
							"downloads",
							"peak_daily_unique_listeners"
						],
						"additionalProperties": false
					},
					"episode_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"all_time": {
						"type": "object",
						"properties": {
							"downloads": {
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							"first_week_downloads": {
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							"first_day": {
								"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"
									}
								]
							}
						},
						"required": [
							"downloads",
							"first_week_downloads",
							"first_day"
						],
						"additionalProperties": false
					}
				},
				"required": [
					"podcast_id",
					"interval",
					"periods",
					"totals",
					"episode_id",
					"all_time"
				],
				"additionalProperties": false
			},
			"EpisodeListItem": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"slug": {
						"type": "string"
					},
					"title": {
						"type": "string"
					},
					"description": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"season_number": {
						"anyOf": [
							{
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							{
								"type": "null"
							}
						]
					},
					"episode_number": {
						"anyOf": [
							{
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							{
								"type": "null"
							}
						]
					},
					"episode_type": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"explicit": {
						"type": "boolean"
					},
					"published_at": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
					},
					"audio": {
						"type": "object",
						"properties": {
							"url": {
								"anyOf": [
									{
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"content_type": {
								"anyOf": [
									{
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"duration_seconds": {
								"anyOf": [
									{
										"type": "number"
									},
									{
										"type": "null"
									}
								]
							},
							"size_bytes": {
								"anyOf": [
									{
										"type": "number"
									},
									{
										"type": "null"
									}
								]
							}
						},
						"required": [
							"url",
							"content_type",
							"duration_seconds",
							"size_bytes"
						],
						"additionalProperties": false
					},
					"artwork": {
						"type": "object",
						"properties": {
							"url": {
								"anyOf": [
									{
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"own": {
								"description": "True when the episode has its own cover; false when it uses the podcast cover. Missing on older cached payloads means unknown.",
								"type": "boolean"
							}
						},
						"required": [
							"url"
						],
						"additionalProperties": false
					},
					"links": {
						"type": "object",
						"properties": {
							"listen": {
								"type": "string"
							},
							"embed": {
								"type": "string"
							}
						},
						"required": [
							"listen",
							"embed"
						],
						"additionalProperties": false
					},
					"people": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"name": {
									"type": "string"
								},
								"role": {
									"anyOf": [
										{
											"type": "string"
										},
										{
											"type": "null"
										}
									]
								},
								"photo_url": {
									"description": "The person's photo: the one on their credit, else the one on their show.fm profile. Null when they have none. Missing on older cached payloads means unknown.",
									"anyOf": [
										{
											"type": "string"
										},
										{
											"type": "null"
										}
									]
								}
							},
							"required": [
								"name",
								"role"
							],
							"additionalProperties": false
						}
					},
					"transcript": {
						"anyOf": [
							{
								"type": "object",
								"properties": {
									"url": {
										"type": "string"
									},
									"type": {
										"type": "string"
									}
								},
								"required": [
									"url",
									"type"
								],
								"additionalProperties": false
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"id",
					"slug",
					"title",
					"description",
					"season_number",
					"episode_number",
					"episode_type",
					"explicit",
					"published_at",
					"audio",
					"artwork",
					"links",
					"people",
					"transcript"
				],
				"additionalProperties": false
			},
			"EpisodePerson": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"name": {
						"type": "string"
					},
					"role_label": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"is_active": {
						"anyOf": [
							{
								"type": "boolean"
							},
							{
								"type": "null"
							}
						]
					},
					"source_type": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"id",
					"name",
					"role_label",
					"is_active",
					"source_type"
				],
				"additionalProperties": false
			},
			"Error": {
				"type": "object",
				"properties": {
					"error": {
						"type": "object",
						"properties": {
							"code": {
								"type": "string",
								"enum": [
									"invalid_request",
									"not_found",
									"unavailable",
									"unauthorized",
									"invalid_api_key",
									"insufficient_scope",
									"forbidden",
									"plan_upgrade_required",
									"rate_limited",
									"service_unavailable",
									"internal_error",
									"not_implemented"
								]
							},
							"message": {
								"type": "string"
							},
							"request_id": {
								"type": "string"
							},
							"details": {
								"type": "array",
								"items": {
									"type": "object",
									"properties": {
										"field": {
											"type": "string"
										},
										"message": {
											"type": "string"
										},
										"reason": {
											"description": "A stable reason a client may branch on, for example `outside_retention`.",
											"type": "string"
										}
									},
									"required": [
										"field",
										"message"
									],
									"additionalProperties": false
								}
							},
							"docs_url": {
								"type": "string"
							}
						},
						"required": [
							"code",
							"message"
						],
						"additionalProperties": false
					}
				},
				"required": [
					"error"
				],
				"additionalProperties": false
			},
			"KeyedEpisode": {
				"type": "object",
				"properties": {
					"source": {
						"type": "object",
						"properties": {
							"guid_sha256": {
								"anyOf": [
									{
										"type": "string",
										"pattern": "^[0-9a-f]{64}$"
									},
									{
										"type": "null"
									}
								],
								"description": "SHA-256 of the original source GUID after trimming surrounding whitespace only. Available for authorised reads of unpublished episodes too. Null when unknown or there is no import/external source. This field returns only a fingerprint."
							},
							"enclosure_sha256": {
								"anyOf": [
									{
										"type": "string",
										"pattern": "^[0-9a-f]{64}$"
									},
									{
										"type": "null"
									}
								],
								"description": "SHA-256 of the normalised source enclosure URL. Null when unknown, invalid, without an import/external source, or before publication. No raw source URL is returned. Full normalisation rules and parity vectors are in info.description."
							}
						},
						"required": [
							"guid_sha256",
							"enclosure_sha256"
						],
						"additionalProperties": false,
						"description": "One-way import matching fingerprints from the earliest completed snapshot or stored external metadata. Native episodes without either have null fields. Apply the published normalisation rules before hashing candidate values; the contract includes parity vectors."
					},
					"rss_guid": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "The GUID in the show's public RSS feed, which for imported episodes is usually the original GUID. Null unless status is published and published_at has passed, or when unknown or withheld by credential restrictions."
					},
					"id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"podcast_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"slug": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"title": {
						"type": "string"
					},
					"status": {
						"anyOf": [
							{
								"type": "string",
								"enum": [
									"pending_confirmation",
									"draft",
									"scheduled",
									"published",
									"archived"
								]
							},
							{
								"type": "null"
							}
						]
					},
					"episode_number": {
						"anyOf": [
							{
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							{
								"type": "null"
							}
						]
					},
					"season_number": {
						"anyOf": [
							{
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							{
								"type": "null"
							}
						]
					},
					"episode_type": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"published_at": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
							},
							{
								"type": "null"
							}
						]
					},
					"scheduled_for": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
							},
							{
								"type": "null"
							}
						]
					},
					"duration_seconds": {
						"anyOf": [
							{
								"type": "number"
							},
							{
								"type": "null"
							}
						]
					},
					"subtitle": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"created_at": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
							},
							{
								"type": "null"
							}
						]
					},
					"explicit": {
						"type": "boolean"
					},
					"description": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Plain text."
					},
					"show_notes": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Plain text."
					},
					"show_notes_html": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Sanitised HTML (p, br, strong, em, u, a, ul, ol, li, h1 to h6, blockquote; links https, http or mailto only). Still untrusted: sanitise again before rendering."
					},
					"media": {
						"anyOf": [
							{
								"$ref": "#/components/schemas/KeyedEpisodeMedia"
							},
							{
								"type": "null"
							}
						],
						"description": "Only for a published episode whose publish time has passed; null otherwise."
					}
				},
				"required": [
					"source",
					"rss_guid",
					"id",
					"podcast_id",
					"slug",
					"title",
					"status",
					"episode_number",
					"season_number",
					"episode_type",
					"published_at",
					"scheduled_for",
					"duration_seconds",
					"subtitle",
					"created_at",
					"explicit",
					"description",
					"show_notes",
					"show_notes_html",
					"media"
				],
				"additionalProperties": false
			},
			"KeyedEpisodeListItem": {
				"type": "object",
				"properties": {
					"source": {
						"type": "object",
						"properties": {
							"guid_sha256": {
								"anyOf": [
									{
										"type": "string",
										"pattern": "^[0-9a-f]{64}$"
									},
									{
										"type": "null"
									}
								],
								"description": "SHA-256 of the original source GUID after trimming surrounding whitespace only. Available for authorised reads of unpublished episodes too. Null when unknown or there is no import/external source. This field returns only a fingerprint."
							},
							"enclosure_sha256": {
								"anyOf": [
									{
										"type": "string",
										"pattern": "^[0-9a-f]{64}$"
									},
									{
										"type": "null"
									}
								],
								"description": "SHA-256 of the normalised source enclosure URL. Null when unknown, invalid, without an import/external source, or before publication. No raw source URL is returned. Full normalisation rules and parity vectors are in info.description."
							}
						},
						"required": [
							"guid_sha256",
							"enclosure_sha256"
						],
						"additionalProperties": false,
						"description": "One-way import matching fingerprints from the earliest completed snapshot or stored external metadata. Native episodes without either have null fields. Apply the published normalisation rules before hashing candidate values; the contract includes parity vectors."
					},
					"rss_guid": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "The GUID in the show's public RSS feed, which for imported episodes is usually the original GUID. Null unless status is published and published_at has passed, or when unknown or withheld by credential restrictions."
					},
					"id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"podcast_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"slug": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"title": {
						"type": "string"
					},
					"status": {
						"anyOf": [
							{
								"type": "string",
								"enum": [
									"pending_confirmation",
									"draft",
									"scheduled",
									"published",
									"archived"
								]
							},
							{
								"type": "null"
							}
						]
					},
					"episode_number": {
						"anyOf": [
							{
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							{
								"type": "null"
							}
						]
					},
					"season_number": {
						"anyOf": [
							{
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							{
								"type": "null"
							}
						]
					},
					"episode_type": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"published_at": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
							},
							{
								"type": "null"
							}
						]
					},
					"scheduled_for": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
							},
							{
								"type": "null"
							}
						]
					},
					"duration_seconds": {
						"anyOf": [
							{
								"type": "number"
							},
							{
								"type": "null"
							}
						]
					},
					"subtitle": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"created_at": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"source",
					"rss_guid",
					"id",
					"podcast_id",
					"slug",
					"title",
					"status",
					"episode_number",
					"season_number",
					"episode_type",
					"published_at",
					"scheduled_for",
					"duration_seconds",
					"subtitle",
					"created_at"
				],
				"additionalProperties": false
			},
			"KeyedEpisodeMedia": {
				"type": "object",
				"properties": {
					"audio": {
						"type": "object",
						"properties": {
							"url": {
								"anyOf": [
									{
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"content_type": {
								"anyOf": [
									{
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"size_bytes": {
								"anyOf": [
									{
										"type": "number"
									},
									{
										"type": "null"
									}
								]
							},
							"duration_seconds": {
								"anyOf": [
									{
										"type": "number"
									},
									{
										"type": "null"
									}
								]
							}
						},
						"required": [
							"url",
							"content_type",
							"size_bytes",
							"duration_seconds"
						],
						"additionalProperties": false
					},
					"cover_image_url": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"chapters_url": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"transcript_url": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"audio",
					"cover_image_url",
					"chapters_url",
					"transcript_url"
				],
				"additionalProperties": false
			},
			"KeyedPodcast": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"slug": {
						"type": "string"
					},
					"title": {
						"type": "string"
					},
					"role": {
						"type": "string",
						"enum": [
							"owner",
							"admin",
							"member"
						],
						"description": "Built-in source identity, not an authorisation grant. Host and Account manager map to owner, Producer to admin, Co-host to member. Custom roles retain their copied-from key. Highest key wins; ties prefer the show role, then an account role, then account owner."
					},
					"role_name": {
						"description": "Added in the roles update: name of the source selected for role.",
						"type": "string"
					},
					"capabilities": {
						"description": "Added in the roles update: effective show capabilities from all current sources, with implications expanded.",
						"type": "array",
						"items": {
							"type": "string"
						}
					},
					"status": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"hosting_type": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"timezone": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"created_at": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
					}
				},
				"required": [
					"id",
					"slug",
					"title",
					"role",
					"status",
					"hosting_type",
					"timezone",
					"created_at"
				],
				"additionalProperties": false
			},
			"Me": {
				"type": "object",
				"properties": {
					"user": {
						"type": "object",
						"properties": {
							"id": {
								"type": "string",
								"format": "uuid",
								"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
							},
							"name": {
								"anyOf": [
									{
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							}
						},
						"required": [
							"id",
							"name"
						],
						"additionalProperties": false
					},
					"key": {
						"type": "object",
						"properties": {
							"id": {
								"type": "string",
								"format": "uuid",
								"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
							},
							"name": {
								"type": "string"
							},
							"environment": {
								"type": "string",
								"enum": [
									"live",
									"test"
								]
							},
							"scopes": {
								"type": "array",
								"items": {
									"type": "string"
								}
							},
							"podcasts": {
								"anyOf": [
									{
										"type": "string",
										"const": "all"
									},
									{
										"type": "array",
										"items": {
											"type": "string",
											"format": "uuid",
											"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
										}
									}
								]
							},
							"expires_at": {
								"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
							},
							"previous_secret_in_use": {
								"type": "boolean"
							},
							"previous_secret_expires_at": {
								"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
									},
									{
										"type": "null"
									}
								]
							}
						},
						"required": [
							"id",
							"name",
							"environment",
							"scopes",
							"podcasts",
							"expires_at",
							"previous_secret_in_use",
							"previous_secret_expires_at"
						],
						"additionalProperties": false
					}
				},
				"required": [
					"user",
					"key"
				],
				"additionalProperties": false
			},
			"Oembed": {
				"type": "object",
				"properties": {
					"version": {
						"type": "string",
						"const": "1.0"
					},
					"type": {
						"type": "string",
						"const": "rich"
					},
					"provider_name": {
						"type": "string"
					},
					"provider_url": {
						"type": "string"
					},
					"title": {
						"type": "string"
					},
					"author_name": {
						"type": "string"
					},
					"html": {
						"type": "string"
					},
					"width": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991
					},
					"height": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991
					},
					"thumbnail_url": {
						"type": "string"
					},
					"thumbnail_width": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991
					},
					"thumbnail_height": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991
					},
					"cache_age": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991
					},
					"documentation": {
						"type": "string"
					}
				},
				"required": [
					"version",
					"type",
					"provider_name",
					"provider_url",
					"title",
					"author_name",
					"html",
					"width",
					"height",
					"cache_age",
					"documentation"
				],
				"additionalProperties": false
			},
			"Pagination": {
				"type": "object",
				"properties": {
					"next_cursor": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"next_cursor"
				],
				"additionalProperties": false,
				"description": "Opaque keyset cursor; pass it back as `cursor`."
			},
			"PlatformMetrics": {
				"type": "object",
				"properties": {
					"podcast_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"source": {
						"type": "string",
						"enum": [
							"apple",
							"spotify"
						]
					},
					"imported_at": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
							},
							{
								"type": "null"
							}
						]
					},
					"as_of": {
						"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"
							}
						]
					},
					"show_metrics": {
						"type": "object",
						"propertyNames": {
							"type": "string"
						},
						"additionalProperties": {
							"type": "number"
						}
					},
					"episodes": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"episode_id": {
									"type": "string",
									"format": "uuid",
									"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
								},
								"title": {
									"anyOf": [
										{
											"type": "string"
										},
										{
											"type": "null"
										}
									]
								},
								"metrics": {
									"type": "object",
									"propertyNames": {
										"type": "string"
									},
									"additionalProperties": {
										"type": "number"
									}
								}
							},
							"required": [
								"episode_id",
								"title",
								"metrics"
							],
							"additionalProperties": false
						}
					}
				},
				"required": [
					"podcast_id",
					"source",
					"imported_at",
					"as_of",
					"show_metrics",
					"episodes"
				],
				"additionalProperties": false
			},
			"Podcast": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"slug": {
						"type": "string"
					},
					"guid": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"title": {
						"type": "string"
					},
					"subtitle": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"author": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"description": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"language": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"category": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"subcategory": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"explicit": {
						"type": "boolean"
					},
					"artwork": {
						"type": "object",
						"properties": {
							"url": {
								"anyOf": [
									{
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							}
						},
						"required": [
							"url"
						],
						"additionalProperties": false
					},
					"brand_color": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"player_color": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"player_theme": {
						"type": "string"
					},
					"player_waveform": {
						"type": "boolean"
					},
					"website_url": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"episode_count": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991
					},
					"links": {
						"type": "object",
						"properties": {
							"listen": {
								"type": "string"
							},
							"feed": {
								"type": "string"
							}
						},
						"required": [
							"listen",
							"feed"
						],
						"additionalProperties": false
					},
					"branding": {
						"type": "object",
						"properties": {
							"show_powered_by": {
								"type": "boolean"
							}
						},
						"required": [
							"show_powered_by"
						],
						"additionalProperties": false
					}
				},
				"required": [
					"id",
					"slug",
					"guid",
					"title",
					"subtitle",
					"author",
					"description",
					"language",
					"category",
					"subcategory",
					"explicit",
					"artwork",
					"brand_color",
					"player_color",
					"player_theme",
					"player_waveform",
					"website_url",
					"episode_count",
					"links",
					"branding"
				],
				"additionalProperties": false
			},
			"PodcastDownloads": {
				"type": "object",
				"properties": {
					"podcast_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"interval": {
						"type": "string",
						"enum": [
							"day",
							"week",
							"month"
						]
					},
					"periods": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/DownloadsPeriod"
						}
					},
					"totals": {
						"type": "object",
						"properties": {
							"downloads": {
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							"peak_daily_unique_listeners": {
								"anyOf": [
									{
										"type": "integer",
										"minimum": -9007199254740991,
										"maximum": 9007199254740991
									},
									{
										"type": "null"
									}
								]
							}
						},
						"required": [
							"downloads",
							"peak_daily_unique_listeners"
						],
						"additionalProperties": false
					}
				},
				"required": [
					"podcast_id",
					"interval",
					"periods",
					"totals"
				],
				"additionalProperties": false
			},
			"PodcastSummary": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"slug": {
						"type": "string"
					},
					"title": {
						"type": "string"
					},
					"author": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"artwork": {
						"type": "object",
						"properties": {
							"url": {
								"anyOf": [
									{
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							}
						},
						"required": [
							"url"
						],
						"additionalProperties": false
					},
					"brand_color": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"player_color": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"player_theme": {
						"type": "string"
					},
					"player_waveform": {
						"type": "boolean"
					},
					"links": {
						"type": "object",
						"properties": {
							"listen": {
								"type": "string"
							}
						},
						"required": [
							"listen"
						],
						"additionalProperties": false
					},
					"branding": {
						"type": "object",
						"properties": {
							"show_powered_by": {
								"type": "boolean"
							}
						},
						"required": [
							"show_powered_by"
						],
						"additionalProperties": false
					}
				},
				"required": [
					"id",
					"slug",
					"title",
					"author",
					"artwork",
					"brand_color",
					"player_color",
					"player_theme",
					"player_waveform",
					"links",
					"branding"
				],
				"additionalProperties": false
			},
			"RegisteredSite": {
				"type": "object",
				"properties": {
					"site_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"site_url": {
						"type": "string"
					},
					"status": {
						"type": "string",
						"enum": [
							"awaiting_registration"
						]
					},
					"ping_secret": {
						"type": "string",
						"pattern": "^[0-9a-f]{64}$",
						"description": "The secret that signs wake-up pings to this site. Shown once; store it with the key."
					},
					"expires_at": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
					}
				},
				"required": [
					"site_id",
					"site_url",
					"status",
					"ping_secret",
					"expires_at"
				],
				"additionalProperties": false
			},
			"RegisterSiteRequest": {
				"type": "object",
				"properties": {
					"admin_url": {
						"description": "Optional WordPress admin address for reconnect links. Must be https, on the same origin as site_url, under its home path and contain /wp-admin/, with no credentials, port or fragment. Stored as the plugin settings address. Omit to preserve an existing address; older connections without one use the site home path plus /wp-admin/.",
						"type": "string",
						"minLength": 1,
						"maxLength": 2048
					},
					"site_url": {
						"type": "string",
						"description": "The site's https address, with no query, fragment, port or login details."
					},
					"rest_root": {
						"type": "string",
						"minLength": 1,
						"maxLength": 2048,
						"description": "WordPress rest_url(): after normalising the host to lowercase IDNA, exactly the normalised site_url plus /wp-json/, /?rest_route=/ or /index.php?rest_route=/. The path keeps its case."
					},
					"state": {
						"type": "string",
						"pattern": "^[A-Za-z0-9_-]{32,128}$",
						"description": "A fresh random value the plugin stored before calling, 32 to 128 URL-safe characters."
					},
					"code_challenge": {
						"type": "string",
						"pattern": "^[A-Za-z0-9_-]{43}$",
						"description": "The S256 challenge: base64url of the SHA-256 of the plugin verifier. show.fm fetches the plugin challenge for `state` and must get this back."
					}
				},
				"required": [
					"site_url",
					"rest_root",
					"state",
					"code_challenge"
				],
				"additionalProperties": false
			},
			"ReportedPost": {
				"type": "object",
				"properties": {
					"site_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"episode_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"wp_post_id": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991
					},
					"post_url": {
						"type": "string"
					},
					"state": {
						"type": "string",
						"enum": [
							"queued",
							"scheduled",
							"published",
							"draft",
							"trashed"
						]
					}
				},
				"required": [
					"site_id",
					"episode_id",
					"wp_post_id",
					"post_url",
					"state"
				],
				"additionalProperties": false
			},
			"ReportPostRequest": {
				"type": "object",
				"properties": {
					"wp_post_id": {
						"type": "integer",
						"minimum": 1,
						"maximum": 9007199254740991
					},
					"post_url": {
						"type": "string",
						"description": "An https address on the site's own host and under its home path (any path for a root install), with no login details, port or fragment."
					},
					"state": {
						"type": "string",
						"enum": [
							"queued",
							"scheduled",
							"published",
							"draft",
							"trashed"
						]
					},
					"content_hash": {
						"description": "The `content_hash` of the change the post now reflects.",
						"type": "string",
						"pattern": "^[0-9A-Za-z:_-]{1,128}$"
					}
				},
				"required": [
					"wp_post_id",
					"post_url",
					"state"
				],
				"additionalProperties": false
			},
			"SiteChange": {
				"type": "object",
				"properties": {
					"seq": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991
					},
					"episode_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"podcast_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"changed_at": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
					},
					"access_state": {
						"type": "string",
						"enum": [
							"ok",
							"paused",
							"detached"
						],
						"description": "Reconciled on every feed call, before paging. Access changes receive fresh sequence values; restored access emits current content again."
					},
					"action": {
						"type": "string",
						"enum": [
							"upsert",
							"tombstone"
						],
						"description": "`upsert`: create or update from `episode`. `tombstone`: apply the reason; detached and paused posts are kept."
					},
					"reason": {
						"anyOf": [
							{
								"type": "string",
								"enum": [
									"deleted",
									"removed",
									"unpublished",
									"access_removed",
									"plan_or_policy"
								]
							},
							{
								"type": "null"
							}
						],
						"description": "Tombstones: deleted moves to the bin; removed or unpublished moves to draft; access_removed detaches and keeps the post with No longer synced from show.fm; plan_or_policy pauses and leaves the post unchanged until access returns."
					},
					"post": {
						"type": "object",
						"properties": {
							"wp_post_id": {
								"anyOf": [
									{
										"type": "integer",
										"minimum": -9007199254740991,
										"maximum": 9007199254740991
									},
									{
										"type": "null"
									}
								]
							},
							"post_url": {
								"anyOf": [
									{
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"state": {
								"anyOf": [
									{
										"type": "string",
										"enum": [
											"queued",
											"scheduled",
											"published",
											"draft",
											"trashed"
										]
									},
									{
										"type": "null"
									}
								]
							}
						},
						"required": [
							"wp_post_id",
							"post_url",
							"state"
						],
						"additionalProperties": false,
						"description": "The post this site last reported for the episode."
					},
					"episode": {
						"anyOf": [
							{
								"$ref": "#/components/schemas/SiteChangeEpisode"
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"seq",
					"episode_id",
					"podcast_id",
					"changed_at",
					"access_state",
					"action",
					"reason",
					"post",
					"episode"
				],
				"additionalProperties": false
			},
			"SiteChangeEpisode": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"podcast_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"slug": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"title": {
						"type": "string"
					},
					"status": {
						"type": "string",
						"enum": [
							"scheduled",
							"published"
						]
					},
					"scheduled_for": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
							},
							{
								"type": "null"
							}
						]
					},
					"published_at": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
							},
							{
								"type": "null"
							}
						]
					},
					"episode_number": {
						"anyOf": [
							{
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							{
								"type": "null"
							}
						]
					},
					"season_number": {
						"anyOf": [
							{
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							{
								"type": "null"
							}
						]
					},
					"episode_type": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"explicit": {
						"type": "boolean"
					},
					"description": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Plain text."
					},
					"show_notes_html": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Sanitised HTML."
					},
					"content_hash": {
						"type": "string",
						"description": "Changes whenever anything a post shows changes. Compare it to skip an unchanged update."
					}
				},
				"required": [
					"id",
					"podcast_id",
					"slug",
					"title",
					"status",
					"scheduled_for",
					"published_at",
					"episode_number",
					"season_number",
					"episode_type",
					"explicit",
					"description",
					"show_notes_html",
					"content_hash"
				],
				"additionalProperties": false
			},
			"SiteChanges": {
				"type": "object",
				"properties": {
					"data": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/SiteChange"
						}
					},
					"cursor": {
						"$ref": "#/components/schemas/SiteChangesCursor"
					}
				},
				"required": [
					"data",
					"cursor"
				],
				"additionalProperties": false
			},
			"SiteChangesCursor": {
				"type": "object",
				"properties": {
					"after": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991
					},
					"next": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991,
						"description": "Send this as `after` once these changes are applied."
					},
					"latest": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991,
						"description": "The site's newest `seq`."
					},
					"has_more": {
						"type": "boolean"
					}
				},
				"required": [
					"after",
					"next",
					"latest",
					"has_more"
				],
				"additionalProperties": false
			},
			"SiteExchange": {
				"type": "object",
				"properties": {
					"site_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"api_key": {
						"type": "string",
						"description": "The site's API key. Shown once; keep it on the server."
					},
					"ping_secret": {
						"type": "string",
						"pattern": "^[0-9a-f]{64}$",
						"description": "The secret that signs wake-up pings to this site. Shown once; store it with the key."
					},
					"expires_at": {
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
					}
				},
				"required": [
					"site_id",
					"api_key",
					"ping_secret",
					"expires_at"
				],
				"additionalProperties": false
			},
			"SiteExchangeRequest": {
				"type": "object",
				"properties": {
					"code": {
						"type": "string",
						"pattern": "^[A-Za-z0-9_-]{43}$",
						"description": "The one-time code from the redirect back to wp-admin. Single use, valid for five minutes."
					},
					"code_verifier": {
						"type": "string",
						"pattern": "^[A-Za-z0-9._~-]{43,128}$",
						"description": "The verifier whose S256 challenge started the connection."
					}
				},
				"required": [
					"code",
					"code_verifier"
				],
				"additionalProperties": false
			},
			"SiteHealthRecorded": {
				"type": "object",
				"properties": {
					"site_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"recorded": {
						"type": "boolean",
						"const": true
					}
				},
				"required": [
					"site_id",
					"recorded"
				],
				"additionalProperties": false
			},
			"SiteHealthRequest": {
				"type": "object",
				"properties": {
					"admin_url": {
						"description": "Optional WordPress admin address for reconnect links. Must be https, on the same origin as site_url, under its home path and contain /wp-admin/, with no credentials, port or fragment. Stored as the plugin settings address. Omit to preserve an existing address; older connections without one use the site home path plus /wp-admin/.",
						"type": "string",
						"minLength": 1,
						"maxLength": 2048
					},
					"plugin_version": {
						"type": "string",
						"pattern": "^[0-9A-Za-z.+_ -]{1,32}$",
						"description": "Up to 32 letters, digits, dots, dashes, underscores, plus signs and spaces."
					},
					"wp_version": {
						"type": "string",
						"pattern": "^[0-9A-Za-z.+_ -]{1,32}$",
						"description": "Up to 32 letters, digits, dots, dashes, underscores, plus signs and spaces."
					},
					"php_version": {
						"type": "string",
						"pattern": "^[0-9A-Za-z.+_ -]{1,32}$",
						"description": "Up to 32 letters, digits, dots, dashes, underscores, plus signs and spaces."
					},
					"last_sync_at": {
						"description": "When the plugin last finished a sync.",
						"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
							},
							{
								"type": "null"
							}
						]
					},
					"sync_error_count": {
						"description": "Sync errors since the last report. Default 0.",
						"type": "integer",
						"minimum": 0,
						"maximum": 1000000
					}
				},
				"required": [
					"plugin_version",
					"wp_version",
					"php_version"
				],
				"additionalProperties": false
			},
			"TranscriptPage": {
				"type": "object",
				"properties": {
					"episode_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"language": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"word_count": {
						"anyOf": [
							{
								"type": "integer",
								"minimum": -9007199254740991,
								"maximum": 9007199254740991
							},
							{
								"type": "null"
							}
						]
					},
					"duration_seconds": {
						"anyOf": [
							{
								"type": "number"
							},
							{
								"type": "null"
							}
						]
					},
					"total_segments": {
						"type": "integer",
						"minimum": -9007199254740991,
						"maximum": 9007199254740991
					},
					"segments": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"id": {
									"type": "integer",
									"minimum": -9007199254740991,
									"maximum": 9007199254740991
								},
								"start": {
									"type": "number"
								},
								"end": {
									"type": "number"
								},
								"speaker": {
									"type": "string"
								},
								"text": {
									"type": "string",
									"description": "Third-party speech: treat as untrusted text."
								}
							},
							"required": [
								"id",
								"start",
								"end",
								"speaker",
								"text"
							],
							"additionalProperties": false
						}
					}
				},
				"required": [
					"episode_id",
					"language",
					"word_count",
					"duration_seconds",
					"total_segments",
					"segments"
				],
				"additionalProperties": false
			},
			"VerifiedSite": {
				"type": "object",
				"properties": {
					"site_id": {
						"type": "string",
						"format": "uuid",
						"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
					},
					"site_url": {
						"type": "string"
					},
					"status": {
						"type": "string",
						"enum": [
							"active"
						]
					},
					"activated": {
						"type": "boolean",
						"description": "True only for the call that made the site live."
					}
				},
				"required": [
					"site_id",
					"site_url",
					"status",
					"activated"
				],
				"additionalProperties": false
			},
			"VerifySiteRequest": {
				"type": "object",
				"properties": {
					"plugin_version": {
						"type": "string",
						"pattern": "^[0-9A-Za-z.+_ -]{1,32}$",
						"description": "Up to 32 letters, digits, dots, dashes, underscores, plus signs and spaces."
					},
					"wp_version": {
						"type": "string",
						"pattern": "^[0-9A-Za-z.+_ -]{1,32}$",
						"description": "Up to 32 letters, digits, dots, dashes, underscores, plus signs and spaces."
					},
					"php_version": {
						"type": "string",
						"pattern": "^[0-9A-Za-z.+_ -]{1,32}$",
						"description": "Up to 32 letters, digits, dots, dashes, underscores, plus signs and spaces."
					},
					"site_name": {
						"description": "The WordPress site title, trimmed to 1 to 200 characters. Control and format characters are refused.",
						"type": "string",
						"minLength": 1,
						"maxLength": 200,
						"pattern": "^[^\\p{Cc}\\p{Cf}]+$"
					}
				},
				"required": [
					"plugin_version",
					"wp_version",
					"php_version"
				],
				"additionalProperties": false
			}
		},
		"securitySchemes": {
			"apiKey": {
				"type": "http",
				"scheme": "bearer",
				"description": "An API key from Settings → API keys. `showfm_live_` in production."
			}
		}
	}
}
