XOOMAR

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

GET
/api/markets/insiders

Latest open-market Form 4 trades across all companies: type=buys (default) or sells (S and sales work too), window=7d, 30d (default) or 90d.

GET
/api/markets/insiders/{ticker}?from=YYYY-MM-DD&to=YYYY-MM-DD&limit=2000

Form 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.

GET
/api/markets/planned-sales?symbol=DELL or ?days=30

Form 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.

GET
/api/markets/large-holders?symbol=HIMS or ?form=13D|13G&days=30&new=1

Schedule 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.

GET
/api/markets/insiders/clusters?days=30&minInsiders=3&minUsd=100000

Cluster 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:

FieldTypeDescription
tickerstring | nullTrading symbol of the issuer, when reported in the filing
insiderNamestringReporting officer, director, or 10% owner
insiderTitlestring | nullRole at the company (CEO, CFO, Director...)
txDatestring (date)Transaction date from the filing, YYYY-MM-DD
sharesstring | nullShares bought or sold
pricePerSharestring | nullReported price per share in USD
valueUsdstring | nullShares times price per share, USD; null when the filing omits the price
priceNotestring | 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:

FieldTypeDescription
tickerstringTrading symbol of the issuer
companystring | nullCompany name from the SEC ticker list
insidersnumberDistinct insiders who bought on the open market in the window
tradesnumberOpen-market purchase transactions in the window
valueUsdnumber | nullCombined purchases in USD (shares times price, per filing), counting the trades whose price is stated; null when none of them states a price
sharesnumberCombined shares bought
priceNotestring | 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
firstTxDatestring (date)Earliest purchase in the window
latestTxDatestring (date)Latest purchase in the window
latestFiledAtstring (ISO 8601) | nullWhen the latest of those filings reached EDGAR
buyersarrayUp to five buyers, largest first
buyers[].namestringInsider name as filed
buyers[].titlestring | nullRole at the company, when the filing gives one
buyers[].valueUsdnumber | nullThat insider's combined purchases in the window, counting the trades whose price is stated; null when none of them states a price
buyers[].priceNotestring | 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?
Form 4 filings from SEC EDGAR. 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.
How often does it update?
Every 30 minutes. Form 4 is due within two business days of the trade.
Can I get a single company's history?
Yes. GET /api/markets/insiders/{ticker} returns the transaction history for that symbol, including non-open-market codes; from, to and limit (max 2,000 rows) select the window. History starts in 2020; the free API returns the last six months.
Are crypto-related companies included?
Yes. Insiders at MSTR, COIN, MARA and the like file Form 4s like those at any other US issuer.

Data on this page is provided for informational purposes only and is not financial advice. See our editorial policy.