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 will need an EODHD API subscription that includes access to the Fundamental Data feed — available on Fundamentals and All-in-One plans.
Quick jump:
Important: API Update
The legacy /api/insider-transactions endpoint is now obsolete. It remains available for backward compatibility with existing integrations and continues to deliver data in the same flat schema you have today — see the Legacy Endpoint section at the bottom of this page.
Note. Historical coverage. As of May 2026, history depth is uneven across issuers and is being expanded continuously. Backfill is processed in priority order: by market capitalization for major U.S. exchanges (NYSE, NASDAQ, NYSE ARCA, NYSE MKT, AMEX, BATS), and by 5-day average trading volume elsewhere. Depth currently ranges from roughly 12 months for recently onboarded issuers up to a decade or more for the largest names (e.g., AAPL Form 4 history reaches back to April 2015). We expect substantially uniform multi-year coverage across the U.S. equities universe by June 2026.
For all new integrations we recommend the new SEC Form 4 endpoint described below. Compared to the legacy endpoint, it provides:
- Direct SEC EDGAR data — fewer data quality issues.
- Expected – up to 10+ years of historical filings for major US large-caps, compared to roughly one year on the legacy endpoint.
- Richer schema: both non-derivative transactions and derivative transactions (stock options, RSUs, warrants), plus the footnotes referenced within each filing.
- Full SEC transaction code set (15 codes) instead of a binary buy/sell indicator.
- Reporting owner CIK, relationship flags (director / officer / 10% owner), and post-transaction holdings populated on every row.
API Endpoint
https://eodhd.com/api/sec-filings/{symbol}/form4
Path Parameter
| Parameter | Required | Description |
|---|---|---|
| symbol | Yes | US ticker, e.g. AAPL or AAPL.US. Case-insensitive. The .US suffix is optional. Form 4 is filed by US-listed issuers only |
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| api_token | Yes | Your EODHD API token |
| page[offset] | No | Pagination offset, zero-based (default 0) |
| page[limit] | No | Page size, 1 to 100 (default 20) |
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 |
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%5Boffset%5D=20&page%5Blimit%5D=20"
}
}
Filing
Each entry in data 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, etc.). 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
}
| 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% or greater owner |
| is_other | boolean | True if the insider has another relationship |
| officer_title | string or null | Officer title, e.g. 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, e.g. 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 (acquired) or D (disposed) |
| shares_amount | number | Number of shares transacted |
| price_per_share | number or null | USD price per share. May be null when not applicable, e.g. 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 |
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"
}
| 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, e.g. 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 (acquired) or D (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, e.g. 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
{
"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, e.g. 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 our SEC Form 4 dataset (non-US issuer, ticker typo, or unknown share class). |
| 422 | Validation error — 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, KO, and GME have 5 to 11 years of history. Smaller mid-caps, newly added tickers, and foreign private issuers (ADRs) may currently expose less, with backfill continuing on a weekly schedule.
- Daily refresh. Data is refreshed daily from SEC EDGAR. Filings submitted to SEC 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 — 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.
The Insider Transactions Data API is a part of the Fundamental Data feed. Each request consumes 10 API calls.
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, e.g. 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.