Insider Trades API
Query real-time SEC Form 3, 4, and 5 insider transactions through our official Node.js and Python SDKs, or our MCP server for AI tools. Get your API key from the dashboard.
Installation
Install the official SDK. Node.js 20+ for the Node SDK, Python 3.8+ for the Python SDK.
npm install insider-trades-api
Authentication
Create an API key in your dashboard, then pass it to the client. You can also set the INSIDER_TRADES_API_KEY environment variable and omit the option.
import { InsiderTradesAPI } from "insider-trades-api";// Pass the key explicitly…const client = new InsiderTradesAPI({ apiKey: "YOUR_API_KEY" });// …or set INSIDER_TRADES_API_KEY and call with no argumentsconst client = new InsiderTradesAPI();
Quick Start
Fetch recent insider purchases for a company:
const { insiderTransactions } = await client.getInsiderTransactions({issuerTicker: "AAPL",transactionTypes: "purchase",limit: 10,});for (const tx of insiderTransactions) {console.log(tx.reportingOwnerInformation?.name, tx.purchaseAmount);}
MCP Server
Use the API directly from AI tools via our Model Context Protocol server — works with Claude Desktop, ChatGPT, Cursor, Windsurf, VS Code Copilot, and other MCP clients. Add this to your tool's MCP config (no install needed — npx runs it):
{"mcpServers": {"insider-trades": {"command": "npx","args": ["-y", "insider-trades-mcp"],"env": {"INSIDER_TRADES_API_KEY": "YOUR_API_KEY"}}}}
Your assistant can then answer questions like “Show me recent insider purchases at Apple” or “Which CEOs bought their own stock this month?”
insider-trades-mcp on npmgetInsiderTransactions(params?)
Returns a promise resolving to { insiderTransactions, count, recordedTimeInUtc }. All parameters are optional.
In Python the method is get_insider_transactions(**params) with snake_case argument names (e.g. issuer_ticker), returning a dict with the same fields.
| Parameter | Type | Description |
|---|---|---|
| filingId | string | Direct lookup by filing ID |
| issuerTicker | string | Filter by ticker symbol, e.g. "AAPL" |
| issuerCik | string | Filter by issuer CIK |
| reportingOwnerCik | string | Filter by insider CIK |
| accessionNumber | string | Filter by SEC accession number |
| formTypes | string | string[] | Form types: "3", "4", "5" (default: all) |
| transactionTypes | TransactionType[] | See transaction types below |
| ownerRoles | OwnerRole[] | "director", "officer", "tenPercentOwner" |
| officerTitles | string[] | Normalized titles: "CEO", "CFO", etc. |
| filingDateInEstStartDate | string | Filing date start (YYYY-MM-DD, ET) |
| filingDateInEstEndDate | string | Filing date end (YYYY-MM-DD, ET) |
| periodOfReportStartDate | string | Period of report start (YYYY-MM-DD) |
| periodOfReportEndDate | string | Period of report end (YYYY-MM-DD) |
| minTotalAmount | number | Minimum total dollar value |
| maxTotalAmount | number | Maximum total dollar value |
| fieldset | "minimal" | "standard" | "full" | Control response size |
| limit | number | Max results, default 100, max 900 |
Transaction Types
Values accepted by the transactionTypes parameter, with their underlying SEC transaction codes.
| Value | SEC Code | Description |
|---|---|---|
| purchase | P | Open market purchase |
| sale | S | Open market sale |
| grant | A | Grant or award |
| gift | G | Bona fide gift |
| exercise | M | Option exercise (Rule 16b-3) |
| derivativeExercise | O, X | Derivative exercise |
| disposition | D | Disposition to issuer |
| discretionary | I | Discretionary transaction |
| derivativeConversion | C | Conversion of derivative |
| derivativeExpiration | E, H | Expiration of derivative |
| smallAcquisition | L | Small acquisition (Rule 16a-6) |
| inheritance | W | Inheritance |
| equitySwap | K | Equity swap |
| tender | U | Tender offer / change of control |
| other | J | Other acquisition / disposition |
Fieldsets
Use the fieldset parameter to control response size. Smaller fieldsets are recommended for bulk queries.
minimal— ID, issuer, owner, key amounts, and dates.standard— adds all aggregates, boolean flags, links, and the AI summary.full— adds raw transaction and holding arrays.
Response
Each transaction is fully typed via the exported InsiderTransaction interface. A representative record:
{"insiderTransactions": [{"formType": "4","accessionNumber": "0001140361-26-023363","issuerInformation": {"tradingSymbol": "AAPL","companyName": "Apple Inc."},"reportingOwnerInformation": {"name": "LEVINSON ARTHUR D","isDirector": true},"ownerRoles": "director","filingDateInEst": "2026-05-29","totalAmount": 15551000.0,"saleAmount": 15551000.0,"netSharesAcquired": -50000.0,"hasSales": "true","summary": "Arthur D. Levinson sold 50,000 shares of Apple Inc..."}],"count": 1,"recordedTimeInUtc": "2026-05-29T22:30:00Z"}
Note: boolean type flags such as hasSales are returned as the string "true" — use truthiness checks rather than strict equality.
Error Handling
Non-success responses throw an Error with the status code and a human-readable message. The SDK validates dates and CIKs before any network call and automatically retries on 429 and 504.
try {const { insiderTransactions } = await client.getInsiderTransactions({issuerTicker: "AAPL",});} catch (err) {console.error((err as Error).message);}
| Status | Meaning |
|---|---|
| 400 | Invalid parameters (bad date, invalid CIK, inverted range) |
| 403 | Invalid or missing API key |
| 429 | Rate limit exceeded — retried automatically |
| 504 | Request timed out — retried automatically |
Plans & Limits
API access is billed separately from the Insider Trades Pro consumer plan (email alerts, Trade Ideas, watchlist) — this pricing is only for programmatic access.
| Plan | Price | Monthly requests | API keys | Overage |
|---|---|---|---|---|
| Free | $0 / mo | 1,000 | 1 | — |
| Pro | $79 / mo | 500,000 | 2 | Optional, $1.00 / 1,000 extra requests |
Requests reset on your monthly billing cycle. Pro can enable overage billing to keep serving requests past the 500,000 quota instead of being rate-limited, with a configurable monthly spend cap. Manage your plan, keys, and usage from the API dashboard.
Ready to start building?
Create an API key and make your first request in minutes.