# City Council Agenda & Legislation Monitor (Legistar) (`opendatalabs/legistar-agenda-monitor`) Actor

Track city council, county board and committee agendas, legislation, votes and attachments from 150+ US jurisdictions on Legistar. Keyword alerts, only-new monitoring, and agenda PDF text for RAG. Official public API, no proxies.

- **URL**: https://apify.com/opendatalabs/legistar-agenda-monitor.md
- **Developed by:** [Shyheim Ulrickson](https://apify.com/opendatalabs) (community)
- **Categories:** Lead generation, Business, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.55 / 1,000 agenda items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Agenda & Legislation Monitor (Legistar)

**Use it to** get alerts when US city councils and county boards put your keywords on an agenda, weeks before a vote or an RFP.

**Cost:** $3 per 1,000 agenda items ($2 per 1,000 meetings in meetings mode; agenda PDF text is $0.01 per meeting and off by default). A default run (50 items) costs about $0.15.

**Why this one**

- **Official Legistar Web API**, not HTML scraping, across 153 active jurisdictions in 33 states. Pick by city or by state.
- **Monitoring mode.** `onlyNew` returns only items you have not received before, so you pay only for new items.
- **Clean rows.** Whole-word keyword matching with a snippet, procedural boilerplate dropped, duplicate legislation collapsed, and links to every attachment.

**Sample output** (real run, Seattle, Oct 2026):

| jurisdiction | bodyName | meetingDate | title | matterType |
|---|---|---|---|---|
| City of Seattle | Select Budget Committee | 2026-10-13 | Introduction and Overview | Information Item (Inf) |
| City of Seattle | Select Budget Committee | 2026-10-13 | General Fund (GF) Balancing and Sustainability Analysis | Information Item (Inf) |
| City of Seattle | Select Budget Committee | 2026-10-13 | Voluntary Separation | Information Item (Inf) |

Track what US city councils, county boards and their committees will discuss and what they decided: agenda items, legislation, votes, staff reports and PDF attachments from **153 active US jurisdictions in 33 states** (plus any other Legistar client you name). Built on the **official public Legistar Web API**, so it needs no proxies or browser and breaks far less often than scrapers of the HTML sites.

Set **keywords** such as `data center`, `cybersecurity` or `RFP` and run it daily with **Only new records** turned on. You get alerts weeks before an RFP is posted, and each row is clean, structured JSON ready for your CRM, Slack, a spreadsheet or a RAG pipeline.

### What you get

- **Agenda items** with title, file number, legislation type and status, action taken, pass/fail result, mover and seconder, cleaned agenda notes, and direct links to the legislation page and every attachment (staff reports, contracts, presentations).
- **Meetings** with body, date, time, location, agenda and minutes status, agenda/minutes PDF links and the meeting page. Optionally includes the **full text of the agenda PDF** for LLM summarisation or RAG.
- **Keyword alerts**: whole-word, case-insensitive matching (plurals included) across titles, notes, actions and attachment names, with a snippet showing where the match was found.
- **Monitoring mode** (`onlyNew`): the Actor remembers what it already delivered, so a scheduled run returns only new items, and you only pay for new items.
- **Coverage built in**: pick jurisdictions by slug, by state (`["CA","TX"]`), or monitor all of them at once.
- **Clean data**: procedural rows (roll call, adjournment, public-comment boilerplate) are dropped by default, duplicate listings of the same legislation are collapsed, and RTF/HTML notes are converted to plain text.

### Who uses it

| Use case | Example |
|---|---|
| **GovTech / SLED sales signals** | Alert reps when a county board discusses "cybersecurity", "body cameras", "ERP replacement" or "Request for Proposals", before the bid is posted. |
| **AI agents & RAG** | Feed agents structured local-government decisions; the `meetings` mode with agenda text gives LLM-ready context with source links. |
| **Real estate & energy developers** | Watch for rezoning, data-center moratoriums, battery storage, short-term rental rules and annexations. |
| **Public affairs, lobbying, advocacy** | Track ordinances and votes across many cities from one feed. |
| **Journalists & researchers** | Build datasets of council actions with links to the primary documents. |

### Input

| Field | What it does | Default |
|---|---|---|
| `clients` | Legistar client slugs or URLs, e.g. `seattle`, `oakland`, `denver`, `cook-county`, `kingcounty`, `lacounty` | `seattle, oakland, denver` |
| `states` | Add every active jurisdiction in these states | – |
| `allRegistryClients` | Monitor all ~150 active jurisdictions | `false` |
| `daysBack` / `daysAhead` | Date window around today (agendas are typically posted 3–10 days ahead) | 7 / 14 |
| `startDate` / `endDate` | Absolute date window (overrides the above) | – |
| `keywords` | Only return items that mention any of these words or phrases | – |
| `bodyNameContains` | Filter by body, e.g. `council`, `planning`, `finance` | – |
| `outputType` | `agendaItems` (one row per item) or `meetings` (one row per meeting) | `agendaItems` |
| `extractAgendaText` | Add agenda PDF text (meetings mode) | `false` |
| `onlyNew` + `stateKey` | Monitoring memory across runs | `false` |
| `maxItems` | Hard cap on rows written (cost control). The default keeps a first run around $0.15; raise it for more cities or longer ranges. On the default demo cities (seattle, oakland, denver) the cap is shared evenly across the cities. | 50 |
| `clientTokens` | Tokens for the few cities that require one (e.g. `nyc`, `phila`) | – |

Example: daily data-center and cybersecurity alerts for all of California:

```json
{
  "states": ["CA"],
  "keywords": ["data center", "cybersecurity", "request for proposals"],
  "daysBack": 1,
  "daysAhead": 14,
  "onlyNew": true,
  "stateKey": "ca-signals"
}
```

### Sample output

An agenda item (`outputType: agendaItems`):

```json
{
  "recordType": "agenda_item",
  "client": "seattle",
  "jurisdiction": "City of Seattle",
  "state": "WA",
  "meetingId": 6910,
  "bodyName": "City Council",
  "meetingDate": "2026-10-20",
  "meetingTime": "2:00 PM",
  "meetingUrl": "https://seattle.legistar.com/MeetingDetail.aspx?LEGID=6910&GID=393&G=FFE3B678-CEF6-4197-84AC-5204EA4CFC0C",
  "agendaPdfUrl": "https://legistar2.granicus.com/seattle/meetings/2026/10/6910_A_City_Council_26-10-20_Full_Council_Meeting_Agenda.pdf",
  "itemId": 126453,
  "agendaSequence": 12,
  "agendaNumber": null,
  "title": "An ordinance relating to Seattle Public Utilities; authorizing the acquisition by negotiation or eminent domain (condemnation) of three parcels of land in Seattle for utility purposes identified as King County Parcel Numbers 302604-9100 (11762 Aurora Ave N), 302604-9116 (12004 Aurora Ave N), and 302604-9124 (12020 Aurora Ave N), authorizing the General Manager and Chief Executive Officer of Seattle Public Utilities (General Manager/CEO) or their designee to execute all documents and take other actions deemed by the General Manager/CEO or designee as necessary to complete the acquisitions; placing the real properties conveyed to the City under the jurisdiction of Seattle Public Utilities; and ratifying and confirming certain prior acts.",
  "matterId": 17371,
  "matterFile": "CB 121292",
  "matterName": "CB 121292",
  "matterType": "Council Bill (CB)",
  "matterStatus": "Full Council Agenda Ready",
  "matterUrl": "https://seattle.legistar.com/LegislationDetail.aspx?ID=17371&GUID=F9D8708B-E13E-45D9-BFAF-9670CBD41EF8",
  "isConsentItem": false,
  "actionName": null,
  "actionText": null,
  "result": null,
  "mover": null,
  "seconder": null,
  "agendaNote": null,
  "minutesNote": null,
  "attachments": [
    {
      "name": "Summary Ex A – Area Map",
      "url": "https://legistar2.granicus.com/seattle/attachments/021d6e34-34db-4b77-944b-4b8f6e7f5c17.docx"
    },
    {
      "name": "Summary and Fiscal Note",
      "url": "https://legistar2.granicus.com/seattle/attachments/e496854d-6dfa-4d03-88c5-9d5e66ae9c28.docx"
    }
  ],
  "attachmentCount": 5,
  "lastModifiedUtc": "2026-10-16T19:02:25Z",
  "scrapedAt": "2026-10-19T01:03:48Z"
}
```

A keyword alert from a run across all jurisdictions:

```json
{
  "jurisdiction": "City of Hayward",
  "state": "CA",
  "bodyName": "City Council",
  "meetingDate": "2026-10-20",
  "matterFile": "LB 26-015",
  "matterType": "Legislative Business",
  "title": "Temporary Moratorium on New Data Centers: Adopt an Interim Urgency Ordinance Pursuant to California Government Code Section 65858, Imposing a Temporary Moratorium on New Data Centers in Hayward, and Finding that the Action is Exempt from Environmental Review (Report from Development Services Director Buizer)",
  "matchedKeywords": [
    "data center"
  ],
  "matchSnippet": "Temporary Moratorium on New Data Centers: Adopt an Interim Urgency Ordinance Pursuant to California Government Code Section 65858, Imposing a Temporary Moratori…",
  "matterUrl": "https://hayward.legistar.com/LegislationDetail.aspx?ID=11059&GUID=665E3C69-5137-4C19-B13B-F404A9932E6E"
}
```

You can export results as JSON, CSV, Excel, or HTML, or fetch them through the Apify API, webhooks, Zapier, Make or n8n, or the Apify MCP server for AI agents.

### Pricing (pay per event)

| Event | Price |
|---|---|
| Agenda item delivered | **$0.003** ($3 per 1,000) |
| Meeting delivered (meetings mode) | **$0.002** |
| Agenda PDF converted to text | **$0.01** per meeting (not charged when the PDF has no extractable text, e.g. a scan) |

You never pay for procedural rows, duplicates, or records you already received in monitoring mode. Typical costs:

- **A default run** (`maxItems` 50): at most about $0.15.
- **One city, one month of agendas**: about 150 items (set `maxItems` to 150 or more), roughly $0.45.
- **Keyword alerts across all 153 jurisdictions**: in a test run, five keywords over a 12-day window matched 70 items, about $0.21. With `onlyNew` on, daily runs bill only items you haven't received yet.

Use `maxItems` and the run's maximum-charge setting to cap spend.

### FAQ

**Is this legal? Is it scraping?** The Actor reads Legistar's official public Web API, which Granicus provides so the public can reuse published agendas and legislation. It only returns items the jurisdiction has marked as public. There is no login, no CAPTCHA and no proxy. Please respect each jurisdiction's terms and use the data responsibly.

**Does it include personal data?** It returns government records. These include the names of officials acting in their public role (for example, the mover and seconder of a motion) and any names that appear in public agenda titles, such as appointments to commissions. It does not enrich or profile individuals.

**My city isn't in the list.** If your city uses Legistar (its site looks like `https://<name>.legistar.com`), just put `<name>` in `clients`. If it uses a different platform (Granicus, PrimeGov, CivicClerk, BoardDocs), let us know through the Issues tab; those platforms are on the roadmap.

**Why did a city return nothing?** Some cities publish agendas only a few days before the meeting, so widen `daysAhead`. A few (e.g. `nyc`, `phila`) require a free API token from the city; others (e.g. Chicago, Austin, San Francisco) have moved off the Legistar API. The run summary in the key-value store (`OUTPUT`) lists errors for each jurisdiction.

**How fresh is the data?** It is live: every run queries the API directly. A full run across all 153 jurisdictions takes about 2 minutes.

**Can I get the full text of staff reports?** Every attachment URL is included. `extractAgendaText` adds the agenda PDF text; text extraction for attachments is on the roadmap.

### Verified jurisdictions (active in the last 120 days)

- **AL**: City of Huntsville (`huntsvilleal`)
- **AR**: City of Jonesboro (`jonesboro`)
- **AZ**: City of Apache Junction, Arizona (`apachejunction`), City of Mesa (`mesa`), City of Phoenix (`phoenix`), Lake Havasu City (`lakehavasucity`), Pima County (`pima`)
- **CA**: Alameda-Contra Costa Transit District (`actransit`), City of Chino (`chino`), City of Costa Mesa (`costamesa`), City of Cupertino (`cupertino`), City of Hayward (`hayward`), City of Merced (`cityofmerced`), City of Murrieta (`murrieta`), City of Alameda (`alameda`), City of Dublin (`dublin`), City of Fontana (`fontana`), City of Fresno (`fresno`), City of Fullerton (`fullerton`), City of Hesperia (`hesperia`), City of Huntington Beach (`huntingtonbeach`), City of Lodi (`lodica`), City of Mountain View (`mountainview`), City of Oakland (`oakland`), City of Orange (`cityoforange`), City of Pomona (`pomona`), City of Rialto (`rialto`), City of Riverside (`riversideca`), City of Sacramento (`sacramento`), City of Salinas (`salinas`), City of San José (`sanjose`), City of Santa Clara (`santaclara`), City of Stockton (`stockton`), City of Sunnyvale (`sunnyvaleca`), City of Westminster (`westminsterca`), County of Fresno (`fresnocounty`), County of Los Angeles (`lacounty`), County of Monterey (`monterey`), County of San Mateo (`sanmateocounty`), County of Santa Barbara (`santabarbara`), Los Angeles Unified School District (`lausd`), Metro (`metro`), Napa County (`napa`), City of Newport Beach (`newportbeach`), San Bernardino County (`sanbernardino`), San Francisco Bay Area Rapid Transit District (`bart`), Solano County (`solano`), Sonoma County (`sonoma-county`), City of Temecula (`temeculaca`), Metropolitan Water District of Southern California (`mwdh2o`), City of Visalia (`visalia`)
- **CO**: Arapahoe County (`arapahoe`), City and County of Denver (`denver`), City of Colorado Springs (`coloradosprings`), Town of Erie (`erie`)
- **CT**: City of Bridgeport (`bridgeportct`)
- **FL**: City of Aventura (`cityofaventura`), Broward County (`broward`), City of Doral (`doral`), City of Clearwater (`clearwater`), City of Coconut Creek (`coconutcreek`), City of Coral Gables (`coralgables`), City of Delray Beach (`delraybeach`), City of Deltona (`deltona`), City of Fort Lauderdale (`fortlauderdale`), City of Hallandale Beach (`hallandalebeach`), City of Hollywood (`hollywoodfl`), City of Margate (`margatefl`), City of Miramar, FL (`miramar`), City of North Port (`cityofnorthport`), City of Pinellas Park (`pinellaspark`), City of Ocala (`ocala`), Pinellas County (`pinellas`), Village of Wellington (`wellington`)
- **GA**: City of Marietta (`marietta`), DeKalb County (`dekalbcountyga`), Fulton County (`fulton`)
- **ID**: City of Idaho Falls (`idahofalls`)
- **IL**: Cook County (`cook-county`), City of Joliet (`joliet`), City of Naperville (`naperville`), City of Rockford (`rockfordil`), Village of Orland Park (`orlandpark`), Village of Lombard (`lombard`), Village of Romeoville (`romeoville`)
- **KS**: City of Olathe (`olatheks`)
- **KY**: Louisville Metro (`louisville`)
- **LA**: City of Alexandria (`alexandria`)
- **MA**: City of Salem (`salem`), City of Boston (`boston`), City of Malden (`cityofmalden`), City of Revere, MA (`revere`), City of Somerville, Massachusetts (`somervillema`)
- **MD**: City of Annapolis (`annapolismd`), City of Baltimore (`baltimore`), City of Rockville (`rockvillemd`), Prince George's County (`princegeorgescountymd`)
- **MI**: City of Ann Arbor (`a2gov`)
- **MN**: City of Saint Paul (`stpaul`)
- **MO**: Kansas City (`kansascity`)
- **NC**: City of Charlotte (`charlottenc`), City of Fayetteville (`cityoffayetteville`), Mecklenburg County (`mecklenburg`), Town of Chapel Hill (`chapelhill`)
- **ND**: City of Fargo (`fargond`)
- **NH**: City of Concord (`concordnh`)
- **NJ**: City of Newark (`newark`)
- **NM**: City of Albuquerque (`cabq`)
- **NV**: Clark County (`clark`)
- **NY**: City of Mount Vernon, New York (`mountvernonny`), City of Yonkers (`yonkersny`)
- **OH**: City of Cincinnati (`cincinnatioh`), City of Columbus (`columbus`), City of Toledo (`toledo`), City of Cleveland (`cityofcleveland`)
- **PA**: City of Allentown (`allentownpa`), City of Pittsburgh (`pittsburgh`)
- **RI**: City of Providence (`providenceri`)
- **TN**: Metropolitan Nashville and Davidson County, TN (`nashville`)
- **TX**: City of McKinney (`mckinney`), City of Carrollton (`carrolltontx`), City of Coppell, Texas (`coppell`), City of Corpus Christi (`corpuschristi`), City of Dallas (`cityofdallas`), City of Keller (`cityofkeller`), City of Killeen (`killeen`), City of Laredo (`cityoflaredo`), City of League City, TX (`leaguecity`), City of Lewisville, TX (`cityoflewisville`), City of Mesquite, Texas (`mesquite`), City of New Braunfels, Texas (`newbraunfels`), City of Pflugerville (`pflugerville`), City of Plano, TX (`plano`), City of Round Rock (`roundrock`), City of San Marcos (`sanmarcos`), City of El Paso (`elpasotexas`)
- **VA**: City of Hampton (`hampton`), City of Richmond (`richmondva`)
- **WA**: City of Bellevue (`bellevue`), City of Olympia (`olympia`), City of Redmond - Meetings Calendar (`redmond`), City of Tacoma (`cityoftacoma`), King County (`kingcounty`), City of Seattle (`seattle`), Snohomish County (`snohomish`)
- **WI**: City of Appleton (`cityofappleton`), City of La Crosse, Wisconsin (`cityoflacrosse`), City of Madison (`madison`), City of Milwaukee (`milwaukee`), City of Waukesha (`waukesha`), City of West Allis (`westalliswi`), Dane County (`dane`), Milwaukee County (`milwaukeecounty`)

Restricted (need a token from the city): New York City Council (`nyc`), Philadelphia (`phila`), Oceanside CA (`oceanside`), Broken Arrow OK (`brokenarrow`).

***

*This Actor is not affiliated with Granicus or any government. Data comes from the respective public agencies.*

### Feedback

This Actor is new and actively maintained. If a run fails, a field is missing, or a result looks wrong, please open an issue on the **Issues** tab with the run ID. We read and reply to every issue, and suggestions for new filters or fields are very welcome.

# Actor input Schema

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

Legistar client names: the subdomain of <client>.legistar.com, e.g. seattle, oakland, denver, boston, cook-county, kingcounty, lacounty. A full https://<client>.legistar.com URL also works. See the README for the 150+ verified jurisdictions.

## `states` (type: `array`):

Two-letter US state codes (e.g. CA, TX, FL). Adds all active jurisdictions from the built-in registry for those states.

## `allRegistryClients` (type: `boolean`):

Run across every active jurisdiction in the built-in registry. Best combined with keywords and onlyNew on a daily schedule.

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

Include meetings from this many days before today. Ignored if startDate is set.

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

Include scheduled meetings up to this many days after today (agendas are usually published 3-10 days ahead). Ignored if endDate is set.

## `startDate` (type: `string`):

YYYY-MM-DD. Overrides daysBack.

## `endDate` (type: `string`):

YYYY-MM-DD. Overrides daysAhead.

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

Only return agenda items mentioning any of these words or phrases (case-insensitive; matched against title, matter type, notes, action text and attachment names). Example: data center, cybersecurity, RFP, rezoning, short-term rental. Leave empty to return everything.

## `bodyNameContains` (type: `string`):

Case-insensitive filter on the meeting body, e.g. 'council', 'planning', 'finance'.

## `outputType` (type: `string`):

agendaItems = one row per agenda item (best for alerts, lead gen, RAG); meetings = one row per meeting (calendar sync, agenda PDF text).

## `includeProceduralItems` (type: `boolean`):

Also return rows with no legislation attached (roll call, section headers, adjournment). Off by default to keep results useful and cheaper.

## `dedupeMatters` (type: `boolean`):

Some jurisdictions publish the same legislation on two concurrent meetings the same day (e.g. Council + Successor Agency). Keep only the first listing per matter per day.

## `extractAgendaText` (type: `boolean`):

Download each meeting's agenda PDF and add its text (for RAG / LLM summarisation). Charged as a separate 'agenda-text' event.

## `maxTextChars` (type: `integer`):

Truncate extracted agenda text to this many characters per meeting.

## `onlyNew` (type: `boolean`):

Remember what earlier runs delivered (in a named key-value store) and only output items you have not received before. Use with a schedule.

## `stateKey` (type: `string`):

Separate memory for different monitors when onlyNew is on (letters, numbers, dashes).

## `maxItems` (type: `integer`):

Hard cap on rows written (cost control). The default of 50 keeps a first run around $0.15 at $0.003 per agenda item; raise it for wider date ranges or more cities.

## `clientTokens` (type: `object`):

A few jurisdictions (e.g. nyc, phila) require a free token issued by that city. Map client slug to token: {"nyc": "..."}.

## Actor input object example

```json
{
  "clients": [
    "seattle",
    "oakland",
    "denver"
  ],
  "states": [],
  "allRegistryClients": false,
  "daysBack": 7,
  "daysAhead": 14,
  "keywords": [],
  "outputType": "agendaItems",
  "includeProceduralItems": false,
  "dedupeMatters": true,
  "extractAgendaText": false,
  "maxTextChars": 20000,
  "onlyNew": false,
  "stateKey": "default",
  "maxItems": 50,
  "clientTokens": {}
}
```

# Actor output Schema

## `results` (type: `string`):

Agenda items and meetings delivered by this run (switch views to see meetings).

## `runSummary` (type: `string`):

Run summary: cities, meetings and agenda items processed, stop reason and warnings.

# 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",
        "oakland",
        "denver"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("opendatalabs/legistar-agenda-monitor").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",
        "oakland",
        "denver",
    ],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("opendatalabs/legistar-agenda-monitor").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",
    "oakland",
    "denver"
  ],
  "maxItems": 50
}' |
apify call opendatalabs/legistar-agenda-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,opendatalabs/legistar-agenda-monitor"
        }
    }
}
```

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/lUMzTYSpQnI8QBkuE/builds/d97FkedaNqX5V6M9c/openapi.json
