API
Everything on this site is available as JSON: every disclosed trade, every member, every fund holding and every executive transaction, each carrying a link to the filing it came from.
These are public records. Use them for research, journalism or anything else — attribution is welcome but not required. The one thing we ask is that you keep the caveats with the numbers: amounts are bands, dates are self-reported, and a 13F is a quarter old by the time it is filed.
Getting started
Every request needs a token, sent as a bearer header. Create an account and then make a token — it takes about a minute.
Base URL
https://filing45.devops-monk.com/api/v1Keep the token out of your shell history and your repository
export FILING45_TOKEN="f45_…"
curl -H "Authorization: Bearer $FILING45_TOKEN" "https://filing45.devops-monk.com/api/v1/stats"120 requests a minute per token. Every response carries X-RateLimit-Remaining and X-RateLimit-Reset, so you can pace a long job rather than guess.
Try it
Send a real request from this page. While you are signed in it uses your session, so nothing needs pasting here — and the curl underneath is the same request with a token, ready to run anywhere.
GET /api/v1/trades?ticker=NVDA&limit=3Sign in to send requests from here. The curl below works from anywhere once you have a token.
The same request, from anywhere
curl -H "Authorization: Bearer $FILING45_TOKEN" \
"https://filing45.devops-monk.com/api/v1/trades?ticker=NVDA&limit=3"GET/trades
Disclosed trades, newest first.
member- Member slug, as returned by /members
ticker- Ticker symbol, for example NVDA
chamber- house or senate
action- buy or sell
since, until- Transaction date bounds, as 2026-01-31
limit- 1 to 200, default 50
cursor- next_cursor from the previous response
curl -H "Authorization: Bearer $FILING45_TOKEN" \
"https://filing45.devops-monk.com/api/v1/trades?ticker=NVDA&action=buy&limit=2"Show the response
{
"data": [
{
"id": 4821,
"ticker": "NVDA",
"asset_name": "NVIDIA Corporation - Common Stock",
"transaction_type": "P",
"owner": "SP",
"transaction_date": "2025-12-29",
"filed_date": "2026-01-16",
"disclosure_lag_days": 18,
"amount_min": 100001,
"amount_max": 250000,
"amount_range": "$100,001 - $250,000",
"member_slug": "markwayne-mullin-senate",
"member_name": "Markwayne Mullin",
"chamber": "senate",
"party": "R",
"state": "OK",
"source_url": "https://efdsearch.senate.gov/search/view/ptr/…"
}
],
"meta": { "count": 1, "next_cursor": 4775, "filters": { … } }
}GET/members
Every member on record, most active first.
chamber- house or senate
state- Two-letter state code
q- Match part of a name
limit, offset- Up to 600 per page
curl -H "Authorization: Bearer $FILING45_TOKEN" \
"https://filing45.devops-monk.com/api/v1/members?chamber=senate&state=OK"Show the response
{
"data": [
{
"slug": "markwayne-mullin-senate",
"full_name": "Markwayne Mullin",
"chamber": "senate",
"party": "R",
"state": "OK",
"trade_count": 707,
"last_traded": "2026-02-25",
"median_disclosure_days": 113
}
],
"meta": { "count": 1, "limit": 100, "offset": 0 }
}GET/members/{slug}
One member, with totals: purchases, sales, median delay, late filings, paper filings.
curl -H "Authorization: Bearer $FILING45_TOKEN" \
"https://filing45.devops-monk.com/api/v1/members/rohit-khanna-ca17"Show the response
{
"data": {
"slug": "rohit-khanna-ca17",
"full_name": "Ro Khanna",
"trade_count": 0,
"purchases": 0,
"sales": 0,
"median_disclosure_days": null,
"filed_late": 0,
"paper_filings": 8
},
"meta": { "slug": "rohit-khanna-ca17" }
}GET/funds · /funds/{slug}
The 13F managers we follow, largest first. The single-fund route adds its holdings.
limit, offset- Up to 300 per page
curl -H "Authorization: Bearer $FILING45_TOKEN" \
"https://filing45.devops-monk.com/api/v1/funds/warren-buffett"Show the response
{
"data": {
"slug": "warren-buffett",
"firm": "Berkshire Hathaway",
"manager": "Warren Buffett",
"period_of_report": "2026-06-30",
"portfolio_value": 299300000000,
"holdings_count": 29,
"holdings": [
{ "ticker": "AAPL", "issuer": "Apple INC", "value": 66080000000,
"pct_of_portfolio": "22.04", "change_type": "hold" }
]
},
"meta": { "slug": "warren-buffett", "holdings_note": "…" }
}GET/executive · /executive/{slug}
The President and Senate-confirmed appointees, from OGE Form 278-T.
limit, offset- Up to 500 transactions per page
curl -H "Authorization: Bearer $FILING45_TOKEN" \
"https://filing45.devops-monk.com/api/v1/executive/donald-j-trump?limit=1"Show the response
{
"data": {
"slug": "donald-j-trump",
"full_name": "Donald J Trump",
"role": "President of the United States",
"transactions": [
{ "asset_name": "TEXAS INSTRS INC", "transaction_type": "Purchase",
"transaction_date": "2026-07-31", "amount_range": "$250,001 - $500,000",
"confident": true, "form_type": "278-T",
"source_url": "https://extapps2.oge.gov/…" }
]
},
"meta": { "note": "These filings are scans. …" }
}GET/stats
Totals for everything held, and the date of the newest filing.
curl -H "Authorization: Bearer $FILING45_TOKEN" "https://filing45.devops-monk.com/api/v1/stats"Show the response
{
"data": {
"trades": 4943, "filings": 531, "members_trading": 125,
"members_tracked": 541, "funds": 122, "fund_holdings": 5303,
"executive_transactions": 636, "median_disclosure_days": 28,
"latest_filing": "2026-09-22"
},
"meta": { "generated_at": "2026-09-25T11:29:25.696Z" }
}Paging
Trades page by cursor rather than offset. Each response returns meta.next_cursor; pass it back as cursor to get the next page, and stop when it comes back null. Offsets would shift rows whenever a new filing arrived mid-scan; a cursor cannot.
Read every trade for one member
cursor=""
while :; do
page=$(curl -s -H "Authorization: Bearer $FILING45_TOKEN" \
"https://filing45.devops-monk.com/api/v1/trades?member=josh-gottheimer-nj05&limit=200&cursor=$cursor")
echo "$page" | jq -c '.data[]'
cursor=$(echo "$page" | jq -r '.meta.next_cursor // empty')
[ -z "$cursor" ] && break
doneThe other endpoints use limit and offset, since their lists do not grow between requests.
Errors
Failures return a stable code for your program and a message for whoever reads the log.
| Status | Code | When |
|---|---|---|
| 401 | missing_token | No Authorization header, or not in the Bearer form. |
| 401 | invalid_token | The token is unknown or has been revoked. |
| 400 | bad_request | A parameter was not usable. The message says which. |
| 404 | not_found | No member, fund or official with that identifier. |
| 429 | rate_limited | Over 120 requests in a minute. Retry-After says how long to wait. |
{ "error": { "code": "rate_limited",
"message": "That token has made 120 requests this minute. Try again shortly." } }