ParseForge Scrapers

Municode Records Scraper

parseforge/municipal-meeting-minutes-scraper

News & mediaAutomationDeveloper tools

Scrapes municipal meeting minutes, agendas, resolutions, and ordinances from Municode by state, municipality, and document type. Returns each document as a flat row with source URL.

Run this scraper See the API call
Total runs
248
Bookmarked
0
Rating
3.0 (1)
Last modified
2 days ago

This scraper was last updated on .

What does the Municode Records Scraper return?

ParseForge

Municode Records Scraper

Scrape meeting minutes, agendas, resolutions and ordinances from the US municipalities that publish them on Municode. Every record comes with the municipality, document type, meeting date, and a direct link to the source. No login or API key. Export to CSV, JSON, Excel, or XML.

Municode hosts records for about 4,300 US municipalities, and there is no bulk download or official API for researchers. This Actor reads the public document indexes directly, filtered by state, municipality, document type, and year range, and returns each match in one fixed schema. Read the coverage section below before you plan a run: meeting documents are a separate Municode product, and not every municipality on Municode buys it.

Who uses it What they scrape Municode for
Local government reporters Track what a city council discussed or voted on last month
Civic tech developers Build a searchable archive of local decisions for a region
Policy researchers Compare how different municipalities handle a specific issue
Legal professionals Pull ordinances and resolutions for a client's compliance review
Data journalists Collect meeting records across a state for a trend analysis

What it does

This Actor collects municipal meeting minutes, agendas, resolutions, and ordinances from Municode by state, municipality, or document type, and returns each one as a flat row.

Coverage note: the Actor reads the meeting archive that Municode calls MuniDocs. Not every city on Municode publishes one, and a city's codified Code of Ordinances is a separate Municode product that this Actor does not index. When a municipality has no meeting archive, the run says so in its log and status message and lists the municipalities in that state that do have one.

  • ๐Ÿ“„ Document types: minutes, agendas, resolutions, ordinances, or all of them in one run.
  • ๐Ÿ“ Geographic filters: target one state, one municipality, or a city name across the whole US.
  • ๐Ÿ“… Year range: limit results to documents from a start year, an end year, or both.
  • ๐Ÿ”— Direct links: every record includes the source URL on Municode for verification.
  • โš™๏ธ Flexible input: use state abbreviation, municipality name, or exact municipality ID.

Results export to CSV, JSON, Excel, or XML, or straight from the API.

What is covered

This Actor reads Municode, which is a vendor, not a national registry. A municipality appears here only if it is a Municode client, and it has meeting documents only if it also bought the MuniDocs product. Everyone else publishes only a code of ordinances.

We measured this on 2026-09-03 across all 51 state listings, sampling 25 municipalities spread through each state's list: 4,327 municipalities on Municode, and roughly 413 of them publish meeting documents, about 10%.

Coverage by state, for the states with the most municipalities:

State Municipalities on Municode Publishing meeting documents
Florida 416 ~67 (16%)
Georgia 404 ~32 (8%)
Texas 337 ~40 (12%)
Michigan 317 ~13 (4%)
Illinois 254 ~10 (4%)
California 237 ~28 (12%)
Wisconsin 192 ~0
North Carolina 176 ~21 (12%)

The highest rates are in smaller states: Arizona 36%, Idaho 28%, Oregon 24%, Ohio and Wyoming 20%.

Two things follow from that, and they are worth knowing before you run this:

  1. If you need every municipality in a state, Municode is not the source. It is a vendor's client list, not a census.
  2. If you need meeting documents specifically, expect roughly one municipality in ten to have them, and check your state in the table above first.

If a run comes back with fewer documents than you expected, that is almost always coverage, not a failure. The log names every municipality that is on Municode with the code of ordinances only, and closes with a coverage line: how many of the municipalities it checked publish meeting documents. When a single municipality you asked for has no meeting archive, the run also lists the municipalities in that state that do.

What you can do with Municode data

๐Ÿ“ฐ Local news monitoring.

A reporter sets the state to Texas and document type to minutes, then reviews the latest meeting records for every city in the state to find story leads.

๐Ÿ›๏ธ Ordinance research.

A legal analyst filters by municipality name and document type ordinances to collect all short-term rental rules passed since 2020 for a client report.

๐Ÿ“Š Cross-city policy study.

A policy researcher scrapes agendas from 50 municipalities in one state and compares which topics appear most often in the last two years.

๐Ÿ—‚๏ธ Civic archive building.

A civic tech developer runs the Actor weekly with document type all and stores the results in a public database of local government actions.

Why choose this scraper

What you get
No official API Municode does not offer a public bulk API, so this Actor reads the indexes directly
One fixed schema Every document returns the same flat fields, ready for CSV or a database
Scale to a million Collect up to 1,000,000 documents per run, enough for a whole state
Verifiable sources Each row includes the original Municode URL for citation or audit

How it compares

No other Store actor targets Municode the same way, so the honest comparison is with the alternatives teams actually weigh.

Municode Records Scraper Build it in-house By hand
Setup Run it now, zero config Days of engineering None, but hours per pull
When Municode changes Maintained for you You fix it You re-learn the page
Proxies, retries, anti-bot Built in Your problem Browser only
Output Fixed JSON schema, CSV/Excel export Whatever you build Copy-paste
Cost Pay per result Engineering time Analyst hours

Configure the run

Drive the Actor from state abbreviations, municipality names, municipality IDs, and document types, alone or together, and filters run as each document is read so only matches reach your dataset. The Input tab lists every parameter.

A first run with the defaults:

{
  "maxItems": 10,
  "stateAbbr": "tx",
  "municipalityName": "Abilene",
  "documentType": "minutes"
}

A larger pull:

{
  "maxItems": 200,
  "stateAbbr": "tx",
  "municipalityName": "Abilene",
  "documentType": "minutes"
}

Free users

Free-plan runs return up to 10 results as a preview. Upgrade your Apify plan to collect up to 1,000,000 results per run.

Run it

  1. Create a free Apify account with $5 in credit.
  2. Open the Municode Records Scraper.
  3. Set your inputs and any filters, then click Start.
  4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab.

Run it programmatically through the Apify API (run-sync-get-dataset-items) or the ApifyClient for JavaScript and Python.

Use with AI agents (MCP)

Give an AI agent live access to Municode through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/municipal-meeting-minutes-scraper"

Then prompt it in plain language to run the scraper and read back the results.

Troubleshooting

Why am I getting no results?

Check your filters. A municipalityName that is too specific or a startYear after the latest available document will return nothing. Try broadening the state or removing the year range.

Why does the run stop before maxItems?

The Actor stops when it has read all matching documents on Municode. If your filters are narrow, the total available may be less than maxItems.

How do I find the municipality ID?

You can usually find it in the Municode URL for the municipality's page. If you do not know it, use municipalityName or city instead.

Why are some documents missing from my results?

Municode may not have digitized every historical document. The Actor only returns what is publicly listed on the site.

Can I scrape a municipality that is not on Municode?

No. This Actor only works with municipalities that publish their records on Municode. Check the site first to confirm coverage.

FAQ

Question Answer
What is Municode? Municode is a platform operated by CivicPlus that hosts municipal codes, meeting minutes, agendas, resolutions, and ordinances for thousands of US local governments.
Do I need an API key or login? No. The Actor reads the public document indexes on Municode directly, so no registration or authentication is required.
Can I scrape all states at once? Yes. Omit the state abbreviation field and the Actor will process every state that Municode covers, subject to the maxItems limit.
What document types can I collect? You can choose minutes, agendas, resolutions, ordinances, or all. The default is minutes.
How do I filter by a specific city? Use the municipalityName field for a partial, case-insensitive match, or the municipalityId field for an exact Municode ID. The city field also filters by city name.
Can I limit results to a date range? Yes. Set startYear and endYear to include only documents from that period. Both are optional.
What does each result row contain? Each row includes the municipality name, state, document type, meeting date, document title, and the direct URL to the source on Municode, along with other metadata.
Is there a limit on how many documents I can scrape? You can set maxItems up to 1,000,000 documents per run. The default is 10.
What output formats are supported? The Actor exports to CSV, JSON, Excel, and XML through the Apify platform.
Can I schedule this Actor to run regularly? Yes. Use Apify's scheduler to run it daily, weekly, or monthly and collect new meeting records automatically.

๐Ÿ†˜ Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.

โš ๏ธ Disclaimer. This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by CivicPlus, LLC. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.

What input does the Municode Records Scraper accept?

FieldTypeWhat it doesDefault
maxItems integer Maximum number of meeting minutes to collect per run. 10
stateAbbr string Filter by US state abbreviation (e.g. 'in', 'al', 'tx'). Scrapes all states if omitted. tx
municipalityName string Filter by municipality name (partial match, case-insensitive). Scrapes all municipalities in the state if omitted. Only municipalities that publish a meeting archive (MuniDocs) on Municode return documents; if yours has none, the run log lists the ones in the state that do. Abilene
municipalityId integer Filter by exact municipality ID from Municode (overrides municipalityName match). not set
city string Filter municipalities by city name (partial match, case-insensitive). not set
documentType string (5 options) Type of documents to scrape. Options: 'minutes', 'agendas', 'resolutions', 'ordinances', 'all'. Default: 'minutes'. minutes
startYear integer Only return documents from this year onward (e.g. 2020). Omit to include all years. not set
endYear integer Only return documents up to and including this year (e.g. 2025). Omit to include all years. not set
productId integer Filter by exact Municode product ID when a municipality has multiple document products. not set

How much does the Municode Records Scraper cost?

from $11.99 per 1,000 results

Charged forWhat it isPrice each
Actor Start Charged once when the run starts. $0.005
Result Item Charged once per result collected. $0.01199 to $0.01599

Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.

How do I call the Municode Records Scraper API?

One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.

POST ยท run and get results
curl -X POST "https://api.apify.com/v2/acts/parseforge~municipal-meeting-minutes-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "maxItems": 10,
    "stateAbbr": "tx",
    "municipalityName": "Abilene",
    "documentType": "minutes"
  }'

What example inputs can I use?

Use these inputs to see how a run is configured.

input.json
{
  "maxItems": 10,
  "stateAbbr": "tx",
  "municipalityName": "Abilene",
  "documentType": "minutes"
}

What do users say about the Municode Records Scraper?

Rated 3.0 out of 5 across 1 review. Read them on Apify.

How do I report an issue with the Municode Records Scraper?

We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.

Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.

What related scrapers can I use?

Run Municode Records Scraper on Apify All scrapers