Documentation
Query 13F holdings, insider and congressional trades, financials and macro data over REST or MCP. Start with a request, connect an AI agent, or open the API reference.
REST base URL: https://api.ko.io
curl "https://api.ko.io/api/v1/holdings/1067983?per_page=1&demo=true"Abridged response captured Sep 25, 2026 (quarter ending Jun 30, 2026). Run it for the live response; no key or sign-up needed. A newer quarter may be returned.
{
"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",
"prev_value": "57843260493",
"is_option": 0,
"call_shares": "0",
"put_shares": "0"
}
]
}- Filer
- Berkshire Hathaway
- Ticker
- AAPL
- Shares
- 227,917,808
- Filing lines combined
- 12
The row does not carry its accession number. The 13F-HR it was parsed from (quarter ending Jun 30, 2026, captured Sep 25, 2026) 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 in the Authorization header as a Bearer token (below). Paginate with page and per_page. The Quickstart has the same call in curl, Python and MCP; the Playground runs requests with your key.
Authorization header. Keys start with ko_live_; create them in the Console.curl "https://api.ko.io/api/v1/holdings/1067983" \
-H "Authorization: Bearer ko_live_your_key_here"Demo mode
Add?demo=true to a Free-plan endpoint to call it without a key. Demo mode allows about 1,000 requests an hour per IP and sends no rate-limit headers. Pro and Builder endpoints return 403 PLAN_REQUIRED.Web-app sign-in endpoints (session auth for the website, not for API keys)
- POST/api/auth/google
- POST/api/auth/login
- POST/api/auth/register
- POST/api/auth/logout
- POST/api/auth/forgot-password
- POST/api/auth/reset-password
- GET/api/auth/me
- PUT/api/auth/profile
{ data, meta } on success and { error: { code, message } } on failure. data is an array for lists and an object for single resources; file and document endpoints are described in the reference.{
"data": [ ... ],
"meta": {
"page": 1,
"per_page": 50,
"total_count": "1234",
"query_time_ms": 3.1
}
}{
"data": { ... },
"meta": {
"query_time_ms": 2.1
}
}Provenance
SEC data is normalized from public filings. 13F, Form 4 and similar REST rows do not include an accession number. Use the filing lookup endpoints to locate source documents. List a filer’s filings with/api/v1/filings/:cik, then open one with /api/v1/filings/:cik/:accession. Numeric fields often arrive as strings (for example "holding_value": "65950296923"); parse them before arithmetic.Connect an AI agent
24 toolshttps://mcp.ko.io/mcp gives Claude Code, Codex, Cursor, Grok (xAI API), Gemini CLI and other MCP clients the same data as the REST API. MCP tool calls and REST requests share one daily quota.claude mcp add ko-sec-data --transport http https://mcp.ko.io/mcpConfigs for every client, demo mode and API-key options, and the searchable list of all 24 tools with their plans are on the MCP page. For a worked example, follow Build an SEC agent.
The core data endpoints by group, one line each. Each line opens its entry in the API reference, which has the parameters, response formats and runnable requests, plus the crypto ETF, N-PORT, Reg SHO and filings gateway endpoints not listed here. Endpoints without a plan label work on the Free plan and in demo mode.
44 core endpoints in 17 groups
- List Form 144 notices
/api/v1 /form144-notices - Form 144 notices for a ticker
/api/v1 /form144-notices /{ticker} - Form 144 notices by reporting owner
/api/v1 /form144-notices /insider /{cik} - 13D / 13G stakesPro plan
/api/v1 /sec /13dg - Form D offeringsPro plan
/api/v1 /sec /form-d - 8-K buybacks (historical; updates paused)Pro plan
/api/v1 /sec /buybacks
- Plan
- Calls / day
- Rows / request
- Price
- Free
- 200
- 500
- $0
- Pro
- 20,000
- 5,000
- $60/mo
- Builder
- 200,000
- 50,000
- $250/mo
Monthly prices; annual billing is cheaper and shown on Pricing, along with what each plan includes. Free covers the most recent quarter and latest data only; full history needs Pro or higher. MCP tool calls and REST requests share one quota. Requests made with an API key return X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, plus Retry-After on a 429. Demo mode (no key) allows about 1,000 requests an hour per IP and sends none of these headers.
- 400
- Bad request
- Check the query parameters and the path format.
- 401
- Missing or invalid key
- Send a valid API key, or use ?demo=true on a Free-plan endpoint.
- 403
- Plan required
- Your plan does not include this endpoint or feature.
- 404
- Not found
- Check the path and the identifier (CIK, ticker, slug).
- 429
- Rate limited
- With a key, read Retry-After and the X-RateLimit headers; a daily quota resets at 00:00 UTC. In demo mode, wait up to an hour or use a Free API key.
- 500
- Server error
- Retry after a few seconds.
{
"error": {
"code": "INVALID_API_KEY",
"message": "Missing or invalid API key. Get one at https://ko.io/console/keys"
}
}{
"error": {
"code": "PLAN_REQUIRED",
"message": "This endpoint requires a paid plan. Upgrade at https://ko.io/pricing"
}
}