# US Congress Stock Trades: House STOCK Act Financial Disclosures (`neverempty/us-congress-stock-trades`) Actor

For trading signals, journalism and ethics research: every stock trade US House members disclose under the STOCK Act, from the Clerk of the House - ticker, buy or sell, trade and notification dates, whose account, and the disclosed range as lower and upper numbers. 2026 holds 1,603 filings.

- **URL**: https://apify.com/neverempty/us-congress-stock-trades.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** News, Automation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.39 / 1,000 trade returneds

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

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## US Congress Stock Trades - House STOCK Act disclosures

**For political-trade tracking, compliance and ethics research, journalism and copy-trade signals**: every stock trade that members of the US House of Representatives disclose under the STOCK Act, taken straight from the **Clerk of the House** and turned into one row per trade — the member, the ticker and asset, the transaction date, the notification date, and a link to the original PDF.

**The amount is a filed range, and both halves come back as numbers.** You get the disclosed range exactly as filed (`$15,001 - $50,000`) **plus its lower and upper bound** as `amountMinUsd` and `amountMaxUsd`. That matters because the range wraps across lines in the source PDF: reading only the first half turns `$15,001 - $50,000` into a flat `$15,001` that **appears nowhere in the disclosure**.

**A scanned filing is labelled, not silently skipped.** The 2026 filing year holds **1,603 filings, 379 of them stock reports**, and **45 of those 379** are images with no extractable text at all. Those come back as their own labelled row saying so, so a gap in your data is visible instead of invisible.

No login, no third-party data broker, no paywall in between: the source is `disclosures-clerk.house.gov`, the official publisher of these filings. Export as JSON, CSV or Excel.

***

### What you get

One row per trade, with:

- **Who**: member name, status, state and district
- **What**: asset name, ticker, and the asset type code the form uses (`ST`, `GS`, …) with its meaning
  where that meaning has been verified against the House's own reference
- **Which way**: purchase, sale, partial sale or exchange
- **When**: the trade date and the date the member was notified - the gap between them is the disclosure lag
- **How much**: the disclosed range exactly as filed (`$15,001 - $50,000`) **plus its lower and upper bound
  as numbers**, so you can sort and filter without parsing strings
- **Whose account**: self, spouse, joint or dependent child, and the account name (`Morgan Stanley - Rollover IRA`)
- **Which filing**: filing id, filing date, whether it was new or amended, and a link to the original PDF

***

### Example output (one trade)

```json
{
  "memberName": "Hon. Thomas Suozzi",
  "stateDistrict": "NY03",
  "state": "NY",
  "assetName": "Advanced Micro Devices, Inc. - Common Stock",
  "ticker": "AMD",
  "assetTypeCode": "ST",
  "assetType": "stock",
  "transactionType": "sale",
  "transactionDate": "2026-02-18",
  "notificationDate": "2026-02-19",
  "amountRange": "$1,001 - $15,000",
  "amountMinUsd": 1001,
  "amountMaxUsd": 15000,
  "owner": "Thomas Suozzi IRA FBO Thomas Suozzi",
  "filingStatus": "New",
  "filingId": "20034188",
  "tradeId": "20034188-1",
  "documentUrl": "https://disclosures-clerk.house.gov/public_disc/ptr-pdfs/2026/20034188.pdf"
}
```

***

### Input

| Field | Key | What it does |
|---|---|---|
| **Year** | `year` | Which filing year to read (2026 holds 1,603 filings, 379 of them stock reports) |
| **How many filings to open** | `maxReports` | Newest first; each filing is one PDF |
| **Maximum records** | `maxRecords` | The most trades this run may return and charge for |
| **Filing types** | `filingTypes` | `P` is the stock transaction report; only `P` contains trades |
| **Filed on or after** | `filedSince` | `YYYY-MM-DD`, applied before any PDF is opened |
| **Member names** | `members` | Partial, case-insensitive |
| **States or districts** | `states` | `CA` or `CA11` |
| **Tickers** | `tickers` | `NVDA`, `AAPL` |
| **Transaction types** | `transactionTypes` | purchase / sale / partial sale / exchange |
| **Minimum disclosed amount** | `minAmountUsd` | Compares the **bottom** of the disclosed range |
| **Keywords / match / exclude** | `keywords`, `keywordMatch`, `excludeKeywords` | Text filters over member, asset, ticker and account |
| **Only new since last run** | `monitoringMode` | For a schedule that watches for new disclosures |
| **Forget what was read** | `resetMonitoringState` | Clears that memory once |
| **Maximum requests** | `maxRequests` | Hard ceiling on files fetched from the House server |

***

### Things this Actor is careful about

**A scan is not an empty filing.** About one filing in eight is a scan of a paper form and contains no
extractable text at all (45 of 379 in 2026). Those come back as their own labelled row saying the
transactions are in the image - never as "this member made no trades". Those rows are **not charged**.

**Amounts are ranges, and stay ranges.** Congress discloses a band, not a figure. This Actor returns the
band as filed and adds `amountMinUsd` / `amountMaxUsd`, and it never invents a single number. The band also
wraps across lines in the source PDF; reading only the first half would turn `$15,001 - $50,000` into a flat
`$15,001` that **appears nowhere in the disclosure**.

**Codes are not guessed.** The forms use short codes for asset types. Only the ones verified against the
House's own reference are translated; anything else keeps its raw code with the meaning left empty, rather
than being labelled with a plausible-sounding guess.

**Filters run before the PDFs are opened.** Member, state, filing type and date are applied to the index
first, so narrowing your search also makes the run shorter and cheaper - and puts less load on a
government server.

**The limit does not delete whole members.** When *Maximum records* cuts the result, trades are taken evenly
from every filing that was read, and a free row says how many were left out and from where.

***

### Frequently asked

**Does this cover the Senate?** No. The Senate's disclosure search is behind a block that refuses automated
access, so this Actor covers the House only, and says so rather than returning a partial picture as if it
were complete.

**How current is it?** The House publishes filings as they are submitted. Members must report a trade within
45 days, so the newest rows are typically days to weeks behind the trade itself - `transactionDate` and
`notificationDate` let you measure that lag yourself.

**Can I watch for new disclosures?** Yes - schedule the Actor with *Only return filings that are new since
the last run* turned on.

**Why do some trades have no ticker?** Treasury bills, funds and private holdings are disclosed without one.
The field is left empty rather than filled with something from the asset name.

***

### Pricing

Pay per event: you are charged for each **trade returned**. Rows that explain a problem - a scanned filing,
an unreadable page, a filter that matched nothing, a result cut by your maximum - are never charged.

# Actor input Schema

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

Which filing year to read. The Clerk of the House publishes one index per year; 2026 holds 1,603 filings, of which 379 are stock transaction reports.

## `maxReports` (type: `integer`):

Filings are opened newest first. Each is one PDF and holds anywhere from 1 to dozens of trades. Lower this to keep runs short and cheap.

## `maxRecords` (type: `integer`):

The most trades this run may return and charge for. When the limit cuts the result, trades are taken evenly from every filing, so no member disappears completely, and a free row says what was left out.

## `filingTypes` (type: `array`):

P = periodic transaction report (the stock trades). Others: O annual report, C candidate report, A amendment, X extension, W withdrawal, D termination. Only P contains trades.

## `filedSince` (type: `string`):

Only filings submitted on or after this date (YYYY-MM-DD). Applied to the filing date in the index, before any PDF is opened.

## `members` (type: `array`):

Keep only these members. Matched against the first and last name in the index, case-insensitive and partial (for example "pelosi").

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

Two-letter state codes (CA, NY) or full districts (CA11, NY03).

## `tickers` (type: `array`):

Keep only trades in these tickers (NVDA, AAPL). Trades in assets without a ticker - treasury bills, funds - are dropped when this is set.

## `transactionTypes` (type: `array`):

purchase, sale, partial sale or exchange.

## `minAmountUsd` (type: `integer`):

Keep only trades whose disclosed range starts at or above this. Disclosures are always ranges, so this compares the bottom of the range - never a made-up single figure.

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

Keep only trades whose member name, asset name, ticker, account or transaction type contain these words.

## `keywordMatch` (type: `string`):

any = at least one keyword must appear. all = every keyword must appear.

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

Drop trades containing any of these words.

## `monitoringMode` (type: `boolean`):

Remembers which filings this Actor has already read and skips them next time. Filtering happens before this, so a filing you filtered out is not held back for later.

## `resetMonitoringState` (type: `boolean`):

Clears that memory once, so the next run returns everything again.

## `maxRequests` (type: `integer`):

A hard ceiling on how many files this run may fetch from the House server (one for the index, one per filing).

## Actor input object example

```json
{
  "year": 2026,
  "maxReports": 25,
  "maxRecords": 200,
  "filingTypes": [
    "P"
  ],
  "minAmountUsd": 0,
  "keywordMatch": "any",
  "monitoringMode": false,
  "resetMonitoringState": false,
  "maxRequests": 60
}
```

# Actor output Schema

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

One row per disclosed trade: the House member with their state and district, the asset name and ticker, the asset type code the form uses and its meaning where that meaning has been verified, whether it was a purchase, sale, partial sale or exchange, the trade date and the date the member was notified, the disclosed amount range together with its lower and upper bound as numbers, whose account it was (self, spouse, joint or dependent child) and the account name, whether the filing was new or amended, and a link to the original PDF. Filings that are scans of paper forms with no extractable text, filings whose layout does not match, an index that could not be read, filters that matched nothing and trades left out by your maximum each come back as their own row and are not charged.

# 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 = {
    "year": 2026,
    "maxReports": 25,
    "maxRecords": 200,
    "filingTypes": [
        "P"
    ],
    "maxRequests": 60
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/us-congress-stock-trades").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 = {
    "year": 2026,
    "maxReports": 25,
    "maxRecords": 200,
    "filingTypes": ["P"],
    "maxRequests": 60,
}

# Run the Actor and wait for it to finish
run = client.actor("neverempty/us-congress-stock-trades").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 '{
  "year": 2026,
  "maxReports": 25,
  "maxRecords": 200,
  "filingTypes": [
    "P"
  ],
  "maxRequests": 60
}' |
apify call neverempty/us-congress-stock-trades --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neverempty/us-congress-stock-trades"
        }
    }
}

```

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/0QTvNMLwWj5tPzKne/builds/H4ZlSkKvrm72TbmEV/openapi.json
