Skip to content

API documentation

REST and MCP access to SEC 13F holdings, Form 4 insider trades, congressional trades, company financials and macro series. 44 endpoints below; every response is JSON with a data / meta envelope. Base URL https://api.ko.io.

One request against the public demo route: no key, no sign-up. It returns Berkshire Hathaway's largest 13F position; the receipt below links the filing that row was parsed from.
curl "https://api.ko.io/api/v1/holdings/1067983?per_page=1&demo=true"
Response

Abridged response captured 2026-09-23 (quarter ending 2026-06-30). Run it for the live response; no key or sign-up needed.

{
  "data": [
    {
      "cik": "1067983",
      "quarter_date": "2026-06-30",
      "ticker": "AAPL",
      "name_of_issuer": "APPLE INC",
      "shares_held": "227917808",
      "holding_value": "65950296923",
      "total_portfolio_value": "299253556246",
      "portfolio_weight_pct": 22.04,
      "action": "UNCHANGED",
      "share_change": "0",
      "prev_shares": "227917808"
    }
  ]
}
Filer
Berkshire Hathaway
Ticker
AAPL
Shares
227,917,808
Lines summed
12
SourceSEC EDGAR13F-HR0001193125-26-352200 ↗period 2026-06-30filed 2026-08-14

The row does not carry its accession. The 13F-HR it was parsed from (quarter ending 2026-06-30, captured 2026-09-23) is listed by GET /api/v1/filings/1067983?form=13F-HR. A newer quarter returns a newer filing.

Next, create a free account and a key in Console → API Keys, then send it as a Bearer token (below). Paginate with page and per_page.

Send your API key as a Bearer token in the Authorization header. Keys use the format ko_live_*.
curl "https://api.ko.io/api/v1/holdings/1067983" \
  -H "Authorization: Bearer ko_live_your_key_here"

Demo mode

Add ?demo=true to any endpoint for keyless access. Rate-limited per IP; meant for testing and prototyping.

API key format

Keys start with ko_live_ followed by a hex string. Create keys in the Console.

Auth endpoints (web app)

Used by the ko.io web app; not intended for API consumers.

  • POST/api/auth/google · /api/auth/login · /api/auth/register · /api/auth/logout
  • GET/api/auth/me · /api/auth/profile
All responses share one JSON structure with data and meta fields. data is an array for lists and an object for single resources.
List response200 OK
{
  "data": [ ... ],
  "meta": {
    "page": 1,
    "per_page": 50,
    "total_count": 1234,
    "query_time_ms": 3.1
  }
}
Object response200 OK
{
  "data": { ... },
  "meta": {
    "query_time_ms": 2.1
  }
}

Provenance

Numeric fields often arrive as strings (for example "holding_value": "65950296923"); parse them before arithmetic. Rows derived from SEC filings resolve to their filing through the filings endpoints (/api/v1/filings/:cik, then /api/v1/filings/:cik/:accession), which return the accession and the documents on sec.gov.
Connect Claude, Cursor, Windsurf or any Model Context Protocol client directly to ko.io data. 24 tools cover SEC filings, macro data and market microstructure.
Remote (HTTP transport -- Claude.ai, any MCP client)
claude mcp add ko-sec-data --transport http https://mcp.ko.io/mcp
Local (stdio -- Claude Code, Cursor)
claude mcp add ko-sec-data -- npx -y @ko-io/mcp-sec-data
.env (optional)
KO_API_KEY=ko_live_xxx    # Optional: without key, uses demo mode (rate-limited per IP)
KO_API_URL=https://api.ko.io

Available tools

24
ToolDescription
searchSearch across institutions, stocks, and congress members
get_institution_holdings13F institutional holdings with change analytics
list_institutionsList/search institutional investors
get_stock_profileStock info with ownership summary
get_stock_holdersInstitutional holders for a stock
get_stock_activityStock activity and trading metrics
get_stock_financialsCompany financials from SEC filings
get_stock_priceHistorical daily OHLCV prices
get_insider_tradesForm 4 insider trades with filters
list_insider_tradersTop insider traders by volume
get_congress_tradesCongressional stock trades from STOCK Act
get_congress_memberTrading history for a congress member
get_form144_noticesForm 144 proposed sale notices
get_treasury_yieldsUS Treasury yield curve data
get_fed_ratesFederal Reserve interest rates
get_economic_indicatorsBLS CPI, PPI, NFP, unemployment
get_ftd_dataSEC Failures to Deliver
get_financial_stressOFR Financial Stress Index
get_crypto_exposureInstitutional spot BTC-ETF exposure summary
get_crypto_holdersInstitutions holding spot crypto ETFs
get_crypto_holderOne institution's crypto-ETF positions
sec_list_filingsList an entity’s SEC EDGAR filings
sec_get_filing_indexFiles inside a specific filing
sec_get_filing_documentFetch a filing document + signed link

Institutions

4 endpoints

Holdings

1 endpoint

Stock Analysis

2 endpoints

Insider Trades

2 endpoints

Congress Trades

4 endpoints

SEC Extensions

6 endpoints

Treasury

3 endpoints

Federal Reserve

3 endpoints

Economic

1 endpoint

Energy

1 endpoint

Banking

3 endpoints

Bulk Export

1 endpoint

Dashboard

2 endpoints

Requests are rate-limited per API key on a daily rolling window.
PlanPriceDaily limitBulk export
Free$0200 / dayNo
Pro$29 / mo20,000 / dayNo
Team$99 / mo200,000 / dayYes
Enterprise$499 / mo1,000,000 / dayYes

Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset headers.

StatusMeaningResolution
400Bad RequestCheck query parameters and path format
401UnauthorizedInclude valid API key or use ?demo=true
403ForbiddenUpgrade plan for this endpoint or feature
404Not FoundCheck endpoint path and resource IDs
429Rate LimitedWait for reset or upgrade plan
500Server ErrorRetry after a few seconds
Error response401
{
  "error": "Unauthorized",
  "message": "Invalid or missing API key. Use ?demo=true for keyless access.",
  "status": 401
}