---
title: "Per-disclosure politician trade feed (cursor, exactly-once)"
method: GET
path: "/politicians/disclosures"
tags: ["Politician Disclosures"]
---

# Per-disclosure politician trade feed (cursor, exactly-once)

`GET /politicians/disclosures`

## Request

- Base URL: `https://api.signal8.ai/api/v1/public`
- URL: `https://api.signal8.ai/api/v1/public/politicians/disclosures`
- Auth: API key in header `X-Api-Key`

One item per DISCLOSURE — a congressional STOCK Act periodic transaction
report (PTR) or an executive-branch OGE Form 278-T — that contains at
least one trade whose bracket LOWER bound is at or above `minAmount`.
Every item carries ALL trades of the report (sorted by bracket lower
bound, largest first); `qualifyingTradeCount` says how many clear the
threshold.

**Built for polling.** Store `nextCursor` and pass it back as `since`
on the next call: each disclosure is returned exactly once for a given
`minAmount` + `kinds`, in the order it became complete — plus once more
per GROWTH revision (below). `nextCursor` is returned on every
response, including empty pages; keep it even when `items` is empty.
When `hasMore` is true, call again immediately.

**Completeness.** Rows of one report reach us across several sweeps, so
a report is emitted only once no new row of it has arrived for a settle
window (8h by default). If a later row raises the report's largest
bracket above a threshold it had not reached, the report is emitted
(once) to clients at that threshold. Upstream batches of one large
report can arrive more than a day apart, so a report that GROWS
materially after it was emitted (+25 trades or +20%) is emitted again,
once, with a higher `revision`; when you already received an earlier
revision at your threshold the item says `replacesPrevious: true` —
replace the copy you hold by `id` (if you hold none, treat it as new).
Smaller growth is not re-emitted.

**Lateness.** `filingDelayDays` is the largest trade-to-disclosure lag
in the report, `isLateFiling` whether it exceeds 45 days, and
`lateTradeCount` how many trades do — all computed EXCLUDING trades
whose `transactionDateSuspect` is true: a trade lagging its own
otherwise on-time report's median by ~one year (335-395 days; median
≤45 days; needs ≥3 other trades) is a probable mistyped year upstream.
Such trades are still listed with their date as filed and counted in
`suspectDateCount`. `owner` is `null` when not stated ("Not stated",
never "Self").

**Cold start.** Without `since`, only disclosures that became complete
in the last 48 hours are returned. Reports whose filing date is older
than the event window (14 days congressional, 30 days executive) are
never emitted, so a historical backfill is not replayed as news.

**Amounts are brackets.** Render `amountRange`. `amountMin` is null when
the bracket could not be parsed (never "$0"); `amountMax` is null for
"Over $50,000,000". A null `ticker` is a non-equity asset (bond, fund,
real estate) — see `assetDescription`.

**Credit cost: 3**

## Query parameters

- `since` string
- `limit` integer
- `minAmount` integer
- `kinds` string

## Response `200`

A page of disclosures plus the cursor to resume from

- object

## Other responses

- `400`: Invalid request parameters
- `401`: Missing or invalid API key
- `402`: Not enough credits for this request
- `429`: Rate limit exceeded

---

[API](https://skmtc.dev/signal8/apis/signal8-public-api.md) · [All operations](https://skmtc.dev/signal8/apis/signal8-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/signal8/apis/signal8-public-api/revisions/5a18ae8d6d58?raw)
