Skip to main content
Press ⌘K to search

Insider trading

Corporate insider activity — Form 3 initial ownership, Forms 4/5 transactions and ownership updates, Form 144 proposed sales, insider search, and the market-wide insider-sentiment ranking. Every route is a GET under the https://api.equibles.com/v1 base URL; the transaction and proposed-sale lists page with limit/offset and a meta envelope, while the ownership roster and insider search return their rows in a bare data array. The sentiment ranking returns its rows in a data array beneath its own window and universe counters.

/v1/stocks/

Returns the most recent insider transactions for a stock, parsed from SEC Forms 4 and 5 — each row carries the insider's name and role, the transaction type, the share count, per-share price, dollar value, and the shares held immediately afterward. transactionType is the coarse Buy/Sell/Award/Gift/Exercise label; transactionCode carries the filed SEC code's meaning (Purchase, Sale, Award, Conversion, Exercise, Tax Payment, Expiration, Gift, Inheritance, Discretionary, Other) — non-market codes surface there, so check it before reading a row as an open-market trade — or filter on isOpenMarketTrade, which is true only for a filed purchase or sale. isRule10b5One is the Form 4/5 trading-plan checkbox (null on filings that predate it). securityKind (Non-derivative, Derivative, Unknown), securityTitle (the security's title exactly as filed, null when the filing names none) and ownershipForm (Direct, Indirect) identify which running balance sharesOwnedAfter belongs to: balances are tracked per security and ownership form, so two rows for one insider on one date can carry different balances without contradicting each other — and an issuer with several listed securities (ordinary shares and ADS, say) shows them as separate titles.

Parameters: ticker (required, path); limit and offset for paging (max limit 500).

curl "https://api.equibles.com/v1/stocks/NVDA/insider-transactions?limit=2" \
  -H "Authorization: Bearer eq_your_api_key"
import requests
r = requests.get(
    "https://api.equibles.com/v1/stocks/NVDA/insider-transactions?limit=2",
    headers={"Authorization": "Bearer eq_your_api_key"},
)
print(r.json())
const res = await fetch("https://api.equibles.com/v1/stocks/NVDA/insider-transactions?limit=2", {
  headers: { Authorization: "Bearer eq_your_api_key" },
});
console.log(await res.json());
{
  "data": [
    {
      "transactionDate": "2026-07-01",
      "insiderName": "COXE TENCH",
      "role": "Director",
      "transactionType": "Gift",
      "transactionCode": "Gift",
      "isOpenMarketTrade": false,
      "isRule10b5One": true,
      "shares": 500000,
      "pricePerShare": 0.0,
      "value": 0.0,
      "sharesOwnedAfter": 25171360,
      "securityKind": "Non-derivative",
      "securityTitle": "Common",
      "ownershipForm": "Indirect"
    },
    {
      "transactionDate": "2026-06-25",
      "insiderName": "HUDSON DAWN E",
      "role": "Director",
      "transactionType": "Award",
      "transactionCode": "Award",
      "isOpenMarketTrade": false,
      "isRule10b5One": false,
      "shares": 1211,
      "pricePerShare": 0.0,
      "value": 0.0,
      "sharesOwnedAfter": 370098,
      "securityKind": "Non-derivative",
      "securityTitle": "Common Stock",
      "ownershipForm": "Direct"
    }
  ],
  "meta": {
    "limit": 2,
    "offset": 0,
    "count": 2,
    "hasMore": true
  }
}

/v1/stocks/

Returns a company's current insider roster — each insider's role, total shares held (restated onto today's split basis before ranking), and the type and date of their most recent transaction, sorted from the largest holder down. lastTransactionType uses the raw SEC code vocabulary (Purchase, Sale, Award, Gift, Holding, TaxPayment, …), not the coarse labels of the transactions endpoint.

Parameters: ticker (required, path); limit (largest holders to return, default 30, max 100) and offset for paging down the ranking (ties break on insider name, so pages never repeat or skip rows). Returns a bare data array; the excerpt below shows the two largest holders.

curl "https://api.equibles.com/v1/stocks/NVDA/insider-ownership" \
  -H "Authorization: Bearer eq_your_api_key"
import requests
r = requests.get(
    "https://api.equibles.com/v1/stocks/NVDA/insider-ownership",
    headers={"Authorization": "Bearer eq_your_api_key"},
)
print(r.json())
const res = await fetch("https://api.equibles.com/v1/stocks/NVDA/insider-ownership", {
  headers: { Authorization: "Bearer eq_your_api_key" },
});
console.log(await res.json());
{
  "data": [
    {
      "insiderName": "HUANG JEN HSUN",
      "role": "Director, President and CEO",
      "sharesOwned": 109040602,
      "lastTransactionType": "Holding",
      "lastTransactionDate": "2026-06-17"
    },
    {
      "insiderName": "COXE TENCH",
      "role": "Director",
      "sharesOwned": 25171360,
      "lastTransactionType": "Gift",
      "lastTransactionDate": "2026-07-01"
    }
  ]
}

/v1/stocks/

Returns Form 144 proposed-sale notices for a stock — insiders signalling an intent to sell restricted or control shares — with the filing date, the seller's name and relationship to the issuer, the number of shares to be sold, their aggregate market value, the approximate sale date, and the broker handling the sale. sharesOutstanding is the issuer's current share count from the exchange record (deliberately not the notice's own figure, which filers sometimes fill with their sale count) — the denominator for the standard materiality read; it is the current basis while sharesToBeSold is as filed, so restate the latter across any splits since the filing before dividing. remarks — typically the 10b5-1 plan adoption date — separates planned from discretionary sales. Each is null when unknown or omitted.

Parameters: ticker (required, path); limit and offset for paging (max limit 500).

curl "https://api.equibles.com/v1/stocks/NVDA/proposed-sales?limit=2" \
  -H "Authorization: Bearer eq_your_api_key"
import requests
r = requests.get(
    "https://api.equibles.com/v1/stocks/NVDA/proposed-sales?limit=2",
    headers={"Authorization": "Bearer eq_your_api_key"},
)
print(r.json())
const res = await fetch("https://api.equibles.com/v1/stocks/NVDA/proposed-sales?limit=2", {
  headers: { Authorization: "Bearer eq_your_api_key" },
});
console.log(await res.json());
{
  "data": [
    {
      "filingDate": "2026-06-22",
      "sellerName": "DONALD ROBERTSON",
      "relationshipToIssuer": "Officer",
      "sharesToBeSold": 4594,
      "aggregateMarketValue": 967909.86,
      "approxSaleDate": "2026-06-22",
      "brokerName": "Morgan Stanley Smith Barney LLC Executive Financial Services",
      "sharesOutstanding": 24200000000,
      "remarks": null
    },
    {
      "filingDate": "2026-06-03",
      "sellerName": "Neal Stephen C",
      "relationshipToIssuer": "Director",
      "sharesToBeSold": 15500,
      "aggregateMarketValue": 3343863.05,
      "approxSaleDate": "2026-06-03",
      "brokerName": "BofA Securities, Inc.",
      "sharesOutstanding": 24200000000,
      "remarks": null
    }
  ],
  "meta": {
    "limit": 2,
    "offset": 0,
    "count": 2,
    "hasMore": true
  }
}

/v1/insiders

Searches tracked corporate insiders by whole name words, never arbitrary substrings, and returns SEC CIK, latest role, city, and the company on the most recent Form 3/4/5 filing (latestCompanyTicker/latestCompanyName). Exact legal names and verified aliases win; otherwise all punctuation-independent words are required before a sparse any-word fallback. Jensen Huang resolves the SEC-filed HUANG JEN HSUN, while a short token such as ann does not match JOANNA. hasMore flags truncation.

Parameters: query (required — a full or partial insider name as filed with the SEC); limit for capping the result count (max 500) and offset for paging (matches sort by name, then CIK).

curl "https://api.equibles.com/v1/insiders?query=Huang&limit=2" \
  -H "Authorization: Bearer eq_your_api_key"
import requests
r = requests.get(
    "https://api.equibles.com/v1/insiders?query=Huang&limit=2",
    headers={"Authorization": "Bearer eq_your_api_key"},
)
print(r.json())
const res = await fetch("https://api.equibles.com/v1/insiders?query=Huang&limit=2", {
  headers: { Authorization: "Bearer eq_your_api_key" },
});
console.log(await res.json());
{
  "data": [
    {
      "name": "HUANG JEN HSUN",
      "cik": "0001197649",
      "role": "Director, President and CEO",
      "city": "SANTA CLARA",
      "stateOrCountry": null,
      "latestCompanyTicker": "NVDA",
      "latestCompanyName": "Nvidia Corp"
    },
    {
      "name": "Huang Tao",
      "cik": "0001324003",
      "role": "Director",
      "city": "LANCASTER",
      "stateOrCountry": null,
      "latestCompanyTicker": "AWI",
      "latestCompanyName": "Armstrong World Industries Inc"
    }
  ],
  "hasMore": true
}

/v1/insider-sentiment-scores

Ranks the whole scored universe by a composite insider-sentiment score, highest first — a peer-relative 0-100 blend of three direction-aware factors (net distinct insiders buying, net shares bought as a share of shares outstanding, and net insider buy value in dollars), each carried alongside as its own percentile across the universe. Only open-market Forms 4/5 purchases and sales inside the trailing windowDays window count; Form 3 establishes initial ownership rather than reporting transactions. Trades a filing flags as Rule 10b5-1 pre-planned are excluded so the score reflects organic buying rather than a scheduled plan. A factor a stock has no data for drops out of that stock's mean instead of scoring zero, which is why a percentile — or netSharesBoughtPercentOfShares, marketCapUsd, averageDollarVolume3MonthUsd — can be null on an otherwise scored row.

rank is the stock's place in the full scored universe (totalScored) and does not renumber when the liquidity filters narrow the set, so a filtered page still reports true positions. bottom=true walks that same ranking from the far end — heaviest net insider distribution first — with the universe ranks preserved. Pass ticker to get one stock's score and rank instead of the leaderboard; the other filters do not apply then, and a stock outside the scored universe is a 404 rather than a zero score. Note that netSharesBoughtPercentOfShares is a fraction of shares outstanding despite its name: 0.2507495870790599810669692615 is just over 25%.

Parameters: all optional — clusterBuysOnly (keep only cluster buys: three or more distinct insiders buying in the window); minMarketCap, minSharePrice, minDollarVolume (USD floors, default 0 for no floor — once a floor is set, rows whose value is unknown are excluded); limit (default 25, max 200); bottom (walk the ranking from the distribution end); ticker (one stock's score and universe rank instead of the leaderboard).

curl "https://api.equibles.com/v1/insider-sentiment-scores?limit=2" \
  -H "Authorization: Bearer eq_your_api_key"
import requests
r = requests.get(
    "https://api.equibles.com/v1/insider-sentiment-scores?limit=2",
    headers={"Authorization": "Bearer eq_your_api_key"},
)
print(r.json())
const res = await fetch("https://api.equibles.com/v1/insider-sentiment-scores?limit=2", {
  headers: { Authorization: "Bearer eq_your_api_key" },
});
console.log(await res.json());
{
  "windowDays": 90,
  "totalScored": 2582,
  "data": [
    {
      "rank": 1,
      "ticker": "SCTX",
      "score": 99.5,
      "distinctBuyers": 6,
      "distinctSellers": 0,
      "netDistinctBuyers": 6,
      "netSharesBoughtPercentOfShares": 0.2507495870790599810669692615,
      "netBuyValue": 71344746.25,
      "isClusterBuy": true,
      "marketCapUsd": 490474048.0,
      "sharePriceUsd": 26.000000636119299085589109553,
      "averageDollarVolume3MonthUsd": null,
      "netDistinctBuyersPercentile": 99.12824486633089,
      "netSharesBoughtPercentile": 99.68883702839362,
      "netBuyValuePercentile": 99.69004261913987
    },
    {
      "rank": 2,
      "ticker": "BRVE",
      "score": 99.21,
      "distinctBuyers": 7,
      "distinctSellers": 0,
      "netDistinctBuyers": 7,
      "netSharesBoughtPercentOfShares": 0.0545664563396589957221534399,
      "netBuyValue": 69394950.0,
      "isClusterBuy": true,
      "marketCapUsd": 2119585152.0,
      "sharePriceUsd": 30.000000169844557411833902553,
      "averageDollarVolume3MonthUsd": null,
      "netDistinctBuyersPercentile": 99.49631925610228,
      "netSharesBoughtPercentile": 98.48308051341891,
      "netBuyValuePercentile": 99.65129794653235
    }
  ]
}

Try it with a real key

Every example on this page runs against the live API. A free account includes an API key and MCP access — set up in under a minute.

Get your free API key