# US Congress Financial Disclosure Scraper (`jungle_synthesizer/us-congress-financial-disclosure-scraper`) Actor

Congressional financial disclosures for the House and Senate: Periodic Transaction Reports (stock trades) plus full annual disclosure schedules (assets, income, liabilities, positions, agreements, gifts, travel). Filing years back to 2008, amendments linked, STOCK Act filing-delay flagged per trade.

- **URL**: https://apify.com/jungle\_synthesizer/us-congress-financial-disclosure-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 record scrapeds

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 Financial Disclosure Scraper

Pulls financial disclosures for both chambers of Congress — the House and the
Senate. That means stock trades (Periodic Transaction Reports) and the full
annual disclosure schedules: assets, income, liabilities, positions,
agreements, gifts, travel. Most tools stop at PTRs from one chamber. This one
doesn't.

> **Senate availability note:** the House side is fully verified and always
> available. The Senate side (efdsearch.senate.gov) has been intermittently
> unreachable upstream (HTTP 503 / maintenance). When that happens, a
> Senate-only run fails loudly with the real cause named instead of returning
> an empty result — it never reports success with 0 records. Request both
> chambers, or retry later, if you hit this.

***

### US Congress Financial Disclosure Scraper Features

- Covers both the House and the Senate in one normalized schema
- Parses Periodic Transaction Reports — ticker, buy/sell/exchange, date, amount band, per-owner (self/spouse/joint)
- Parses the full Annual Financial Disclosure — Schedules A through I: assets and unearned income, earned income, liabilities, outside positions, future-employment agreements, gifts, and privately funded travel
- Computes `filing_delay_days` per trade — the STOCK Act's 45-day notification window, as a number you can filter and sort on instead of eyeballing two dates
- Links amendments back to the filing they amend, so a superseded trade doesn't get double-counted
- Filters by chamber, filing year (2008 onward), and filing type
- Filing years back to 2008 — not just the trailing 12 months

***

### Who Uses Congressional Financial Disclosure Data?

- **Funds and quant desks** — track the STOCK Act "congress trading" signal: what members bought or sold, when, and how late they reported it
- **Accountability journalists and researchers** — cross-reference outside positions, future-employment agreements, and gifts against a member's votes and committee assignments
- **Compliance and oppo-research teams** — build a full financial picture of a filer, not just their trade history
- **Copy-trade and newsletter products** — feed a structured trade feed instead of re-parsing PDFs by hand

***

### How US Congress Financial Disclosure Scraper Works

1. You choose a chamber (House, Senate, or both), a set of filing years, and — optionally — which filing types you want.
2. The actor walks the House Clerk's public disclosure index and the Senate's electronic filing system for the years and chamber(s) you selected.
3. Each filing is parsed into records: one row per stock transaction for a PTR, one row per disclosed item (asset, liability, position, gift, and so on) for an annual report.
4. Records land in your dataset as clean, structured JSON — one row per transaction or disclosed item, joined back to the filer and the source filing.

***

### Input

```json
{
  "chambers": ["house"],
  "years": ["2024", "2025"],
  "filingTypes": ["ptr"],
  "maxItems": 500
}
```

| Field         | Type    | Default | Description |
|---------------|---------|---------|-------------|
| `chambers`    | array   | both    | `house`, `senate`, or both. Leave empty for both chambers. |
| `years`       | array   | all     | Filing years to include, 2008–2026. Leave empty for every year. |
| `filingTypes` | array   | all     | `ptr`, `annual`, `candidate`, `termination`, `extension`, `blind_trust`, `amendment`. Leave empty for every type. |
| `maxItems`    | integer | 15      | Maximum number of records to return. |

#### Resuming a large crawl

Every run emits a `resumeCursor` in its Output. If a large crawl stops before it finishes — because it hit `maxItems`, your spend cap (`maxTotalChargeUsd`), or was aborted — start a new run with **the same input** plus that `resumeCursor` to continue from where it left off. The crawl resumes from the queued work the previous run didn't reach.

- You are **not re-charged** for records the earlier run already delivered.
- Resume within your account's run-retention window — on the free tier, roughly your 10 most recent runs. Once the source run is pruned, its `resumeCursor` is no longer valid.
- `resumeCursor` is opaque — supply it unmodified.

***

### US Congress Financial Disclosure Scraper Output Fields

Every record — whether a stock trade or a disclosed asset — shares the same filing-level fields, plus whichever transaction or schedule fields apply to that row.

```json
{
  "filing_id": "house-20032062",
  "chamber": "house",
  "filing_type": "ptr",
  "filer_last_name": "Aderholt",
  "filer_first_name": "Robert B.",
  "filer_role": "Member",
  "state_district": "AL04",
  "filing_year": 2025,
  "filing_date": "2025-09-10",
  "document_url": "https://disclosures-clerk.house.gov/public_disc/ptr-pdfs/2025/20032062.pdf",
  "transaction_date": "2025-07-28",
  "notification_date": "2025-08-11",
  "owner": "self",
  "asset_name": "GSK plc American Depositary Shares",
  "ticker": "GSK",
  "asset_type": "ST",
  "transaction_type": "sale",
  "amount_low": 1001,
  "amount_high": 15000,
  "amount_band": "$1,001 - $15,000",
  "filing_delay_days": 14,
  "capital_gains_over_200": false,
  "parse_status": "parsed"
}
```

| Field                    | Type    | Description |
|---------------------------|---------|-------------|
| `filing_id`                | string  | House DocID or Senate report UUID, prefixed by chamber. |
| `chamber`                  | string  | `house` or `senate`. |
| `filing_type`               | string  | `ptr`, `annual`, `candidate`, `termination`, `extension`, `blind_trust`, or `amendment`. |
| `filing_type_code`          | string  | Raw source-system code the filing type was derived from. |
| `filer_last_name` / `filer_first_name` / `filer_suffix` | string | Filer's name as filed. |
| `filer_role`                | string  | e.g. Member, Candidate, Former Member. |
| `state_district`            | string  | State/district for House filers, state for Senate filers. |
| `filing_year`               | number  | Year the filing covers. |
| `filing_date`                | date    | Date the filing was submitted. |
| `document_url`              | string  | Link to the source filing. |
| `amendment_of`              | string  | `filing_id` of the original filing, when this record is an amendment. |
| `transaction_date` / `notification_date` | date | Trade date and the date it was reported. |
| `owner`                      | string  | `self`, `SP` (spouse), `DC` (dependent child), or `JT` (joint). |
| `asset_name` / `ticker` / `asset_type` | string | The traded or disclosed asset. |
| `transaction_type`          | string  | `purchase`, `sale`, `partial_sale`, or `exchange`. |
| `amount_low` / `amount_high` / `amount_band` | number/string | The disclosed value band — Congress reports ranges, not exact figures. |
| `filing_delay_days`          | number  | Days between the trade and its disclosure — the STOCK Act's 45-day compliance signal. |
| `capital_gains_over_200`     | boolean | Whether the filer flagged capital gains over $200 on this trade. |
| `schedule`                   | string  | Which annual-disclosure schedule this row came from (assets, earned income, liabilities, positions, agreements, gifts, travel), for annual-report records. |
| `schedule_item_name` / `schedule_value_band` / `schedule_value_low` / `schedule_value_high` | string/number | The disclosed item and its value band, for schedule rows that aren't assets, liabilities, or positions. |
| `income_type` / `income_band`  | string  | Type and band of disclosed income. |
| `liability_creditor` / `liability_type` | string | For disclosed liabilities. |
| `position_organization` / `position_title` | string | For disclosed outside positions. |
| `source_document_url`        | string  | Same as `document_url` — included for downstream joins that key on it. |
| `parse_status`               | string  | `parsed`, or `scanned_unparsed` for the small share of older filings that are scanned images rather than text. |

***

### FAQ

#### How do I get congressional stock trading data?

Run US Congress Financial Disclosure Scraper with `chambers: ["house", "senate"]` and `filingTypes: ["ptr"]`. Every trade comes back as its own record — ticker, direction, date, amount band, and how many days late it was reported.

#### Does this cover the Senate, or just the House?

Both. Set `chambers` to `["house"]`, `["senate"]`, or leave it empty for both. Most tools on the market only cover the House, because the Senate side needs a separate filing system entirely.

#### Can I get the full annual disclosure, not just stock trades?

Yes. Set `filingTypes` to include `annual` (or leave it empty) and you'll get Schedules A through I — assets, earned income, liabilities, outside positions, future-employment agreements, gifts, and travel — alongside the trades.

#### How far back does the data go?

House filings go back to 2008. Set `years` to whichever range you need, or leave it empty for the full range.

#### What does `filing_delay_days` actually measure?

The gap between a trade date and its notification date. The STOCK Act requires disclosure within 45 days — a negative or unusually large value in this field is worth a second look, and occasionally reflects an error in the filer's own paperwork rather than ours.

***

### Need More Features?

Need a different filter, a specific filer, or a related dataset? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use US Congress Financial Disclosure Scraper?

- **Both chambers, one schema** — most alternatives are House-only
- **The full annual disclosure, not just trades** — Schedules A through I, the part of the filing everyone else skips, structured the same way as the PTR data
- **A real compliance signal** — `filing_delay_days` and linked amendments, computed once instead of recomputed by every buyer

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `resumeCursor` (type: `string`):

Leave empty for a fresh crawl. To CONTINUE a previous run where it stopped — without paying again for records you already received — paste the `resumeCursor` value from that run's Output (the run's OUTPUT key). Resume promptly: the previous run's data expires with your account's retention window (free tier: your ~10 most recent runs).

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

Maximum number of records to scrape

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

Congressional chambers to include. Leave empty for both House and Senate. The Senate source (efdsearch.senate.gov) is occasionally unreachable upstream (HTTP 503) — a senate-only run fails loudly with the real cause when that happens rather than returning an empty result.

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

Filter to specific disclosure filing types. Leave empty for all types (PTR trades, annual disclosures, candidate reports, terminations, extensions, blind trusts, amendments).

## `years` (type: `array`):

Filing years to include (House ZIP index covers 2008-2026; Senate eFD applies the same range). Leave empty for all years.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10,
  "chambers": [],
  "filingTypes": [],
  "years": []
}
```

# Actor output Schema

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

No description

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/us-congress-financial-disclosure-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/us-congress-financial-disclosure-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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10
}' |
apify call jungle_synthesizer/us-congress-financial-disclosure-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/us-congress-financial-disclosure-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/ooTg5Vzf932csEkoe/builds/gJDCGKp4pWtBbcn7P/openapi.json
