The EODHD Insider Transactions API provides Form 4 filings — the public disclosure of stock transactions by directors, officers, and 10% owners of US-listed companies as required by Section 16 of the Securities Exchange Act. Each filing exposes non-derivative transactions (common stock), derivative transactions (stock options, RSUs, warrants), and the footnotes referenced from each row. Data is sourced directly from SEC EDGAR and refreshed on a daily schedule.
Coverage is limited to US-listed issuers that file Form 4 with the SEC.
You can try this endpoint without an account using the demo API token (api_token=demo). For SEC filings the demo token is limited to three tickers: AAPL.US, TSLA.US, and AMZN.US.
The legacy /api/insider-transactions endpoint is obsolete. It remains available for backward compatibility and still returns the same flat schema (see the Legacy Endpoint section at the end of this page). For all new integrations, use the SEC Form 4 endpoint described below.
Coverage
Form 4 filings are sourced from SEC EDGAR and refreshed daily, with history reaching back to 2000.
| Metric | Value |
|---|---|
| Filings | 1,470,000+ |
| Issuers | 4,800+ |
| History | 2000 to present |
| Non-derivative transactions | 2.4 million+ |
| Derivative transactions | 889,000+ |
Nearly all filings, about 99.6 percent, include at least one transaction. The small remainder are holdings-only or amendment filings, which is normal. Depth per issuer varies: major US large-caps have a decade or more of history, while recently listed names have less.
Compared with the legacy endpoint, the SEC Form 4 endpoint provides direct SEC EDGAR data with fewer data-quality issues, up to a decade or more of history for major issuers, both non-derivative and derivative transactions with footnotes, the full SEC transaction code set, and reporting-owner CIK, relationship flags, and post-transaction holdings on every row.
API Endpoint
GET https://eodhd.com/api/sec-filings/{symbol}/form4
Path Parameter
symbol
string
required
Query Parameters
api_token
string
required
page[offset]
integer
optional
page[limit]
integer
optional
Transaction Codes
The transaction_code field uses the SEC Section 16 reporting codes. Both non-derivative and derivative transactions share the same code set:
| Code | Description |
|---|---|
| P | Open-market or private purchase of non-derivative or derivative security |
| S | Open-market or private sale of non-derivative or derivative security |
| A | Grant, award, or other acquisition under an equity-based compensation plan |
| D | Disposition to the issuer of securities under an equity-based compensation plan |
| F | Payment of exercise price or tax liability by delivering or withholding shares |
| M | Exercise or conversion of derivative security received under an equity-based compensation plan |
| G | Bona fide gift |
| V | Voluntarily reported transaction otherwise not required to be reported |
| J | Other acquisition or disposition (described in a footnote) |
| L | Small acquisition under SEC Rule 16a-6 |
| C | Conversion of derivative security |
| E | Expiration of short derivative position |
| H | Expiration of long derivative position with value received |
| O | Exercise of out-of-the-money derivative security |
| X | Exercise of in-the-money or at-the-money derivative security |
| I | Discretionary transaction under Rule 16b-3(f) resulting in an acquisition or disposition of issuer securities |
| U | Disposition pursuant to a tender of shares in a change-of-control transaction |
| W | Acquisition or disposition by will or the laws of descent and distribution |
| Z | Deposit into or withdrawal from a voting trust |
| K | Transaction in an equity swap or instrument with similar characteristics |
Request Example
https://eodhd.com/api/sec-filings/AAPL/form4?api_token=YOUR_TOKEN
curl --location "https://eodhd.com/api/sec-filings/AAPL/form4?api_token=YOUR_TOKEN&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/sec-filings/AAPL/form4?api_token=YOUR_TOKEN&fmt=json',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$data = curl_exec($curl);
curl_close($curl);
try {
$data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
var_dump($data);
} catch (Exception $e) {
echo 'Error. '.$e->getMessage();
}
import requests
url = f'https://eodhd.com/api/sec-filings/AAPL/form4?api_token=YOUR_TOKEN&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/sec-filings/AAPL/form4?api_token=YOUR_TOKEN&fmt=json'
response <- GET(url)
if (http_type(response) == "application/json") {
content <- content(response, "text", encoding = "UTF-8")
cat(content)
} else {
cat("Error while receiving data\n")
}
Try it now (it's free)!
How to use it (YouTube)
Response Format
The response envelope contains a data array of Form 4 filings sorted by filed_at in descending order, a meta object with pagination info, and a links object for forward navigation. Only links.next is exposed; clients walk pages forward until it becomes null.
{
"data": [ /* Form 4 filings */ ],
"meta": {
"total": 594,
"page": { "offset": 0, "limit": 20 }
},
"links": {
"next": "https://eodhd.com/api/sec-filings/AAPL.US/form4?page[offset]=20&page[limit]=20"
}
}
Filing
Each entry in the data array represents one Form 4 submission:
{
"accession_number": "0001104659-26-062860",
"filed_at": "2026-05-15",
"period_of_report": "2026-05-13",
"non_derivative": [ /* non-derivative transactions */ ],
"derivative": [ /* derivative transactions */ ],
"footnotes": [ /* footnotes referenced from transaction rows */ ]
}
| Field | Type | Description |
|---|---|---|
| accession_number | string | SEC accession number, unique identifier of the filing |
| filed_at | string (date) | Date the filing was submitted to SEC, YYYY-MM-DD |
| period_of_report | string (date) | Reporting period, YYYY-MM-DD |
| non_derivative | array | Direct stock transactions (Common Stock, Class A/B/C, and similar). May be empty when the filing reports only derivative activity |
| derivative | array | Derivative transactions (stock options, RSUs, warrants) |
| footnotes | array | Footnotes referenced from transaction rows |
Non-Derivative Transaction
{
"reporting_owner_cik": "0001771340",
"reporting_owner_name": "Taneja Vaibhav",
"is_director": false,
"is_officer": true,
"is_ten_percent_owner": false,
"is_other": false,
"officer_title": "Chief Financial Officer",
"other_text": null,
"security_title": "Common Stock",
"transaction_date": "2026-05-13T00:00:00+00:00",
"transaction_code": "S",
"acquired_or_disposed": "D",
"shares_amount": 3000,
"price_per_share": 450,
"shares_owned_after": 18106.5,
"total_value": 1350000,
"footnote_ids": ["F1"],
"footnote_refs": { "shares_owned_after": ["F1"] }
}
| Field | Type | Description |
|---|---|---|
| reporting_owner_cik | string | SEC CIK of the insider |
| reporting_owner_name | string | Full name of the insider |
| is_director | boolean | True if the insider is a board director |
| is_officer | boolean | True if the insider is a company officer |
| is_ten_percent_owner | boolean | True if the insider is a 10 percent or greater owner |
| is_other | boolean | True if the insider has another relationship |
| officer_title | string or null | Officer title, for example Chief Executive Officer. Null when is_officer is false |
| other_text | string or null | Description of the other relationship, when is_other is true |
| security_title | string | Security name, for example Common Stock, Class A Common Stock |
| transaction_date | string (datetime) | ISO 8601 datetime of the transaction |
| transaction_code | string | SEC transaction code (see Transaction Codes section above) |
| acquired_or_disposed | string | A for acquired or D for disposed |
| shares_amount | number | Number of shares transacted |
| price_per_share | number or null | USD price per share. May be null when not applicable, for example gifts |
| shares_owned_after | number | Total shares owned by this insider after the transaction |
| total_value | number or null | Computed shares times price. Null when price is unavailable or implausible |
| footnote_ids | array | Identifiers of all footnotes that apply to this row, for example [“F3”]. Resolve each against the footnotes array. Empty when the row has none |
| footnote_refs | object | Maps a field name to the footnote ids that annotate that specific field, for example {“security_title”: [“F3”]} |
Derivative Transaction
{
"reporting_owner_cik": "0001771340",
"reporting_owner_name": "Taneja Vaibhav",
"security_title": "Non-Qualified Stock Option (right to buy)",
"conversion_or_exercise_price": 18.44,
"transaction_date": "2026-05-13T00:00:00+00:00",
"transaction_code": "M",
"acquired_or_disposed": "D",
"shares_amount": 1000,
"price_per_share": 0,
"shares_owned_after": 2390,
"underlying_security_title": "Common Stock",
"underlying_shares": 1000,
"exercise_date": null,
"expiration_date": "2028-10-16T00:00:00+00:00",
"footnote_ids": ["F1"],
"footnote_refs": { "conversion_or_exercise_price": ["F1"] }
}
| Field | Type | Description |
|---|---|---|
| reporting_owner_cik | string | SEC CIK of the insider |
| reporting_owner_name | string | Full name of the insider |
| security_title | string | Derivative security name, for example Non-Qualified Stock Option |
| conversion_or_exercise_price | number or null | Exercise or conversion price, USD |
| transaction_date | string (datetime) | ISO 8601 datetime of the transaction |
| transaction_code | string | SEC transaction code |
| acquired_or_disposed | string | A for acquired or D for disposed |
| shares_amount | number | Number of derivative units transacted |
| price_per_share | number or null | USD price per derivative unit |
| shares_owned_after | number | Total derivative units held after the transaction |
| underlying_security_title | string or null | Underlying security, for example Common Stock |
| underlying_shares | number or null | Number of underlying shares the derivative converts to |
| exercise_date | string (datetime) or null | Date the derivative becomes exercisable |
| expiration_date | string (datetime) or null | Expiration date of the derivative |
| footnote_ids | array | Identifiers of all footnotes that apply to this row, for example [“F1”]. Resolve each against the footnotes array. Empty when the row has none |
| footnote_refs | object | Maps a field name to the footnote ids that annotate that specific field, for example {“conversion_or_exercise_price”: [“F1”]} |
Footnote
{
"footnote_id": "F1",
"text": "The transactions reported on this Form 4 were effected pursuant to a Rule 10b5-1 trading plan adopted by the reporting person on November 17, 2025."
}
| Field | Type | Description |
|---|---|---|
| footnote_id | string | Identifier referenced from transaction rows, for example F1, F2 |
| text | string | Footnote text |
Response Codes
| Code | Meaning |
|---|---|
| 200 | Success. Response includes data, meta, and links |
| 401 | Missing or invalid api_token |
| 403 | Plan does not include access to this endpoint |
| 404 | Symbol not found in the SEC Form 4 dataset (non-US issuer, ticker typo, or unknown share class) |
| 422 | Validation error, for example page[limit] greater than 100, page[offset] negative, or page passed as a scalar instead of an array |
| 429 | Rate limit exceeded |
Known Limitations
- US-only. Form 4 is filed by US-listed issuers. Non-US issuers without US listings return 404.
- History depth varies by ticker. Major US large-caps such as AAPL, MSFT, NVDA, and KO have a decade or more of history back to 2000. Recently listed names and smaller issuers may expose less.
- Daily refresh. Data is refreshed daily from SEC EDGAR. Filings submitted during the current trading day appear in the API on the same or next day.
- Earnings-driven activity. Insider transactions cluster around earnings releases. The absence of new filings during the 4 to 6 weeks before each earnings report is expected, as insiders are typically subject to blackout periods under their company’s trading policy.
- Forward-only pagination. The API exposes only links.next. To reach a specific page, increment page[offset] directly using the value from meta.total.
Legacy Endpoint (Obsolete)
/api/insider-transactions — flat-schema legacy endpoint, kept for backward compatibility
This endpoint is maintained for backward compatibility with existing integrations. For new integrations we recommend the SEC Form 4 endpoint described above.
https://eodhd.com/api/insider-transactions?api_token=YOUR_TOKEN&fmt=json
curl --location "https://eodhd.com/api/insider-transactions?api_token=YOUR_TOKEN&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/insider-transactions?api_token=YOUR_TOKEN&fmt=json',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$data = curl_exec($curl);
curl_close($curl);
try {
$data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
var_dump($data);
} catch (Exception $e) {
echo 'Error. '.$e->getMessage();
}
import requests
url = f'https://eodhd.com/api/insider-transactions?api_token=YOUR_TOKEN&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/insider-transactions?api_token=YOUR_TOKEN&fmt=json'
response <- GET(url)
if (http_type(response) == "application/json") {
content <- content(response, "text", encoding = "UTF-8")
cat(content)
} else {
cat("Error while receiving data\n")
}
Try it now (it's free)!
How to use it (YouTube)
Parameters
| Parameter | Required | Description |
|---|---|---|
| api_token | Yes | Your EODHD API token |
| code | No | Ticker, for example AAPL or AAPL.US. By default, all symbols are returned |
| from | No | Start date, YYYY-MM-DD. Default: one year ago |
| to | No | End date, YYYY-MM-DD. Default: current date |
| limit | No | Number of entries per result, 1 to 1000. Default 100 |
| fmt | No | Response format. json is supported |
Example
An example of past insider transactions for AAPL:

The legacy endpoint exposes two transaction codes: P for purchase of securities on an exchange or from another person, and S for sale of securities on an exchange or to another person.