> ## Documentation Index
> Fetch the complete documentation index at: https://docs.financialdatasets.ai/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> The Financial Datasets API is served at https://api.financialdatasets.ai. Authenticate with the `X-API-KEY` header; create keys at https://financialdatasets.ai. Agents can open and fund their own account without a dashboard: see https://docs.financialdatasets.ai/agents.md.
> Tool-using agents can call Financial Datasets without writing code through the hosted MCP server at https://mcp.financialdatasets.ai/.
> The OpenAPI spec at https://financialdatasets.ai/openapi.json is the source of truth for request and response schemas.
> The index of every docs page is at https://docs.financialdatasets.ai/llms.txt. Append .md to any docs URL to get that page as Markdown.

# Congressional Trading API (House Stock Trades)

> Stock trades disclosed by members of the US House of Representatives: 57,000+ trades since 2014, updated within minutes after each report goes public.

### Overview

The Financial Datasets politician trades API returns the stock trades that members of the US House of Representatives disclose. It tells you which stocks members of the House bought or sold, within minutes after each report goes public. Every trade is read directly from the official disclosure reports, which come from authoritative government sources ([data provenance](https://docs.financialdatasets.ai/data-provenance.md)).

You can call it as a REST endpoint with an API key, or from Claude, ChatGPT, Cursor, and other AI apps through the [MCP server](https://docs.financialdatasets.ai/mcp-server.md), or pay per request with [x402](https://docs.financialdatasets.ai/x402.md). [Pricing](https://www.financialdatasets.ai/pricing) starts at \$20.

With no filter, the endpoint is a feed of the newest disclosures from every member. Add filters to answer questions like:

* Which members of the House sold Nvidia this year?
* What did members from Texas buy last month?
* Which trades over \$1,000,000 did a member's spouse make?

To get started, please create an account and grab your **API key** at [financialdatasets.ai](https://financialdatasets.ai).

You will use the API key to authenticate your API requests.

### Coverage

| Chamber | Members | Trades | Years of Coverage | Updated |
| - | - | - | - | - |
| House | 320+ | 57,000+ | 2014 onward | Within minutes after each report goes public |

Senate trades are coming soon. Reports that a member filed on paper are not included.

**Trade date and filing date**: a member has up to 45 days to report a trade, so a trade's `transaction_date` is often weeks before its `filing_date`. Use `filing_date` to see what became public, and `transaction_date` to see when the trade happened.

### Available Members

You can fetch the list of members with a trade on record, with their chamber and state, with a `GET` request to:
[https://api.financialdatasets.ai/politician-trades/names/](https://api.financialdatasets.ai/politician-trades/names/)

### Getting Started

There are only 3 steps for making a successful API call:

1. Add your API key to the header of the request as `X-API-KEY`.
2. Add query params like `ticker` and `limit` to filter the data.
3. Execute the API request.

### The Response

Each trade is one row of a member's report. Most fields are as filed. These need a word:

* `amount_low` and `amount_high`: members report a dollar range, not an exact amount. A trade of "$1,001 - $15,000" has `amount_low` 1001 and `amount_high` 15000. When a member reports an exact amount, `amount_low` and `amount_high` are equal.
* `owner`: whose account made the trade: `self`, `spouse`, `joint`, or `dependent_child`.
* `transaction_type`: `purchase`, `sale`, or `exchange`.
* `sale_type`: `partial` when the report marks a sale as partial, `full` when it marks it as full, and `null` when the report does not say.
* `filing_status`: `new` for a first report of the trade, `amended` for a corrected row, and `deleted` for a row the member withdrew.
* `ticker`: the ticker as the member reported it, or `null` when the member did not report one.
* `report_url`: the official report the trade comes from.

### Filtering the Data

No parameter is required. With no filter, you get the newest disclosures first.

You can filter the data by `ticker`, `name`, `chamber`, `transaction_type`, `state`, `owner`, `amount_gte`, `filing_date`, and `transaction_date`, and sort with `order_by`. All filters combine.

**Note**: by default, `limit` is `10` and `order_by` is `filing_date`.

The `ticker` parameter is used to filter trades in one stock (e.g., `NVDA`). Share classes match in both forms: `BRK.B` and `BRK-B` give the same trades.

The `name` parameter is used to filter trades by a member. Every word you send must be in the name, in any case, so a last name alone is enough. You can get the list of names from the `/names` endpoint above.

The `chamber` parameter is `house` or `senate`.

The `transaction_type` parameter is `purchase`, `sale`, or `exchange`.

The `state` parameter is the member's two-letter state code (e.g., `TX`), in any case.

The `owner` parameter is `self`, `spouse`, `joint`, or `dependent_child`.

The `amount_gte` parameter keeps trades whose `amount_low` is at least this many whole dollars. For example, `amount_gte=1000001` keeps the "$1,000,001 - $5,000,000" range and up.

The `filing_date` and `transaction_date` parameters filter by date in `YYYY-MM-DD` format. For example, `transaction_date_gte=2025-01-01` and `transaction_date_lte=2025-12-31` give the trades made in 2025.

The available date operations are:

* `filing_date`, `filing_date_gte`, `filing_date_lte`, `filing_date_gt`, `filing_date_lt`
* `transaction_date`, `transaction_date_gte`, `transaction_date_lte`, `transaction_date_gt`, `transaction_date_lt`

The `order_by` parameter sets the order:

* `filing_date` (default): newest disclosure first.
* `transaction_date`: newest trade first.

The `limit` parameter is the total number of trades to return across all pages. Each page holds up to 10 trades, linked by `next_page_url`. The maximum value is `5000`.

### Example (the feed)

```python Politician Trades theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
import requests

# add your API key to the headers
headers = {
    "X-API-KEY": "your_api_key_here"
}

# the newest disclosures from every member
url = 'https://api.financialdatasets.ai/politician-trades?limit=10'

# make API request
response = requests.get(url, headers=headers)

# parse politician_trades from the response
politician_trades = response.json().get('politician_trades')
```

### Example (with ticker)

```python Politician Trades theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
import requests

# add your API key to the headers
headers = {
    "X-API-KEY": "your_api_key_here"
}

# set your query params
ticker = 'NVDA'     # stock ticker
limit = 100         # number of trades to return

# create the URL
url = (
    f'https://api.financialdatasets.ai/politician-trades'
    f'?ticker={ticker}'
    f'&limit={limit}'
)

# make API request
response = requests.get(url, headers=headers)

# parse politician_trades from the response
politician_trades = response.json().get('politician_trades')
```

### Example (with name)

```python Politician Trades theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
import requests

# add your API key to the headers
headers = {
    "X-API-KEY": "your_api_key_here"
}

# set your query params
name = 'last_name'  # every word must be in the member's name; see /politician-trades/names

# create the URL
url = (
    f'https://api.financialdatasets.ai/politician-trades'
    f'?name={name}'
    f'&limit=100'
)

# make API request
response = requests.get(url, headers=headers)

# parse politician_trades from the response
politician_trades = response.json().get('politician_trades')
```

### Example (with state and transaction\_date)

```python Politician Trades theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
import requests

# add your API key to the headers
headers = {
    "X-API-KEY": "your_api_key_here"
}

# set your query params
state = 'TX'                        # member's state
transaction_date_gte = '2025-01-01' # trades made on or after this day

# create the URL
url = (
    f'https://api.financialdatasets.ai/politician-trades'
    f'?state={state}'
    f'&transaction_date_gte={transaction_date_gte}'
    f'&limit=100'
)

# make API request
response = requests.get(url, headers=headers)

# parse politician_trades from the response
politician_trades = response.json().get('politician_trades')
```

### Example (with owner and amount\_gte)

```python Politician Trades theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
import requests

# add your API key to the headers
headers = {
    "X-API-KEY": "your_api_key_here"
}

# set your query params
owner = 'spouse'        # whose account made the trade
amount_gte = 1000001    # the trade's low bound is at least $1,000,001

# create the URL
url = (
    f'https://api.financialdatasets.ai/politician-trades'
    f'?owner={owner}'
    f'&amount_gte={amount_gte}'
    f'&limit=100'
)

# make API request
response = requests.get(url, headers=headers)

# parse politician_trades from the response
politician_trades = response.json().get('politician_trades')
```

### Example (newest trades first)

```python Politician Trades theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
import requests

# add your API key to the headers
headers = {
    "X-API-KEY": "your_api_key_here"
}

# sort by the day of the trade, not the day it was disclosed
url = (
    f'https://api.financialdatasets.ai/politician-trades'
    f'?order_by=transaction_date'
    f'&limit=100'
)

# make API request
response = requests.get(url, headers=headers)

# parse politician_trades from the response
politician_trades = response.json().get('politician_trades')
```

### FAQ

#### Where does the politician trading data come from?

From authoritative government sources: the official trade reports that members of the House file. Each report is read into one structured record per trade.

#### How fast do new trades show up?

Within minutes after each report goes public.

#### Why is the trade date weeks before the filing date?

A member has up to 45 days to report a trade. The trade happened on `transaction_date`; it became public on `filing_date`.

#### Why is the amount a range?

Members report a dollar range, not an exact amount. We serve the range as filed in `amount_low` and `amount_high`, and never guess a figure inside it.

#### Do you cover the Senate?

Not yet. Senate trades are coming soon.

#### Can an AI agent use this data?

Yes. Claude, ChatGPT, Cursor, and other MCP clients reach it through the [Financial Datasets MCP server](https://docs.financialdatasets.ai/mcp-server.md). An agent with a wallet can also pay per request with [x402](https://docs.financialdatasets.ai/x402.md), with no account.


## OpenAPI

````yaml GET /politician-trades
openapi: 3.0.1
info:
  title: Financial Datasets API
  description: >-
    Stock market API with real-time and historical financial data for 27,000+
    tickers over 30+ years. Financial statements, equity prices, insider trades,
    SEC filings, and more.
  version: 1.0.0
  license:
    name: MIT
    url: https://opensource.org/licenses/MIT
  contact:
    name: API Support
    url: mailto:support@financialdatasets.ai
    email: support@financialdatasets.ai
  termsOfService: https://financialdatasets.ai/terms-of-use
servers:
  - url: https://api.financialdatasets.ai/
    description: Production server
security:
  - X-API-KEY: []
tags:
  - name: Financial Statements
    description: Access to income statements, balance sheets, and cash flow statements
  - name: Market Data
    description: Real-time and historical price data
  - name: Company Information
    description: Company facts like ticker, name, and description
  - name: Earnings
    description: Earnings data and related information
  - name: News
    description: Real-time and historical news articles
  - name: SEC Filings
    description: SEC filings and regulatory documents
  - name: Insider Trades
    description: Insider trading activity and transactions
  - name: Politician Trades
    description: Stock trades disclosed by members of Congress
  - name: Activist Ownership
    description: Activist stakes from SEC Schedule 13D filings, in real time
  - name: Beneficial Ownership
    description: >-
      Holders of more than 5% of a company's shares, from SEC Schedules 13D and
      13G
  - name: Insider Ownership
    description: Insider ownership statements from SEC Forms 3 and 5
  - name: Institutional Holdings
    description: SEC-direct 13F equity holdings of institutional investment managers
  - name: IPOs
    description: >-
      Upcoming IPOs from SEC registration statements (Form S-1), with extracted
      pre-IPO financial statements
  - name: Index Funds
    description: >-
      ETF and index-fund holdings, weights, and the funds that hold a given
      security
  - name: Financial Metrics
    description: Financial ratios, metrics, and key performance indicators
  - name: Macroeconomics
    description: Real-time and historical macroeconomic data like interest rates
  - name: KPIs
    description: Sector-specific operational KPIs extracted from earnings releases.
  - name: Agent Account
    description: Self-serve account creation and funding for AI agents.
  - name: Search
    description: Search financial documents with one question and get cited passages back
paths:
  /politician-trades:
    get:
      tags:
        - Politician Trades
      summary: Get politician trades
      description: >-
        Get the stock trades that members of the US House disclose. No parameter
        is required: with no filter, the newest disclosures come first.
      operationId: getPoliticianTrades
      parameters:
        - name: ticker
          in: query
          description: >-
            Filter by stock ticker (e.g., 'NVDA'). Share classes match in both
            forms: 'BRK.B' and 'BRK-B' give the same trades.
          required: false
          schema:
            type: string
        - name: name
          in: query
          description: >-
            Filter by member name. Every word must be in the name, in any case,
            so a last name alone is enough. Use the /politician-trades/names
            endpoint to get the names.
          required: false
          schema:
            type: string
        - name: chamber
          in: query
          description: Filter by chamber of Congress.
          required: false
          schema:
            type: string
            enum:
              - house
              - senate
        - name: transaction_type
          in: query
          description: Filter by type of trade.
          required: false
          schema:
            type: string
            enum:
              - purchase
              - sale
              - exchange
        - name: state
          in: query
          description: >-
            Filter by the member's two-letter state code (e.g., 'TX'), in any
            case.
          required: false
          schema:
            type: string
            minLength: 2
            maxLength: 2
        - name: owner
          in: query
          description: Filter by whose account made the trade.
          required: false
          schema:
            type: string
            enum:
              - self
              - spouse
              - joint
              - dependent_child
        - name: amount_gte
          in: query
          description: >-
            Keep trades whose amount_low is at least this many whole dollars
            (e.g., 1000001 keeps the $1,000,001 - $5,000,000 range and up).
          required: false
          schema:
            type: integer
            minimum: 0
        - name: filing_date
          in: query
          description: >-
            Filter by the date the report was filed: equal to this date
            (YYYY-MM-DD).
          required: false
          schema:
            type: string
            format: date
        - name: filing_date_gte
          in: query
          description: >-
            Filter by the date the report was filed: on or after this date
            (YYYY-MM-DD).
          required: false
          schema:
            type: string
            format: date
        - name: filing_date_lte
          in: query
          description: >-
            Filter by the date the report was filed: on or before this date
            (YYYY-MM-DD).
          required: false
          schema:
            type: string
            format: date
        - name: filing_date_gt
          in: query
          description: >-
            Filter by the date the report was filed: after this date
            (YYYY-MM-DD).
          required: false
          schema:
            type: string
            format: date
        - name: filing_date_lt
          in: query
          description: >-
            Filter by the date the report was filed: before this date
            (YYYY-MM-DD).
          required: false
          schema:
            type: string
            format: date
        - name: transaction_date
          in: query
          description: 'Filter by the date of the trade: equal to this date (YYYY-MM-DD).'
          required: false
          schema:
            type: string
            format: date
        - name: transaction_date_gte
          in: query
          description: 'Filter by the date of the trade: on or after this date (YYYY-MM-DD).'
          required: false
          schema:
            type: string
            format: date
        - name: transaction_date_lte
          in: query
          description: >-
            Filter by the date of the trade: on or before this date
            (YYYY-MM-DD).
          required: false
          schema:
            type: string
            format: date
        - name: transaction_date_gt
          in: query
          description: 'Filter by the date of the trade: after this date (YYYY-MM-DD).'
          required: false
          schema:
            type: string
            format: date
        - name: transaction_date_lt
          in: query
          description: 'Filter by the date of the trade: before this date (YYYY-MM-DD).'
          required: false
          schema:
            type: string
            format: date
        - name: order_by
          in: query
          description: >-
            The order of the trades: filing_date (default) puts the newest
            disclosure first; transaction_date puts the newest trade first.
          required: false
          schema:
            type: string
            enum:
              - filing_date
              - transaction_date
            default: filing_date
        - name: limit
          in: query
          description: >-
            The maximum number of trades to return (default: 10, max: 5000).
            This is the total across all pages, not a page size: each page holds
            up to 10 records, linked by `next_page_url`.
          required: false
          schema:
            type: integer
            default: 10
        - name: cursor
          in: query
          description: >-
            Opaque pagination cursor from a previous response's next_page_url.
            When provided, all other query parameters are ignored: the cursor
            carries the original request's filters. Treat it as opaque; do not
            construct or modify it.
          required: false
          schema:
            type: string
      responses:
        '200':
          description: Politician trades response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PoliticianTradesResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '402':
          $ref: '#/components/responses/PaymentRequiredError'
        '404':
          $ref: '#/components/responses/NotFoundError'
components:
  schemas:
    PoliticianTradesResponse:
      type: object
      properties:
        politician_trades:
          type: array
          items:
            $ref: '#/components/schemas/PoliticianTrade'
        next_page_url:
          type: string
          description: >-
            Absolute URL of the next page of results. Present only when more
            results remain; request it as-is to continue. Each page holds up to
            10 records.
    PoliticianTrade:
      type: object
      properties:
        name:
          type: string
          description: The member's name as filed.
        chamber:
          type: string
          enum:
            - house
            - senate
          description: 'The chamber of Congress: house or senate.'
        state:
          type: string
          nullable: true
          description: The member's two-letter state code.
        district:
          type: string
          nullable: true
          description: The member's congressional district (House only).
        owner:
          type: string
          enum:
            - self
            - spouse
            - joint
            - dependent_child
          description: Whose account made the trade.
        ticker:
          type: string
          nullable: true
          description: >-
            The ticker as the member reported it, or null when the member did
            not report one.
        asset_name:
          type: string
          description: The asset as the member described it.
        asset_type:
          type: string
          nullable: true
          description: The type of asset as filed (for example, 'Stocks (including ADRs)').
        transaction_type:
          type: string
          enum:
            - purchase
            - sale
            - exchange
          description: The type of trade.
        sale_type:
          type: string
          enum:
            - full
            - partial
          nullable: true
          description: >-
            For a sale: partial when the report marks it as partial, full when
            it marks it as full, null when the report does not say.
        transaction_date:
          type: string
          format: date
          description: The date of the trade.
        notification_date:
          type: string
          format: date
          nullable: true
          description: The date the member was notified of the trade.
        filing_date:
          type: string
          format: date
          description: >-
            The date the report was filed. A member has up to 45 days after the
            trade to report it.
        amount_low:
          type: number
          description: >-
            The low end of the disclosed dollar range. Equal to amount_high when
            the member reported an exact amount.
        amount_high:
          type: number
          nullable: true
          description: >-
            The high end of the disclosed dollar range, or null for an open
            range such as 'Over $1,000,000'.
        filing_status:
          type: string
          enum:
            - new
            - amended
            - deleted
          description: >-
            new for a first report of the trade, amended for a corrected row,
            deleted for a row the member withdrew.
        description:
          type: string
          nullable: true
          description: The description the member added to the trade.
        comment:
          type: string
          nullable: true
          description: The comment the member added to the trade.
        report_url:
          type: string
          description: The official report the trade comes from.
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: A short error message.
        message:
          type: string
          description: A more detailed error message.
  responses:
    BadRequestError:
      description: Bad request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Bad Request
            message: Invalid request parameters
    UnauthorizedError:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Unauthorized
            message: Invalid API key provided
    PaymentRequiredError:
      description: The request requires a paid subscription
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Payment Required
            message: >-
              This endpoint requires a paid subscription. Please upgrade your
              plan.
    NotFoundError:
      description: The specified resource was not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Not Found
            message: Ticker XXXX not found
  securitySchemes:
    X-API-KEY:
      type: apiKey
      name: X-API-KEY
      description: API key for authentication.
      in: header

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.