NC govwatch

API

Every meeting, agenda item and summary on this site is readable as JSON, CSV, RSS or a calendar subscription. No key, no account, no sign-up. Local government records are public, and so is reading them.

What you need before the first request

Meetings

GET /api/meetings

The meeting list. It takes the same filters as the pages on this site, so any view you can build by clicking is also an address you can fetch.

Filters, all optional and all combinable
ParameterWhat it takes
entityA government slug, from the table further down.
boardWhat kind of body: governing, planning, school, committee, other.
typeWhat kind of meeting, such as work-session.
actionMeetings holding an item of this kind, such as public-hearing.
topicA subject slug, such as rezoning.
qFree text, searched across agendas, summaries, minutes and captions.
whenupcoming (the default), month, past, all. A request with q and no when searches everything, because most of what is worth finding has already happened.
limit1 to 500. Default 100.
GET /api/meetings?entity=cary&topic=rezoning&when=all&limit=5

{
  "meetings": [
    {
      "id": 412,
      "title": "Town Council Regular Meeting",
      "government": "Town of Cary",
      "board": "Town Council",
      "board_kind": "governing",
      "starts_at": "2026-08-27T18:30:00-04:00",
      "location": "Town Hall Council Chamber",
      "status": "scheduled",
      "meeting_type": "regular",
      "topics": ["rezoning", "water-sewer"],
      "item_count": 34,
      "summary": "Two paragraphs on what this body will decide.",
      "agenda_url": "https://carync.iqm2.com/Citizens/FileOpen.aspx?Type=14&ID=2843",
      "minutes_url": "",
      "url": "/meetings/412"
    }
  ],
  "count": 1
}

agenda_url, packet_url, minutes_url, stream_url and detail_url point at the government's own documents, not at copies held here. They are the record. summary is absent until somebody has read the agenda.

GET /api/meetings/{id}

One meeting with its agenda items. Each item carries its number and title, what kind of action it asks for, the subjects it was sorted under, a summary, and the recorded outcome where the source published one. It may also carry matter_url, which is the item's own document: a staff report on most agendas, and the bill itself on a General Assembly calendar.

An item that names a property also carries places, with whatever the county parcel file answered.

"places": [
  {
    "kind": "address",
    "raw": "4312 Jacobs Creek Lane",
    "status": "matched",
    "parcel": {
      "county": "Wake",
      "parcel_no": "0723194404",
      "owner": "STERLING WEST LLC",
      "acres": 8.92,
      "assessed": 1188857,
      "lat": 35.8217, "lon": -78.8695,
      "url": "/parcels/17"
    }
  }
]

status is matched or not_found, and is absent when the reference has not been looked up yet. not_found is ordinary rather than an error. Land is merged, split and renumbered between the agenda and the parcel file, and some counties publish thinner records than others.

Property

GET /api/parcels.geojson

Every matched property as GeoJSON, which is what the map on this site reads. Takes entity, county, topic, from and to as YYYY-MM-DD, and limit from 1 to 2000, default 500. When more match than the limit allows, truncated comes back true. The answer to that is a narrower filter rather than a second page: a thousand outlines on one map is a smear.

GET /api/parcels/{id}

One parcel, as a single-feature collection.

Vocabularies and coverage

GET /api/vocabulary

The three closed lists this site sorts everything into: subjects, meeting types and action types. They are also printed at the bottom of this page.

GET /api/concepts

The wordings search treats as the same thing, so a query for "granny flat" reaches an item that says "accessory dwelling unit". Each group has a canonical phrase and the phrases that reach it.

GET /api/status

The Sources page as JSON, in three parts. sources is one row per government with its state and how many meetings are held for it. holdings is what came of that across the whole site, including unread, which is how many meetings have a document nobody has read yet. queue is the reading backlog's own bookkeeping.

found_last_run and meetings_on_file are different numbers and only the second means what a reader expects. A government whose whole published calendar has already been collected finds nothing new on the next run, so found_last_run drops to zero while nothing is wrong. Use meetings_on_file for how much this site holds.

GET /api/finances

Audited figures from each government's annual financial report. With no parameters it answers the coverage question first: which governments are short of years. With entity it gives that government's rows and the note written about them. With year, every government for that fiscal year.

Every figure carries whether it was reported. Without that a zero is unreadable: a town that levies no sales tax and a town whose sales tax was never filed both store zero and mean different things.

GET /api/channels

Where each government streams its meetings, one row per government.

GET /api/build

Which version of this site is running, and when it started.

Feeds and exports

Not JSON, but the same surface and the same filters. A narrowed view becomes a narrow subscription.

Other formats, all taking the meeting filters
PathFormatExample
/calendar.icsiCalendar, with a real time zone and an hourly refresh hint rezoning in Apex
/feed.xmlRSS 2.0 every planning board
/export.csvOne row per meeting everything collected
/items.csvOne row per agenda item, with its subjects and outcome a year of rezoning items
/analysis.csvSubject counts per government, with the per-resident rates behind the analysis page the last twelve months

/items.csv takes entity, board, topic, action, q, months, and from and to as YYYY-MM-DD. It returns at most 500 rows, so page it by government and month to walk the whole corpus.

Rate limits

Requests are counted per address, in three separate budgets. Spending one leaves the other two untouched, so a script pulling exports cannot lock a reader out of the meeting pages, and a reader searching hard is not competing with it.

What one address is allowed
Kind of requestPaths Requests a minute
Pageseverything else 120
Search and the wider views/search, /items, /watch, /map, /trends, /analysis, /compare 30
JSON, feeds and exports/api/…, /calendar.ics, /feed.xml, /export.csv, /items.csv, /analysis.csv 60

The whole minute's worth can be spent at once and then refills steadily, so a burst is fine and a sustained loop is what runs out. Stylesheets, scripts, robots.txt and the health check are not counted at all. Every answer carries RateLimit-Limit and RateLimit-Remaining. Going over gets a 429 with Retry-After in seconds; wait that long and the next request goes through. If you want more than this, the exports hand over the whole corpus in one request, which is cheaper for both of us than paging.

What to know before you publish anything from this

Governments

The entity slug for each government currently collected.

Government slugs
SlugGovernment
nc-general-assemblyNC General Assembly
wake-countyWake County
durham-countyDurham County
chatham-countyChatham County
durham-cityCity of Durham
raleighCity of Raleigh
caryTown of Cary
chapel-hillTown of Chapel Hill
apexTown of Apex
wake-forestTown of Wake Forest
holly-springsTown of Holly Springs
hillsboroughTown of Hillsborough
fuquay-varinaTown of Fuquay-Varina
knightdaleTown of Knightdale
garnerTown of Garner
morrisvilleTown of Morrisville
orange-countyOrange County
pittsboroTown of Pittsboro
sanfordCity of Sanford
wcpssWake County Public School System
chatham-county-schoolsChatham County Schools

Subjects

The topic slugs. One fixed list for every government, which is what makes a rezoning in Apex countable against a rezoning in Cary.

Subject slugs
SlugSubject
appointmentsAppointments and personnel
civil-rightsCivil rights and nondiscrimination
dei-programsDEI programs
elections-districtsElections and districts
ethics-transparencyEthics and transparency
immigrationImmigration and enforcement
intergovernmentalIntergovernmental agreements
lgbtq-policyLGBTQ+ policy
litigationLitigation and settlements
legislative-agendaState legislative agenda
surveillanceSurveillance and cameras
broadbandBroadband and technology
facilitiesPublic facilities
transportationRoads and transportation
solid-wasteSolid waste and recycling
stormwaterStormwater and flooding
transitTransit
water-sewerWater and sewer
annexationAnnexation
comprehensive-planComprehensive plan
data-centersData centers and large loads
farmland-conservationFarmland and open space
historicHistoric preservation
housingHousing and affordability
land-conversionLand conversion and large development
rezoningRezoning
subdivisionSubdivision and site plans
text-amendmentZoning text amendment
bonds-debtBonds and debt
budgetBudget and appropriations
procurementContracts and procurement
incentivesEconomic development incentives
fees-ratesFees and utility rates
grantsGrants and outside funding
tax-rateTax rate and revaluation
arts-cultureArts and public art
drugs-addictionDrugs and addiction
environmentEnvironment and sustainability
faith-cultureFaith and cultural communities
fire-emsFire and EMS
health-human-servicesHealth and human services
homelessness-shelterHomelessness and shelter
parks-recParks and recreation
public-safetyPolice and public safety
schoolsSchools and education

Meeting and action types

Meeting type slugs
SlugKind of meeting
regularRegular meeting
work-sessionWork session
public-hearingPublic hearing
specialSpecial or emergency meeting
committeeCommittee meeting
advisoryAdvisory board meeting
quasi-judicialQuasi-judicial hearing
budgetBudget session
retreatRetreat or planning session
annualAnnual or organizational meeting
closed-sessionClosed session
legislative-sessionLegislative session
otherOther
Action type slugs
SlugWhat the item asks for
consentConsent agenda
public-hearingPublic hearing
ordinanceOrdinance
resolutionResolution
contractContract or award
appointmentAppointment
personnelPersonnel
budget-actionBudget action
presentationPresentation
reportStaff or committee report
discussionDiscussion item
proclamationProclamation or recognition
minutesMinutes approval
closed-sessionClosed session
proceduralProcedural
otherOther