Free SEC Insider Trading API
Form 4 insider transactions from SEC EDGAR, Form 144 notices of planned sales, and Schedule 13D and 13G large-holder cover pages. Open market buys and sells by officers, directors and 10% owners, what they have told their broker they will sell, and who crossed 5%. Updated every 30 minutes.
Endpoints
/api/markets/insidersLatest open-market Form 4 trades across all companies: type=buys (default) or sells (S and sales work too), window=7d, 30d (default) or 90d.
/api/markets/insiders/{ticker}?from=YYYY-MM-DD&to=YYYY-MM-DD&limit=2000Form 4 transactions for one ticker, newest first: the newest 200 by default; from, to and limit (max 2,000) select the window. History starts in 2020; the free API returns the last six months.
/api/markets/planned-sales?symbol=DELL or ?days=30Form 144 notices of proposed sale: seller, relationship, shares, aggregate market value, shares outstanding, approximate sale date, broker. Without symbol: the largest notices in the window. CSV of the last 90 days: /api/markets/planned-sales/csv.
/api/markets/large-holders?symbol=HIMS or ?form=13D|13G&days=30&new=1Schedule 13D and 13G cover pages, one row per reporting person: shares owned, percent of class, type of holder, event date, amendment number. Without symbol: filings in the window, newest first (sort=percent for the largest stakes); new=1 excludes amendments. CSV of the last 90 days: /api/markets/large-holders/csv.
/api/markets/insiders/clusters?days=30&minInsiders=3&minUsd=100000Cluster buying: companies where several different insiders bought on the open market within the window, one row per company with the distinct buyers, trades, combined value and the first and latest trade dates. Sorted by number of insiders, then value; ticker= narrows to one company. Same rows as CSV: /api/markets/insiders/clusters/csv.
Examples
curl
curl "https://xoomar.com/api/markets/insiders?type=buys&window=7d"
Python
import requests
r = requests.get("https://xoomar.com/api/markets/insiders", params={"type": "buys", "window": "7d"})
for t in r.json()["data"][:5]:
# valueUsd is null when the filing states no price; priceNote then says so (it also marks a price given as a range)
value = f"${float(t['valueUsd']):,.0f}" if t["valueUsd"] else t["priceNote"]
print(f"{t['ticker']} | {t['insiderName']} | {value}")Main features
- SEC Form 4 insider trades for all US-listed companies, updated every 30 minutes.
- The latest view lists open-market purchases (P) and sales (S); the per-ticker history includes every transaction code, with isOpenMarket marking P and S.
- Insider name, title, share count, price and USD value per row.
- Per-ticker history endpoints, and 13F portfolios of 30 tracked managers on the funds endpoints.
Example
Request
curl "https://xoomar.com/api/markets/insiders?type=buys&window=7d"
Response, live at 2026-10-15 17:46 UTC, trimmed
{
"data": [
{
"ticker": "CRESY",
"insiderName": "Elsztain Alejandro Gustavo",
"insiderTitle": "Director",
"txDate": "2026-10-15",
"shares": "8295.0000",
"pricePerShare": "11.1800",
"valueUsd": "92738.1000",
"priceNote": null
},
{
"ticker": "QTEX",
"insiderName": "Parnes Tal",
"insiderTitle": "Director",
"txDate": "2026-10-15",
"shares": "6666.0000",
"pricePerShare": "1.5000",
"valueUsd": "9999.0000",
"priceNote": null
}
],
"updatedAt": "2026-10-15T17:46:08.937Z",
"source": "xoomar.com",
"docs": "https://xoomar.com/markets/api",
"license": "https://xoomar.com/terms",
"attribution": "Credit XOOMAR with a link to the dataset page on xoomar.com when you republish this data",
"meta": {
"source": "SEC",
"sourceAttribution": "Insider trade data: SEC.",
"notice": "10 requests a minute without a key, 30 with a free key. Get a free key at https://xoomar.com/signup?utm_source=api, register your app at https://xoomar.com/developers/register?utm_source=api, and credit the data as \"Data: XOOMAR\" together with the sourceAttribution line."
}
}Form 4 is due within two business days of the trade; txDate is the trade date, not the filing date.
What people build with it
Cluster-buy screens
/api/markets/insiders/clusters lists companies where several different insiders bought on the open market in the window, with the buyers, combined value and dates, so you can poll one endpoint.
Earnings-window studies
Join insider trades against earnings dates from the earnings calendar endpoint.
13F monitoring
The funds endpoints expose the tracked managers' portfolios with quarter-over-quarter changes.
Watchlist alerts
Poll per-ticker endpoints for your watchlist and push a notification on any new open-market buy.
Fair use
No key needed to start. A 429 response carries a Retry-After header in seconds; cache responses on your side where you can. Need more volume? Write to info@xoomar.com.
Response shape
Every endpoint returns the same JSON envelope: { data, updatedAt, source, docs, license, attribution, meta }. In meta, source names who publishes the data and sourceAttribution is the credit line to show with it. The data field is an array of records with these fields:
| Field | Type | Description |
|---|---|---|
| ticker | string | null | Trading symbol of the issuer, when reported in the filing |
| insiderName | string | Reporting officer, director, or 10% owner |
| insiderTitle | string | null | Role at the company (CEO, CFO, Director...) |
| txDate | string (date) | Transaction date from the filing, YYYY-MM-DD |
| shares | string | null | Shares bought or sold |
| pricePerShare | string | null | Reported price per share in USD |
| valueUsd | string | null | Shares times price per share, USD; null when the filing omits the price |
| priceNote | string | null | "price not stated in the filing" when the filing states no price (the price and the value are then null, never 0; on a cluster, valueUsd is null); "≈ $61.36, midpoint of the stated range $60.86 to $61.85" when the price is the midpoint of a range the filing states (pricePerShare is that midpoint); otherwise null |
Query params: type=buys or sells (default buys; S and sales also mean sales), window=7d, 30d or 90d (default 30d). Returns up to 100 open-market transactions, newest first. The per-ticker endpoint returns { ticker, transactions } with the same record fields plus txCode and isOpenMarket.
Numeric fields typed string in the table carry exact decimals; parse them with your language's decimal type. No key needed to start: 10 requests a minute per IP without a key and 30 a minute with a free account key, with at least six months of history. A 429 response carries a Retry-After header in seconds. Credit XOOMAR with a link to the dataset page when you republish the data; the data terms are on the terms page.
A free account key raises the limit; send it in an X-API-Key header.
Response shape
Every endpoint returns the same JSON envelope: { data, updatedAt, source, docs, license, attribution, meta }. In meta, source names who publishes the data and sourceAttribution is the credit line to show with it. The data field is an array of records with these fields:
| Field | Type | Description |
|---|---|---|
| ticker | string | Trading symbol of the issuer |
| company | string | null | Company name from the SEC ticker list |
| insiders | number | Distinct insiders who bought on the open market in the window |
| trades | number | Open-market purchase transactions in the window |
| valueUsd | number | null | Combined purchases in USD (shares times price, per filing), counting the trades whose price is stated; null when none of them states a price |
| shares | number | Combined shares bought |
| priceNote | string | null | "price not stated in the filing" when the filing states no price (the price and the value are then null, never 0; on a cluster, valueUsd is null); "≈ $61.36, midpoint of the stated range $60.86 to $61.85" when the price is the midpoint of a range the filing states (pricePerShare is that midpoint); otherwise null |
| firstTxDate | string (date) | Earliest purchase in the window |
| latestTxDate | string (date) | Latest purchase in the window |
| latestFiledAt | string (ISO 8601) | null | When the latest of those filings reached EDGAR |
| buyers | array | Up to five buyers, largest first |
| buyers[].name | string | Insider name as filed |
| buyers[].title | string | null | Role at the company, when the filing gives one |
| buyers[].valueUsd | number | null | That insider's combined purchases in the window, counting the trades whose price is stated; null when none of them states a price |
| buyers[].priceNote | string | null | "price not stated in the filing" when buyers[].valueUsd is null; otherwise null |
/api/markets/insiders/clusters: days 1 to 365 (default 30), minInsiders 2 to 20 (default 3), minUsd (default 0), ticker, limit up to 500 (default 100). Companies where at least minInsiders different insiders bought on the open market (Form 4 code P) within the window; awards, option exercises and plan purchases are not buys. Built from the Form 4 rows above, so a company appears the same day its filings do.
Numeric fields typed string in the table carry exact decimals; parse them with your language's decimal type. No key needed to start: 10 requests a minute per IP without a key and 30 a minute with a free account key, with at least six months of history. A 429 response carries a Retry-After header in seconds. Credit XOOMAR with a link to the dataset page when you republish the data; the data terms are on the terms page.
A free account key raises the limit; send it in an X-API-Key header.
Frequently Asked Questions
What insider transactions are tracked?
How often does it update?
Can I get a single company's history?
Are crypto-related companies included?
Data on this page is provided for informational purposes only and is not financial advice. See our editorial policy.