ParseForge Scrapers

Municode Records Scraper

parseforge/municipal-meeting-minutes-scraper

AutomationDeveloper toolsOther

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 users
5
Monthly active
0
Total runs
209
Bookmarked
0
Rating
3.0 (1)
Last modified
12 days ago

Overview

ParseForge

Municode Records Scraper

Scrape municipal meeting minutes, agendas, resolutions, and ordinances from Municode, up to a million documents per run. 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 public meeting records for thousands of US cities and counties, but 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.

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.

  • ๐Ÿ“„ 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 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"
}

Pricing

Pay-per-result: $0.01599 per result collected. You pay only for the results written to your dataset.

Results collected Approximate cost
100 results $1.60
1,000 results $15.99
10,000 results $159.90

New Apify accounts start with $5 in free credit.

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.

Related actors

Browse the full ParseForge collection for more scrapers.

๐Ÿ†˜ 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.

Input

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. 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

Pricing

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.

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 '{
    "helloWorld": 123
  }'

Examples

Input that runs as-is.

input.json
{
  "helloWorld": 123
}

Reviews

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

Issues

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.

Related scrapers

Run Municode Records Scraper on Apify All scrapers