Filing45

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/v1

Keep 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=3

Sign 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
done

The 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.

StatusCodeWhen
401missing_tokenNo Authorization header, or not in the Bearer form.
401invalid_tokenThe token is unknown or has been revoked.
400bad_requestA parameter was not usable. The message says which.
404not_foundNo member, fund or official with that identifier.
429rate_limitedOver 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." } }