# City Council Agendas API: Legistar Items, Votes & PDFs | $1/1k (`transparent_meteorite/city-council-agendas`) Actor

Upcoming and recent city council and committee agenda items from 18 US cities as structured rows: meeting date, body, matter file, type, status, action, vote result, attachment and agenda PDF links. Official Legistar Web API, keyword filters, deduped alerts. $0.001 per item.

- **URL**: https://apify.com/transparent_meteorite/city-council-agendas.md
- **Developed by:** [Matthew Michels](https://apify.com/transparent_meteorite) (community)
- **Categories:** Real estate, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 agenda item returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## City Council Agendas API: agenda items, votes and PDFs from 18 US cities

**Know what is on a city council or committee agenda before the meeting: one clean row per agenda item, with the matter number, status, vote result and links to the agenda PDF and attachments.**

Pulled from the official public **Legistar Web API** (`webapi.legistar.com`), the same records cities publish on their own council sites. Seattle, Denver, Boston, Phoenix, San Jose, Nashville, Baltimore and 11 more cities. No scraping of HTML, no AI, no account needed.

### Sample output

Real rows from a run on Oct 5, 2026:

| City | Meeting | Body | File | Type | Item | Action | Vote |
|---|---|---|---|---|---|---|---|
| Denver, CO | 2026-09-28 | City Council | 26-1339 | Resolution | A resolution approving a proposed Fifth Amendatory Agreement between the City and... | adopted | Pass |
| Denver, CO | 2026-09-28 | City Council | 26-1306 | Resolution | A resolution approving the City Council appointment of Angel Hurtado to the Housing... | adopted | Pass |
| Denver, CO | 2026-09-28 | City Council | 26-1421 | Proclamation | A Proclamation Honoring the Lifetime Leadership and Legacy of Dolores Huerta | adopted | Pass |
| Seattle, WA | 2026-09-29 | Select Budget Committee | Inf 2966 | Information Item | Office of Planning and Community Development (OPCD) | | |
| Seattle, WA | 2026-09-28 | Select Budget Committee | Inf 2962 | Information Item | Seattle Department of Transportation (SDOT) | heard in Committee | |

One full row:

```json
{
  "city": "Denver, CO",
  "client": "denver",
  "body": "City Council",
  "meetingDate": "2026-09-28",
  "meetingTime": "3:30 PM",
  "location": "Cathy Reynolds City Council Chamber, 1437 Bannock Street, Room 450",
  "agendaStatus": "Final",
  "title": "A Proclamation Honoring the Lifetime Leadership and Legacy of Dolores Huerta",
  "matterFile": "26-1421",
  "matterType": "Proclamation",
  "matterStatus": "Adopted",
  "action": "adopted",
  "voteResult": "Pass",
  "attachmentUrls": ["https://denver.legistar1.com/denver/attachments/edd8d0df-6a71-4c37-b596-35aed884d391.pdf"],
  "agendaPdfUrl": "https://denver.legistar1.com/denver/meetings/2026/9/12963_A_City_Council_26-09-28_Council_Agenda.pdf",
  "meetingUrl": "https://denver.legistar.com/MeetingDetail.aspx?LEGID=12963&GID=655&G=928A1C29-26D7-4A5D-8DD4-947A533B1CC6",
  "eventId": 12963
}
```

### What you get

One row per agenda item:

| Field | What it is |
|---|---|
| `city`, `client` | City name and its Legistar slug |
| `body` | Council or committee, e.g. "City Council", "Land Use Committee" |
| `meetingDate`, `meetingTime`, `location`, `agendaStatus` | When and where, and whether the agenda is draft or final |
| `agendaItemNumber`, `agendaSequence`, `title` | The item as it appears on the agenda |
| `matterFile`, `matterName`, `matterType`, `matterStatus`, `matterId` | The legislative file behind the item (ordinance, resolution, contract, appointment...) |
| `action`, `voteResult`, `voteTally` | What happened, when the city records it |
| `agendaNote`, `minutesNote` | Clerk notes |
| `attachmentUrls` | Staff reports, contracts, maps and other PDFs for the item |
| `agendaPdfUrl`, `minutesPdfUrl`, `meetingUrl` | The official documents and the meeting page |
| `eventId`, `eventItemId` | Legistar ids |

Turn on `includeMatterDetails` to add `matterTitle`, `matterIntroDate`, `matterPassedDate` and `matterBodyName` (one extra request per item). Export as CSV, Excel or JSON, or read it from the API.

**Cities supported (18, verified without a token):** Seattle, San Jose, Denver, Boston, Phoenix, Oakland, Pittsburgh, Newark, Santa Clara, Cleveland, Kansas City, Columbus, Nashville, Milwaukee, Louisville, Fresno, Sacramento and Baltimore.

### Quick start

Press **Start** with the prefilled form: up to 200 agenda items from the past 7 days and next 30 days in all 18 cities, $0.20 at most.

Zoning and rezoning items in Seattle and Denver:

```json
{ "clients": ["seattle", "denver"], "keywords": ["zoning", "rezone", "land use"], "maxResults": 500 }
```

Contracts and bids in front of the Phoenix and San Jose councils next month:

```json
{ "clients": ["phoenix", "sanjose"], "keywords": ["contract", "agreement", "bid", "purchase"], "daysBack": 0, "daysAhead": 30 }
```

Daily alert feed for one committee (schedule it once a day):

```json
{ "clients": ["seattle"], "bodyFilter": "budget", "daysBack": 0, "daysAhead": 14, "onlyNewSinceLastRun": true }
```

### Pricing

**$0.001 per agenda item returned** ($1 per 1,000 items). No subscription.

| You pull | You pay |
|---|---|
| 200 items (the prefilled Start) | $0.20 |
| 1,000 items | $1.00 |
| 30 new items a day for a month (900 items) | $0.90 |

With `onlyNewSinceLastRun` on (the default), items you already received are skipped and never charged again: run it twice with the same input and the second run charges $0. Meetings, unsupported cities and errors are never charged. Use `maxResults` to cap any run.

### Use with the API, n8n, Make, Zapier, Clay or AI agents

**API** (returns the rows in one call):

```bash
curl -X POST "https://api.apify.com/v2/acts/transparent_meteorite~city-council-agendas/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"clients":["denver"],"keywords":["zoning"],"onlyNewSinceLastRun":false}'
```

**Python**

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("transparent_meteorite/city-council-agendas").call(run_input={"clients": ["denver"], "keywords": ["zoning"]})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["meetingDate"], item["body"], item["matterFile"], item["title"])
```

- **n8n, Make, Zapier:** use the Apify app's "Run Actor" step with actor `transparent_meteorite/city-council-agendas` on a daily schedule, then post new items to Slack, email or a sheet.
- **Clay:** add an HTTP API column that calls the run-sync endpoint with a city slug and keyword.
- **AI agents (MCP):** connect `https://mcp.apify.com?tools=transparent_meteorite/city-council-agendas` to Claude, Cursor or any MCP client, and ask "what is on the Denver City Council agenda this week?".

### Use cases

- **Government relations and lobbying:** track every item that touches your clients' issues across 18 cities.
- **Real estate developers and land-use attorneys:** catch rezoning, variance and land-use items before the hearing.
- **Contractors and vendors:** see contracts, purchases and agreements going to council for approval.
- **Local journalists and newsletters:** a structured daily feed of what councils are voting on.
- **Civic tech and researchers:** build searchable archives of local legislation.

### FAQ

#### How do I get city council agendas automatically?

Schedule the actor daily with `daysBack: 0`, `daysAhead: 14`, your `keywords` and `onlyNewSinceLastRun` on. Each run returns only agenda items you have not seen yet.

#### How do I track zoning or liquor-license items in my city?

Set `clients` to your city's slug, `keywords` to `["zoning","rezone","liquor"]`, and optionally `bodyFilter` to `planning` or `land use`.

#### Which cities are covered?

The 18 cities listed above. You can also try any other Legistar client slug (the part before `.legistar.com`): if it works without a token you get data, and if not you get a clear "unsupported" note and no charge.

#### Does this include New York, Chicago or Los Angeles?

No. NYC requires a private API token, and Chicago, Austin, Los Angeles and San Francisco are not available on the public Legistar API.

#### Can I get the agenda PDF and staff reports?

Yes. Each row links the meeting's agenda PDF, the minutes PDF when published, and the item's attachments when the city posts them.

#### Does it include how each council member voted?

No. You get the result (for example "Pass") when the city records it, not the per-member roll call. Sponsor, mover and seconder names are left out by design.

#### Does the actor use AI?

No. It reads the official Legistar API and maps the fields, so the text is exactly what the city published.

### Limitations

- **Legistar only.** Cities on other platforms (CivicClerk, PrimeGov, Granicus without Legistar and others) are not covered.
- **Fields depend on the city.** `agendaItemNumber`, `voteResult`, `action`, attachments and minutes only appear when the city fills them in. In one real Denver/Seattle/Boston sample, about 20% of items had a vote result and 45% an attachment. Future meetings usually have no actions yet.
- **Agendas appear when cities post them.** Meetings whose agenda is not published yet return no rows.
- Procedural rows (Call to Order, Public Comment) are included as published; use `keywords` to focus on substantive items.
- Polite by design: at most 4 requests per second with retries, so wide multi-city runs take a few minutes.
- Public records as published by each city, which can change. Check `meetingUrl` or `agendaPdfUrl` for the authoritative document.

### Related actors

- [Career Site Jobs API](https://apify.com/transparent_meteorite/ats-open-roles): open jobs from Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee career sites.
- [Website Tech Stack Detector](https://apify.com/transparent_meteorite/website-tech-stack-detector): CMS, ecommerce, analytics and 300+ technologies for any list of domains.
- [FMCSA New Carrier Leads](https://apify.com/transparent_meteorite/fmcsa-new-carrier-leads): new US trucking companies with email and phone.
- [WARN Layoff Notices](https://apify.com/transparent_meteorite/warn-layoff-alerts): Texas WARN Act layoff notices.

Want another city or a field? Open an issue on the Issues tab and we reply quickly.

# Actor input Schema

## `clients` (type: `array`):

Legistar city slugs (the part before .legistar.com), e.g. seattle, denver, boston, phoenix, nashville. Leave empty for all 18 built-in cities. Any other Legistar slug can be tried; cities that need a private token are reported as unsupported and never charged.

## `keywords` (type: `array`):

Keep only items whose title or matter name contains ANY of these (not case-sensitive), e.g. zoning, rezone, liquor license, contract, bond. Leave empty for every item.

## `bodyFilter` (type: `string`):

Part of the committee or body name, e.g. "planning", "city council", "budget". Not case-sensitive. Empty = all bodies.

## `maxResults` (type: `integer`):

Hard cap on agenda items returned, and charged, in this run. At $0.001 per item, 1,000 items = $1.

## `onlyNewSinceLastRun` (type: `boolean`):

Skip items you already received in an earlier run (and never charge for them again). Turn off to re-pull the same date range.

## `dateFrom` (type: `string`):

Start of the meeting date range, YYYY-MM-DD. Leave empty to use "Days back".

## `dateTo` (type: `string`):

End of the meeting date range, YYYY-MM-DD. Leave empty to use "Days ahead".

## `daysBack` (type: `integer`):

Used when 'Meetings from' is empty.

## `daysAhead` (type: `integer`):

Used when 'Meetings to' is empty.

## `includeAttachments` (type: `boolean`):

Add attachment links (staff reports, ordinance text) per item.

## `includeMatterDetails` (type: `boolean`):

One extra request per item with a matter, adds matterTitle, matterIntroDate, matterPassedDate, matterBodyName.

## `includeCancelled` (type: `boolean`):

Include meetings whose agenda status is Cancelled.

## `maxEventsPerClient` (type: `integer`):

Safety cap on meetings fetched per city per run.

## Actor input object example

```json
{
  "clients": [
    "seattle",
    "denver",
    "boston"
  ],
  "maxResults": 200,
  "onlyNewSinceLastRun": true,
  "daysBack": 7,
  "daysAhead": 30,
  "includeAttachments": true,
  "includeMatterDetails": false,
  "includeCancelled": false,
  "maxEventsPerClient": 150
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "clients": [
        "seattle",
        "denver",
        "boston"
    ],
    "maxResults": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("transparent_meteorite/city-council-agendas").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "clients": [
        "seattle",
        "denver",
        "boston",
    ],
    "maxResults": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("transparent_meteorite/city-council-agendas").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "clients": [
    "seattle",
    "denver",
    "boston"
  ],
  "maxResults": 200
}' |
apify call transparent_meteorite/city-council-agendas --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,transparent_meteorite/city-council-agendas"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ibCBXKSdYhek5QmMY/builds/OVdTI3sMWIfbD2bM0/openapi.json
