Programmatic access to Congressional stock trades, member profiles, conflict alerts, lobbying connections, and network graph data. All responses follow a consistent envelope format with pagination and citation metadata.
https://www.capitolexposed.com/api/v1Free-tier requests require no authentication and are rate-limited by IP address. For higher limits, include your API key in the X-API-Key header.
curl -H "X-API-Key: cg_v1_your_key_here" \ https://www.capitolexposed.com/api/v1/stats
All responses return JSON with a standard envelope: status, data, meta (pagination + timestamp), and citation information. Field names use snake_case.
CapitolExposed has two AI surfaces. Quick Answer runs on /api/investigate for fast internal-data answers. Deep Research uses the saved notebook workflow under /api/investigate/deep plus thread, run, share, and export routes. These app routes are used by the Ask AI workspace rather than the public v1 API.
Best for fast database questions and quick follow-ups.
Free plan includes 5 runs per day, rate-limited by route.
Returns streaming chat output and tool results.
Best for source-backed investigations, timelines, comparisons, and source packs.
Pro includes 10 deep runs per month. Institutional and Data Feed plans are unlimited.
Saved notebooks persist runs, messages, artifacts, and source sets.
Uploads accept PDF, text, CSV, Markdown, and JSON files.
Each request supports up to 4 files and 12 MB per file.
PDF extraction reads up to 20 pages and trims extracted text to 50,000 characters.
Deep Research prioritizes uploaded evidence first, internal records second, and official allowlisted domains third.
14 official domains are enabled for retrieval, including congress.gov, senate.gov, house.gov, fec.gov, sec.gov, pdc.wa.gov, and leg.wa.gov.
The machine-readable Deep Research spec lives at /api/investigate/openapi.json.
| Route | Purpose | Access |
|---|---|---|
POST /api/investigate | Quick Answer streaming chat | Public, free tier limited to 5 runs per day |
POST /api/investigate/deep | Create a deep-research run and thread | Signed-in Pro or higher |
POST /api/investigate/uploads | Extract text from PDF and text-based uploads for notebook use | Public |
GET /api/investigate/runs/{runId} | Load run status, progress, and the current thread payload | Signed-in owner |
GET /api/investigate/runs/{runId}/stream | Resumable SSE progress stream for a deep run | Signed-in owner |
GET /api/investigate/threads/{threadId} | Load notebook state, sources, and artifacts | Signed-in owner |
PATCH /api/investigate/threads/{threadId} | Rename a saved notebook | Signed-in owner |
POST /api/investigate/artifacts/{artifactId}/share | Create a frozen public share snapshot | Signed-in owner |
GET /api/investigate/artifacts/{artifactId}/export | Export an artifact and its source set as JSON | Signed-in owner |
Rate limits are enforced per route and returned in response headers. Exceeding the active window returns 429 Too Many Requests with a Retry-After header.
| Route Class | Rate Limit | Authentication | Notes |
|---|---|---|---|
| List endpoints | 60 requests / minute | Optional; tracked by IP or API key | Members and trades |
| Search and alerts | 30 requests / minute | Optional; tracked by IP or API key | Search, alerts |
| Bulk exports | 5 requests / 60 minutes | Optional; some params require cg_v1_ key | CSV / JSON export |
| Quick Answer | 5 requests / day on the free plan | Optional; signed-in paid plans skip the free cap | /api/investigate |
| Deep Research start | 20 requests / 60 minutes | Signed-in paid plans only | /api/investigate/deep |
| Upload ingestion | 20 requests / 60 minutes | Public; shared by Quick Answer and Deep Research uploads | /api/investigate/uploads |
All endpoints accept GET requests and return JSON. Click any endpoint to expand the response example.
/api/v1/statsReturns site-wide statistics including member count, trade count, lobbying filings, and conflict alert totals.
{
"api_version": "1.0",
"status": "success",
"data": {
"member_count": 538,
"trade_count": 15948,
"lobbying_filing_count": 116127,
"alert_count": 900,
"last_filing_date": "2026-02-24"
},
"meta": {
"timestamp": "2026-02-25T12:00:00Z"
},
"citation": {
"source": "CapitolExposed",
"url": "https://www.capitolexposed.com",
"license": "Public Records — Attribution Requested",
"accessed_at": "2026-02-25T12:00:00Z"
}
}/api/v1/membersList all members of Congress with basic profile information, party affiliation, chamber, and state.
| Name | Type | Required | Description |
|---|---|---|---|
chamber | string | optional | Filter by chamber: "house" or "senate" |
party | string | optional | Filter by party: "D", "R", or "I" |
state | string | optional | Filter by two-letter state code (e.g. CA, TX, NY) |
page | integer | optional | Page number (default: 1) |
per_page | integer | optional | Results per page, max 100 (default: 50) |
{
"api_version": "1.0",
"status": "success",
"data": [
{
"id": "m-001",
"slug": "nancy-pelosi",
"name": "Nancy Pelosi",
"party": "D",
"chamber": "house",
"state": "CA",
"district": 11,
"conflict_score": 0.72,
"trade_count": 48
}
],
"meta": {
"total": 538,
"page": 1,
"per_page": 50,
"has_more": true,
"timestamp": "2026-02-25T12:00:00Z"
}
}/api/v1/members/{slug}Retrieve a single member profile including bio, committee assignments, financial summary, and conflict score breakdown.
| Name | Type | Required | Description |
|---|---|---|---|
slug | string | required | URL-safe member identifier (e.g. nancy-pelosi) |
{
"api_version": "1.0",
"status": "success",
"data": {
"id": "m-001",
"slug": "nancy-pelosi",
"name": "Nancy Pelosi",
"party": "D",
"chamber": "house",
"state": "CA",
"district": 11,
"committees": ["Financial Services", "Intelligence"],
"conflict_score": 0.72,
"trade_count": 48,
"total_trade_value_min": 5000000,
"total_trade_value_max": 25000000,
"top_sectors": ["Technology", "Finance", "Healthcare"]
}
}/api/v1/members/{slug}/tradesList all STOCK Act filings for a specific member, including trade details, amounts, and individual conflict scores.
| Name | Type | Required | Description |
|---|---|---|---|
slug | string | required | URL-safe member identifier |
type | string | optional | Trade type: "purchase", "sale", or "exchange" |
ticker | string | optional | Filter by stock ticker symbol (e.g. AAPL, NVDA) |
min_amount | integer | optional | Minimum trade amount in dollars |
page | integer | optional | Page number (default: 1) |
{
"api_version": "1.0",
"status": "success",
"data": [
{
"id": "t-1001",
"member_slug": "nancy-pelosi",
"ticker": "NVDA",
"asset_description": "NVIDIA Corp",
"transaction_type": "purchase",
"transaction_date": "2026-01-15",
"disclosure_date": "2026-02-10",
"amount_min": 250000,
"amount_max": 500000,
"owner": "spouse",
"conflict_score": 0.85
}
],
"meta": { "total": 48, "page": 1, "per_page": 50 }
}/api/v1/members/{slug}/votesRetrieve a member's voting record on bills related to industries where they hold stock positions.
| Name | Type | Required | Description |
|---|---|---|---|
slug | string | required | URL-safe member identifier |
session | string | optional | Congressional session (e.g. 119) |
sector | string | optional | Filter by industry sector |
{
"api_version": "1.0",
"status": "success",
"data": [
{
"vote_id": "v-119-42",
"bill": "H.R. 4521",
"bill_title": "CHIPS and Science Act Extension",
"vote_date": "2026-01-28",
"vote_cast": "yea",
"related_holdings": ["NVDA", "INTC", "AMD"],
"sector_overlap": true
}
],
"meta": { "total": 12, "page": 1, "per_page": 50 }
}/api/v1/members/{slug}/donorsList top campaign donors for a member, cross-referenced with their stock holdings and committee assignments.
| Name | Type | Required | Description |
|---|---|---|---|
slug | string | required | URL-safe member identifier |
cycle | string | optional | Election cycle year (e.g. 2024, 2026) |
min_amount | integer | optional | Minimum total donation amount in dollars |
{
"api_version": "1.0",
"status": "success",
"data": [
{
"donor_name": "Alphabet Inc PAC",
"total_amount": 45000,
"cycle": "2026",
"sector": "Technology",
"member_holds_sector_stock": true,
"member_on_relevant_committee": false
}
],
"meta": { "total": 25, "page": 1, "per_page": 50 }
}/api/v1/tradesList all Congressional stock trades across all members, with filtering and sorting options.
| Name | Type | Required | Description |
|---|---|---|---|
ticker | string | optional | Filter by stock ticker symbol |
type | string | optional | Trade type: "purchase", "sale", or "exchange" |
party | string | optional | Filter by party: "D", "R", or "I" |
min_conflict | number | optional | Minimum conflict score (0.0 to 1.0) |
sort | string | optional | Sort by: "date", "amount", or "conflict" (default: date desc) |
page | integer | optional | Page number (default: 1) |
per_page | integer | optional | Results per page, max 100 (default: 50) |
{
"api_version": "1.0",
"status": "success",
"data": [
{
"id": "t-1001",
"member_slug": "nancy-pelosi",
"member_name": "Nancy Pelosi",
"party": "D",
"ticker": "NVDA",
"asset_description": "NVIDIA Corp",
"transaction_type": "purchase",
"transaction_date": "2026-01-15",
"amount_min": 250000,
"amount_max": 500000,
"conflict_score": 0.85
}
],
"meta": { "total": 3759, "page": 1, "per_page": 50, "has_more": true }
}/api/v1/alertsList conflict alerts scored by severity. Cross-references trades with votes, lobbying, and donations.
| Name | Type | Required | Description |
|---|---|---|---|
severity | string | optional | Filter by severity: "critical", "high", "medium", or "low" |
member | string | optional | Filter by member slug |
page | integer | optional | Page number (default: 1) |
{
"api_version": "1.0",
"status": "success",
"data": [
{
"id": "alert-001",
"severity": "critical",
"title": "Defense stock purchase before Armed Services Committee vote",
"member_slug": "tommy-tuberville",
"member_name": "Tommy Tuberville",
"party": "R",
"trade_count": 1,
"evidence_count": 5,
"created_at": "2026-02-18T00:00:00Z"
}
],
"meta": { "total": 847, "page": 1, "per_page": 50, "has_more": true }
}/api/v1/graphReturns network graph data showing connections between members, companies, lobbying firms, and PACs. Nodes and edges format suitable for D3.js or similar visualization libraries.
| Name | Type | Required | Description |
|---|---|---|---|
center | string | optional | Center the graph on a specific member slug |
depth | integer | optional | Connection depth from center node (1-3, default: 2) |
min_weight | number | optional | Minimum edge weight to include (0.0 to 1.0) |
{
"api_version": "1.0",
"status": "success",
"data": {
"nodes": [
{ "id": "nancy-pelosi", "type": "member", "label": "Nancy Pelosi", "party": "D" },
{ "id": "nvda", "type": "company", "label": "NVIDIA Corp", "sector": "Technology" },
{ "id": "alphabet-pac", "type": "pac", "label": "Alphabet Inc PAC" }
],
"edges": [
{ "source": "nancy-pelosi", "target": "nvda", "type": "trade", "weight": 0.85 },
{ "source": "nancy-pelosi", "target": "alphabet-pac", "type": "donation", "weight": 0.6 }
]
},
"meta": { "node_count": 3, "edge_count": 2 }
}/api/v1/searchSearch across members, trades, bills, lobbying filings, donations, filing documents, and cross-reference evidence. Supports lexical, semantic, and hybrid retrieval.
| Name | Type | Required | Description |
|---|---|---|---|
q | string | required | Search query (e.g. 'Pelosi NVIDIA', 'defense stocks') |
type | string | optional | Restrict to entity type: "member", "trade", "bill", "lobbying", "donation", "document", or "cross_reference" |
mode | string | optional | Search mode: "fts", "semantic", or "hybrid". semantic and hybrid fall back to fts when embeddings are unavailable. |
limit | integer | optional | Max results to return (default: 20, max: 100) |
{
"api_version": "1.0",
"status": "success",
"data": {
"results": [
{
"id": "m-W000816",
"type": "member",
"title": "Roger Williams",
"snippet": "<mark>Roger</mark> <mark>Williams</mark> - R TX",
"score": 0.991,
"url": "/members/roger-williams",
"extra": {
"party": "R",
"state": "TX",
"chamber": "house",
"in_office": true
}
},
{
"id": "doc-offshore-match-entity:85035395",
"type": "cross_reference",
"title": "Cory Mills cross-reference in Paradise Papers - Aruba corporate registry",
"snippet": "Matched offshore registry records linked to Cory Mills for follow-up reporting.",
"score": 0.87,
"url": "/search?q=Cory%20Mills",
"extra": {
"source": "icij-offshore-leaks",
"category": "cross-reference"
}
}
],
"facets": {
"member": 1,
"cross_reference": 1
}
},
"meta": { "total": 2, "query": "roger williams", "mode": "fts" }
}/api/v1/export/tradesBulk export of Congressional stock trades in CSV or JSON format.
| Name | Type | Required | Description |
|---|---|---|---|
format | string | optional | "csv" or "json" (default: json) |
days | integer | optional | Days of data (Free: max 30, Pro: max 1825) |
CSV download or JSON array with trade records
/api/v1/export/membersBulk export of all Congress members with trade statistics.
| Name | Type | Required | Description |
|---|---|---|---|
format | string | optional | "csv" or "json" (default: json) |
CSV download or JSON array with member records
/api/v1/export/lobbyingBulk export of lobbying disclosure filings in CSV or JSON format.
| Name | Type | Required | Description |
|---|---|---|---|
format | string | optional | "csv" or "json" (default: json) |
days | integer | optional | Days of data (Free: max 90, Pro: max 1825) |
CSV download or JSON array with lobbying records
/api/v1/export/billsBulk export of bills with lobbying and trade connection counts.
| Name | Type | Required | Description |
|---|---|---|---|
format | string | optional | "csv" or "json" (default: json) |
session | string | optional | Congress session number (Pro only) |
CSV download or JSON array with bill records
/api/v1/export/votesBulk export of Congressional voting records with trade correlation flags.
| Name | Type | Required | Description |
|---|---|---|---|
format | string | optional | "csv" or "json" (default: json) |
days | integer | optional | Days of data (Free: max 90, Pro: max 1825) |
CSV download or JSON array with vote records
/api/v1/top-tradersReturns members of Congress ranked by total stock trade volume, with conflict trade counts and average conflict scores.
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer | optional | Max results (default: 50, max: 100) |
chamber | string | optional | "senate" or "house" |
{
"data": [
{
"name": "David Perdue",
"slug": "david-perdue",
"party": "R",
"state": "GA",
"chamber": "senate",
"trade_count": 3121,
"conflict_trades": 0,
"avg_conflict": 0.0,
"latest_trade": "2020-12-30"
}
]
}/api/v1/lobbying-contributionsReturns LD-203 lobbying contribution records from the official Lobbying Disclosure Act database. Shows donations from registered lobbyists and PACs to members of Congress.
| Name | Type | Required | Description |
|---|---|---|---|
recipient | string | optional | Filter by recipient name (partial match) |
registrant | string | optional | Filter by lobbying firm name |
year | integer | optional | Filing year (e.g. 2025) |
page | integer | optional | Page number (default: 1) |
per_page | integer | optional | Results per page (default: 25, max: 100) |
{
"data": [
{
"id": "lda-c-abc123-0",
"registrant_name": "HOLLAND & KNIGHT LLP",
"lobbyist_name": "JOHN DOE",
"recipient_name": "Friends of Senator Smith",
"contribution_type": "FECA",
"amount": 5000,
"filing_year": 2025,
"filing_date": "2025-07-15"
}
]
}/api/oembedStandard oEmbed 1.0 endpoint for auto-embedding CapitolExposed member and stock pages in WordPress, Medium, Ghost, and other CMS platforms.
| Name | Type | Required | Description |
|---|---|---|---|
url | string | required | CapitolExposed URL to embed (e.g. https://www.capitolexposed.com/members/nancy-pelosi) |
format | string | optional | "json" (only format supported) |
maxwidth | integer | optional | Maximum embed width in pixels (default: 400) |
maxheight | integer | optional | Maximum embed height in pixels (default: 500) |
{
"version": "1.0",
"type": "rich",
"provider_name": "CapitolExposed",
"title": "Nancy Pelosi - Congressional Trading Profile",
"width": 400,
"height": 350,
"html": "<iframe src=\"https://www.capitolexposed.com/embed/nancy-pelosi\" ...></iframe>"
}| Status | Meaning | Common Cause |
|---|---|---|
200 | OK | Request succeeded |
400 | Bad Request | Invalid query parameters or missing required fields |
401 | Unauthorized | Missing or invalid API key for a protected endpoint |
404 | Not Found | Member slug or resource ID does not exist |
429 | Too Many Requests | Rate limit exceeded. Check the Retry-After header. |
500 | Internal Server Error | Unexpected server error. Please retry or contact support. |
const res = await fetch(
"https://www.capitolexposed.com/api/v1/stats",
{
headers: {
"X-API-Key": "cg_v1_your_key_here"
}
}
);
const { data } = await res.json();
console.log(data.member_count);import requests
resp = requests.get(
"https://www.capitolexposed.com/api/v1/stats",
headers={"X-API-Key": "cg_v1_your_key_here"}
)
data = resp.json()["data"]
print(data["member_count"])curl -s \ -H "X-API-Key: cg_v1_your_key_here" \ https://www.capitolexposed.com/api/v1/stats \ | jq '.data'
library(httr2)
resp <- request("https://www.capitolexposed.com/api/v1/stats") |>
req_headers("X-API-Key" = "cg_v1_your_key_here") |>
req_perform() |>
resp_body_json()
resp$data$member_countPublic access includes route-specific limits surfaced in response headers. Upgrade plans unlock premium exports, embeds, and account-based API access.