# LegiScan Bill Scraper - 50 States & Congress, Status, Sponsors (`scrapersdelight/legiscan-bill-scraper`) Actor

Scrape LegiScan bills for all 50 states, DC and US Congress: keyword search, a state's whole session or bill URLs. Each row: status and date, last action, sponsors with party, history, roll-call votes, subjects, committee, state text links. Monitor mode, RSS feeds. No API key, no login.

- **URL**: https://apify.com/scrapersdelight/legiscan-bill-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** News, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $18.00 / 1,000 bills

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

### What does LegiScan Bill Scraper do?

**LegiScan Bill Scraper** pulls legislation from [LegiScan](https://legiscan.com) for all 50 states, Washington D.C. and the US Congress. Give it keywords, a state, bill numbers or a LegiScan RSS feed, and it returns one row per bill read from the bill's LegiScan page: status and date, last action, sponsors with party, the full action history, roll-call votes, subjects, the committee it is waiting in, and links to the bill text on the legislature's own site. Government-affairs teams, lobbyists, compliance teams, journalists and researchers use it to track bills by topic without opening 50 state websites.

Also known as: LegiScan scraper, state legislation tracker, bill tracking API, legislative monitoring tool.

- 🔎 **Keyword search** through LegiScan's own full-text engine, nationally or state by state (`AND`, `OR`, `NOT` and quotes work)
- 🗂️ **Browse a whole session**: every current bill of a state, filtered by status (introduced, engrossed, enrolled, passed, vetoed, scheduled), chamber and bill type
- 📄 **Bill lookups**: paste LegiScan URLs or ids like `CA AB1 2025`
- 📡 **RSS feeds**: turn any LegiScan committee or sponsor feed into bill rows
- 🔁 **Monitor mode**: a scheduled run returns only bills that are new or have a new action or status, with the previous values next to the new ones
- 👥 **Sponsor details add-on**: role (Primary / Cosponsor / Joint), district, capitol phone and profile links per sponsor
- 🔑 **No LegiScan account, no API key, no cookies**
- 🔌 Export as JSON, CSV or Excel, or connect through the Apify API, webhooks, Make, Zapier, n8n or MCP

### What data can you get from LegiScan?

| | | |
|---|---|---|
| 🏛️ State, session and bill number (`billKey`) | 📌 Title and description | 🚦 Status, status date, progress % |
| ⏱️ Last action and its date | 📅 Introduced date | 🏢 Committee it is pending in |
| 👤 Sponsors: name, party, office, LegiScan id | ⭐ Primary sponsor | ⚖️ Partisanship line (e.g. Bipartisan Bill) |
| 📜 Full action history (date, chamber, action) | 🗳️ Roll-call votes: yea, nay, not voting, absent, result | 🏷️ Subjects |
| 📚 Code sections the bill changes | 🔗 Same-as / similar bills | 📝 Latest text version and format |
| 🌐 Legislature's bill page and text link | 🔄 Change type + previous status/action (monitoring) | ☎️ Sponsor role, district, phone (add-on) |

### How to scrape LegiScan with LegiScan Bill Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) - the free plan includes monthly credit.
2. Open **LegiScan Bill Scraper** and choose what to collect: keywords, states, bill URLs or RSS feeds.
3. Narrow it down with the filters (status, last-action date, match %) and set **Max bills**.
4. Click **Start**. Bills appear in the dataset as each bill page is read.
5. Download the results as JSON, CSV or Excel, or schedule the run with **Only new or changed bills** on.

### ⬇️ Input

| Parameter | Type | Description |
|---|---|---|
| `keywords` | list | Full-text search terms, e.g. `"artificial intelligence"`, `"data privacy"`. One search per keyword per state. Prefilled. |
| `states` | list | `ALL` (all states + Congress), `US` (Congress), `DC` or two-letter state codes. With keywords: where to search. Without keywords: browse each state's whole current session. Prefilled `ALL`. |
| `bills` | list | LegiScan bill URLs (any tab) or ids like `CA AB1 2025`, `US HB10435 2025`. |
| `feedUrls` | list | LegiScan RSS feed URLs (`https://legiscan.com/gaits/feed/<id>.rss`). |
| `status` | select | Any, Introduced, Engrossed, Enrolled, Passed, Vetoed, Failed, Scheduled (browse only). Default Any. |
| `chamber` | select | Browse only: both, House / Assembly, Senate. |
| `billType` | select | Browse only: all, bills, resolutions, other. |
| `sortBy` | select | Default (best match for searches, latest action when browsing), latest action, bill number, status. |
| `lastActionWithinDays` | integer | Keep bills with an action in the last N days. 0 = any. |
| `lastActionFrom` | date | Keep bills whose last action is on or after `YYYY-MM-DD`. |
| `minMatch` | integer | Searches only: minimum LegiScan match %. |
| `excludeKeywords` | list | Drop bills whose title contains any of these words. |
| `includeSponsorDetails` | boolean | Add each sponsor's role, district, phone and profile links (add-on). Default off. |
| `monitorMode` | boolean | Only bills that are new or changed since earlier runs delivered them. Default off. |
| `monitorStoreName` | string | Name of the memory store, to keep separate watchlists. Default `legiscan-bill-monitor`. |
| `maxResults` | integer | Most bills per run, all searches together. Default 10, prefill 5, 0 = no limit. |
| `maxResultsPerSearch` | integer | Most bills from any one search, listing or feed. 0 = no limit. |
| `compact` | boolean | Core fields only, for AI and MCP pipelines. |
| `useUnblocker` | boolean | Read LegiScan pages through Apify's Unblocker (needed: LegiScan checks every page visitor). Default on. |
| `maxConcurrency` | integer | Most bill pages loading at once. Default 4. |
| `proxyConfiguration` | proxy | Optional: your own proxy URLs, tried before the Unblocker. |

#### Input JSON

```json
{
    "keywords": ["artificial intelligence"],
    "states": ["CA", "NY", "TX"],
    "status": "any",
    "lastActionWithinDays": 30,
    "includeSponsorDetails": false,
    "monitorMode": true,
    "maxResults": 200
}
```

#### Search with keywords, browse with states only

With keywords, each keyword is searched in each state you pick (or nationally with `ALL`). Leave keywords empty and pick states to get every bill of their current session instead - for example `{"states": ["NJ"], "status": "passed"}` returns New Jersey's passed bills, latest action first. Chamber and bill-type filters work in this browse mode.

#### Use a date window on scheduled runs

`lastActionWithinDays` (or `lastActionFrom`) is checked on LegiScan's result list before any bill page is read, and searches with a date window are read newest-first, so a weekly run with `lastActionWithinDays: 7` stops at the first bill older than a week.

#### Bills from earlier sessions

LegiScan shows the current session of each legislature to signed-out visitors; pages from earlier sessions answer with LegiScan's sign-in form. Those bills are listed in the run summary as "shown to signed-in LegiScan users only" and are not charged.

### ⬆️ Output

One row per bill. A real row from a test run (lists shortened):

```json
{
  "billKey": "MD-SB597-2026",
  "state": "MD",
  "billNumber": "SB597",
  "session": "2026 Regular Session",
  "title": "Higher Education - Maryland Artificial Intelligence Partnership",
  "status": "Passed",
  "statusCode": 4,
  "statusDate": "2026-05-26",
  "lastActionDate": "2026-05-26",
  "lastAction": "Approved by the Governor - Chapter 633",
  "dateIntroduced": "2026-02-05",
  "sponsorship": "Moderate Partisan Bill (Democrat 7-1)",
  "primarySponsor": "Katie Hester",
  "sponsors": [{ "name": "Katie Hester", "title": "Sen.", "office": "Senator", "party": "Democrat", "peopleId": 20956 }],
  "subjects": ["Administrative Agencies", "Artificial Intelligence", "Budget and Management, Department of"],
  "votes": [{ "date": "2026-04-13", "chamber": "Senate", "motion": "Third Reading Passed", "yea": 46, "nay": 0, "notVoting": 1, "absent": 0, "passed": true }],
  "history": [{ "date": "2026-05-26", "chamber": "Senate", "action": "Approved by the Governor - Chapter 633" }],
  "legiscanUrl": "https://legiscan.com/MD/bill/SB597/2026",
  "stateUrl": "https://mgaleg.maryland.gov/mgawebsite/Legislation/Details/SB0597?ys=2026RS",
  "billTextUrl": "https://mgaleg.maryland.gov/2026RS/Chapters_noln/CH_633_sb0597e.pdf",
  "changeType": "new",
  "searchKeyword": "artificial intelligence",
  "matchPercent": 100
}
```

#### Fields and how often they are filled

Measured on 33 real LegiScan bill pages from 18 jurisdictions (26 from an "artificial intelligence" national search, 7 from California, Alabama, New Jersey and Congress lookups). A field below 100% is empty because LegiScan has nothing to show for that bill, not because it was missed.

| Field | Meaning | Filled |
|---|---|---|
| `billKey`, `state`, `billNumber`, `billType`, `session`, `sessionYear` | Which bill | 100% |
| `title`, `description` | LegiScan's title and summary | 100% |
| `status`, `statusCode`, `statusDate`, `progressPercent` | Introduced / Engrossed / Enrolled / Passed / Vetoed / Failed (codes 1-6) | 100% |
| `lastActionDate`, `lastAction`, `dateIntroduced` | Latest action; earliest date in the history | 100% |
| `history` | Every action with date and chamber | 100% |
| `sponsors`, `primarySponsor`, `sponsorNames`, `sponsorship` | Sponsors with party and office (some bills list none yet) | 97% |
| `stateUrl`, `billTextUrl`, `stateSources` | The legislature's own pages and text files | 100% |
| `legiscanTextUrl`, `latestTextVersion`, `latestTextFormat` | Latest text on LegiScan (e.g. Chaptered, PDF) | 100% |
| `pendingCommittee`, `pendingCommitteeUrl` | Committee the bill waits in (bills still in committee) | 48% |
| `votes`, `voteCount` | Roll calls: yea, nay, not voting, absent, total, result, link | 52% have votes |
| `subjects` | LegiScan subjects (only some states publish them) | 39% |
| `codeCitations` | Code chapter, article, section and citation type the bill changes | 45% |
| `relatedBills` | Same-as / similar bills in the other chamber | 27% |
| `statusNote`, `statusBanner` | e.g. "died in committee", "Completed Legislative Action" | 18% / 45% |
| `changeType`, `previousStatus`, `previousLastActionDate`, `previousLastAction` | new / updated / unchanged against earlier runs | every row / updated rows |
| `source`, `searchKeyword`, `searchState`, `feedUrl`, `matchPercent`, `position` | Where the row came from | per source |
| `sponsors[].role`, `district`, `phone`, `contactUrl`, `stateProfileUrl`, `ballotpediaUrl`, `voteSmartUrl`, `followTheMoneyUrl` | Sponsor details add-on | 100% of 27 sponsors on 3 bills |

LegiScan's internal numeric bill id is not shown on its public pages, so rows carry `billKey` (e.g. `CA-AB1-2025`) as the stable id instead.

### How can I use LegiScan data?

- 🏛️ **Government affairs and lobbying**: watch every bill on your issues across states and see the day it moves.
- 🏭 **Regulatory compliance**: catch new obligations (AI, privacy, cannabis, insurance) while they are still in committee.
- 📰 **Journalism**: find which states passed similar bills and who sponsored them.
- 🎓 **Policy research**: build datasets of sponsors, votes and outcomes by state and session.
- 🤝 **Advocacy**: list the sponsors and committee members to contact for a bill (with the sponsor add-on).
- 🤖 **AI pipelines**: feed compact bill rows and text links into summarizers or alert bots.

### How much does it cost to scrape LegiScan?

Pay per result, no start fee:

| Event | Price | When |
|---|---|---|
| Bill | $0.018 per bill ($18 per 1,000) | every bill row |
| Sponsor details | $0.016 per bill | bills whose Sponsors tab was added (add-on on) |

| Run | Cost |
|---|---|
| 5 bills (the prefilled demo) | $0.09 |
| 100 bills | $1.80 |
| 100 bills with sponsor details | $3.40 |
| 1,000 bills | $18.00 |

Signed-in-only, missing and unreachable bills are not charged, and neither are unchanged bills in monitor mode.

### Integrations, API, scheduling & MCP

Schedule the actor in Apify Console (**Schedules**) with **Only new or changed bills** on to get a daily or weekly digest, and send it on with webhooks or the Make, Zapier, n8n, Google Sheets and Slack integrations. Developers can start runs and read datasets through the [Apify API](https://docs.apify.com/api/v2) with the [Python](https://docs.apify.com/api/client/python) or [JavaScript](https://docs.apify.com/api/client/js) client, and AI agents can call it through Apify's MCP server.

### More government and legal data scrapers

- [SEC EDGAR Funding & Exec-Change Monitor](https://apify.com/scrapersdelight/sec-edgar-gtm-monitor) - Form D raises and executive changes as they are filed
- [US Business Entity Scraper](https://apify.com/scrapersdelight/us-business-entity-scraper) - Secretary of State company records, agents and filings
- [UK Public Contract Award Leads](https://apify.com/scrapersdelight/contracts-finder-awards-scraper) - Contracts Finder awards and suppliers
- [Förderkatalog German Federal Grants](https://apify.com/scrapersdelight/foerderkatalog-grants-scraper) - federal R\&D funding records
- [New York State Bar Attorney Scraper](https://apify.com/scrapersdelight/state-bar-attorney-scraper) - attorney licence lookups
- [SEC Investment Adviser Scraper](https://apify.com/scrapersdelight/sec-adviser-scraper) - RIA firms and Form ADV data

See all actors on [our profile](https://apify.com/scrapersdelight).

### Limits & empty runs

- **Speed**: every LegiScan page passes a visitor check through Apify's Unblocker, which takes about 20-90 seconds per page. The actor loads 4 pages at a time and spaces them out, because LegiScan answers bursts with its sign-in page. In tests the prefilled run (one search page and 5 bills) took about 2 minutes; plan on roughly 4-6 bills a minute for big runs.
- **Sessions**: current sessions only (LegiScan's rule for signed-out visitors).
- **Size**: a search page holds 50 bills; LegiScan reported about 708 current bills for "artificial intelligence" nationally and about 5,100 bills in California's 2025-2026 session.
- **Empty runs**: a search with no matches finishes with 0 rows and costs nothing; if LegiScan pages cannot be reached at all, the run fails with the reason in its status and the `RUN_SUMMARY` record.
- **Run summary**: the `RUN_SUMMARY` record lists, per search, LegiScan's own total, pages read, bills delivered, duplicates, unchanged bills, filtered bills, and bills not found, signed-in only or unreachable.

### ❓ FAQ

#### How much does LegiScan Bill Scraper cost?

$0.018 per bill, plus $0.016 per bill when you add sponsor details. There is no start fee, and the free Apify plan's monthly credit covers a few hundred bills.

#### Do I need a LegiScan API key or account for LegiScan Bill Scraper?

No. It reads LegiScan's public bill pages, so there is no key, login or cookie to supply.

#### Which legislatures does LegiScan Bill Scraper cover?

All 50 states, Washington D.C. and the US Congress - the same jurisdictions LegiScan covers - for their current sessions.

#### How do I track bills on a topic with LegiScan Bill Scraper?

Enter your keywords, pick `ALL` or your states, turn on **Only new or changed bills** and schedule the run. Each run returns new bills and bills with a new action or status, with `previousStatus` and `previousLastAction` filled for the changed ones.

#### Can LegiScan Bill Scraper get the bill text?

Each row links to the latest text on the legislature's site (`billTextUrl`, usually a PDF or HTML file), to LegiScan's text page, and to every text version the legislature published (`stateSources`).

#### Can LegiScan Bill Scraper read LegiScan RSS feeds?

Yes. Paste a feed URL from a committee, sponsor or dashboard page into **LegiScan RSS feeds**; every bill in the feed becomes a full row.

#### Can I use LegiScan Bill Scraper with the Apify API?

Yes. Start runs and fetch results with the Apify API or its Python and JavaScript clients; see the API tab of this actor.

#### Can AI agents use LegiScan Bill Scraper through MCP?

Yes, through Apify's MCP server. Turn on **Compact rows** for shorter rows.

#### Why did LegiScan Bill Scraper return fewer bills than I asked for?

Your filters may have removed them, LegiScan may hold fewer current bills for the search, or some bills were from an earlier session (signed-in only). The `RUN_SUMMARY` record shows the count for each reason.

#### Why did LegiScan Bill Scraper return no results?

The search matched nothing in current sessions, every match was filtered out, or (in monitor mode) nothing changed since the last run. None of these is charged.

#### Your feedback

Missing a field or a filter? Open an issue in the [Issues tab](https://console.apify.com/actors/scrapersdelight~legiscan-bill-scraper/issues) and we will look at it.

# Actor input Schema

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

Full-text search terms, run through LegiScan's own search over current sessions, e.g. "artificial intelligence", "data privacy", "cannabis". LegiScan's operators work (quotes, AND, OR, NOT). Each keyword is searched in each state below. Leave empty to browse whole sessions.

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

Where to search or browse. "All states + Congress" searches nationally. With keywords: one search per state. Without keywords: every current-session bill of each state (filters below).

## `bills` (type: `array`):

LegiScan bill URLs (any tab: /CA/bill/AB1/2025, /NJ/text/S4657/2026) or ids like "CA AB1 2025", "US HB10435 2025". Without a year LegiScan picks the session. Prior sessions are shown to signed-in LegiScan users only.

## `feedUrls` (type: `array`):

LegiScan RSS feed URLs (the orange feed icons on committee, sponsor and dashboard pages), e.g. https://legiscan.com/gaits/feed/0c6ec19234d8657f74e6f99096b3e66e.rss. Each bill in the feed becomes a row.

## `status` (type: `string`):

Keep bills at this progress status. Applies to searches and state browsing; "Scheduled" (bills with a hearing on the calendar) works when browsing a state.

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

Browse only: bills from one chamber. House includes the Assembly / House of Delegates.

## `billType` (type: `string`):

Browse only: bills, resolutions (joint, concurrent, simple) or other measures.

## `sortBy` (type: `string`):

Order LegiScan returns results in. Default: best match first for searches, latest action first when browsing.

## `lastActionWithinDays` (type: `integer`):

Keep bills with an action in the last N days, e.g. 7. Pairs well with a daily or weekly schedule. 0 = any date.

## `lastActionFrom` (type: `string`):

Keep bills whose last action is on or after this date (YYYY-MM-DD), e.g. 2026-01-01. Empty = any date.

## `minMatch` (type: `integer`):

Searches only: drop bills LegiScan scores below this relevance, e.g. 80. 0 = keep all.

## `excludeKeywords` (type: `array`):

Drop bills whose title contains any of these words, e.g. "resolution", "commemorat". Case-insensitive.

## `includeSponsorDetails` (type: `boolean`):

Read each bill's Sponsors tab too: role (Primary / Cosponsor / Joint), district, capitol phone, contact form and Ballotpedia / VoteSmart / FollowTheMoney links per sponsor. Charged as one sponsor-details event per bill.

## `monitorMode` (type: `boolean`):

Deliver only bills that are new, or have a new action or status, since earlier runs delivered them. Every run remembers what it delivers. Pairs with a daily or weekly schedule.

## `monitorStoreName` (type: `string`):

Name of the key-value store that remembers delivered bills. Use different names to keep separate watchlists. Default: legiscan-bill-monitor.

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

Most bills to deliver in this run (all searches together). A search page holds 50 bills; LegiScan lists a few thousand bills per state session. 0 = no limit.

## `maxResultsPerSearch` (type: `integer`):

Most bills from any one search, state listing or feed. 0 = no per-search limit.

## `compact` (type: `boolean`):

Core fields only (id, state, number, title, status, last action, committee, sponsors' names, subjects, links): smaller rows for AI / MCP pipelines.

## `useUnblocker` (type: `boolean`):

LegiScan puts a Cloudflare check in front of every page; Apify's Unblocker passes it. Turn off only with your own proxy that passes it. RSS feeds never need it.

## `maxConcurrency` (type: `integer`):

Most bill pages loading at once. The run also spaces page starts and slows down when LegiScan starts answering with its sign-in page, so more is not always faster.

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

Optional. Add your own proxy URLs to try them before the Unblocker. By default the run uses its own route.

## Actor input object example

```json
{
  "keywords": [
    "artificial intelligence"
  ],
  "states": [
    "ALL"
  ],
  "status": "any",
  "chamber": "both",
  "billType": "all",
  "sortBy": "default",
  "lastActionWithinDays": 0,
  "minMatch": 0,
  "includeSponsorDetails": false,
  "monitorMode": false,
  "maxResults": 5,
  "maxResultsPerSearch": 0,
  "compact": false,
  "useUnblocker": true,
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per bill.

## `summary` (type: `string`):

Per search, state listing, feed and lookup list: LegiScan's own total, pages read, bills delivered, duplicates, unchanged, filtered, not found, signed-in-only and unreachable bills, and the route used.

# 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 = {
    "keywords": [
        "artificial intelligence"
    ],
    "states": [
        "ALL"
    ],
    "maxResults": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/legiscan-bill-scraper").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 = {
    "keywords": ["artificial intelligence"],
    "states": ["ALL"],
    "maxResults": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/legiscan-bill-scraper").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 '{
  "keywords": [
    "artificial intelligence"
  ],
  "states": [
    "ALL"
  ],
  "maxResults": 5
}' |
apify call scrapersdelight/legiscan-bill-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapersdelight/legiscan-bill-scraper"
        }
    }
}
```

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/G3KwiAL7XfuO1YLgc/builds/zklO753ODASjnMzUm/openapi.json
