Browse all documentation

Insider trades API reference

Trades and holdings of company insiders from SEC Forms 3, 4 and 5

Overview

Insider trades come from the SEC's ownership forms: Form 3 (initial holdings), Form 4 (changes) and Form 5 (annual catch-up), and their amendments. They cover the officers, directors and 10% owners of US listed companies. Every request needs a Bearer key, and REST and MCP draw on one credit balance.

Eight routes cover the trades, holdings, holding statements and insiders of one company, the trades of one insider across companies, a feed of trades across all companies, daily buying and selling totals, and the list of transaction codes. A company is addressed by its Filings API id, for example usa:0000320193. An insider is addressed by their own CIK.

History starts with filings of October 2021. New filings are read from the SEC every 2 minutes.

The US is the only country covered. Another country is 404 not_covered.

Base URL: https://api.narwhalapi.com. Each route below is an MCP tool of its own, with the same parameters.

Holders of more than 5% are on the large holders page.

Company ids are the ones the Filings API returns from company search.

What every account gets

WhatEvery account
Insider trades, seven routesIncluded
Transaction codes listIncluded, free

See pricing for what a call costs. A request is charged at the price of its API unless a route says otherwise.

  • Billed at the Companies price. Each successful answer is one call, whatever the number of rows, and an empty page is charged too. Errors are not charged. The transaction codes list is free.
  • Numbers are decimal strings. A field with no value is left out, a list is always present, and a flag such as officer is sent only when true.
  • A trade price is per share and is left out when the filing gives none. transaction_value and shares_owned_before are worked out only when the filing gives the figures they come from.
  • The Rule 10b5-1 box is one tick for the whole form. plan_10b5_1 is true for every trade on such a form, including trades the filer did not make under the plan.
  • An amendment that matched exactly one original names it in amends. When it names an original we could not find, amends_unmatched is true and both rows stay in the list.
  • Holders that report only through other entities, such as a parent company, are listed with no share total. ownership_pct is empty where no share count is held.
  • A company in the feed that is not in our company list answers 404 on the company routes.
  • An insider CIK we hold nothing for answers an empty page on the insider route, and it is charged.

Endpoints

Every route is a GET and needs your key in the Authorization: Bearer header. The examples show the shape of an answer, not live data.

List a company's insider trades

GET /v1/companies/{company_id}/insider-trades

Every transaction in the company's shares reported on Forms 4 and 5 by its officers, directors and 10% owners, newest filing first. Derivative transactions (options, warrants, convertibles) are included and carry derivative.

Trades come from Forms 4 and 5. A form_type of 3 or 3/A answers an empty list.

The default order is by filing date, newest first. Send sort=transaction_date.asc to read in trade order.

MCP: tool filings_list_insider_trades.

Parameters

ParameterWhereRequiredTypeMeaning
company_idpathYesstringThe company id, for example usa:0000320193. A ticker alias such as usa:AAPL is accepted.
filed_fromqueryNodateFirst filing day, inclusive (YYYY-MM-DD).
filed_toqueryNodateLast filing day, inclusive.
filing_datequeryNodateOnly filings made on this day.
filing_date_gtqueryNodateOnly filings made after this day.
filing_date_ltqueryNodateOnly filings made before this day.
transaction_datequeryNodateOnly trades made on this day.
transaction_date_gtqueryNodateOnly trades made after this day.
transaction_date_gtequeryNodateOnly trades made on or after this day.
transaction_date_ltqueryNodateOnly trades made before this day.
transaction_date_ltequeryNodateOnly trades made on or before this day.
owner_cikqueryNostringOnly filings of the owner with this CIK. Leading zeros are optional.
namequeryNostringOnly owners whose name contains this text. Case-insensitive, 2 to 100 characters.
transaction_codequeryNostringOnly trades with this one-letter SEC transaction code, for example P or S.
form_typequeryNoone of 3, 3/A, 4, 4/A, 5, 5/AOnly trades on this form. Trades come from Forms 4 and 5.
sortqueryNoone of filing_date.desc, filing_date.asc, transaction_date.desc, transaction_date.ascOrder of the list. Default filing_date.desc.
cursorqueryNostringnext_cursor of the previous page, with the same other parameters.
limitqueryNointegerRows per page. Default 50, at most 200.

Response fields

FieldTypeSentMeaning
idstringAlwaysThe company id. On one insider's trades, usa: and the insider's CIK.
filed_fromdateOptionalEarliest filing day this account can read. Left out when no earlier day is hidden.
tradeslist of objectAlwaysThe trades, in the order asked for.
trades[].derivativealways trueOptionalTrue when the row is a derivative security such as an option, warrant or convertible.
trades[].securitystringOptionalTitle of the security, as filed, for example Common Stock.
trades[].ownershipone of D, IOptionalD for direct ownership, I for indirect.
trades[].naturestringOptionalHow indirect ownership is held, as filed.
trades[].underlyingstringOptionalFor a derivative, the security it turns into.
trades[].underlying_sharesstringOptionalFor a derivative, how many underlying shares.
trades[].exercise_pricestringOptionalFor a derivative, the strike or conversion price.
trades[].exercise_datedateOptionalFor a derivative, the date it can first be exercised.
trades[].expiration_datedateOptionalFor a derivative, the date it expires.
trades[].filing_idstringAlwaysId of the filing the row comes from.
trades[].formone of 3, 3/A, 4, 4/A, 5, 5/AAlwaysThe form the row was reported on: 3, 4 or 5, with /A for an amendment.
trades[].fileddateAlwaysDay the filing was made.
trades[].perioddateOptionalDate of the event that required the filing.
trades[].ownerslist of objectAlwaysThe reporting owners of the filing. A joint filing lists several.
trades[].owners[].cikstringOptionalSEC Central Index Key of the owner.
trades[].owners[].idstringOptionalThe owner's id with its registry, for example usa:0001780525.
trades[].owners[].namestringAlwaysName of the owner, as filed.
trades[].owners[].titlestringOptionalOfficer title or other relationship, as filed.
trades[].owners[].directoralways trueOptionalTrue when the owner is a director.
trades[].owners[].officeralways trueOptionalTrue when the owner is an officer.
trades[].owners[].ten_percentalways trueOptionalTrue when the owner holds more than 10% of the shares.
trades[].owners[].otheralways trueOptionalTrue when the owner has another relationship to the company.
trades[].plan_10b5_1always trueOptionalTrue when the form ticks the Rule 10b5-1 box.
trades[].transaction_datedateOptionalDate of the trade.
trades[].codestringOptionalSEC transaction code, for example P purchase, S sale, A grant, M option exercise, F tax withholding or G gift.
trades[].acquired_disposedone of A, DOptionalA when the owner acquired shares, D when the owner disposed of them.
trades[].sharesstringOptionalNumber of shares in the trade.
trades[].pricestringOptionalPrice per share. Left out when the filing gives none.
trades[].currencystringOptionalCurrency of the prices and values. Left out means US dollars.
trades[].owned_afterstringOptionalShares owned after the trade.
trades[].equity_swapalways trueOptionalTrue when the filer marked the trade as an equity swap or similar instrument.
trades[].amendsstringOptionalThe filing this one replaces, when it is an amendment that matched exactly one original.
trades[].amends_unmatchedalways trueOptionalTrue when the amendment names an original we could not find.
trades[].transaction_valuestringOptionalshares times price. Left out unless the filing gives both.
trades[].shares_owned_beforestringOptionalShares owned before the trade. Given only when the balances on the filing's rows for that position follow one from the next.
trades[].deemed_execution_datedateOptionalDate the trade was deemed executed, when the filing gives one.
trades[].timelinessone of E, LOptionalE when the filer marked the report as early, L when late.
trades[].not_subject_to_section_16always trueOptionalTrue when the filer marked the trade as not subject to Section 16.
trades[].remarksstringOptionalRemarks the filer wrote on the form.
trades[].footnoteslist of stringAlwaysThe footnotes of the row. Empty when there are none.
trades[].company_idstringOptionalId of the company whose shares were traded. Sent on lists that are not about one company.
trades[].issuerstringOptionalName of the company whose shares were traded.
trades[].tickerstringOptionalTicker of the company.
next_cursorstringAlwaysPass as cursor to read the next page. Always sent; null on the last page.
Request
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/companies/usa:0000320193/insider-trades?transaction_code=S&limit=1"
Example response
{
  "id": "usa:0000320193",
  "trades": [
    {
      "security": "Common Stock",
      "ownership": "D",
      "filing_id": "usa:0000320193:0001140361-26-042149",
      "form": "4",
      "filed": "2026-11-05",
      "period": "2026-11-03",
      "owners": [
        {
          "cik": "0001780525",
          "name": "Newstead Jennifer",
          "title": "SVP, GC and Government Affairs",
          "officer": true
        }
      ],
      "plan_10b5_1": true,
      "transaction_date": "2026-11-03",
      "code": "S",
      "acquired_disposed": "D",
      "shares": "2399",
      "price": "325.75",
      "owned_after": "29997",
      "transaction_value": "781474.25",
      "shares_owned_before": "32396",
      "footnotes": [
        "This transaction was made pursuant to a Rule 10b5-1 trading plan adopted by the reporting person on May 5, 2026."
      ]
    }
  ],
  "next_cursor": "eyJrIjoiNzk3Mzg4OTQ5OTk4…"
}

List a company's insider holdings

GET /v1/companies/{company_id}/insider-ownership

The latest reported holding of each insider in each security: the balance after the newest trade, or the newest Form 3 or annual holding, whichever was filed last.

One row for each owner and security: the latest balance. shares is the amount owned, or value when the filing gives dollars instead. as_of is the date of that trade or the filing date of that holding.

MCP: tool filings_list_insider_ownership.

Parameters

ParameterWhereRequiredTypeMeaning
company_idpathYesstringThe company id, for example usa:0000320193. A ticker alias such as usa:AAPL is accepted.
filed_fromqueryNodateFirst filing day, inclusive (YYYY-MM-DD).
filed_toqueryNodateLast filing day, inclusive.
filing_datequeryNodateOnly filings made on this day.
filing_date_gtqueryNodateOnly filings made after this day.
filing_date_ltqueryNodateOnly filings made before this day.
owner_cikqueryNostringOnly filings of the owner with this CIK. Leading zeros are optional.
namequeryNostringOnly owners whose name contains this text. Case-insensitive, 2 to 100 characters.
form_typequeryNoone of 3, 3/A, 4, 4/A, 5, 5/AOnly filings on this form.
cursorqueryNostringnext_cursor of the previous page, with the same other parameters.
limitqueryNointegerRows per page. Default 100, at most 500.

Response fields

FieldTypeSentMeaning
idstringAlwaysThe company id. On one insider's trades, usa: and the insider's CIK.
filed_fromdateOptionalEarliest filing day this account can read. Left out when no earlier day is hidden.
positionslist of objectAlwaysThe latest holding of each owner in each security.
positions[].derivativealways trueOptionalTrue when the row is a derivative security such as an option, warrant or convertible.
positions[].securitystringOptionalTitle of the security, as filed, for example Common Stock.
positions[].ownershipone of D, IOptionalD for direct ownership, I for indirect.
positions[].naturestringOptionalHow indirect ownership is held, as filed.
positions[].underlyingstringOptionalFor a derivative, the security it turns into.
positions[].underlying_sharesstringOptionalFor a derivative, how many underlying shares.
positions[].exercise_pricestringOptionalFor a derivative, the strike or conversion price.
positions[].exercise_datedateOptionalFor a derivative, the date it can first be exercised.
positions[].expiration_datedateOptionalFor a derivative, the date it expires.
positions[].filing_idstringAlwaysId of the filing the row comes from.
positions[].formone of 3, 3/A, 4, 4/A, 5, 5/AAlwaysThe form the row was reported on: 3, 4 or 5, with /A for an amendment.
positions[].fileddateAlwaysDay the filing was made.
positions[].ownerslist of objectAlwaysThe reporting owners of the filing. A joint filing lists several.
positions[].owners[].cikstringOptionalSEC Central Index Key of the owner.
positions[].owners[].idstringOptionalThe owner's id with its registry, for example usa:0001780525.
positions[].owners[].namestringAlwaysName of the owner, as filed.
positions[].owners[].titlestringOptionalOfficer title or other relationship, as filed.
positions[].owners[].directoralways trueOptionalTrue when the owner is a director.
positions[].owners[].officeralways trueOptionalTrue when the owner is an officer.
positions[].owners[].ten_percentalways trueOptionalTrue when the owner holds more than 10% of the shares.
positions[].owners[].otheralways trueOptionalTrue when the owner has another relationship to the company.
positions[].as_ofdateAlwaysDate of the trade or the filing date of the holding that gives this balance.
positions[].sharesstringOptionalAmount owned, in shares.
positions[].valuestringOptionalDollar value owned, when the filing reports a value instead of shares.
positions[].currencystringOptionalCurrency of the prices and values. Left out means US dollars.
next_cursorstringAlwaysPass as cursor to read the next page. Always sent; null on the last page.
Request
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/companies/usa:0000320193/insider-ownership?limit=1"
Example response
{
  "id": "usa:0000320193",
  "positions": [
    {
      "security": "Common Stock",
      "ownership": "D",
      "filing_id": "usa:0000320193:0001140361-26-042149",
      "form": "4",
      "filed": "2026-11-05",
      "owners": [
        {
          "cik": "0001780525",
          "name": "Newstead Jennifer",
          "title": "SVP, GC and Government Affairs",
          "officer": true
        }
      ],
      "as_of": "2026-11-03",
      "shares": "29997"
    }
  ],
  "next_cursor": "eyJrIjoiNzk3Mzg4OTQ5OTk4…"
}

List a company's holding statements

GET /v1/companies/{company_id}/insider-ownership/statements

Every Form 3 and Form 5 statement of holdings, and their amendments, as filed, newest first. Not only the latest balance.

Statements are Forms 3 and 5, and their amendments, as filed. form_type takes 3, 3/A, 5 or 5/A, and another form is 400 invalid_query.

MCP: tool filings_list_insider_statements.

Parameters

ParameterWhereRequiredTypeMeaning
company_idpathYesstringThe company id, for example usa:0000320193. A ticker alias such as usa:AAPL is accepted.
filed_fromqueryNodateFirst filing day, inclusive (YYYY-MM-DD).
filed_toqueryNodateLast filing day, inclusive.
filing_datequeryNodateOnly filings made on this day.
filing_date_gtqueryNodateOnly filings made after this day.
filing_date_ltqueryNodateOnly filings made before this day.
owner_cikqueryNostringOnly filings of the owner with this CIK. Leading zeros are optional.
namequeryNostringOnly owners whose name contains this text. Case-insensitive, 2 to 100 characters.
form_typequeryNoone of 3, 3/A, 4, 4/A, 5, 5/AOnly statements on this form: 3, 3/A, 5 or 5/A.
cursorqueryNostringnext_cursor of the previous page, with the same other parameters.
limitqueryNointegerRows per page. Default 100, at most 500.

Response fields

FieldTypeSentMeaning
idstringAlwaysThe company id. On one insider's trades, usa: and the insider's CIK.
statementslist of objectAlwaysThe statements, newest first.
statements[].derivativealways trueOptionalTrue when the row is a derivative security such as an option, warrant or convertible.
statements[].securitystringOptionalTitle of the security, as filed, for example Common Stock.
statements[].ownershipone of D, IOptionalD for direct ownership, I for indirect.
statements[].naturestringOptionalHow indirect ownership is held, as filed.
statements[].underlyingstringOptionalFor a derivative, the security it turns into.
statements[].underlying_sharesstringOptionalFor a derivative, how many underlying shares.
statements[].exercise_pricestringOptionalFor a derivative, the strike or conversion price.
statements[].exercise_datedateOptionalFor a derivative, the date it can first be exercised.
statements[].expiration_datedateOptionalFor a derivative, the date it expires.
statements[].filing_idstringAlwaysId of the filing the row comes from.
statements[].formone of 3, 3/A, 4, 4/A, 5, 5/AAlwaysThe form the row was reported on: 3, 4 or 5, with /A for an amendment.
statements[].fileddateAlwaysDay the filing was made.
statements[].ownerslist of objectAlwaysThe reporting owners of the filing. A joint filing lists several.
statements[].owners[].cikstringOptionalSEC Central Index Key of the owner.
statements[].owners[].idstringOptionalThe owner's id with its registry, for example usa:0001780525.
statements[].owners[].namestringAlwaysName of the owner, as filed.
statements[].owners[].titlestringOptionalOfficer title or other relationship, as filed.
statements[].owners[].directoralways trueOptionalTrue when the owner is a director.
statements[].owners[].officeralways trueOptionalTrue when the owner is an officer.
statements[].owners[].ten_percentalways trueOptionalTrue when the owner holds more than 10% of the shares.
statements[].owners[].otheralways trueOptionalTrue when the owner has another relationship to the company.
statements[].as_ofdateAlwaysDate of the trade or the filing date of the holding that gives this balance.
statements[].sharesstringOptionalAmount owned, in shares.
statements[].valuestringOptionalDollar value owned, when the filing reports a value instead of shares.
statements[].currencystringOptionalCurrency of the prices and values. Left out means US dollars.
next_cursorstringAlwaysPass as cursor to read the next page. Always sent; null on the last page.
Request
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/companies/usa:0000320193/insider-ownership/statements?limit=1"
Example response
{
  "id": "usa:0000320193",
  "statements": [
    {
      "security": "Common Stock",
      "ownership": "D",
      "filing_id": "usa:0000320193:0001140361-26-035359",
      "form": "3",
      "filed": "2026-09-01",
      "owners": [
        {
          "cik": "0002148403",
          "name": "Ternus John",
          "title": "CEO",
          "director": true,
          "officer": true
        }
      ],
      "as_of": "2026-09-01",
      "shares": "34155"
    }
  ],
  "next_cursor": "eyJrIjoiNzk3MzkwOTg5OTk4…"
}

List a company's insiders

GET /v1/companies/{company_id}/insiders

Every person who has reported on Forms 3, 4 or 5 for the company, with the roles they hold, how often they filed and what they own now.

shares_owned_direct and shares_owned_indirect add the latest balance of each plain-share position. Derivatives are left out. A position that several owners report together counts for each of them.

MCP: tool filings_list_company_insiders.

Parameters

ParameterWhereRequiredTypeMeaning
company_idpathYesstringThe company id, for example usa:0000320193. A ticker alias such as usa:AAPL is accepted.
namequeryNostringOnly owners whose name contains this text. Case-insensitive, 2 to 100 characters.
cursorqueryNostringnext_cursor of the previous page, with the same other parameters.
limitqueryNointegerRows per page. Default 100, at most 500.

Response fields

FieldTypeSentMeaning
idstringAlwaysThe company id. On one insider's trades, usa: and the insider's CIK.
insiderslist of objectAlwaysThe insiders of the company.
insiders[].owner_cikstringOptionalSEC Central Index Key of the insider.
insiders[].owner_idstringOptionalThe insider's id with its registry.
insiders[].namestringAlwaysName of the owner, as filed.
insiders[].titlestringOptionalOfficer title or other relationship, as filed.
insiders[].directoralways trueOptionalTrue when the owner is a director.
insiders[].officeralways trueOptionalTrue when the owner is an officer.
insiders[].ten_percentalways trueOptionalTrue when the owner holds more than 10% of the shares.
insiders[].otheralways trueOptionalTrue when the owner has another relationship to the company.
insiders[].first_filing_datedateAlwaysDay of the insider's first filing for this company.
insiders[].last_filing_datedateAlwaysDay of the insider's newest filing for this company.
insiders[].filing_countintegerAlwaysNumber of filings the insider made for this company.
insiders[].position_countintegerAlwaysNumber of positions the insider reported.
insiders[].shares_ownedstringOptionalSum of the latest balance of each plain-share position. Left out when the insider never reported a share balance.
insiders[].shares_owned_directstringOptionalThe part of shares_owned held directly.
insiders[].shares_owned_indirectstringOptionalThe part of shares_owned held indirectly.
insiders[].ownership_pctstringOptionalshares_owned as a percent of the company's newest reported shares outstanding. Left out when that is not known, when the result would pass 100, or when the company has more than one class of shares.
insiders[].outstanding_as_ofdateOptionalDate of the shares outstanding figure behind ownership_pct.
next_cursorstringAlwaysPass as cursor to read the next page. Always sent; null on the last page.
Request
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/companies/usa:0000320193/insiders?limit=1"
Example response
{
  "id": "usa:0000320193",
  "insiders": [
    {
      "owner_cik": "0001780525",
      "name": "Newstead Jennifer",
      "title": "SVP, GC and Government Affairs",
      "officer": true,
      "first_filing_date": "2026-03-06",
      "last_filing_date": "2026-11-05",
      "filing_count": 17,
      "position_count": 1,
      "shares_owned": "29997",
      "shares_owned_direct": "29997",
      "ownership_pct": "0.0002",
      "outstanding_as_of": "2026-10-23"
    }
  ],
  "next_cursor": "eyJrIjoiNzk3My04OC05NHww…"
}

List one insider's trades

GET /v1/insiders/{cik}/trades

Every trade one insider filed across companies, newest filing first. cik is the insider's own CIK.

id in the answer is usa: and the insider's CIK. The rows are the same as on the company route, with company_id, issuer and ticker added.

MCP: tool filings_list_insider_person_trades.

Parameters

ParameterWhereRequiredTypeMeaning
cikpathYesstringThe insider's own CIK, one to ten digits.
filed_fromqueryNodateFirst filing day, inclusive (YYYY-MM-DD).
filed_toqueryNodateLast filing day, inclusive.
filing_datequeryNodateOnly filings made on this day.
filing_date_gtqueryNodateOnly filings made after this day.
filing_date_ltqueryNodateOnly filings made before this day.
transaction_datequeryNodateOnly trades made on this day.
transaction_date_gtqueryNodateOnly trades made after this day.
transaction_date_gtequeryNodateOnly trades made on or after this day.
transaction_date_ltqueryNodateOnly trades made before this day.
transaction_date_ltequeryNodateOnly trades made on or before this day.
owner_cikqueryNostringOnly filings of the owner with this CIK. Leading zeros are optional.
namequeryNostringOnly owners whose name contains this text. Case-insensitive, 2 to 100 characters.
transaction_codequeryNostringOnly trades with this one-letter SEC transaction code, for example P or S.
form_typequeryNoone of 3, 3/A, 4, 4/A, 5, 5/AOnly trades on this form. Trades come from Forms 4 and 5.
sortqueryNoone of filing_date.desc, filing_date.asc, transaction_date.desc, transaction_date.ascOrder of the list. Default filing_date.desc.
cursorqueryNostringnext_cursor of the previous page, with the same other parameters.
limitqueryNointegerRows per page. Default 50, at most 200.

Response fields

FieldTypeSentMeaning
idstringOptionalThe company id. On one insider's trades, usa: and the insider's CIK.
filed_fromdateOptionalEarliest filing day this account can read. Left out when no earlier day is hidden.
tradeslist of objectAlwaysThe trades, in the order asked for.
trades[].derivativealways trueOptionalTrue when the row is a derivative security such as an option, warrant or convertible.
trades[].securitystringOptionalTitle of the security, as filed, for example Common Stock.
trades[].ownershipone of D, IOptionalD for direct ownership, I for indirect.
trades[].naturestringOptionalHow indirect ownership is held, as filed.
trades[].underlyingstringOptionalFor a derivative, the security it turns into.
trades[].underlying_sharesstringOptionalFor a derivative, how many underlying shares.
trades[].exercise_pricestringOptionalFor a derivative, the strike or conversion price.
trades[].exercise_datedateOptionalFor a derivative, the date it can first be exercised.
trades[].expiration_datedateOptionalFor a derivative, the date it expires.
trades[].filing_idstringAlwaysId of the filing the row comes from.
trades[].formone of 3, 3/A, 4, 4/A, 5, 5/AAlwaysThe form the row was reported on: 3, 4 or 5, with /A for an amendment.
trades[].fileddateAlwaysDay the filing was made.
trades[].perioddateOptionalDate of the event that required the filing.
trades[].ownerslist of objectAlwaysThe reporting owners of the filing. A joint filing lists several.
trades[].owners[].cikstringOptionalSEC Central Index Key of the owner.
trades[].owners[].idstringOptionalThe owner's id with its registry, for example usa:0001780525.
trades[].owners[].namestringAlwaysName of the owner, as filed.
trades[].owners[].titlestringOptionalOfficer title or other relationship, as filed.
trades[].owners[].directoralways trueOptionalTrue when the owner is a director.
trades[].owners[].officeralways trueOptionalTrue when the owner is an officer.
trades[].owners[].ten_percentalways trueOptionalTrue when the owner holds more than 10% of the shares.
trades[].owners[].otheralways trueOptionalTrue when the owner has another relationship to the company.
trades[].plan_10b5_1always trueOptionalTrue when the form ticks the Rule 10b5-1 box.
trades[].transaction_datedateOptionalDate of the trade.
trades[].codestringOptionalSEC transaction code, for example P purchase, S sale, A grant, M option exercise, F tax withholding or G gift.
trades[].acquired_disposedone of A, DOptionalA when the owner acquired shares, D when the owner disposed of them.
trades[].sharesstringOptionalNumber of shares in the trade.
trades[].pricestringOptionalPrice per share. Left out when the filing gives none.
trades[].currencystringOptionalCurrency of the prices and values. Left out means US dollars.
trades[].owned_afterstringOptionalShares owned after the trade.
trades[].equity_swapalways trueOptionalTrue when the filer marked the trade as an equity swap or similar instrument.
trades[].amendsstringOptionalThe filing this one replaces, when it is an amendment that matched exactly one original.
trades[].amends_unmatchedalways trueOptionalTrue when the amendment names an original we could not find.
trades[].transaction_valuestringOptionalshares times price. Left out unless the filing gives both.
trades[].shares_owned_beforestringOptionalShares owned before the trade. Given only when the balances on the filing's rows for that position follow one from the next.
trades[].deemed_execution_datedateOptionalDate the trade was deemed executed, when the filing gives one.
trades[].timelinessone of E, LOptionalE when the filer marked the report as early, L when late.
trades[].not_subject_to_section_16always trueOptionalTrue when the filer marked the trade as not subject to Section 16.
trades[].remarksstringOptionalRemarks the filer wrote on the form.
trades[].footnoteslist of stringAlwaysThe footnotes of the row. Empty when there are none.
trades[].company_idstringOptionalId of the company whose shares were traded. Sent on lists that are not about one company.
trades[].issuerstringOptionalName of the company whose shares were traded.
trades[].tickerstringOptionalTicker of the company.
next_cursorstringAlwaysPass as cursor to read the next page. Always sent; null on the last page.
Request
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/insiders/0001780525/trades?limit=1"
Example response
{
  "id": "usa:0001780525",
  "trades": [
    {
      "security": "Common Stock",
      "ownership": "D",
      "filing_id": "usa:0000320193:0001140361-26-042149",
      "form": "4",
      "filed": "2026-11-05",
      "period": "2026-11-03",
      "owners": [
        {
          "cik": "0001780525",
          "name": "Newstead Jennifer",
          "title": "SVP, GC and Government Affairs",
          "officer": true
        }
      ],
      "plan_10b5_1": true,
      "transaction_date": "2026-11-03",
      "code": "S",
      "acquired_disposed": "D",
      "shares": "2399",
      "price": "325.75",
      "owned_after": "29997",
      "transaction_value": "781474.25",
      "shares_owned_before": "32396",
      "footnotes": [
        "This transaction was made pursuant to a Rule 10b5-1 trading plan adopted by the reporting person on May 5, 2026."
      ],
      "company_id": "usa:0000320193",
      "issuer": "Apple Inc.",
      "ticker": "AAPL"
    }
  ],
  "next_cursor": "eyJrIjoiNzk3Mzg4OTQ5OTk4…"
}

List insider trades across companies

GET /v1/insider-trades

Insider trades of every company, newest filing first. Without a date it returns the newest filing day we hold and the six days before it.

Without a date the feed returns the newest filing day we hold and the six days before it. With a window, send filed_from with filed_to, or filing_date. A window covers at most 31 days.

The feed is sorted by filing date, newest first. To sort by trade date, ask for one company or one insider.

MCP: tool filings_list_insider_feed.

Parameters

ParameterWhereRequiredTypeMeaning
filed_fromqueryNodateFirst filing day, inclusive (YYYY-MM-DD).
filed_toqueryNodateLast filing day, inclusive.
filing_datequeryNodateOnly filings made on this day.
filing_date_gtqueryNodateOnly filings made after this day.
filing_date_ltqueryNodateOnly filings made before this day.
transaction_datequeryNodateOnly trades made on this day.
transaction_date_gtqueryNodateOnly trades made after this day.
transaction_date_gtequeryNodateOnly trades made on or after this day.
transaction_date_ltqueryNodateOnly trades made before this day.
transaction_date_ltequeryNodateOnly trades made on or before this day.
owner_cikqueryNostringOnly filings of the owner with this CIK. Leading zeros are optional.
namequeryNostringOnly owners whose name contains this text. Case-insensitive, 2 to 100 characters.
transaction_codequeryNostringOnly trades with this one-letter SEC transaction code, for example P or S.
form_typequeryNoone of 3, 3/A, 4, 4/A, 5, 5/AOnly trades on this form. Trades come from Forms 4 and 5.
sortqueryNoone of filing_date.desc, filing_date.asc, transaction_date.desc, transaction_date.ascOrder of the list. Default filing_date.desc.
cursorqueryNostringnext_cursor of the previous page, with the same other parameters.
limitqueryNointegerRows per page. Default 50, at most 200.
countryqueryNostringThree-letter country code of the registry. Left out means USA. A country the route does not cover is 404 not_covered.

Response fields

FieldTypeSentMeaning
idstringOptionalThe company id. On one insider's trades, usa: and the insider's CIK.
filed_fromdateOptionalEarliest filing day this account can read. Left out when no earlier day is hidden.
tradeslist of objectAlwaysThe trades, in the order asked for.
trades[].derivativealways trueOptionalTrue when the row is a derivative security such as an option, warrant or convertible.
trades[].securitystringOptionalTitle of the security, as filed, for example Common Stock.
trades[].ownershipone of D, IOptionalD for direct ownership, I for indirect.
trades[].naturestringOptionalHow indirect ownership is held, as filed.
trades[].underlyingstringOptionalFor a derivative, the security it turns into.
trades[].underlying_sharesstringOptionalFor a derivative, how many underlying shares.
trades[].exercise_pricestringOptionalFor a derivative, the strike or conversion price.
trades[].exercise_datedateOptionalFor a derivative, the date it can first be exercised.
trades[].expiration_datedateOptionalFor a derivative, the date it expires.
trades[].filing_idstringAlwaysId of the filing the row comes from.
trades[].formone of 3, 3/A, 4, 4/A, 5, 5/AAlwaysThe form the row was reported on: 3, 4 or 5, with /A for an amendment.
trades[].fileddateAlwaysDay the filing was made.
trades[].perioddateOptionalDate of the event that required the filing.
trades[].ownerslist of objectAlwaysThe reporting owners of the filing. A joint filing lists several.
trades[].owners[].cikstringOptionalSEC Central Index Key of the owner.
trades[].owners[].idstringOptionalThe owner's id with its registry, for example usa:0001780525.
trades[].owners[].namestringAlwaysName of the owner, as filed.
trades[].owners[].titlestringOptionalOfficer title or other relationship, as filed.
trades[].owners[].directoralways trueOptionalTrue when the owner is a director.
trades[].owners[].officeralways trueOptionalTrue when the owner is an officer.
trades[].owners[].ten_percentalways trueOptionalTrue when the owner holds more than 10% of the shares.
trades[].owners[].otheralways trueOptionalTrue when the owner has another relationship to the company.
trades[].plan_10b5_1always trueOptionalTrue when the form ticks the Rule 10b5-1 box.
trades[].transaction_datedateOptionalDate of the trade.
trades[].codestringOptionalSEC transaction code, for example P purchase, S sale, A grant, M option exercise, F tax withholding or G gift.
trades[].acquired_disposedone of A, DOptionalA when the owner acquired shares, D when the owner disposed of them.
trades[].sharesstringOptionalNumber of shares in the trade.
trades[].pricestringOptionalPrice per share. Left out when the filing gives none.
trades[].currencystringOptionalCurrency of the prices and values. Left out means US dollars.
trades[].owned_afterstringOptionalShares owned after the trade.
trades[].equity_swapalways trueOptionalTrue when the filer marked the trade as an equity swap or similar instrument.
trades[].amendsstringOptionalThe filing this one replaces, when it is an amendment that matched exactly one original.
trades[].amends_unmatchedalways trueOptionalTrue when the amendment names an original we could not find.
trades[].transaction_valuestringOptionalshares times price. Left out unless the filing gives both.
trades[].shares_owned_beforestringOptionalShares owned before the trade. Given only when the balances on the filing's rows for that position follow one from the next.
trades[].deemed_execution_datedateOptionalDate the trade was deemed executed, when the filing gives one.
trades[].timelinessone of E, LOptionalE when the filer marked the report as early, L when late.
trades[].not_subject_to_section_16always trueOptionalTrue when the filer marked the trade as not subject to Section 16.
trades[].remarksstringOptionalRemarks the filer wrote on the form.
trades[].footnoteslist of stringAlwaysThe footnotes of the row. Empty when there are none.
trades[].company_idstringOptionalId of the company whose shares were traded. Sent on lists that are not about one company.
trades[].issuerstringOptionalName of the company whose shares were traded.
trades[].tickerstringOptionalTicker of the company.
next_cursorstringAlwaysPass as cursor to read the next page. Always sent; null on the last page.
Request
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/insider-trades?transaction_code=P&limit=1"
Example response
{
  "trades": [
    {
      "security": "Ordinary Shares",
      "ownership": "D",
      "filing_id": "usa:0001651717:0002111999-26-000011",
      "form": "4",
      "filed": "2026-11-12",
      "period": "2026-11-09",
      "owners": [
        {
          "cik": "0002111999",
          "name": "BALDEW RUBEN",
          "title": "Chief Financial Officer",
          "director": true,
          "officer": true
        }
      ],
      "transaction_date": "2026-11-09",
      "code": "P",
      "acquired_disposed": "A",
      "shares": "8379",
      "price": "11.9538",
      "owned_after": "375551",
      "transaction_value": "100160.8902",
      "shares_owned_before": "367172",
      "footnotes": [
        "Includes 184,991 Restricted Share Units which will vest on June 17, 2027."
      ],
      "company_id": "usa:0001651717",
      "issuer": "Nomad Foods Ltd",
      "ticker": "NOMD"
    }
  ],
  "next_cursor": "eyJrIjoiNzk3Mzg4ODc5OTk3…"
}

Get daily insider buying and selling

GET /v1/insider-trades/activity

Daily totals of open-market purchases (code P) and sales (code S) of plain shares, grouped by company and transaction date.

Totals cover open-market purchases (code P) and sales (code S) of plain shares. Derivatives are left out.

With company_id the whole history can be asked for. Without it, send filed_from and filed_to no more than 7 days apart, and the totals cover the filings made in those days. A longer window is 400 invalid_query.

purchaser_count and seller_count count people once for each filing. Only the first owner listed counts.

MCP: tool filings_get_insider_activity.

Parameters

ParameterWhereRequiredTypeMeaning
company_idqueryNostringOnly this company. With it the whole history can be asked for.
countryqueryNostringThree-letter country code of the registry. Left out means USA. A country the route does not cover is 404 not_covered.
filed_fromqueryNodateFirst filing day, inclusive (YYYY-MM-DD).
filed_toqueryNodateLast filing day, inclusive.
transaction_datequeryNodateOnly trades made on this day.
transaction_date_gtqueryNodateOnly trades made after this day.
transaction_date_gtequeryNodateOnly trades made on or after this day.
transaction_date_ltqueryNodateOnly trades made before this day.
transaction_date_ltequeryNodateOnly trades made on or before this day.
sortqueryNoone of transaction_date.desc, transaction_date.ascOrder of the days. Default transaction_date.desc.
cursorqueryNostringnext_cursor of the previous page, with the same other parameters.
limitqueryNointegerDays per page. Default 100, at most 1000.

Response fields

FieldTypeSentMeaning
dayslist of objectAlwaysOne row for each company and day.
days[].company_idstringAlwaysId of the company.
days[].currencystringOptionalCurrency of the prices and values. Left out means US dollars.
days[].issuerstringOptionalName of the company whose shares were traded.
days[].tickerstringOptionalTicker of the company.
days[].transaction_datedateAlwaysDate of the trade.
days[].last_filing_datedateAlwaysDay of the newest filing that adds to this day's totals.
days[].purchase_countintegerAlwaysNumber of open-market purchases.
days[].purchase_sharesstringAlwaysShares bought.
days[].purchase_valuestringOptionalDollar value of the purchases. Left out when a trade it adds up has no price.
days[].purchaser_countintegerAlwaysPeople who bought, counted once for each filing.
days[].sale_countintegerAlwaysNumber of open-market sales.
days[].sale_sharesstringAlwaysShares sold.
days[].sale_valuestringOptionalDollar value of the sales. Left out when a trade it adds up has no price.
days[].seller_countintegerAlwaysPeople who sold, counted once for each filing.
days[].net_sharesstringAlwayspurchase_shares less sale_shares.
days[].net_valuestringOptionalpurchase_value less sale_value.
days[].planned_purchase_valuestringOptionalValue of purchases on forms that tick the Rule 10b5-1 box. An upper bound, because the box covers the whole form. Left out for filings before 1 April 2023.
days[].planned_sale_valuestringOptionalValue of sales on forms that tick the Rule 10b5-1 box. An upper bound. Left out for filings before 1 April 2023.
next_cursorstringAlwaysPass as cursor to read the next page. Always sent; null on the last page.
Request
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/insider-trades/activity?company_id=usa:0000320193&limit=1"
Example response
{
  "days": [
    {
      "company_id": "usa:0000320193",
      "issuer": "Apple Inc.",
      "ticker": "AAPL",
      "transaction_date": "2026-11-03",
      "last_filing_date": "2026-11-05",
      "purchase_count": 0,
      "purchase_shares": "0",
      "purchase_value": "0",
      "purchaser_count": 0,
      "sale_count": 1,
      "sale_shares": "2399",
      "sale_value": "781474.25",
      "seller_count": 1,
      "net_shares": "-2399",
      "net_value": "-781474.25",
      "planned_purchase_value": "0",
      "planned_sale_value": "781474.25"
    }
  ],
  "next_cursor": "eyJrIjoiMDAwMDMyMDE5M3wy…"
}

List insider transaction codes

GET /v1/insider-trades/transaction-codes

The fixed list of SEC transaction codes with their meaning and group. Free: this route is not charged.

The codes are fixed. Use this list to read code on a trade. It takes no parameters. The example shows the first four of the list.

MCP: tool filings_list_insider_transaction_codes.

Parameters

This route takes no parameters.

Response fields

FieldTypeSentMeaning
codeslist of objectAlwaysThe transaction codes.
codes[].codestringAlwaysThe one-letter SEC transaction code.
codes[].meaningstringAlwaysWhat the code means.
codes[].groupone of general, derivative, otherAlwaysgeneral, derivative or other.
Request
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/insider-trades/transaction-codes"
Example response
{
  "codes": [
    {
      "code": "P",
      "meaning": "Open market or private purchase",
      "group": "general"
    },
    {
      "code": "S",
      "meaning": "Open market or private sale",
      "group": "general"
    },
    {
      "code": "V",
      "meaning": "Transaction voluntarily reported earlier than required",
      "group": "general"
    },
    {
      "code": "A",
      "meaning": "Grant, award or other acquisition",
      "group": "general"
    }
  ]
}

Errors

Errors use the shared problem shape with a request_id. See Errors and credits for the shape and the credit headers. Failed requests are not charged.

CodeStatusMeaning
invalid_query400A parameter is missing, unknown, repeated or outside its range.
invalid_cursor400The cursor is not one this request returned, or it comes from a different request.
company_not_found404No company matches the id.
not_covered404The market, country or company is not covered yet.
insufficient_credits402Your credit balance is less than the request costs.
company_data_unavailable503The filings behind this route cannot be read right now. Try again shortly.

Was this page helpful?