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_.
Base URL: https:/. 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
| What | Every account |
|---|---|
| Insider trades, seven routes | Included |
| Transaction codes list | Included, 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
officeris sent only when true. - A trade price is per share and is left out when the filing gives none.
transaction_andvalue shares_are worked out only when the filing gives the figures they come from.owned_ before - The Rule 10b5-1 box is one tick for the whole form.
plan_is true for every trade on such a form, including trades the filer did not make under the plan.10b5_ 1 - An amendment that matched exactly one original names it in
amends. When it names an original we could not find,amends_is true and both rows stay in the list.unmatched - Holders that report only through other entities, such as a parent company, are listed with no share total.
ownership_is empty where no share count is held.pct - 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_ of 3 or 3/ answers an empty list.
The default order is by filing date, newest first. Send sort=transaction_ to read in trade order.
MCP: tool filings_.
Parameters
| Parameter | Where | Required | Type | Meaning |
|---|---|---|---|---|
company_ | path | Yes | string | The company id, for example usa:0000320193. A ticker alias such as usa:AAPL is accepted. |
filed_ | query | No | date | First filing day, inclusive (YYYY-MM-DD). |
filed_ | query | No | date | Last filing day, inclusive. |
filing_ | query | No | date | Only filings made on this day. |
filing_ | query | No | date | Only filings made after this day. |
filing_ | query | No | date | Only filings made before this day. |
transaction_ | query | No | date | Only trades made on this day. |
transaction_ | query | No | date | Only trades made after this day. |
transaction_ | query | No | date | Only trades made on or after this day. |
transaction_ | query | No | date | Only trades made before this day. |
transaction_ | query | No | date | Only trades made on or before this day. |
owner_ | query | No | string | Only filings of the owner with this CIK. Leading zeros are optional. |
name | query | No | string | Only owners whose name contains this text. Case-insensitive, 2 to 100 characters. |
transaction_ | query | No | string | Only trades with this one-letter SEC transaction code, for example P or S. |
form_ | query | No | one of 3, 3/A, 4, 4/A, 5, 5/A | Only trades on this form. Trades come from Forms 4 and 5. |
sort | query | No | one of filing_date.desc, filing_date.asc, transaction_date.desc, transaction_date.asc | Order of the list. Default filing_. |
cursor | query | No | string | next_ of the previous page, with the same other parameters. |
limit | query | No | integer | Rows per page. Default 50, at most 200. |
Response fields
| Field | Type | Sent | Meaning |
|---|---|---|---|
id | string | Always | The company id. On one insider's trades, usa: and the insider's CIK. |
filed_ | date | Optional | Earliest filing day this account can read. Left out when no earlier day is hidden. |
trades | list of object | Always | The trades, in the order asked for. |
trades[].derivative | always true | Optional | True when the row is a derivative security such as an option, warrant or convertible. |
trades[].security | string | Optional | Title of the security, as filed, for example Common Stock. |
trades[].ownership | one of D, I | Optional | D for direct ownership, I for indirect. |
trades[].nature | string | Optional | How indirect ownership is held, as filed. |
trades[].underlying | string | Optional | For a derivative, the security it turns into. |
trades[].underlying_ | string | Optional | For a derivative, how many underlying shares. |
trades[].exercise_ | string | Optional | For a derivative, the strike or conversion price. |
trades[].exercise_ | date | Optional | For a derivative, the date it can first be exercised. |
trades[].expiration_ | date | Optional | For a derivative, the date it expires. |
trades[].filing_ | string | Always | Id of the filing the row comes from. |
trades[].form | one of 3, 3/A, 4, 4/A, 5, 5/A | Always | The form the row was reported on: 3, 4 or 5, with / for an amendment. |
trades[].filed | date | Always | Day the filing was made. |
trades[].period | date | Optional | Date of the event that required the filing. |
trades[].owners | list of object | Always | The reporting owners of the filing. A joint filing lists several. |
trades[].owners[].cik | string | Optional | SEC Central Index Key of the owner. |
trades[].owners[].id | string | Optional | The owner's id with its registry, for example usa:0001780525. |
trades[].owners[].name | string | Always | Name of the owner, as filed. |
trades[].owners[].title | string | Optional | Officer title or other relationship, as filed. |
trades[].owners[].director | always true | Optional | True when the owner is a director. |
trades[].owners[].officer | always true | Optional | True when the owner is an officer. |
trades[].owners[].ten_ | always true | Optional | True when the owner holds more than 10% of the shares. |
trades[].owners[].other | always true | Optional | True when the owner has another relationship to the company. |
trades[].plan_ | always true | Optional | True when the form ticks the Rule 10b5-1 box. |
trades[].transaction_ | date | Optional | Date of the trade. |
trades[].code | string | Optional | SEC transaction code, for example P purchase, S sale, A grant, M option exercise, F tax withholding or G gift. |
trades[].acquired_ | one of A, D | Optional | A when the owner acquired shares, D when the owner disposed of them. |
trades[].shares | string | Optional | Number of shares in the trade. |
trades[].price | string | Optional | Price per share. Left out when the filing gives none. |
trades[].currency | string | Optional | Currency of the prices and values. Left out means US dollars. |
trades[].owned_ | string | Optional | Shares owned after the trade. |
trades[].equity_ | always true | Optional | True when the filer marked the trade as an equity swap or similar instrument. |
trades[].amends | string | Optional | The filing this one replaces, when it is an amendment that matched exactly one original. |
trades[].amends_ | always true | Optional | True when the amendment names an original we could not find. |
trades[].transaction_ | string | Optional | shares times price. Left out unless the filing gives both. |
trades[].shares_ | string | Optional | Shares owned before the trade. Given only when the balances on the filing's rows for that position follow one from the next. |
trades[].deemed_ | date | Optional | Date the trade was deemed executed, when the filing gives one. |
trades[].timeliness | one of E, L | Optional | E when the filer marked the report as early, L when late. |
trades[].not_ | always true | Optional | True when the filer marked the trade as not subject to Section 16. |
trades[].remarks | string | Optional | Remarks the filer wrote on the form. |
trades[].footnotes | list of string | Always | The footnotes of the row. Empty when there are none. |
trades[].company_ | string | Optional | Id of the company whose shares were traded. Sent on lists that are not about one company. |
trades[].issuer | string | Optional | Name of the company whose shares were traded. |
trades[].ticker | string | Optional | Ticker of the company. |
next_ | string | Always | Pass as cursor to read the next page. Always sent; null on the last page. |
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/companies/usa:0000320193/insider-trades?transaction_code=S&limit=1"{
"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_ is the date of that trade or the filing date of that holding.
MCP: tool filings_.
Parameters
| Parameter | Where | Required | Type | Meaning |
|---|---|---|---|---|
company_ | path | Yes | string | The company id, for example usa:0000320193. A ticker alias such as usa:AAPL is accepted. |
filed_ | query | No | date | First filing day, inclusive (YYYY-MM-DD). |
filed_ | query | No | date | Last filing day, inclusive. |
filing_ | query | No | date | Only filings made on this day. |
filing_ | query | No | date | Only filings made after this day. |
filing_ | query | No | date | Only filings made before this day. |
owner_ | query | No | string | Only filings of the owner with this CIK. Leading zeros are optional. |
name | query | No | string | Only owners whose name contains this text. Case-insensitive, 2 to 100 characters. |
form_ | query | No | one of 3, 3/A, 4, 4/A, 5, 5/A | Only filings on this form. |
cursor | query | No | string | next_ of the previous page, with the same other parameters. |
limit | query | No | integer | Rows per page. Default 100, at most 500. |
Response fields
| Field | Type | Sent | Meaning |
|---|---|---|---|
id | string | Always | The company id. On one insider's trades, usa: and the insider's CIK. |
filed_ | date | Optional | Earliest filing day this account can read. Left out when no earlier day is hidden. |
positions | list of object | Always | The latest holding of each owner in each security. |
positions[].derivative | always true | Optional | True when the row is a derivative security such as an option, warrant or convertible. |
positions[].security | string | Optional | Title of the security, as filed, for example Common Stock. |
positions[].ownership | one of D, I | Optional | D for direct ownership, I for indirect. |
positions[].nature | string | Optional | How indirect ownership is held, as filed. |
positions[].underlying | string | Optional | For a derivative, the security it turns into. |
positions[].underlying_ | string | Optional | For a derivative, how many underlying shares. |
positions[].exercise_ | string | Optional | For a derivative, the strike or conversion price. |
positions[].exercise_ | date | Optional | For a derivative, the date it can first be exercised. |
positions[].expiration_ | date | Optional | For a derivative, the date it expires. |
positions[].filing_ | string | Always | Id of the filing the row comes from. |
positions[].form | one of 3, 3/A, 4, 4/A, 5, 5/A | Always | The form the row was reported on: 3, 4 or 5, with / for an amendment. |
positions[].filed | date | Always | Day the filing was made. |
positions[].owners | list of object | Always | The reporting owners of the filing. A joint filing lists several. |
positions[].owners[].cik | string | Optional | SEC Central Index Key of the owner. |
positions[].owners[].id | string | Optional | The owner's id with its registry, for example usa:0001780525. |
positions[].owners[].name | string | Always | Name of the owner, as filed. |
positions[].owners[].title | string | Optional | Officer title or other relationship, as filed. |
positions[].owners[].director | always true | Optional | True when the owner is a director. |
positions[].owners[].officer | always true | Optional | True when the owner is an officer. |
positions[].owners[].ten_ | always true | Optional | True when the owner holds more than 10% of the shares. |
positions[].owners[].other | always true | Optional | True when the owner has another relationship to the company. |
positions[].as_ | date | Always | Date of the trade or the filing date of the holding that gives this balance. |
positions[].shares | string | Optional | Amount owned, in shares. |
positions[].value | string | Optional | Dollar value owned, when the filing reports a value instead of shares. |
positions[].currency | string | Optional | Currency of the prices and values. Left out means US dollars. |
next_ | string | Always | Pass as cursor to read the next page. Always sent; null on the last page. |
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/companies/usa:0000320193/insider-ownership?limit=1"{
"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_ takes 3, 3/, 5 or 5/, and another form is 400 invalid_.
MCP: tool filings_.
Parameters
| Parameter | Where | Required | Type | Meaning |
|---|---|---|---|---|
company_ | path | Yes | string | The company id, for example usa:0000320193. A ticker alias such as usa:AAPL is accepted. |
filed_ | query | No | date | First filing day, inclusive (YYYY-MM-DD). |
filed_ | query | No | date | Last filing day, inclusive. |
filing_ | query | No | date | Only filings made on this day. |
filing_ | query | No | date | Only filings made after this day. |
filing_ | query | No | date | Only filings made before this day. |
owner_ | query | No | string | Only filings of the owner with this CIK. Leading zeros are optional. |
name | query | No | string | Only owners whose name contains this text. Case-insensitive, 2 to 100 characters. |
form_ | query | No | one of 3, 3/A, 4, 4/A, 5, 5/A | Only statements on this form: 3, 3/, 5 or 5/. |
cursor | query | No | string | next_ of the previous page, with the same other parameters. |
limit | query | No | integer | Rows per page. Default 100, at most 500. |
Response fields
| Field | Type | Sent | Meaning |
|---|---|---|---|
id | string | Always | The company id. On one insider's trades, usa: and the insider's CIK. |
statements | list of object | Always | The statements, newest first. |
statements[].derivative | always true | Optional | True when the row is a derivative security such as an option, warrant or convertible. |
statements[].security | string | Optional | Title of the security, as filed, for example Common Stock. |
statements[].ownership | one of D, I | Optional | D for direct ownership, I for indirect. |
statements[].nature | string | Optional | How indirect ownership is held, as filed. |
statements[].underlying | string | Optional | For a derivative, the security it turns into. |
statements[].underlying_ | string | Optional | For a derivative, how many underlying shares. |
statements[].exercise_ | string | Optional | For a derivative, the strike or conversion price. |
statements[].exercise_ | date | Optional | For a derivative, the date it can first be exercised. |
statements[].expiration_ | date | Optional | For a derivative, the date it expires. |
statements[].filing_ | string | Always | Id of the filing the row comes from. |
statements[].form | one of 3, 3/A, 4, 4/A, 5, 5/A | Always | The form the row was reported on: 3, 4 or 5, with / for an amendment. |
statements[].filed | date | Always | Day the filing was made. |
statements[].owners | list of object | Always | The reporting owners of the filing. A joint filing lists several. |
statements[].owners[].cik | string | Optional | SEC Central Index Key of the owner. |
statements[].owners[].id | string | Optional | The owner's id with its registry, for example usa:0001780525. |
statements[].owners[].name | string | Always | Name of the owner, as filed. |
statements[].owners[].title | string | Optional | Officer title or other relationship, as filed. |
statements[].owners[].director | always true | Optional | True when the owner is a director. |
statements[].owners[].officer | always true | Optional | True when the owner is an officer. |
statements[].owners[].ten_ | always true | Optional | True when the owner holds more than 10% of the shares. |
statements[].owners[].other | always true | Optional | True when the owner has another relationship to the company. |
statements[].as_ | date | Always | Date of the trade or the filing date of the holding that gives this balance. |
statements[].shares | string | Optional | Amount owned, in shares. |
statements[].value | string | Optional | Dollar value owned, when the filing reports a value instead of shares. |
statements[].currency | string | Optional | Currency of the prices and values. Left out means US dollars. |
next_ | string | Always | Pass as cursor to read the next page. Always sent; null on the last page. |
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/companies/usa:0000320193/insider-ownership/statements?limit=1"{
"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_ and shares_ 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_.
Parameters
| Parameter | Where | Required | Type | Meaning |
|---|---|---|---|---|
company_ | path | Yes | string | The company id, for example usa:0000320193. A ticker alias such as usa:AAPL is accepted. |
name | query | No | string | Only owners whose name contains this text. Case-insensitive, 2 to 100 characters. |
cursor | query | No | string | next_ of the previous page, with the same other parameters. |
limit | query | No | integer | Rows per page. Default 100, at most 500. |
Response fields
| Field | Type | Sent | Meaning |
|---|---|---|---|
id | string | Always | The company id. On one insider's trades, usa: and the insider's CIK. |
insiders | list of object | Always | The insiders of the company. |
insiders[].owner_ | string | Optional | SEC Central Index Key of the insider. |
insiders[].owner_ | string | Optional | The insider's id with its registry. |
insiders[].name | string | Always | Name of the owner, as filed. |
insiders[].title | string | Optional | Officer title or other relationship, as filed. |
insiders[].director | always true | Optional | True when the owner is a director. |
insiders[].officer | always true | Optional | True when the owner is an officer. |
insiders[].ten_ | always true | Optional | True when the owner holds more than 10% of the shares. |
insiders[].other | always true | Optional | True when the owner has another relationship to the company. |
insiders[].first_ | date | Always | Day of the insider's first filing for this company. |
insiders[].last_ | date | Always | Day of the insider's newest filing for this company. |
insiders[].filing_ | integer | Always | Number of filings the insider made for this company. |
insiders[].position_ | integer | Always | Number of positions the insider reported. |
insiders[].shares_ | string | Optional | Sum of the latest balance of each plain-share position. Left out when the insider never reported a share balance. |
insiders[].shares_ | string | Optional | The part of shares_ held directly. |
insiders[].shares_ | string | Optional | The part of shares_ held indirectly. |
insiders[].ownership_ | string | Optional | shares_ 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_ | date | Optional | Date of the shares outstanding figure behind ownership_. |
next_ | string | Always | Pass as cursor to read the next page. Always sent; null on the last page. |
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/companies/usa:0000320193/insiders?limit=1"{
"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_, issuer and ticker added.
MCP: tool filings_.
Parameters
| Parameter | Where | Required | Type | Meaning |
|---|---|---|---|---|
cik | path | Yes | string | The insider's own CIK, one to ten digits. |
filed_ | query | No | date | First filing day, inclusive (YYYY-MM-DD). |
filed_ | query | No | date | Last filing day, inclusive. |
filing_ | query | No | date | Only filings made on this day. |
filing_ | query | No | date | Only filings made after this day. |
filing_ | query | No | date | Only filings made before this day. |
transaction_ | query | No | date | Only trades made on this day. |
transaction_ | query | No | date | Only trades made after this day. |
transaction_ | query | No | date | Only trades made on or after this day. |
transaction_ | query | No | date | Only trades made before this day. |
transaction_ | query | No | date | Only trades made on or before this day. |
owner_ | query | No | string | Only filings of the owner with this CIK. Leading zeros are optional. |
name | query | No | string | Only owners whose name contains this text. Case-insensitive, 2 to 100 characters. |
transaction_ | query | No | string | Only trades with this one-letter SEC transaction code, for example P or S. |
form_ | query | No | one of 3, 3/A, 4, 4/A, 5, 5/A | Only trades on this form. Trades come from Forms 4 and 5. |
sort | query | No | one of filing_date.desc, filing_date.asc, transaction_date.desc, transaction_date.asc | Order of the list. Default filing_. |
cursor | query | No | string | next_ of the previous page, with the same other parameters. |
limit | query | No | integer | Rows per page. Default 50, at most 200. |
Response fields
| Field | Type | Sent | Meaning |
|---|---|---|---|
id | string | Optional | The company id. On one insider's trades, usa: and the insider's CIK. |
filed_ | date | Optional | Earliest filing day this account can read. Left out when no earlier day is hidden. |
trades | list of object | Always | The trades, in the order asked for. |
trades[].derivative | always true | Optional | True when the row is a derivative security such as an option, warrant or convertible. |
trades[].security | string | Optional | Title of the security, as filed, for example Common Stock. |
trades[].ownership | one of D, I | Optional | D for direct ownership, I for indirect. |
trades[].nature | string | Optional | How indirect ownership is held, as filed. |
trades[].underlying | string | Optional | For a derivative, the security it turns into. |
trades[].underlying_ | string | Optional | For a derivative, how many underlying shares. |
trades[].exercise_ | string | Optional | For a derivative, the strike or conversion price. |
trades[].exercise_ | date | Optional | For a derivative, the date it can first be exercised. |
trades[].expiration_ | date | Optional | For a derivative, the date it expires. |
trades[].filing_ | string | Always | Id of the filing the row comes from. |
trades[].form | one of 3, 3/A, 4, 4/A, 5, 5/A | Always | The form the row was reported on: 3, 4 or 5, with / for an amendment. |
trades[].filed | date | Always | Day the filing was made. |
trades[].period | date | Optional | Date of the event that required the filing. |
trades[].owners | list of object | Always | The reporting owners of the filing. A joint filing lists several. |
trades[].owners[].cik | string | Optional | SEC Central Index Key of the owner. |
trades[].owners[].id | string | Optional | The owner's id with its registry, for example usa:0001780525. |
trades[].owners[].name | string | Always | Name of the owner, as filed. |
trades[].owners[].title | string | Optional | Officer title or other relationship, as filed. |
trades[].owners[].director | always true | Optional | True when the owner is a director. |
trades[].owners[].officer | always true | Optional | True when the owner is an officer. |
trades[].owners[].ten_ | always true | Optional | True when the owner holds more than 10% of the shares. |
trades[].owners[].other | always true | Optional | True when the owner has another relationship to the company. |
trades[].plan_ | always true | Optional | True when the form ticks the Rule 10b5-1 box. |
trades[].transaction_ | date | Optional | Date of the trade. |
trades[].code | string | Optional | SEC transaction code, for example P purchase, S sale, A grant, M option exercise, F tax withholding or G gift. |
trades[].acquired_ | one of A, D | Optional | A when the owner acquired shares, D when the owner disposed of them. |
trades[].shares | string | Optional | Number of shares in the trade. |
trades[].price | string | Optional | Price per share. Left out when the filing gives none. |
trades[].currency | string | Optional | Currency of the prices and values. Left out means US dollars. |
trades[].owned_ | string | Optional | Shares owned after the trade. |
trades[].equity_ | always true | Optional | True when the filer marked the trade as an equity swap or similar instrument. |
trades[].amends | string | Optional | The filing this one replaces, when it is an amendment that matched exactly one original. |
trades[].amends_ | always true | Optional | True when the amendment names an original we could not find. |
trades[].transaction_ | string | Optional | shares times price. Left out unless the filing gives both. |
trades[].shares_ | string | Optional | Shares owned before the trade. Given only when the balances on the filing's rows for that position follow one from the next. |
trades[].deemed_ | date | Optional | Date the trade was deemed executed, when the filing gives one. |
trades[].timeliness | one of E, L | Optional | E when the filer marked the report as early, L when late. |
trades[].not_ | always true | Optional | True when the filer marked the trade as not subject to Section 16. |
trades[].remarks | string | Optional | Remarks the filer wrote on the form. |
trades[].footnotes | list of string | Always | The footnotes of the row. Empty when there are none. |
trades[].company_ | string | Optional | Id of the company whose shares were traded. Sent on lists that are not about one company. |
trades[].issuer | string | Optional | Name of the company whose shares were traded. |
trades[].ticker | string | Optional | Ticker of the company. |
next_ | string | Always | Pass as cursor to read the next page. Always sent; null on the last page. |
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/insiders/0001780525/trades?limit=1"{
"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_ with filed_, or filing_. 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_.
Parameters
| Parameter | Where | Required | Type | Meaning |
|---|---|---|---|---|
filed_ | query | No | date | First filing day, inclusive (YYYY-MM-DD). |
filed_ | query | No | date | Last filing day, inclusive. |
filing_ | query | No | date | Only filings made on this day. |
filing_ | query | No | date | Only filings made after this day. |
filing_ | query | No | date | Only filings made before this day. |
transaction_ | query | No | date | Only trades made on this day. |
transaction_ | query | No | date | Only trades made after this day. |
transaction_ | query | No | date | Only trades made on or after this day. |
transaction_ | query | No | date | Only trades made before this day. |
transaction_ | query | No | date | Only trades made on or before this day. |
owner_ | query | No | string | Only filings of the owner with this CIK. Leading zeros are optional. |
name | query | No | string | Only owners whose name contains this text. Case-insensitive, 2 to 100 characters. |
transaction_ | query | No | string | Only trades with this one-letter SEC transaction code, for example P or S. |
form_ | query | No | one of 3, 3/A, 4, 4/A, 5, 5/A | Only trades on this form. Trades come from Forms 4 and 5. |
sort | query | No | one of filing_date.desc, filing_date.asc, transaction_date.desc, transaction_date.asc | Order of the list. Default filing_. |
cursor | query | No | string | next_ of the previous page, with the same other parameters. |
limit | query | No | integer | Rows per page. Default 50, at most 200. |
country | query | No | string | Three-letter country code of the registry. Left out means USA. A country the route does not cover is 404 not_covered. |
Response fields
| Field | Type | Sent | Meaning |
|---|---|---|---|
id | string | Optional | The company id. On one insider's trades, usa: and the insider's CIK. |
filed_ | date | Optional | Earliest filing day this account can read. Left out when no earlier day is hidden. |
trades | list of object | Always | The trades, in the order asked for. |
trades[].derivative | always true | Optional | True when the row is a derivative security such as an option, warrant or convertible. |
trades[].security | string | Optional | Title of the security, as filed, for example Common Stock. |
trades[].ownership | one of D, I | Optional | D for direct ownership, I for indirect. |
trades[].nature | string | Optional | How indirect ownership is held, as filed. |
trades[].underlying | string | Optional | For a derivative, the security it turns into. |
trades[].underlying_ | string | Optional | For a derivative, how many underlying shares. |
trades[].exercise_ | string | Optional | For a derivative, the strike or conversion price. |
trades[].exercise_ | date | Optional | For a derivative, the date it can first be exercised. |
trades[].expiration_ | date | Optional | For a derivative, the date it expires. |
trades[].filing_ | string | Always | Id of the filing the row comes from. |
trades[].form | one of 3, 3/A, 4, 4/A, 5, 5/A | Always | The form the row was reported on: 3, 4 or 5, with / for an amendment. |
trades[].filed | date | Always | Day the filing was made. |
trades[].period | date | Optional | Date of the event that required the filing. |
trades[].owners | list of object | Always | The reporting owners of the filing. A joint filing lists several. |
trades[].owners[].cik | string | Optional | SEC Central Index Key of the owner. |
trades[].owners[].id | string | Optional | The owner's id with its registry, for example usa:0001780525. |
trades[].owners[].name | string | Always | Name of the owner, as filed. |
trades[].owners[].title | string | Optional | Officer title or other relationship, as filed. |
trades[].owners[].director | always true | Optional | True when the owner is a director. |
trades[].owners[].officer | always true | Optional | True when the owner is an officer. |
trades[].owners[].ten_ | always true | Optional | True when the owner holds more than 10% of the shares. |
trades[].owners[].other | always true | Optional | True when the owner has another relationship to the company. |
trades[].plan_ | always true | Optional | True when the form ticks the Rule 10b5-1 box. |
trades[].transaction_ | date | Optional | Date of the trade. |
trades[].code | string | Optional | SEC transaction code, for example P purchase, S sale, A grant, M option exercise, F tax withholding or G gift. |
trades[].acquired_ | one of A, D | Optional | A when the owner acquired shares, D when the owner disposed of them. |
trades[].shares | string | Optional | Number of shares in the trade. |
trades[].price | string | Optional | Price per share. Left out when the filing gives none. |
trades[].currency | string | Optional | Currency of the prices and values. Left out means US dollars. |
trades[].owned_ | string | Optional | Shares owned after the trade. |
trades[].equity_ | always true | Optional | True when the filer marked the trade as an equity swap or similar instrument. |
trades[].amends | string | Optional | The filing this one replaces, when it is an amendment that matched exactly one original. |
trades[].amends_ | always true | Optional | True when the amendment names an original we could not find. |
trades[].transaction_ | string | Optional | shares times price. Left out unless the filing gives both. |
trades[].shares_ | string | Optional | Shares owned before the trade. Given only when the balances on the filing's rows for that position follow one from the next. |
trades[].deemed_ | date | Optional | Date the trade was deemed executed, when the filing gives one. |
trades[].timeliness | one of E, L | Optional | E when the filer marked the report as early, L when late. |
trades[].not_ | always true | Optional | True when the filer marked the trade as not subject to Section 16. |
trades[].remarks | string | Optional | Remarks the filer wrote on the form. |
trades[].footnotes | list of string | Always | The footnotes of the row. Empty when there are none. |
trades[].company_ | string | Optional | Id of the company whose shares were traded. Sent on lists that are not about one company. |
trades[].issuer | string | Optional | Name of the company whose shares were traded. |
trades[].ticker | string | Optional | Ticker of the company. |
next_ | string | Always | Pass as cursor to read the next page. Always sent; null on the last page. |
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/insider-trades?transaction_code=P&limit=1"{
"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_ the whole history can be asked for. Without it, send filed_ and filed_ no more than 7 days apart, and the totals cover the filings made in those days. A longer window is 400 invalid_.
purchaser_ and seller_ count people once for each filing. Only the first owner listed counts.
MCP: tool filings_.
Parameters
| Parameter | Where | Required | Type | Meaning |
|---|---|---|---|---|
company_ | query | No | string | Only this company. With it the whole history can be asked for. |
country | query | No | string | Three-letter country code of the registry. Left out means USA. A country the route does not cover is 404 not_covered. |
filed_ | query | No | date | First filing day, inclusive (YYYY-MM-DD). |
filed_ | query | No | date | Last filing day, inclusive. |
transaction_ | query | No | date | Only trades made on this day. |
transaction_ | query | No | date | Only trades made after this day. |
transaction_ | query | No | date | Only trades made on or after this day. |
transaction_ | query | No | date | Only trades made before this day. |
transaction_ | query | No | date | Only trades made on or before this day. |
sort | query | No | one of transaction_date.desc, transaction_date.asc | Order of the days. Default transaction_. |
cursor | query | No | string | next_ of the previous page, with the same other parameters. |
limit | query | No | integer | Days per page. Default 100, at most 1000. |
Response fields
| Field | Type | Sent | Meaning |
|---|---|---|---|
days | list of object | Always | One row for each company and day. |
days[].company_ | string | Always | Id of the company. |
days[].currency | string | Optional | Currency of the prices and values. Left out means US dollars. |
days[].issuer | string | Optional | Name of the company whose shares were traded. |
days[].ticker | string | Optional | Ticker of the company. |
days[].transaction_ | date | Always | Date of the trade. |
days[].last_ | date | Always | Day of the newest filing that adds to this day's totals. |
days[].purchase_ | integer | Always | Number of open-market purchases. |
days[].purchase_ | string | Always | Shares bought. |
days[].purchase_ | string | Optional | Dollar value of the purchases. Left out when a trade it adds up has no price. |
days[].purchaser_ | integer | Always | People who bought, counted once for each filing. |
days[].sale_ | integer | Always | Number of open-market sales. |
days[].sale_ | string | Always | Shares sold. |
days[].sale_ | string | Optional | Dollar value of the sales. Left out when a trade it adds up has no price. |
days[].seller_ | integer | Always | People who sold, counted once for each filing. |
days[].net_ | string | Always | purchase_ less sale_. |
days[].net_ | string | Optional | purchase_ less sale_. |
days[].planned_ | string | Optional | Value 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_ | string | Optional | Value of sales on forms that tick the Rule 10b5-1 box. An upper bound. Left out for filings before 1 April 2023. |
next_ | string | Always | Pass as cursor to read the next page. Always sent; null on the last page. |
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/insider-trades/activity?company_id=usa:0000320193&limit=1"{
"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_.
Parameters
This route takes no parameters.
Response fields
| Field | Type | Sent | Meaning |
|---|---|---|---|
codes | list of object | Always | The transaction codes. |
codes[].code | string | Always | The one-letter SEC transaction code. |
codes[].meaning | string | Always | What the code means. |
codes[].group | one of general, derivative, other | Always | general, derivative or other. |
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/insider-trades/transaction-codes"{
"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_. See Errors and credits for the shape and the credit headers. Failed requests are not charged.
| Code | Status | Meaning |
|---|---|---|
invalid_ | 400 | A parameter is missing, unknown, repeated or outside its range. |
invalid_ | 400 | The cursor is not one this request returned, or it comes from a different request. |
company_ | 404 | No company matches the id. |
not_ | 404 | The market, country or company is not covered yet. |
insufficient_ | 402 | Your credit balance is less than the request costs. |
company_ | 503 | The filings behind this route cannot be read right now. Try again shortly. |
Was this page helpful?