# Legislation Tracking API: Congress, State and EU Bills, Votes (`nabeelbaghoor/legislation-tracking-bills-votes-api`) Actor

Track federal, state, local and EU legislation with the Quorum API: search bills by keyword, region, status and sponsor, plus summaries, cosponsors, amendments, roll call votes, legislators, staffers, committees and legislative documents. Bring your own key.

- **URL**: https://apify.com/nabeelbaghoor/legislation-tracking-bills-votes-api.md
- **Developed by:** [Nabeel Hassan](https://apify.com/nabeelbaghoor) (community)
- **Categories:** Business, Developer tools, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 bill, amendment, summary or vote returneds

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

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

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

## Legislation Tracking API: Congress, State and EU Bills, Votes

Track federal, state, local and EU legislation from the Quorum API with your own key: bills, summaries, sponsors, amendments, roll call votes, legislators, committees and legislative documents as clean dataset rows.

Quorum is a public affairs platform that tracks US Congress, all 50 state legislatures, DC and the territories, US local governments, the European Union and other national parliaments. This actor wraps the read only endpoints of the Quorum RESTful API on www.quorum.us/api, exactly as the public reference on quorum.redoc.ly documents them. Give keywords, regions, statuses, years or Quorum IDs and get deduplicated rows you can download as JSON, CSV or Excel, schedule as a daily bill tracker, or feed into government affairs reporting, policy research, compliance monitoring, Google Sheets, BI dashboards and AI agents. Bring your own API key.

BYOK, not live-tested: every path, parameter and enum comes from the public Quorum API reference (OpenAPI definition version 2.1938.2026-10-14-1217z-stable) and Quorum's enumeration file. A probe with an invalid key on 2026-10-23 confirmed every route used here answers 401 "Invalid API Key" while invented routes answer 404, but the actor has not been run against a live Quorum key.

### What it does

- **Bill search**: federal, state, local and EU bills by keyword (quick or advanced search), region, bill type, general status, sponsor party, bill number, introduction year and month, or sponsor. Rows carry the label (such as H.R. 1), title, region, type, general status, status text, readable status, sponsor name, introduced and last action dates, last action, session, enacted date, public law number, veto flag, cosponsor counts by party and the source link.
- **Bills by ID**: single bills by Quorum ID.
- **Bill summaries**: the summary text of given bills.
- **Bill sponsors and cosponsors**: primary sponsors, original and other cosponsors, authors and EU rapporteurs of given bills, or every bill a given person sponsors.
- **Bill amendments**: amendments by keyword, region, status, party, year or bill, with status, offered date and last action.
- **Roll call votes**: votes by keyword, region, chamber, year or bill, with question, result, yea, nay and other totals.
- **Officials and staffers**: members of Congress, state legislators, local officials, MEPs, executives and staff by keyword, region, party, person type and current status, plus single people by ID.
- **Roles and offices held**: every role of given people, with party, state, district, office, phone, website and start and end dates.
- **Committees and caucuses**: congressional, state and European Parliament committees by keyword, region and type, with chairs, ranking members and member counts.
- **Legislative documents**: press releases, floor statements, Dear Colleague letters, CRS, CBO and GAO reports, executive orders, committee reports, EU documents and more, by keyword, region, type, year or author.
- **Pay only for results**: refused and empty lookups are recorded as a free row that says why, never charged.

Every request is a GET. Nothing in your Quorum account is created or edited.

### How to get your API key

Quorum API access is a paid add-on to a Quorum subscription. Once your organization has it on its contract, ask your Quorum Customer Success Manager to generate an API key for a named Quorum user. Quorum authenticates each request with that user's username and key together, in the header Authorization: ApiKey username:key.

1. Paste the key into the **API key** field.
2. Put the Quorum username of the user the key belongs to in the **Quorum username** field.
3. Or set the DATA_API_KEY secret to username:key (or DATA_API_KEY and DATA_API_USERNAME separately).

Both values are stored as secrets, sent only to www.quorum.us and removed from everything the actor logs. Missing credentials end the run cleanly with a message, before any request.

### Input

| Field | Modes | Description |
| --- | --- | --- |
| `mode` | all | `bills` (default), `billsById`, `billSummaries`, `billSponsors`, `amendments`, `votes`, `votesById`, `officials`, `officialsById`, `personRoles`, `committees` or `documents` |
| `searchText` | searches | Keywords or a phrase |
| `searchMethod` | bills, amendments, officials, committees | `quick` (default) or `advanced` |
| `regions` | most modes | US Congress, state legislatures, DC, territories, US local, European Union, other parliaments |
| `billTypes`, `billStatuses`, `billLabel` | bills | Bill type, general status, bill number |
| `parties` | bills, amendments, officials | Democrat, Republican, Independent, European Parliament groups and more |
| `year`, `month` | bills, amendments, votes, documents | Introduced, offered, created or document date |
| `billIds` | by ID, summaries, sponsors, amendments, votes | Numeric Quorum bill IDs |
| `voteIds` | votes by ID | Numeric Quorum vote IDs |
| `personIds` | bills, sponsors, officials by ID, roles, documents | Numeric Quorum person IDs, such as 300087 |
| `chambers` | votes | Senate, House, Joint, Executive |
| `amendmentStatuses`, `sponsorTypes`, `personTypes`, `committeeTypes`, `documentTypes` | matching mode | Documented Quorum enums |
| `currentOnly` | officials, roles | Only people and roles in office now (default on) |
| `includeObsoleteCommittees` | committees | Include committees that no longer exist |
| `expandBillDetails` | bills | Readable status and sponsor name (default on) |
| `maxResults` | all | Row ceiling for the run (default 100) |
| `requestsPerMinute` | all | Pacing, default 60 |
| `username`, `apiKey` | all | Your Quorum username and API key |

Example: data privacy bills introduced in Congress and California in 2026.

```json
{
    "mode": "bills",
    "searchText": "data privacy",
    "regions": ["1", "6"],
    "year": 2026
}
```

Example: every roll call vote on two bills.

```json
{
    "mode": "votes",
    "billIds": ["<bill ID from a Bills run>", "<another bill ID>"]
}
```

### Example output

An illustrative bill row (values are an example, not real data). The full Quorum record is kept under `record`.

```json
{
    "mode": "bills",
    "modeLabel": "Bills",
    "recordType": "bill",
    "query": "\"data privacy\", US Congress, 2026",
    "found": true,
    "id": "1234567",
    "name": "H.R. 1234",
    "title": "Example Data Privacy Act",
    "billLabel": "H.R. 1234",
    "region": 1,
    "regionName": "US Congress",
    "date": "2026-03-04T00:00:00",
    "billType": 3,
    "billTypeName": "H.R.",
    "generalStatus": 2,
    "generalStatusName": "Out of Committee",
    "statusText": "Reported by committee",
    "sponsorName": "Rep. Example Member",
    "introducedDate": "2026-03-04T00:00:00",
    "lastActionDate": "2026-06-18T00:00:00",
    "democratCosponsors": 12,
    "republicanCosponsors": 9,
    "url": "https://www.congress.gov/bill/example",
    "retrievedAt": "2026-10-23T12:00:00.000Z",
    "note": null,
    "record": { "id": 1234567, "label": "H.R. 1234", "...": "..." }
}
```

A vote row carries `question`, `result`, `chamberName`, `yeas`, `nays`, `otherVotes` and `billId`. An official row carries `firstName`, `lastName`, `title`, `partyName`, `personTypeName`, `state`, `district`, `email` and `phone`. A committee row carries `abbrev`, `committeeTypeName`, `chairs` and `memberCount`. A document row carries `documentTypeName`, `sourceName`, `speaker`, `summary` and links.

### Pricing

| Event | Price | Charged for |
| --- | --- | --- |
| `legislation-record` | 0.01 USD | Each bill, bill summary, amendment or roll call vote |
| `official-record` | 0.008 USD | Each official, staffer or role held |
| `document-record` | 0.008 USD | Each legislative document |
| `reference-record` | 0.005 USD | Each sponsor or cosponsor record, committee or caucus |

Refused lookups and empty searches are never charged. Your Quorum subscription and API add-on are billed separately by Quorum.

### FAQ

#### What is the Quorum API?

It is the RESTful API of Quorum, the public affairs and legislative tracking platform. It serves Quorum's legislative datasets (bills, amendments, sponsors, votes, officials, staffers, committees and documents across the US Congress, state legislatures, local governments and the European Union) and your organization's own stakeholder records on www.quorum.us/api, documented on quorum.redoc.ly.

#### Do I need my own Quorum API key?

Yes. This is a bring-your-own-key actor: it calls Quorum with your username and key, under your organization's subscription and its terms. API access is an add-on your Customer Success Manager enables. Missing or rejected credentials end the run cleanly with a status message, and nothing is charged.

#### Which legislatures does it cover?

Whatever your Quorum plan covers, filtered with the regions input: US Congress, the 50 state legislatures, the Council of the District of Columbia, Puerto Rico and the other territories, US local governments by state, the European Union and other national parliaments listed in Quorum's region enum.

#### How do I track bills on a topic every day?

Run the Bills mode with your keywords, regions and the current year, and schedule the run daily. Each row has a stable Quorum ID, the general status and the last action date, so changes are easy to spot in a spreadsheet or BI tool.

#### How do I get the votes and cosponsors of a bill?

Take the bill's id from a Bills run, then run Roll call votes or Bill sponsors and cosponsors with that ID in Bill IDs. Bill summaries and Bill amendments work the same way.

#### Can I find legislators and their offices?

Yes. Officials and staffers searches by name, region, party and person type, and Roles and offices held lists each person's roles with party, state, district, office phone, website and dates.

#### Does it change anything in my Quorum account?

No. The Quorum API also lets you create and edit contacts, notes and issues, but this actor only sends GET requests to the legislative datasets.

#### How many API requests does a run use?

One per page of up to 100 records for searches, one per ID for by ID lookups, and one search per bill or person ID for the related modes. Max results stops paging early, and the run log reports the exact request count.

### Keyword map

Legislation tracking API, bill tracking API, Congress bills API, state legislation data, EU legislation tracker, roll call votes API, legislator data API, cosponsor data, bill status tracking, committee data API, government affairs data, public affairs API, policy monitoring, legislative documents, CRS reports, Quorum API, Quorum bill tracking, Quorum Analytics data export.

### Licensing and data use

This actor needs your organization's own Quorum subscription with the API add-on, and runs under your agreement with Quorum. Quorum's agreement grants use for your internal business purposes and allows derivative works and display of the results, but it bars using Quorum to build a competing product. Keep the results for your own government affairs, research and reporting work, and do not resell the data or use it to build a rival legislative tracking service. This actor is not affiliated with or endorsed by Quorum Analytics.

# Actor input Schema

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

Bills searches federal, state, local and EU bills (GET /newbill/). Bills by ID reads single bills. Bill summaries and Bill sponsors and cosponsors read the summaries and sponsor records of given bills. Bill amendments and Roll call votes search amendments and votes, optionally for given bills. Officials and staffers searches legislators, executives and staff; Roles and offices held lists the roles of given people. Committees and caucuses and Legislative documents search committees and documents such as press releases, floor statements, CRS reports and EU documents. Every request is one call on your Quorum API access.

## `searchText` (type: `string`):

Bills, amendments, votes, officials, committees and documents. Keywords or a phrase, sent as quick_search or advanced_search (votes and documents offer advanced search only). Leave empty to filter only.

## `searchMethod` (type: `string`):

Bills, amendments, officials and committees. Quick search answers faster; advanced search uses the most comprehensive method Quorum has for the dataset and can take a little longer.

## `regions` (type: `array`):

Bills, amendments, votes, officials, roles, committees and documents. US Congress, any of the 50 state legislatures, DC and territories, US local, the European Union and other national parliaments, sent as region__in (most_recent_region__in for officials).

## `billTypes` (type: `array`):

Bills only. Such as H.R., S., H.Res., joint and concurrent resolutions, EU regulations, directives and decisions, and nominations.

## `billStatuses` (type: `array`):

Bills only. The general status, such as introduced, out of committee, passed one or both chambers, sent to the executive, enacted or failed, and the EU legislative procedure stages.

## `billLabel` (type: `string`):

Bills only. A bill label or part of one, such as H.R. 1 or SB 54, matched case insensitively (label__icontains).

## `parties` (type: `array`):

Bills and amendments (primary party of the sponsors) and officials (most recent party), including the European Parliament groups.

## `year` (type: `integer`):

Bills (introduced), amendments (offered), votes (created) and documents (dated) in this year, sent as the documented \_\_year qualifier.

## `month` (type: `integer`):

Optional, with the year. Month 1 to 12, sent as the documented \_\_month qualifier.

## `billIds` (type: `array`):

Numeric Quorum bill IDs, one per line, from the id column of a Bills run. Required for Bills by ID and Bill summaries; optional for Bill sponsors, Bill amendments and Roll call votes, which then run once per bill.

## `voteIds` (type: `array`):

Votes by ID only. Numeric Quorum vote IDs, one per line.

## `personIds` (type: `array`):

Numeric Quorum person IDs, one per line, such as 300087. Required for Officials by ID and Roles and offices held; optional for Bills (bills they sponsor), Bill sponsors (bills they sponsor or cosponsor) and Legislative documents (documents from them).

## `chambers` (type: `array`):

Roll call votes only. Senate, House, Joint or Executive.

## `amendmentStatuses` (type: `array`):

Bill amendments only. Offered, passed, failed or withdrawn.

## `sponsorTypes` (type: `array`):

Bill sponsors only. Primary sponsor, original or other cosponsor, author, and the EU rapporteur and committee roles.

## `personTypes` (type: `array`):

Officials and staffers only. Member, staffer, executive, local member, judiciary, press contact or person.

## `currentOnly` (type: `boolean`):

Officials and roles only. Sends current=true so only people and roles in office now are returned. Untick to include former ones.

## `committeeTypes` (type: `array`):

Committees only. Senate, House, Joint, and European Parliament committees, intergroups and committees of inquiry.

## `includeObsoleteCommittees` (type: `boolean`):

Committees only. Left unticked, obsolete=false keeps committees that no longer exist out of the results.

## `documentTypes` (type: `array`):

Legislative documents only. Such as press releases, floor statements, Dear Colleague letters, CRS, CBO and GAO reports, executive orders, committee reports and EU documents.

## `expandBillDetails` (type: `boolean`):

Bills only. Sends dehydrate=display_status,sponsor_name so rows carry the readable status and the sponsor name.

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

The most rows this run returns and charges for. Searches page 100 records at a time and stop here.

## `requestsPerMinute` (type: `integer`):

Pacing for calls to www.quorum.us/api.

## `username` (type: `string`):

The Quorum username of the user your API key was issued to. Sent only to www.quorum.us in the Authorization header; never logged. You can instead set the DATA_API_USERNAME secret, or give the key as username:key.

## `apiKey` (type: `string`):

Your own Quorum API key, issued by your Customer Success Manager once your organization has the API add-on. Stored as a secret and sent only to www.quorum.us as Authorization: ApiKey username:key; never logged. You can instead set the DATA_API_KEY secret.

## Actor input object example

```json
{
  "mode": "bills",
  "searchText": "data privacy",
  "searchMethod": "quick",
  "regions": [
    "1"
  ],
  "currentOnly": true,
  "includeObsoleteCommittees": false,
  "expandBillDetails": true,
  "maxResults": 100,
  "requestsPerMinute": 60
}
```

# Actor output Schema

## `records` (type: `string`):

One row per Quorum record.

# 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 = {
    "searchText": "data privacy",
    "regions": [
        "1"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/legislation-tracking-bills-votes-api").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 = {
    "searchText": "data privacy",
    "regions": ["1"],
}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/legislation-tracking-bills-votes-api").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 '{
  "searchText": "data privacy",
  "regions": [
    "1"
  ]
}' |
apify call nabeelbaghoor/legislation-tracking-bills-votes-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/legislation-tracking-bills-votes-api"
        }
    }
}
```

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/cyPaaFbtlM4ZLET5z/builds/cq5Jg0NehOWD7ugs4/openapi.json
