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.
Install the official SDK for your language. Node.js 18+ or Python 3.8+.
npm install sec-daily-api
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 argumentsconst client = new SecDailyAPI();
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);}
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.
{"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 npmReturns { filings, pagination }. All parameters are optional. Python method: get_filings(**params) with snake_case argument names.
| Parameter | Type | Description |
|---|---|---|
| ticker | string | Filter by ticker symbol, e.g. "AAPL" |
| cik | string | Filter by company CIK |
| formTypes | string | string[] | "10-K", "8-K", "4", etc. |
| filingDateStart | string | Start date (YYYY-MM-DD, ET) |
| filingDateEnd | string | End date (YYYY-MM-DD, ET) |
| fieldset | "minimal" | "standard" | "full" | Control response payload size |
| fields | string[] | Custom projection, e.g. ["id","formType","entity.name"] |
| limit | number | Max results per page, up to 1,000 |
| cursor | string | Pagination cursor from previous response |
Returns { insiderTransactions, count }. Python: get_insider_transactions(**params).
| Parameter | Type | Description |
|---|---|---|
| issuerTicker | string | Filter by issuer ticker, e.g. "TSLA" |
| issuerCik | string | Filter by issuer CIK |
| formTypes | string | string[] | "3", "4", "5" |
| transactionTypes | string | string[] | "purchase", "sale", "grant", etc. |
| ownerRoles | string | string[] | "director", "officer", "tenPercentOwner" |
| filingDateInEstStartDate | string | Filing date start (YYYY-MM-DD, ET) |
| filingDateInEstEndDate | string | Filing date end (YYYY-MM-DD, ET) |
| minTotalAmount | number | Minimum transaction dollar value |
| fieldset | "minimal" | "standard" | "full" | Control response payload size |
| limit | number | Max results per page |
const { insiderTransactions } = await client.getInsiderTransactions({issuerTicker: "AAPL",transactionTypes: "purchase",limit: 10,});
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);}
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.A representative filing record:
{"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=="}}
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);}}
| Status | Meaning |
|---|---|
| 400 | Invalid parameters (bad date, inverted range) |
| 403 | Invalid or missing API key |
| 429 | Rate limit exceeded — retried automatically |
| 504 | Request timed out — retried automatically |
| Plan | Monthly requests | History |
|---|---|---|
| Free | 1,000 | 1 year |
| Plus | 10,000 | 3 years |
| Pro | 100,000 | 10 years |
| Ultra | Unlimited | Full archive (2015–) |
Get a free API key — 1,000 requests/month, no credit card required.