Get the app!
Developer Documentation

SEC Daily API

Query real-time SEC filings, insider trades, and news through official Node.js and Python SDKs, or our MCP server for AI tools. Get your free API key at secdailyapi.com.

Installation

Install the official SDK for your language. Node.js 18+ or Python 3.8+.

npm install sec-daily-api

Authentication

Create an API key at secdailyapi.com, then pass it to the client. You can also set the SEC_DAILY_API_KEY environment variable and omit the option.

import { SecDailyAPI } from "sec-daily-api";
// Pass the key explicitly…
const client = new SecDailyAPI({ apiKey: "YOUR_API_KEY" });
// …or set SEC_DAILY_API_KEY and call with no arguments
const client = new SecDailyAPI();

Quick Start

Fetch recent 8-K filings for Apple:

const { filings } = await client.getFilings({
ticker: "AAPL",
formTypes: ["8-K"],
limit: 10,
});
for (const filing of filings) {
console.log(filing.entity?.name, filing.formType, filing.filingDateInEst);
}

MCP Server

Use the API directly from AI tools via our Model Context Protocol server — works with Claude Desktop, ChatGPT, Cursor, Windsurf, and other MCP clients. No install needed — npx runs it on demand.

claude_desktop_config.json
{
"mcpServers": {
"sec-daily": {
"command": "npx",
"args": ["-y", "sec-daily-mcp"],
"env": {
"SEC_DAILY_API_KEY": "YOUR_API_KEY"
}
}
}
}

Your assistant can then answer questions like “Show me Apple's latest 8-K filings” or “What did Tesla insiders buy this month?”

sec-daily-mcp on npm

getFilings(params?)

Returns { filings, pagination }. All parameters are optional. Python method: get_filings(**params) with snake_case argument names.

ParameterTypeDescription
tickerstringFilter by ticker symbol, e.g. "AAPL"
cikstringFilter by company CIK
formTypesstring | string[]"10-K", "8-K", "4", etc.
filingDateStartstringStart date (YYYY-MM-DD, ET)
filingDateEndstringEnd date (YYYY-MM-DD, ET)
fieldset"minimal" | "standard" | "full"Control response payload size
fieldsstring[]Custom projection, e.g. ["id","formType","entity.name"]
limitnumberMax results per page, up to 1,000
cursorstringPagination cursor from previous response

getInsiderTransactions(params?)

Returns { insiderTransactions, count }. Python: get_insider_transactions(**params).

ParameterTypeDescription
issuerTickerstringFilter by issuer ticker, e.g. "TSLA"
issuerCikstringFilter by issuer CIK
formTypesstring | string[]"3", "4", "5"
transactionTypesstring | string[]"purchase", "sale", "grant", etc.
ownerRolesstring | string[]"director", "officer", "tenPercentOwner"
filingDateInEstStartDatestringFiling date start (YYYY-MM-DD, ET)
filingDateInEstEndDatestringFiling date end (YYYY-MM-DD, ET)
minTotalAmountnumberMinimum transaction dollar value
fieldset"minimal" | "standard" | "full"Control response payload size
limitnumberMax results per page
const { insiderTransactions } = await client.getInsiderTransactions({
issuerTicker: "AAPL",
transactionTypes: "purchase",
limit: 10,
});

getNews(params?)

Returns { news, count }. Python: get_news(**params).

const { news } = await client.getNews({
ticker: "TSLA",
limit: 5,
});
for (const item of news) {
console.log(item.title, item.publishedDateInEst);
}

Fieldsets

Use the fieldset parameter to control response size. Smaller fieldsets are faster and cheaper for bulk queries.

  • minimal — ID, form type, dates, accession number, and CIK only.
  • standard — adds links and basic entity info. Recommended default.
  • full — adds entity enrichment, document files, and all filers.

Response

A representative filing record:

response.json
{
"filings": [
{
"id": "abc123",
"formType": "8-K",
"filingDateInEst": "2026-04-26",
"filingTimeInEst": "08:01:00",
"accessionNumber": "0000320193-26-000039",
"entity": {
"name": "Apple Inc.",
"cik": "0000320193",
"tradingSymbol": "AAPL"
},
"linkToFilingDetail": "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&...",
"linkToPrimaryDocument": "https://www.sec.gov/Archives/edgar/..."
}
],
"pagination": {
"hasMore": true,
"nextCursor": "eyJsYXN0SWQiOiJhYmMxMjMifQ=="
}
}

Error Handling

Non-success responses throw a SecDailyAPIError with the HTTP status and message. The SDK automatically retries on 429 and 504.

import { SecDailyAPI, SecDailyAPIError } from "sec-daily-api";
try {
const { filings } = await client.getFilings({ ticker: "AAPL" });
} catch (err) {
if (err instanceof SecDailyAPIError) {
console.error(err.status, err.message);
}
}
StatusMeaning
400Invalid parameters (bad date, inverted range)
403Invalid or missing API key
429Rate limit exceeded — retried automatically
504Request timed out — retried automatically

Plans & Limits

PlanMonthly requestsHistory
Free1,0001 year
Plus10,0003 years
Pro100,00010 years
UltraUnlimitedFull archive (2015–)

Ready to start building?

Get a free API key — 1,000 requests/month, no credit card required.

Get your API key