The Boring PartsFederalLocal · USLocal · Canada

Add your city's meetings to your website

Run a local news site, neighborhood association, library, Facebook group, or civic project? Add plain-English, always-current public-meeting updates for your community — free, under CC BY 4.0. A link back to the city's page is all we ask. Four ways, from zero-code to the full dataset:

Building an app, a newsroom tool, or a planning dashboard? Build on local government data without scraping thousands of meeting portals. Search or download structured meetings, agendas, decisions, vote tallies, source documents, and plain-English summaries from jurisdictions across the United States and Canada.

Free. No API key. Source-linked. CC BY 4.0.  → full API & search reference · open dataset & schema · MCP server · every jurisdiction (JSON)

1. Embed a city — no code

Drop a single city's upcoming & recent meetings onto any page with an iframe. Every city page has an “🔗 Embed this city” box with this snippet pre-filled:

<iframe src="https://canada.theboringparts.com/city/CITY-SLUG/embed/"
        width="100%" height="600" loading="lazy"
        style="border:1px solid #ddd;border-radius:8px"
        title="City government meetings"></iframe>
<p>Local government meetings via <a href="https://canada.theboringparts.com/city/CITY-SLUG/">MyTown</a></p>

Keep the credit line under the iframe — it's the CC BY attribution, and a plain text link (unlike the iframe) is what actually points search engines back to us.

Replace CITY-SLUG with your city's slug — it's the last part of its page URL (e.g. /city/cityofpaloalto/). The widget is self-contained, mobile-responsive, and follows the visitor's light/dark setting.

WordPress: paste the iframe into a “Custom HTML” block. Squarespace / Wix: use an Embed or Code block. You can point it at a city, a county, or a school board — whichever page's slug you use.

2. Per-city JSON API

To build your own display, fetch a city's meetings as JSON. CORS is open (Access-Control-Allow-Origin: *), so you can call it straight from the browser. Rebuilt hourly.

GET https://canada.theboringparts.com/city/CITY-SLUG/meetings.json

▶ Try it — opens a live response. A shortened real example:

{
  "city": "Palo Alto", "state": "California",
  "page": "https://canada.theboringparts.com/city/cityofpaloalto/",
  "generated": "2026-07-17",
  "upcoming": [
    { "date": "2026-07-21", "body": "City Council",
      "headline": "Council to weigh $12M housing bond and downtown rezoning",
      "summary": "The City Council will consider placing a $12 million affordable-housing bond ...",
      "agenda_url": "https://paloalto.legistar.com/View.ashx?M=A&ID=...",
      "minutes_url": null,
      "source": "https://paloalto.legistar.com/Calendar.aspx" }
  ],
  "recent": [ /* same shape, past meetings with decisions where available */ ],
  "attribution": "MyTown / theboringparts.com",
  "license": "CC BY 4.0"
}

Fetch it three ways — working data in under a minute:

# curl
curl -s https://canada.theboringparts.com/city/cityofpaloalto/meetings.json

# Python
import requests
data = requests.get("https://canada.theboringparts.com/city/cityofpaloalto/meetings.json").json()
for m in data["upcoming"]:
    print(m["date"], m["body"], m["headline"])

# JavaScript (browser or Node 18+)
const data = await (await fetch("https://canada.theboringparts.com/city/cityofpaloalto/meetings.json")).json();
data.upcoming.forEach(m => console.log(m.date, m.body, m.headline));

Response shape:

Want the full picture for a city? city.json (same URL pattern, same open CORS) is a superset of meetings.json — it carries the same meeting arrays plus every data layer we show on the page:

GET https://canada.theboringparts.com/city/CITY-SLUG/city.json

Any block with no data for that city is simply omitted, so check for a key before using it. meetings.json stays a stable minimal subset — use it if all you need is the meeting list.

3. RSS feed

Every city, county and board also publishes an RSS feed of its upcoming & recent meetings. Drop it into a news reader, a WordPress RSS block/widget, or an automation (IFTTT, Zapier) to post meeting updates to your site or group automatically.

https://canada.theboringparts.com/city/CITY-SLUG/rss.xml

4. The whole dataset

Want everything — every city, meeting, brief, decision and roundup across the US and Canada? The entire database is one downloadable SQLite file. See the open dataset. The same docs live in the GitHub repo.

API stability

Attribution

Credit “MyTown / theboringparts.com” with a link. Summaries are AI-generated from official documents — always verify against the linked primary source before relying on a detail.