# FastDemocracy Legislative Bill Tracker (`crawlerbros/fastdemocracy-legislative-bill-tracker`) Actor

Track legislation across the US Congress and all 50 states. Search bills by keyword, browse by state or legislative session, and pull full bill detail - sponsors, votes, actions, and bill text links. Sourced from the free public FastDemocracy bill-tracking site.

- **URL**: https://apify.com/crawlerbros/fastdemocracy-legislative-bill-tracker.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, News, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

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

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## FastDemocracy Legislative Bill Tracker

Track legislation across the **US Congress and all 50 states** (plus DC, Puerto Rico, and several major cities). Search bills by keyword, browse a jurisdiction's current bills, browse a specific legislative session, or pull full bill detail — sponsors, chamber, status timeline, roll-call votes, action history, and bill text/document links. Sourced from the free public [FastDemocracy](https://fastdemocracy.com) bill-tracking site — no login, no API key.

### Data source (and why not LegiScan)

This actor was originally scoped to scrape **legiscan.com**. During implementation, legiscan.com (and, for the same reason, **congress.gov**) were confirmed to sit behind an unsolvable Cloudflare Turnstile "Just a moment..." challenge on **every** page, including the homepage — verified from:

- A residential ISP IP using plain `curl`, `curl_cffi` (chrome131 impersonation), Playwright headless with `playwright-stealth`, and Camoufox with `humanize=True` — all blocked.
- Anthropic's own hosted fetch infrastructure — blocked.
- **Apify's cloud, via a real `apify call`** — blocked both with a **direct connection** and through the **free AUTO proxy group** (Playwright + stealth, confirmed via two live cloud runs).

Per the project's Zero-Cost Cloud Reliability policy, a target that fails on Apify's free datacenter IPs even through AUTO proxy — with no residential-proxy option available — must be replaced rather than fought. **FastDemocracy** covers the same category (public legislative/regulatory data), the same jurisdictional scope (Congress + 50 states) as LegiScan, is fully server-rendered (no JS challenge), and its `robots.txt` is permissive (`Disallow: /members/` and `/readme.html` only) — unlike legiscan.com/congress.gov, which explicitly blocklist AI crawlers site-wide.

### What this actor does

- **Five modes:** `search`, `byState`, `bySession`, `billDetail`, `legislators`
- **60 jurisdictions:** US Congress, all 50 states, DC, Puerto Rico, and 5 major cities (Chicago, Saint Louis, Baltimore, Denver, NYC) — plus two aggregate scopes (`congress50`, `states`) for cross-jurisdiction keyword search
- **Rich bill detail:** status timeline (Introduced → Passed chamber → Became Law), full sponsor list with party/district, complete action history, roll-call votes with yes/no/other counts and named voters, every bill text version, committee analyses/documents, and official state-legislature source links
- **Legislator directory:** `legislators` mode browses every current member of a jurisdiction's legislature (name, party, chamber, district, photo) — the easiest way to find a `sponsorId` for the other modes, filterable by chamber, party, and name
- **Empty fields are omitted**

### Output per record

**Search / browse records** (`recordType: "legislativeBillSummary"`):
- `jurisdiction`, `jurisdictionName`, `session`, `chamber` (`upper`/`lower`), `chamberFull`
- `billId` (e.g. `SB 28`, `HR 9449`), `fdId`, `title`
- `sponsors[]` (`name`, `legislatorId`, `legislatorUrl`), `primarySponsor`, `sponsorCount`
- `lastActionText`, `lastActionDate`, `lastActionChamber`
- `latestBillTextUrl`, `latestBillTextLabel`
- `billUrl`, `sourceUrl`, `recordType`, `scrapedAt`

**Bill detail records** (`recordType: "legislativeBill"`, mode=billDetail):
- All of the above, plus:
- `billType` (e.g. "California Senate Bill"), `statusTimeline[]` (`stage`, `date`, `reached`), `currentStage`
- `sponsors[]` with `role`, `party`, `district`
- `actions[]` (`date`, `chamber`, `description`), `actionCount`
- `votes[]` (`date`, `chamber`, `motion`, `yesCount`, `noCount`, `otherCount`, `yesVoters[]`, `noVoters[]`, `otherVoters[]`), `voteCount`
- `billTexts[]` (`label`, `url`, `format`), `billTextCount`
- `documents[]` (`label`, `url`), `documentCount`
- `sources[]` — official state-legislature / congress.gov links

**Legislator directory records** (`recordType: "legislator"`, mode=legislators):
- `jurisdiction`, `jurisdictionName`, `session`
- `legislatorId` (e.g. `CAL000276`, `USL000427`), `fullName`, `firstName`, `lastName`
- `party`, `chamber` (`upper`/`lower`), `chamberFull`, `district`
- `photoUrl`, `legislatorUrl`, `sourceUrl`, `recordType`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | `search` / `byState` / `bySession` / `billDetail` / `legislators` |
| `jurisdiction` | select | `US` | US Congress, a specific state/city, or an aggregate (`congress50`, `states` — search mode only) |
| `keyword` | string | `climate` | Free-text search; required for mode=search |
| `session` | string | – | Legislative session (e.g. `2025-2026`, or `119` for Congress); required for mode=bySession; optional for mode=legislators (blank = current) |
| `sponsorId` | string | – | Restrict to bills sponsored by this legislator ID (e.g. `CAL000226`) |
| `firstSponsorOnly` | boolean | `false` | Only match when `sponsorId` is the primary sponsor |
| `chamber` | select | Any | `upper` (Senate) / `lower` (House/Assembly) — applies to bills or, mode=legislators, members |
| `partyQuery` | string | – | Substring match on party (mode=legislators), e.g. `Democratic` |
| `legislatorNameQuery` | string | – | Substring match on legislator full name (mode=legislators) |
| `billUrls` | array | – | Full bill detail URLs (mode=billDetail) |
| `maxItems` | integer | `50` | Hard cap (1–1000) |
| `proxyConfiguration` | proxy | `{useApifyProxy: true}` | Optional fallback if FastDemocracy ever blocks the direct connection |

#### Example: search Congress + all states for a topic

```json
{
  "mode": "search",
  "jurisdiction": "congress50",
  "keyword": "artificial intelligence",
  "maxItems": 100
}
````

#### Example: browse California's current bills

```json
{
  "mode": "byState",
  "jurisdiction": "CA",
  "maxItems": 50
}
```

#### Example: browse a specific session

```json
{
  "mode": "bySession",
  "jurisdiction": "CA",
  "session": "2025-2026",
  "keyword": "housing"
}
```

#### Example: full bill detail

```json
{
  "mode": "billDetail",
  "billUrls": ["https://fastdemocracy.com/bill-search/ca/2025-2026/bills/CAB00033323/"]
}
```

#### Example: browse a state's legislator directory

```json
{
  "mode": "legislators",
  "jurisdiction": "CA",
  "chamber": "upper",
  "partyQuery": "Democratic"
}
```

### Use cases

- **Advocacy & lobbying** — track bills by topic or sponsor across every state at once
- **Legal/compliance research** — monitor regulatory bills relevant to an industry
- **Journalism** — pull full vote records and sponsor lists for a story
- **Civic tech** — build state-by-state legislative dashboards
- **Academic research** — bulk export of legislative activity and roll-call votes

### Limitations

- **Bill text link formats vary by state.** `billTexts[].url` / `latestBillTextUrl` always point to the official state legislature (or congress.gov) page for that version, and are always accessible (verified `200` from a clean shell for Texas, New York, California, and US Congress). However, the underlying **content-type depends entirely on how each state publishes it** — Congress and New York serve the raw file directly (`application/pdf`), while California's `leginfo.legislature.ca.gov` serves an HTML viewer page for the same document (its official site does not expose a direct-download PDF endpoint). This is an upstream state-website architecture difference, not a broken or hotlink-blocked URL.
- **Roll-call votes** are only available for chambers/actions that FastDemocracy has recorded a named vote for; voice votes and unrecorded actions won't have a `votes` entry.
- **Session identifiers are state-specific** and not independently validated against a master list — an unrecognized `session` value simply returns fewer/no results rather than an error.
- **`partyQuery` is a substring filter, not a dropdown.** Some jurisdictions report fusion/cross-endorsed labels (e.g. New York's `Republican/Democratic`), so an exact-value enum would silently miss real legislators; a contains-match on e.g. `Democratic` catches both the plain and fusion labels.
- **`photoUrl` (mode=legislators):** ~96% of sampled photo URLs resolve `200 image/*` from a clean shell. A small fraction are broken at the source — some state legislature media servers (e.g. `webapi.assembly.ca.gov`) 404 on individual member photos, independent of anything this actor does. US Congress photos (`bioguide.congress.gov`) reliably return `200 image/jpeg` on a normal `GET` (how browsers and downloaders fetch images) but return `403` on a bare `HEAD` request with no `User-Agent` — a quirk of that server, not a hotlink block.

### FAQ

**Does this cover state legislatures or just Congress?** Both — pick a specific state/city in `jurisdiction`, or `US` for Congress, or the `congress50`/`states` aggregates for cross-jurisdiction keyword search.

**What's a "session"?** Most states use a two-year session like `2025-2026`; the US Congress uses a Congress number like `119`. Leave blank to use each jurisdiction's current/default session.

**How do I get a legislator's ID for `sponsorId`?** Any prior result's `sponsors[].legislatorId` field, or the last path segment of a `legislatorUrl` (e.g. `CAL000226`).

**Are the vote records complete?** Yes for chambers that publish roll-call votes on FastDemocracy — each vote includes the motion text, yes/no/other counts, and the named voters where available (voice votes without a recorded roll call won't have a `votes` entry).

**Are bill text/document links stable?** Yes — they point directly to the official state legislature or congress.gov servers (PDF/HTML), verified accessible without cookies or a Referer header.

**How do I find a `sponsorId` without already having a bill result?** Use `mode: "legislators"` with the target `jurisdiction` — it returns every current member's `legislatorId`, name, party, chamber, and district, so you can look one up by name (`legislatorNameQuery`) before running a sponsor-filtered bill search.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `jurisdiction` (type: `string`):

US Congress, an aggregate scope (mode=search only), or a specific state/city. mode=byState/bySession/legislators require a specific jurisdiction (not an aggregate).

## `keyword` (type: `string`):

Free-text search across bill titles and (where indexed) summaries. Required for mode=search; optional browse-narrower on byState/bySession.

## `session` (type: `string`):

State-specific session identifier, e.g. `2025-2026` for most states, or a Congress number like `119` for US Congress. Leave blank elsewhere to use the current/default session.

## `sponsorId` (type: `string`):

Restrict results to bills sponsored by this FastDemocracy legislator ID (e.g. `CAL000226`, `USL000556`) — found in a prior result's `sponsors[].legislatorId`, or via mode=legislators.

## `firstSponsorOnly` (type: `boolean`):

When `sponsorId` is set, only match bills where this legislator is the first-listed (primary) sponsor.

## `chamber` (type: `string`):

Filter to bills (or, mode=legislators, members) originating in/belonging to a specific chamber.

## `partyQuery` (type: `string`):

Case-insensitive substring match against the legislator's party (e.g. `Democratic`, `Republican`, `Independent`). Some states report fusion/cross-endorsed labels (e.g. `Republican/Democratic` in NY), so this is a contains-match rather than an exact dropdown.

## `legislatorNameQuery` (type: `string`):

Case-insensitive substring match against the legislator's full name.

## `billUrls` (type: `array`):

Full fastdemocracy.com bill detail URLs, e.g. `https://fastdemocracy.com/bill-search/ca/2025-2026/bills/CAB00033323/` (copy from a prior result's `billUrl` field).

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

Hard cap on emitted records. For search/byState/bySession, the actor paginates until this cap or the source's own reported total match count is reached, whichever is smaller, and automatically re-sweeps once if the first pass falls short. Note: fastdemocracy.com's search index has no stable sort key, so on rare occasions a handful of records (well under 1%) may not be recoverable within a single run even after the re-sweep, if the live index reshuffles between every request.

## `proxyConfiguration` (type: `object`):

Optional. FastDemocracy is publicly accessible without a proxy; the actor tries a direct connection first and only engages this free Apify datacenter proxy as a fallback if the direct request is blocked.

## Actor input object example

```json
{
  "mode": "search",
  "jurisdiction": "US",
  "keyword": "climate",
  "firstSponsorOnly": false,
  "chamber": "",
  "billUrls": [
    "https://fastdemocracy.com/bill-search/us/119/bills/USB00106360/"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `bills` (type: `string`):

Dataset containing all scraped bills.

# 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 = {
    "mode": "search",
    "jurisdiction": "US",
    "keyword": "climate",
    "firstSponsorOnly": false,
    "chamber": "",
    "billUrls": [
        "https://fastdemocracy.com/bill-search/us/119/bills/USB00106360/"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/fastdemocracy-legislative-bill-tracker").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 = {
    "mode": "search",
    "jurisdiction": "US",
    "keyword": "climate",
    "firstSponsorOnly": False,
    "chamber": "",
    "billUrls": ["https://fastdemocracy.com/bill-search/us/119/bills/USB00106360/"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/fastdemocracy-legislative-bill-tracker").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "mode": "search",
  "jurisdiction": "US",
  "keyword": "climate",
  "firstSponsorOnly": false,
  "chamber": "",
  "billUrls": [
    "https://fastdemocracy.com/bill-search/us/119/bills/USB00106360/"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call crawlerbros/fastdemocracy-legislative-bill-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/fastdemocracy-legislative-bill-tracker",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "FastDemocracy Legislative Bill Tracker",
        "description": "Track legislation across the US Congress and all 50 states. Search bills by keyword, browse by state or legislative session, and pull full bill detail - sponsors, votes, actions, and bill text links. Sourced from the free public FastDemocracy bill-tracking site.",
        "version": "1.0",
        "x-build-id": "8cQOYcXxkgllbLoAl"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~fastdemocracy-legislative-bill-tracker/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-fastdemocracy-legislative-bill-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/crawlerbros~fastdemocracy-legislative-bill-tracker/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-fastdemocracy-legislative-bill-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/crawlerbros~fastdemocracy-legislative-bill-tracker/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-fastdemocracy-legislative-bill-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "byState",
                            "bySession",
                            "billDetail",
                            "legislators"
                        ],
                        "type": "string",
                        "description": "What to fetch.",
                        "default": "search"
                    },
                    "jurisdiction": {
                        "title": "Jurisdiction",
                        "enum": [
                            "US",
                            "congress50",
                            "states",
                            "AL",
                            "AK",
                            "AZ",
                            "AR",
                            "CA",
                            "CO",
                            "CT",
                            "DC",
                            "DE",
                            "FL",
                            "GA",
                            "HI",
                            "ID",
                            "IL",
                            "IN",
                            "IA",
                            "KS",
                            "KY",
                            "LA",
                            "ME",
                            "MD",
                            "MA",
                            "MI",
                            "MN",
                            "MS",
                            "MO",
                            "MT",
                            "NE",
                            "NV",
                            "NH",
                            "NJ",
                            "NM",
                            "NY",
                            "NC",
                            "ND",
                            "OH",
                            "OK",
                            "OR",
                            "PA",
                            "PR",
                            "RI",
                            "SC",
                            "SD",
                            "TN",
                            "TX",
                            "UT",
                            "VT",
                            "VA",
                            "WA",
                            "WV",
                            "WI",
                            "WY",
                            "CH",
                            "SL",
                            "BL",
                            "DV",
                            "YC"
                        ],
                        "type": "string",
                        "description": "US Congress, an aggregate scope (mode=search only), or a specific state/city. mode=byState/bySession/legislators require a specific jurisdiction (not an aggregate).",
                        "default": "US"
                    },
                    "keyword": {
                        "title": "Keyword (mode=search)",
                        "type": "string",
                        "description": "Free-text search across bill titles and (where indexed) summaries. Required for mode=search; optional browse-narrower on byState/bySession.",
                        "default": "climate"
                    },
                    "session": {
                        "title": "Legislative session (mode=bySession / legislators)",
                        "type": "string",
                        "description": "State-specific session identifier, e.g. `2025-2026` for most states, or a Congress number like `119` for US Congress. Leave blank elsewhere to use the current/default session."
                    },
                    "sponsorId": {
                        "title": "Sponsor legislator ID",
                        "type": "string",
                        "description": "Restrict results to bills sponsored by this FastDemocracy legislator ID (e.g. `CAL000226`, `USL000556`) — found in a prior result's `sponsors[].legislatorId`, or via mode=legislators."
                    },
                    "firstSponsorOnly": {
                        "title": "First (primary) sponsor only",
                        "type": "boolean",
                        "description": "When `sponsorId` is set, only match bills where this legislator is the first-listed (primary) sponsor.",
                        "default": false
                    },
                    "chamber": {
                        "title": "Chamber",
                        "enum": [
                            "",
                            "upper",
                            "lower"
                        ],
                        "type": "string",
                        "description": "Filter to bills (or, mode=legislators, members) originating in/belonging to a specific chamber.",
                        "default": ""
                    },
                    "partyQuery": {
                        "title": "Party contains (mode=legislators)",
                        "type": "string",
                        "description": "Case-insensitive substring match against the legislator's party (e.g. `Democratic`, `Republican`, `Independent`). Some states report fusion/cross-endorsed labels (e.g. `Republican/Democratic` in NY), so this is a contains-match rather than an exact dropdown."
                    },
                    "legislatorNameQuery": {
                        "title": "Legislator name contains (mode=legislators)",
                        "type": "string",
                        "description": "Case-insensitive substring match against the legislator's full name."
                    },
                    "billUrls": {
                        "title": "Bill URLs (mode=billDetail)",
                        "type": "array",
                        "description": "Full fastdemocracy.com bill detail URLs, e.g. `https://fastdemocracy.com/bill-search/ca/2025-2026/bills/CAB00033323/` (copy from a prior result's `billUrl` field).",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Hard cap on emitted records. For search/byState/bySession, the actor paginates until this cap or the source's own reported total match count is reached, whichever is smaller, and automatically re-sweeps once if the first pass falls short. Note: fastdemocracy.com's search index has no stable sort key, so on rare occasions a handful of records (well under 1%) may not be recoverable within a single run even after the re-sweep, if the live index reshuffles between every request.",
                        "default": 50
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional. FastDemocracy is publicly accessible without a proxy; the actor tries a direct connection first and only engages this free Apify datacenter proxy as a fallback if the direct request is blocked.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
