{"openapi":"3.1.0","info":{"title":"CivicFM API","summary":"What local governments decided, item by item, as JSON.","description":"What local governments decided at their public meetings, item by item, as JSON: what each body took up, how it voted, and what was said, each with a link to its moment in the recording. Items are filed by topic, across every show.\n\nEverything it gives is on the shows' episode pages, produced with AI from the public recordings and checked against them. It's read-only and open: no key, and any site may call it. Version 1 only grows: fields are added, never changed or removed.\n\nA mistake is answered in JSON too, `{\"error\": …}`, saying what to ask instead: `400` for a filter it can't read, or one it needs and didn't get, `404` for a path, an item, or a show it doesn't have, and `405` for anything but `GET` or `HEAD`. A parameter it doesn't know is ignored.","version":"1"},"servers":[{"url":"https://civic.fm"}],"paths":{"/api/v1/items":{"get":{"tags":["Items"],"summary":"Items","description":"Items, newest meeting first, or best match first when you give `q`, or oldest change first when you give `updated_since`. Each filter is optional.","operationId":"listItems","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Words to look for, in the item's title, what it is, its votes, and what was said. \"Quotes\" match a phrase, and `-word` leaves one out."},{"name":"topic","in":"query","required":false,"schema":{"type":"string"},"description":"A topic's slug, from `/api/v1/topics`."},{"name":"show","in":"query","required":false,"schema":{"type":"string"},"description":"A show's slug, from `/api/v1/shows`."},{"name":"since","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"The earliest meeting date to give, `YYYY-MM-DD`."},{"name":"until","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"The latest meeting date to give, `YYYY-MM-DD`."},{"name":"result","in":"query","required":false,"schema":{"type":"string","enum":["passed","failed","continued","withdrawn","no_action","unclear"]},"description":"The items with a motion of that result: `passed`, `failed`, `continued`, `withdrawn`, `no_action`, or `unclear`."},{"name":"updated_since","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"A time, like `2026-10-01T13:00:00Z`: the items whose `updated_at` is at or after it, oldest change first. A time that names no zone is UTC."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"The `next` a response gave, for the page after it."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200},"description":"Items per page: 50 if you don't say, and 200 at most."}],"responses":{"200":{"description":"A page of the items that match.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Items"}}}},"400":{"description":"A filter it can't read. The answer says which, and what to ask instead.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/items/{id}":{"get":{"tags":["Items"],"summary":"One item","description":"One item, by its `id`, as `items` has it. `404` if there's none, which is also how a copy learns that an episode was retracted.","operationId":"getItem","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"An item's `id`, as the API gave it: `‹show›:‹meeting›:‹number›`."},"description":"An item's `id`, as the API gave it: `‹show›:‹meeting›:‹number›`."}],"responses":{"200":{"description":"The item.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Item"}}}},"404":{"description":"There's no such item.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/topics":{"get":{"tags":["Topics and shows"],"summary":"Topics","description":"The topics, by area, each with how many items it has.","operationId":"listTopics","responses":{"200":{"description":"Every topic, by area.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Topics"}}}}}}},"/api/v1/shows":{"get":{"tags":["Topics and shows"],"summary":"Shows","description":"The shows, each with the place it covers, its site, and its feed.","operationId":"listShows","responses":{"200":{"description":"Every public show.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Shows"}}}}}}},"/api/v1/places":{"get":{"tags":["Places and officials"],"summary":"A place","description":"A city, town, county, or ZIP code: the governments over it, each with the show that covers it, and the shows to listen to for it, roundups included. Words that fit several places answer only `choices`.","operationId":"findPlace","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"A city, town, or county, with its state if you know it (`Anytown, VT`), or a ZIP code, which names one place."}],"responses":{"200":{"description":"The place, or the places the words fit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Place"}}}},"400":{"description":"A place it can't find, or one it needs and didn't get. The answer says what to ask instead.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/briefing":{"get":{"tags":["Places and officials"],"summary":"A briefing","description":"What a place's local governments did lately: the stories their shows' latest episodes told in the last 14 days, as the front page ranks them, with those episodes. Give `place` or `show`.","operationId":"getBriefing","parameters":[{"name":"place","in":"query","required":false,"schema":{"type":"string"},"description":"A city, town, or county, with its state if you know it (`Anytown, VT`), or a ZIP code, which names one place."},{"name":"show","in":"query","required":false,"schema":{"type":"string"},"description":"A show's slug, from `/api/v1/shows`, in place of `place`. A roundup's is its shows'."}],"responses":{"200":{"description":"The stories, and their episodes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Briefing"}}}},"400":{"description":"A place it can't find, or one it needs and didn't get. The answer says what to ask instead.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/shows/{slug}/officials":{"get":{"tags":["Places and officials"],"summary":"Who decides","description":"A show's bodies: where each takes written comment, and who holds each of its seats today, with their office's email, phone, and page where CivicFM has them. A committee drawn from another body's seats names that body.","operationId":"listOfficials","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","description":"A show's slug, from `/api/v1/shows`."},"description":"A show's slug, from `/api/v1/shows`."}],"responses":{"200":{"description":"Each body, and who holds its seats.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Officials"}}}},"404":{"description":"There's no such show, or it's a show of shows, with no bodies of its own.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1":{"get":{"tags":["The API"],"summary":"Where everything is","description":"Where each of these is, with the page for agents, the reference, and the description.","operationId":"getIndex","responses":{"200":{"description":"An address for each.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Index"}}}}}}}},"components":{"schemas":{"Apps":{"properties":{"apple":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"Its listing in Apple Podcasts, or `null` where it isn't listed yet."},"spotify":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"Its listing in Spotify, or `null` where it isn't listed yet."},"youtube":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"Its podcast on CivicFM's YouTube channel, each episode as a video, or `null` before its first is up."}},"type":"object","required":["apple","spotify","youtube"],"description":"The podcast apps a show is listed in, to subscribe to it there. Any other app takes its `feed`."},"Area":{"properties":{"slug":{"type":"string","description":"Its name in addresses."},"label":{"type":"string","description":"What it's called."},"topics":{"items":{"$ref":"#/components/schemas/Topic"},"type":"array","description":"Its topics."}},"type":"object","required":["slug","label","topics"],"description":"A group of topics."},"Body":{"properties":{"id":{"type":"string","description":"Its name in the show's config.","examples":["city_council"]},"label":{"type":"string","description":"What it's called, as an item's `meeting.body` has it.","examples":["City Council"]},"agendas":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"The government's own page of its meetings ahead and their agendas, or `null` where CivicFM doesn't have it. CivicFM reports a meeting after it happens: this is where to see what's coming up."}},"type":"object","required":["id","label","agendas"],"description":"A body whose meetings a show covers: a council, a board, a commission."},"Briefing":{"properties":{"place":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The place briefed, as the Census Bureau names it, or `null` when a show was asked for.","examples":["Anytown, Vermont"]},"stories":{"items":{"$ref":"#/components/schemas/Item"},"type":"array","description":"The stories, eight at most, from the shows' latest episodes out in the last 14 days: a statewide roundup's top stories that are theirs, then an area roundup's, then each show's own, its first before its second. Empty with nothing out in 14 days."},"episodes":{"items":{"$ref":"#/components/schemas/Heard"},"type":"array","description":"Those episodes, to listen to: each show's own, then the roundups'."},"searched":{"items":{"$ref":"#/components/schemas/Searched"},"type":"array","description":"Each show briefed, with what it covers. Nothing after a show's `covers.last` has been reported yet."}},"type":"object","required":["place","stories","episodes","searched"],"description":"What a place's local governments did lately: the stories their shows' latest episodes told, ranked as CivicFM's\nfront page ranks them, and those episodes."},"Comment":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The address its agenda gives for written comment, or `null`.","examples":["clerk@anytown.gov"]},"form":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"The page its agenda gives to send written comment from, or `null`."}},"type":"object","required":["email","form"],"description":"Where a body takes written comment, as its own agenda says: the channel that reaches every member and goes into\nthe public record. Never a member's own address, or staff's."},"Contact":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The office's email, or `null`.","examples":["district5@anytown.gov"]},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The office's phone, as the government writes it, or `null`.","examples":["(555) 010-0100"]},"page":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"The office's page on the government's site, or `null`."}},"type":"object","required":["email","phone","page"],"description":"How the public reaches a member's office, as the government's own pages give it. A member's own office reaches\none person; the body's `comment` reaches them all and the record."},"Covers":{"properties":{"first":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"The earliest meeting date it has items from. `null` for a digest, whose items are its members'."},"last":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"The latest meeting date it has items from: nothing after it has been reported yet. `null` for a digest."},"episode":{"type":"string","format":"date-time","description":"When its latest episode went out, UTC."}},"type":"object","required":["first","last","episode"],"description":"What a show has published so far: the meetings its items are from, and its latest episode."},"Document":{"properties":{"kind":{"type":"string","enum":["agenda","minutes","other"],"description":"`agenda`, `minutes`, or `other`."},"title":{"type":"string","description":"What its source calls it."},"url":{"type":"string","format":"uri","description":"Where its source keeps it."}},"type":"object","required":["kind","title","url"],"description":"A paper of the meeting's, as its source lists it."},"Episode":{"properties":{"title":{"type":"string","description":"What it's called."},"url":{"type":"string","format":"uri","description":"Its page."},"item_url":{"type":"string","format":"uri","description":"This item on that page, at an address whose link preview is the item's card: its headline and vote."},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When it first went out, UTC."},"audio":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"Its MP3, as its show's feed gives it."},"covered":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"True when the hosts talk about this item, and false when it's only on the page."}},"type":"object","required":["title","url","item_url","published_at","audio","covered"],"description":"The episode that covers an item's meeting."},"Government":{"properties":{"name":{"type":"string","description":"Its name, as the Census Bureau's list has it.","examples":["Anytown"]},"kind":{"type":"string","description":"What that list calls it: `city`, `town`, `village`, `borough`, `township`, `county`, or `community`.","examples":["city"]},"show":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The slug of the show that covers it, as `show` takes it, or `null` where no show covers it yet.","examples":["anytown"]}},"type":"object","required":["name","kind","show"],"description":"A local government over a place: its city's or town's, or its county's."},"Heard":{"properties":{"show":{"$ref":"#/components/schemas/ItemShow","description":"Its show."},"title":{"type":"string","description":"What it's called."},"published_at":{"type":"string","format":"date-time","description":"When it went out, UTC."},"url":{"type":"string","format":"uri","description":"Its page, with the player."},"audio":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"Its MP3, as its show's feed gives it."},"digest":{"type":"boolean","description":"True for a roundup of several shows' weeks."}},"type":"object","required":["show","title","published_at","url","audio","digest"],"description":"An episode a briefing draws on, to listen to."},"Highlight":{"properties":{"title":{"type":"string","description":"What's at stake in it, in a line. It names no one.","examples":["Did anyone study what higher parking prices do to businesses?"]},"context":{"type":"string","description":"What a listener needs before pressing play, in a sentence: a paraphrase, never the speaker's words. It names no one."},"speakers":{"items":{"$ref":"#/components/schemas/Person"},"type":"array","description":"Who speaks in it, in order, each once, named as a point's speaker is: an official only when the recording shows who it was, and a member of the public never."},"audio":{"type":"string","format":"uri","description":"The clip, as an MP3."},"length_s":{"type":"number","description":"How long it runs, in seconds.","examples":[54.8]},"start":{"type":"string","pattern":"^\\d{2}:\\d{2}:\\d{2}$","description":"Where it starts in the recording, `HH:MM:SS`.","examples":["01:42:03"]},"end":{"type":"string","pattern":"^\\d{2}:\\d{2}:\\d{2}$","description":"Where it ends in the recording, `HH:MM:SS`.","examples":["01:42:58"]},"link":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"The recording, opened where it starts, or `null` where the source's player can't open at a time."},"url":{"type":"string","format":"uri","description":"Its page, to share."}},"type":"object","required":["title","context","speakers","audio","length_s","start","end","link","url"],"description":"A stretch of the meeting's own audio, cut from its recording, with a title and a line of context: the\nmeeting's own words, where everything else here is paraphrased. Its title and context are written with AI and\nchecked against the recording."},"Index":{"properties":{"docs":{"type":"string","format":"uri","description":"The page for agents: the MCP server, then the API."},"items":{"type":"string","format":"uri","description":"The items."},"topics":{"type":"string","format":"uri","description":"The topics."},"shows":{"type":"string","format":"uri","description":"The shows."},"reference":{"type":"string","format":"uri","description":"The API's reference, to try each call in."},"openapi":{"type":"string","format":"uri","description":"The API's description, as OpenAPI."},"mcp":{"type":"string","format":"uri","description":"The MCP server, for an AI assistant to read the same items: add it as a connector."},"places":{"type":"string","format":"uri","description":"A place's governments, and the shows to hear for it."},"briefing":{"type":"string","format":"uri","description":"What a place's governments did lately."}},"type":"object","required":["docs","items","topics","shows","reference","openapi","mcp","places","briefing"],"description":"Where everything is."},"Item":{"properties":{"id":{"type":"string","pattern":"^[a-z0-9-]+:\\d+:\\d+$","description":"`‹show›:‹meeting›:‹number›`. It never changes, so it's safe to keep.","examples":["anytown:3:7"]},"show":{"$ref":"#/components/schemas/ItemShow","description":"The show it's in."},"meeting":{"$ref":"#/components/schemas/Meeting","description":"The meeting it's from."},"number":{"type":"integer","description":"Its place in the meeting, from 1."},"agenda_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Its number on the agenda, or `null` if it has none.","examples":["13"]},"title":{"type":"string","description":"What it is, in a line."},"what_and_why":{"type":"string","description":"What it is and why it matters, in plain language."},"topics":{"items":{"type":"string"},"type":"array","description":"The slugs of the topics it's filed under, three at most. An item that fits none has none.","examples":[["surveillance","policing"]]},"at":{"type":"string","pattern":"^\\d{2}:\\d{2}:\\d{2}$","description":"When it starts in the recording, `HH:MM:SS`.","examples":["01:10:05"]},"link":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"The recording, opened at that moment, or `null` where the source's player can't open at a time. `meeting.recording` is always there."},"outcomes":{"items":{"$ref":"#/components/schemas/Outcome"},"type":"array","description":"One for each motion, in the order taken. An item with no motion has none."},"points":{"items":{"$ref":"#/components/schemas/Point"},"type":"array","description":"What officials and staff said, one point each."},"highlights":{"items":{"$ref":"#/components/schemas/Highlight"},"type":"array","description":"Stretches of the meeting's own audio about it, cut from the recording, the best first. Most items have none."},"episode":{"$ref":"#/components/schemas/Episode","description":"The episode that covers its meeting."},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When anything here last changed: its episode going out, a correction, new topics, new links. UTC, as every time here is: `2026-10-02T13:00:00Z`."},"comment":{"anyOf":[{"$ref":"#/components/schemas/Comment"},{"type":"null"}],"description":"Where its body takes written comment now, as the body's agenda says, or `null` where CivicFM doesn't have it. It reaches every member and goes into the record; on an item already decided, it reaches the body as correspondence."}},"type":"object","required":["id","show","meeting","number","agenda_ref","title","what_and_why","topics","at","link","outcomes","points","highlights","episode","updated_at","comment"],"description":"One thing a body took up at a meeting: what it is, how it was voted on, what was said about it, and where each\nof those is in the recording."},"ItemShow":{"properties":{"slug":{"type":"string","description":"Its name in addresses, and what the `show` filter takes."},"title":{"type":"string","description":"What it's called."},"site":{"type":"string","format":"uri","description":"Its site."}},"type":"object","required":["slug","title","site"],"description":"The show an item is in."},"Items":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Item"},"type":"array","description":"The items on this page."},"total":{"type":"integer","description":"How many match in all."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor for the page after: send it back as `cursor`, with the same filters. `null` on the last page.","examples":["NTA="]}},"type":"object","required":["items","total","next"],"description":"A page of items."},"Listen":{"properties":{"slug":{"type":"string","description":"Its name in addresses, and what `show` takes."},"title":{"type":"string","description":"What it's called."},"site":{"type":"string","format":"uri","description":"Its site, with each episode."},"feed":{"type":"string","format":"uri","description":"Its podcast feed."},"apps":{"$ref":"#/components/schemas/Apps","description":"Where to subscribe to it: the podcast apps it's listed in."},"digest":{"type":"boolean","description":"True for a roundup of several shows' weeks, which carries the place's own."}},"type":"object","required":["slug","title","site","feed","apps","digest"],"description":"A show to hear for a place."},"Meeting":{"properties":{"id":{"type":"integer","description":"Its number within its show."},"body":{"type":"string","description":"The body that met.","examples":["City Council"]},"date":{"type":"string","format":"date","description":"Its date, local, `YYYY-MM-DD`."},"title":{"type":"string","description":"What its source calls it."},"recording":{"type":"string","format":"uri","description":"The public recording."},"documents":{"items":{"$ref":"#/components/schemas/Document"},"type":"array","description":"Its agenda, and what else its source lists with it."}},"type":"object","required":["id","body","date","title","recording","documents"],"description":"The meeting an item is from."},"Member":{"properties":{"name":{"type":"string","description":"Their name.","examples":["Ana Lee"]},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The titles they hold today.","examples":["Councilmember, District 5"]},"contact":{"anyOf":[{"$ref":"#/components/schemas/Contact"},{"type":"null"}],"description":"Their office's contact, or `null` where CivicFM doesn't have it."}},"type":"object","required":["name","title","contact"],"description":"Someone who holds a seat on a body today."},"Officials":{"properties":{"show":{"$ref":"#/components/schemas/ItemShow","description":"The show."},"today":{"type":"string","format":"date","description":"The day the seats are read for, where the show is, `YYYY-MM-DD`."},"bodies":{"items":{"$ref":"#/components/schemas/Seats"},"type":"array","description":"Each body whose meetings it covers."}},"type":"object","required":["show","today","bodies"],"description":"Who decides for a show's place, and where to write."},"Outcome":{"properties":{"text":{"type":"string","description":"The motion, its result, the tally if one was announced, and who voted no, abstained, or was recused, in a sentence.","examples":["Ana Lee (Councilmember, District 5) moved to adopt the policy as amended. Result: passed, 7-1. No: a councilmember."]},"unclear":{"type":"boolean","description":"True when the result couldn't be found in the recording. The text then says so."},"at":{"type":"string","pattern":"^\\d{2}:\\d{2}:\\d{2}$","description":"Where it is in the recording, `HH:MM:SS`.","examples":["02:14:37"]},"link":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"The recording, opened at that moment, or `null` where the source's player can't open at a time."},"result":{"anyOf":[{"type":"string","enum":["passed","failed","continued","withdrawn","no_action","unclear"]},{"type":"null"}],"description":"What became of the motion: `passed`, `failed`, `continued`, `withdrawn`, `no_action`, or `unclear`."},"tally":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"As announced, `\"7-1\"` or `\"unanimous\"`. `null` if none was, or the result is unclear.","examples":["7-1"]},"votes":{"anyOf":[{"$ref":"#/components/schemas/Votes"},{"type":"null"}],"description":"The count, `{\"yes\": 7, \"no\": 1}`, when the tally is two numbers, and otherwise `null`."},"no":{"anyOf":[{"items":{"$ref":"#/components/schemas/Person"},"type":"array"},{"type":"null"}],"description":"Who voted no. Empty when no one did."},"abstain":{"anyOf":[{"items":{"$ref":"#/components/schemas/Person"},"type":"array"},{"type":"null"}],"description":"Who abstained. Empty when no one did."},"recused":{"anyOf":[{"items":{"$ref":"#/components/schemas/Person"},"type":"array"},{"type":"null"}],"description":"Who was recused. Empty when no one was."}},"type":"object","required":["text","unclear","at","link","result","tally","votes","no","abstain","recused"],"description":"One motion and what became of it: a vote, as data. Its fields say what its `text` says in a sentence. On an\noutcome that went out before the API had them they're `null`, if its meeting's notes have changed since. Its\n`text` is always there."},"Person":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Their name, or `null` when the recording doesn't show who it was.","examples":["Ana Lee"]},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The titles they held that day, or how the page puts someone unnamed, `a councilmember`. `null` for someone named who held none.","examples":["Councilmember, District 5"]}},"type":"object","required":["name","role"],"description":"Someone who voted or spoke, named as the episode's page names them: an official only when the recording shows\nwho it was, and a member of the public never. So a person is\n`{\"name\": \"Ana Lee\", \"role\": \"Councilmember, District 5\"}` when the recording shows who, and\n`{\"name\": null, \"role\": \"a councilmember\"}` when it doesn't."},"Place":{"properties":{"place":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The place as the Census Bureau names it, or the ZIP code. `null` when the words fit several places: `choices` lists them.","examples":["Anytown, Vermont"]},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What it is: a `city`, `town`, `county`, … as `governments` has them, `unincorporated` for a place no city or town governs, or `zip`.","examples":["city"]},"governments":{"items":{"$ref":"#/components/schemas/Government"},"type":"array","description":"The governments over it: its own, then its county's. An unincorporated place has only its county's, and a ZIP code each one it falls in. No school or special districts."},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What a person there should know of who governs them, where it's not plain: that a place is unincorporated, so its county governs it. Or `null`."},"listen":{"items":{"$ref":"#/components/schemas/Listen"},"type":"array","description":"The shows to hear for it: those that cover its governments, then the roundups that carry them. Empty where no show covers it yet."},"choices":{"items":{"type":"string"},"type":"array","description":"When the words fit several places, up to five of them, as `place` would name each: ask again with one. Otherwise empty.","examples":[["Anytown, Vermont","Anytown, Ohio"]]}},"type":"object","required":["place","kind","governments","note","listen","choices"],"description":"A place, the governments over it, and the shows to hear for it; or, for words that fit several places, only\nthe choices."},"Point":{"properties":{"text":{"type":"string","description":"What was said, in a sentence that opens with who said it.","examples":["A councilmember asked staff to report back in six months on how the policy is used."]},"at":{"type":"string","pattern":"^\\d{2}:\\d{2}:\\d{2}$","description":"Where it is in the recording, `HH:MM:SS`.","examples":["01:23:15"]},"link":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"The recording, opened at that moment, or `null` where the source's player can't open at a time."},"speaker":{"anyOf":[{"$ref":"#/components/schemas/Person"},{"type":"null"}],"description":"Who said it. `null` on a point that went out before the API had it, if its meeting's notes have changed since."}},"type":"object","required":["text","at","link","speaker"],"description":"Something an official or staff said, paraphrased and never quoted."},"Problem":{"properties":{"error":{"type":"string","description":"What was wrong, and what to ask instead."}},"type":"object","required":["error"],"description":"What a mistake gets."},"Searched":{"properties":{"slug":{"type":"string","description":"Its name, as `show` takes it."},"title":{"type":"string","description":"What it's called."},"covers":{"anyOf":[{"$ref":"#/components/schemas/Covers"},{"type":"null"}],"description":"What it has published so far, or `null` before its first episode."}},"type":"object","required":["slug","title","covers"],"description":"A show a search looked in, and what it has published, so an answer can say what it couldn't have found."},"Seats":{"properties":{"id":{"type":"string","description":"Its name in the show's config.","examples":["city_council"]},"label":{"type":"string","description":"What it's called, as an item's `meeting.body` has it.","examples":["City Council"]},"comment":{"anyOf":[{"$ref":"#/components/schemas/Comment"},{"type":"null"}],"description":"Where it takes written comment, as its agenda says, or `null` where CivicFM doesn't have it."},"agendas":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"The government's own page of its meetings ahead and their agendas, or `null` where CivicFM doesn't have it. CivicFM reports a meeting after it happens: this is where to see what's coming up."},"members":{"items":{"$ref":"#/components/schemas/Member"},"type":"array","description":"Who holds each of its seats today, as the show's roster has them. Staff, who hold no seat, aren't listed. Empty for a committee drawn from another body's seats, and where the roster lists no one."},"drawn_from":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"For a committee whose members are some of another body's, that body's `label`. Otherwise `null`.","examples":["City Council"]}},"type":"object","required":["id","label","comment","agendas","members","drawn_from"],"description":"A body, where it takes written comment, and who holds its seats today."},"Show":{"properties":{"slug":{"type":"string","description":"Its name in addresses, and what the `show` filter takes."},"title":{"type":"string","description":"What it's called."},"place":{"type":"string","description":"The place whose meetings it covers."},"region":{"type":"string","description":"Where that place is: its state."},"state":{"type":"string","enum":["live","paused","retired"],"description":"Whether it's still publishing: `live`, `paused`, or `retired`."},"site":{"type":"string","format":"uri","description":"Its site."},"feed":{"type":"string","format":"uri","description":"Its podcast feed."},"apps":{"$ref":"#/components/schemas/Apps","description":"Where to subscribe to it: the podcast apps it's listed in."},"digest":{"type":"boolean","description":"True for a show of shows, made from its area's shows' episodes. Their items are listed under them, so it has none of its own."},"bodies":{"items":{"$ref":"#/components/schemas/Body"},"type":"array","description":"The bodies whose meetings it covers. A digest has none."},"covers":{"anyOf":[{"$ref":"#/components/schemas/Covers"},{"type":"null"}],"description":"What it has published so far, or `null` before its first episode."}},"type":"object","required":["slug","title","place","region","state","site","feed","apps","digest","bodies","covers"],"description":"A show: one place's meetings, weekly."},"Shows":{"properties":{"shows":{"items":{"$ref":"#/components/schemas/Show"},"type":"array","description":"Every public show, by title."}},"type":"object","required":["shows"],"description":"The network's shows."},"Topic":{"properties":{"slug":{"type":"string","description":"Its name in addresses, and what the `topic` filter takes."},"label":{"type":"string","description":"What it's called."},"about":{"type":"string","description":"What belongs in it."},"count":{"type":"integer","description":"How many items it has."}},"type":"object","required":["slug","label","about","count"],"description":"One of the network's topics."},"Topics":{"properties":{"areas":{"items":{"$ref":"#/components/schemas/Area"},"type":"array","description":"Every area, each with its topics, whether or not they have items yet."}},"type":"object","required":["areas"],"description":"The network's topics, by area."},"Votes":{"properties":{"yes":{"type":"integer","description":"How many voted yes.","examples":[7]},"no":{"type":"integer","description":"How many voted no.","examples":[1]}},"type":"object","required":["yes","no"],"description":"A count, yes and no."}}},"tags":[{"name":"Items","description":"What each body took up, meeting by meeting."},{"name":"Topics and shows","description":"What an item is filed under and whose it is: what the `topic` and `show` filters take."},{"name":"Places and officials","description":"Which shows cover a place, what they told lately, and who decides there and where to write: what a person's own agent asks for them."},{"name":"The API","description":"Where everything is."}],"externalDocs":{"description":"The page for agents: the MCP server, a real call, paging, and keeping a copy","url":"https://civic.fm/agents"},"security":[]}