# US Bills Change Feed (`1mp/us-bills-change-feed`) Actor

US bills and resolutions new or changed since a date, for policy, government-affairs and compliance teams: govinfo BILLSTATUS for any Congress, titles, latest actions, a new or updated tag, and agency_tags.

- **URL**: https://apify.com/1mp/us-bills-change-feed.md
- **Developed by:** [Jesse Hawkins](https://apify.com/1mp) (community)
- **Categories:** Business, News, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 results

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

## US Bills Change Feed

**US bills and resolutions that are new or changed since a date, for
policy, government-affairs and compliance teams.** One run returns the
change set of a Congress from **govinfo**'s **BILLSTATUS** bulk data:
all eight measure types, one row per measure, each row saying whether
the measure is `new` or `updated`, with its title, its latest action,
and `agency_tags` naming the federal agencies the **Congress**
publishes in its text.

Use it as a legislative-tracking feed (what moved in the House and
Senate since your last run), a bill-watch for one agency (`FDA`,
`Medicare`, `EPA`, 107 tags in all), or the change layer on top of a
bill corpus you already hold. It reads the official **govinfo bulk
data** service (`www.govinfo.gov/bulkdata`) directly, with no key and
no browser.

Run it on a schedule, with `since` a day or two before your last run,
and keep the rows whose `bill_id` and `last_modified` you do not hold
yet.

### What you get

One row per measure whose BILLSTATUS file on govinfo changed on or
after `since`:

| Measure type | What it is | Example `bill_id` |
|---|---|---|
| `hr` | House bill | `119-hr-2821` |
| `s` | Senate bill | `119-s-5475` |
| `hres` | House simple resolution | `119-hres-1627` |
| `sres` | Senate simple resolution | `119-sres-445` |
| `hjres` | House joint resolution | `119-hjres-219` |
| `sjres` | Senate joint resolution | `119-sjres-218` |
| `hconres` | House concurrent resolution | `119-hconres-119` |
| `sconres` | Senate concurrent resolution | `119-sconres-10` |

**`new` or `updated`.** A row is `new` when the measure's own
`introducedDate` is on or after `since`: it was introduced inside your
window. Every other row is `updated`: the measure existed before
`since`, and govinfo rewrote its BILLSTATUS file inside the window,
because an action, a committee referral, a cosponsor or a summary
landed.

**The clock.** `last_modified` is govinfo's own
`formattedLastModifiedTime` for that file, read as UTC. govinfo
publishes it without a zone, so treat it as a govinfo timestamp:
comparing two runs of this feed compares like with like.

### Input

```json
{
  "since": "2026-10-09",
  "congresses": [119],
  "billTypes": ["hr", "s"],
  "maxItems": 500
}
```

- `since` (required): a date, `YYYY-MM-DD`, or a number of days back,
  such as `"7"`.
- `congresses`: whole numbers. Empty reads the 119th. govinfo answered
  200 for the 112th through the 119th on 2026-10-16.
- `billTypes`: any of the eight names above. Empty reads all eight.
- `maxItems`: stop after this many rows in all. Each route gives its
  newest changes first. Default 1,000; the most is 10,000, because
  every row costs one extra request (see Limits).

### Output

```json
{
  "bill_id": "119-hr-2821",
  "congress": 119,
  "type": "hr",
  "number": 2821,
  "measure": "House bill",
  "title": "FDA Modernization Act 3.0",
  "change_type": "updated",
  "last_modified": "2026-09-20T05:23:00Z",
  "introduced_date": "2025-04-10",
  "latest_action": "Received in the Senate.",
  "latest_action_date": "2026-07-21",
  "policy_area": "Health",
  "origin_chamber": "House",
  "update_date": "2026-09-19T23:40:10Z",
  "agency_tags": ["FDA"],
  "agency_tag_count": 1,
  "status_file_bytes": 34504,
  "source_url": "https://www.govinfo.gov/bulkdata/BILLSTATUS/119/hr/BILLSTATUS-119hr2821.xml",
  "listing_url": "https://www.govinfo.gov/bulkdata/json/BILLSTATUS/119/hr",
  "legislation_url": "https://www.congress.gov/bill/119th-congress/house-bill/2821",
  "fetched_at": "2026-10-16T12:00:00Z",
  "sha256": "..."
}
```

- `bill_id` is `congress-type-number`, the key of the 1mp **US bills
  and official summaries** library (61,585 rows, 116th to 119th
  Congress), so a feed row joins a library row.
- `source_url` is the BILLSTATUS XML this row was read from;
  `listing_url` is the listing it was found in; `sha256` is the
  SHA-256 of the XML bytes. Store it, and you can see whether the file
  changed between two runs without reading it again.
- `legislation_url` is the congress.gov page, for a person to open.
  The Actor does not fetch it.

### agency_tags

This is the join, and it is the reason to buy the feed rather than
the files. `agency_tags` is the sorted list of federal agencies and
programs named in the measure's **title**, its **latest action** and
its **policy area**, from a written vocabulary of **107** tags, 214
patterns.

The rules, so you can reproduce a tag by hand:

1. A pattern made only of capitals and digits is an acronym and
   matches case-sensitively: `FDA` matches `FDA`, never `fda`.
   Every other pattern matches case-insensitively.
2. A match must stand on its own: the character on each side may not
   be a letter or a digit. `FDA` matches `FDA-approved` and `(FDA)`,
   and not `FDAAA`.
3. Naming the head of a department names the department: "Secretary
   of the Interior" tags `Department of the Interior`.

**It is string matching, and nothing else.** A tag says the agency's
name appears in text govinfo publishes. It does not say the measure
affects that agency, that it will pass, or what it means. There is no
legal interpretation anywhere in this Actor.

**Measured on 2026-10-16** over every BILLSTATUS file of the 119th
Congress, House bills (10,833 measures, all 10,833 parsed): **828
(7.64%)** carried at least one tag, 80 of the 107 tags appeared at
least once, and 8 measures carried `FDA`. The reading is the Actor's
own parser over each file's title, latest action and policy area,
re-run by the cycle after rule 3 was implemented; an earlier note of
834 (7.70%) in the build's draft is superseded by this one. The
commonest tags were `USPS` (112), `Medicare` (81), `Social Security`
(60), `Medicaid` (55) and `Department of Veterans Affairs` (51).
**Known misses:**

- Most measures are short named Acts ("Clergy Act", "RESULTS Act")
  and name no agency at all. That is why the rate is near 8% and not
  near 50%.
- A statute's name is not its agency: "the Federal Deposit Insurance
  Act" gets no `FDIC` tag, and "the Internal Revenue Code of 1986"
  gets no `IRS` tag. Only the agency's own name sets a tag.
- Seven acronyms are left out on purpose, because Congress uses the
  same letters for something else: `SEC` ("Sec. 5"), `ACA`, `ICE`,
  `VA` (Virginia), `DOE` (Energy and Education share it), `CHIP` (and
  the CHIPS Act) and `DOT`. Those agencies are in the vocabulary
  under their full names, so a measure that writes "Immigration and
  Customs Enforcement" is tagged and one that writes only "ICE" is
  not.
- A measure that names a committee, not an agency, is untagged:
  committees are not agencies.

**The cross-feed question this answers.** The 1mp **FDA Change Feed**
returns FDA's own decisions (510(k), PMA, recalls, Drugs@FDA) new or
changed since a date. Run both with the same `since`, filter this
feed to `agency_tags` containing `FDA`, and you have the bills and
the decisions for one agency in one window.

### Limits

- **One route is one listing; one row is one more request.** A route
  is one `(congress, type)` pair. Reading it is a single request for
  the whole listing (3,863,398 bytes for `119/hr` on 2026-10-16,
  10,834 entries). Each row in the change set then costs one request
  for that measure's BILLSTATUS XML. Requests are paced 0.25 s apart,
  so 1,000 rows takes about four minutes. That is why `maxItems` tops
  out at 10,000.
- **govinfo rewrites a file when anything on the measure changes**, so
  a one-line committee referral and a floor vote look the same in
  `last_modified`. Read `latest_action` and `latest_action_date` to
  see what moved. Measured on 2026-10-16: of 980 changes in the 119th
  Congress since 2026-10-09, 82 were `new` and 898 `updated`.
- **No bill text and no summary.** This is a change feed over
  BILLSTATUS: the measure's administrative record. For the full text
  and the official CRS summary, use the 1mp US bills library.
- `hamdt` and `samdt` (amendments), `treaty`, `hdoc` and `sdoc` are
  not measure types in BILLSTATUS and are refused by name with a
  reason, not skipped in silence.
- **BILLSUM is not read.** Its listing answers 200 and carries the
  same clock field, but it holds only measures CRS has summarised
  (3,395 entries for `119/hr` against BILLSTATUS's 10,834 on
  2026-10-16) and carries no latest action. A BILLSUM change shows up
  as a BILLSTATUS change anyway.
- `api.govinfo.gov` is **not** used. It carries the same data behind
  an api.data.gov key, and a key is something no buyer should have to
  supply. Everything here comes from the keyless bulk-data service.

### What it will not do

- No personal data. Sponsors, cosponsors and committee members name
  people, and no field of a row carries one. The Actor does not read
  those elements at all.
- No interpretation, no prediction, no legal advice. A row is the
  record govinfo publishes.
- No login, no browser, no proxy, no key.

### Source and licence

govinfo, U.S. Government Publishing Office. Every BILLSTATUS file
carries this statement in its `dublinCore` `dc:rights` element:
"Pursuant to Title 17 Section 105 of the United States Code, this
file is not subject to copyright protection and is in the public
domain." `www.govinfo.gov/robots.txt`, read 2026-10-16, does not
disallow `/bulkdata/`, and lists a sitemap for the BILLSTATUS
collection.

### FAQ

**Which Congresses can I read?** govinfo answered 200 for the 112th
through the 119th on 2026-10-16. The default is the 119th. The 1mp US
bills library covers the 116th to the 119th, so a Congress outside
that range gets a warning in the run log.

**How far back can `since` go?** As far as you like. The window is
bounded by what govinfo has rewritten, not by the Actor.

**Why is a measure `updated` when nothing seems to have happened?**
govinfo rewrites the whole BILLSTATUS file for any change, including a
new cosponsor or a newly published summary. Compare `sha256` between
runs to see whether the bytes really changed.

**Do I get the bill text?** No. Titles, latest actions and the
administrative fields only. The 1mp US bills library has the text and
the official summary.

**Do I need an API key or a proxy?** No.

**Can I filter to one agency?** Not in the input: filter the output on
`agency_tags`. Every row is tagged, so one run gives you the whole
window and you keep what you need.

**Why does a run return fewer rows than `maxItems`?** Because the
window held fewer changes. A window with no changes succeeds with no
rows and says so in the run's status message.

### Use with AI agents (MCP)

Add this Actor to Apify's MCP server as a tool:

```
https://mcp.apify.com?tools=1mp/us-bills-change-feed
```

An MCP client, for example Claude or Cursor, can then ask for the
bills that changed since a date, or the ones that name an agency. A
run needs an Apify account; the client signs in when it first
connects.

Not affiliated with the U.S. Government Publishing Office, the Library
of Congress or congress.gov. The data is the public's; please credit
"govinfo, U.S. Government Publishing Office" where you publish it.

### Price

$5.00 per 1,000 rows ($0.005 a row), billed per row returned, with no
start fee. The same rate as the 1mp FDA Change Feed, so a buyer of
both pays one price.

### Changelog

- 0.1 (2026-10-16): first release.

# Actor input Schema

## `since` (type: `string`):

Start of the window: a date such as 2026-10-01, or a number of days back such as 7. A row's BILLSTATUS file changed on or after it.

## `congresses` (type: `array`):

Which Congresses to read, as whole numbers. Empty reads the 119th. The 1mp US bills library covers the 116th to the 119th.

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

Measure types to read. Empty reads all eight. Fewer types give fewer rows and fewer requests.

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

Stop after this many rows in all, newest change first per route. Each row is one charge and one extra request.

## Actor input object example

```json
{
  "since": "7",
  "congresses": [
    119
  ],
  "billTypes": [],
  "maxItems": 20
}
```

# Actor output Schema

## `changes` (type: `string`):

Every row, as JSON from the run's default dataset.

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

Rows in the overview view: bill, change, dates, title, agency tags.

# 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 = {
    "since": "7",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("1mp/us-bills-change-feed").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 = {
    "since": "7",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("1mp/us-bills-change-feed").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 '{
  "since": "7",
  "maxItems": 20
}' |
apify call 1mp/us-bills-change-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,1mp/us-bills-change-feed"
        }
    }
}
```

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/S6OEPQPOZgR5sORqn/builds/6l42Iaq8boodHYJ3N/openapi.json
