Options Data for US Stocks: End-of-Day and Historical Learn more

SEC Filings API (10-K, 10-Q, 8-K) (beta)

The SEC Filings API delivers parsed filings for US-listed companies straight from SEC EDGAR: annual reports (10-K), quarterly reports (10-Q), and material-event reports (8-K). Financial statements are extracted from XBRL into a flat, ready-to-use field set, and material events are broken down into item sections and exhibits. Filings are refreshed daily and history reaches back to 1994.

You can try these endpoints 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.

API Endpoints

MethodEndpointReturns
GET/api/sec-filings/{symbol}Filing overview: counts and latest date per form type
GET/api/sec-filings/{symbol}/10kAnnual reports (10-K) with parsed financials
GET/api/sec-filings/{symbol}/10qQuarterly reports (10-Q) with parsed financials
GET/api/sec-filings/{symbol}/8kMaterial-event reports (8-K) with item sections and exhibits

Coverage

Filings are sourced from SEC EDGAR for US-listed companies and refreshed daily, with history reaching back to 1994. Every completed filing maps to exactly one data row.

ReportFilingsCompaniesHistory
10-K annual49,000+4,400+1994 to present
10-Q quarterly147,000+4,400+1994 to present
8-K material events526,000+4,500+1994 to present

Depth per company varies: large, long-listed issuers have decades of filings, while recently listed companies have shorter histories.

Path Parameter

symbol string required
US-listed ticker, for example AAPL.US. The .US suffix is optional.

Query Parameters

api_token string required
Your EODHD API token
page[offset] integer optional
Number of rows to skip, for pagination. Applies to the list endpoints (10k, 10q, 8k). (Default: 0)
page[limit] integer optional
Number of rows per page. Applies to the list endpoints (10k, 10q, 8k). (Default: 20, Range: 1-100)

Response Envelope

Every response is a JSON object with three top-level members: data (the payload), meta (result metadata, including pagination totals on the list endpoints), and links (the next-page URL, or null on the last page). The overview endpoint is not paginated and returns empty meta and links.

{
  "data": [ ... ],
  "meta": { "total": 34, "page": { "offset": 0, "limit": 20 } },
  "links": { "next": "https://eodhd.com/api/sec-filings/AAPL.US/10q?page[offset]=20&page[limit]=20" }
}

Filing Overview

GET /api/sec-filings/{symbol} returns a per-company summary: identification fields plus a count and latest filing date for each available form type.

Request Example

https://eodhd.com/api/sec-filings/AAPL.US?api_token=YOUR_API_TOKEN
(Sign up for free to get an API token)
curl --location "https://eodhd.com/api/sec-filings/AAPL.US?api_token=YOUR_API_TOKEN&fmt=json"
(Sign up for free to get an API token)
$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => 'https://eodhd.com/api/sec-filings/AAPL.US?api_token=YOUR_API_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();
}
(Sign up for free to get an API token)
import requests

url = f'https://eodhd.com/api/sec-filings/AAPL.US?api_token=YOUR_API_TOKEN&fmt=json'
data = requests.get(url).json()

print(data)
(Sign up for free to get an API token)
library(httr)
library(jsonlite)

url <- 'https://eodhd.com/api/sec-filings/AAPL.US?api_token=YOUR_API_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")
}
(Sign up for free to get an API token)
New to coding? Our ChatGPT assistant can generate code in any language tailored to our API. Simply describe how you want to use our data, and get a working piece of code. Don’t forget to replace the API token with your own.

Try it now (it's free)!

How to use it (YouTube)

Response Example

{
  "data": {
    "ticker": "AAPL",
    "exchange": "US",
    "name": "Apple Inc.",
    "cik": "0000320193",
    "filings": {
      "10k":   { "count": 11,  "latest": "2025-10-31", "url": "https://eodhd.com/api/sec-filings/AAPL.US/10k" },
      "10q":   { "count": 34,  "latest": "2026-05-01", "url": "https://eodhd.com/api/sec-filings/AAPL.US/10q" },
      "8k":    { "count": 107, "latest": "2026-04-30", "url": "https://eodhd.com/api/sec-filings/AAPL.US/8k" },
      "form4": { "count": 597, "latest": "2026-06-17", "url": "https://eodhd.com/api/sec-filings/AAPL.US/form4" }
    }
  }
}

Response Fields

FieldTypeDescription
tickerstringCompany ticker
exchangestringExchange code, US for US listings
namestringCompany name
cikstringSEC Central Index Key, zero-padded
filingsobjectPer-form summary keyed by form type (10k, 10q, 8k, form4), each with count, latest, and url

Annual Reports (10-K)

GET /api/sec-filings/{symbol}/10k returns a paginated list of annual reports, newest first. Each entry carries filing metadata and financial-statement fields parsed from the filing XBRL. All monetary values are in the reporting currency (USD for US filers), stated in whole units. A field is null when the value is not reported or not tagged in the source filing.

Request Example

https://eodhd.com/api/sec-filings/AAPL.US/10k?api_token=YOUR_API_TOKEN
(Sign up for free to get an API token)
curl --location "https://eodhd.com/api/sec-filings/AAPL.US/10k?api_token=YOUR_API_TOKEN&fmt=json"
(Sign up for free to get an API token)
$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => 'https://eodhd.com/api/sec-filings/AAPL.US/10k?api_token=YOUR_API_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();
}
(Sign up for free to get an API token)
import requests

url = f'https://eodhd.com/api/sec-filings/AAPL.US/10k?api_token=YOUR_API_TOKEN&fmt=json'
data = requests.get(url).json()

print(data)
(Sign up for free to get an API token)
library(httr)
library(jsonlite)

url <- 'https://eodhd.com/api/sec-filings/AAPL.US/10k?api_token=YOUR_API_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")
}
(Sign up for free to get an API token)
New to coding? Our ChatGPT assistant can generate code in any language tailored to our API. Simply describe how you want to use our data, and get a working piece of code. Don’t forget to replace the API token with your own.

Try it now (it's free)!

How to use it (YouTube)

Response Example

{
  "data": [
    {
      "accession_number": "0000320193-25-000079",
      "filed_at": "2025-10-31",
      "period_of_report": "2025-09-27",
      "fiscal_year_end": "2025-09-27T00:00:00.000000Z",
      "revenue": 416161000000,
      "net_income": 112010000000,
      "eps_diluted": 7.46,
      "total_assets": 359241000000,
      "operating_cash_flow": 111482000000,
      "free_cash_flow": 98767000000
    }
  ],
  "meta": { "total": 11, "page": { "offset": 0, "limit": 20 } },
  "links": { "next": null }
}

Response Fields

Fields are grouped for readability; expand each group to see its fields.

Filing metadata
FieldTypeDescription
accession_numberstringSEC accession number of the filing
filed_atstringFiling date, YYYY-MM-DD
period_of_reportstringReporting period end date, YYYY-MM-DD
fiscal_year_endstringFiscal year end, ISO 8601 datetime
Income statement
FieldTypeDescription
revenueintegerTotal revenue
cost_of_revenueintegerCost of revenue
gross_profitintegerGross profit
research_and_developmentintegerResearch and development expense
selling_general_adminintegerSelling, general and administrative expense
operating_expensesintegerTotal operating expenses
operating_incomeintegerOperating income
interest_expenseinteger or nullInterest expense
interest_incomeinteger or nullInterest income
income_before_taxintegerPre-tax income
income_tax_expenseintegerIncome tax expense
net_incomeintegerNet income
ebitdaintegerEarnings before interest, taxes, depreciation and amortization
depreciation_amortizationintegerDepreciation and amortization
eps_basicnumberBasic earnings per share
eps_dilutednumberDiluted earnings per share
weighted_avg_shares_basicintegerWeighted average basic shares outstanding
weighted_avg_shares_dilutedintegerWeighted average diluted shares outstanding
shares_outstandingintegerShares outstanding
Balance sheet
FieldTypeDescription
cash_and_equivalentsintegerCash and cash equivalents
short_term_investmentsintegerShort-term investments
accounts_receivableintegerAccounts receivable
inventoryintegerInventory
total_current_assetsintegerTotal current assets
property_plant_equipmentintegerProperty, plant and equipment, net
goodwillinteger or nullGoodwill
intangible_assetsinteger or nullIntangible assets
total_assetsintegerTotal assets
accounts_payableintegerAccounts payable
short_term_debtintegerShort-term debt
total_current_liabilitiesintegerTotal current liabilities
long_term_debtintegerLong-term debt
total_liabilitiesintegerTotal liabilities
common_stockintegerCommon stock and additional paid-in capital
retained_earningsintegerRetained earnings, can be negative
stockholders_equityintegerStockholders equity
total_equityintegerTotal equity
Cash flow
FieldTypeDescription
operating_cash_flowintegerNet cash from operating activities
capital_expenditureintegerCapital expenditure
free_cash_flowintegerFree cash flow
investing_cash_flowintegerNet cash from investing activities
financing_cash_flowintegerNet cash from financing activities
dividends_paidintegerDividends paid
share_repurchaseintegerShare repurchases

Sign up & Get Data

Quarterly Reports (10-Q)

GET /api/sec-filings/{symbol}/10q returns a paginated list of quarterly reports, newest first. Each entry carries the same financial-statement fields as the 10-K endpoint (see the Annual Reports groups above), with two differences in the metadata block.

Request Example

https://eodhd.com/api/sec-filings/AAPL.US/10q?api_token=YOUR_API_TOKEN
(Sign up for free to get an API token)
curl --location "https://eodhd.com/api/sec-filings/AAPL.US/10q?api_token=YOUR_API_TOKEN&fmt=json"
(Sign up for free to get an API token)
$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => 'https://eodhd.com/api/sec-filings/AAPL.US/10q?api_token=YOUR_API_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();
}
(Sign up for free to get an API token)
import requests

url = f'https://eodhd.com/api/sec-filings/AAPL.US/10q?api_token=YOUR_API_TOKEN&fmt=json'
data = requests.get(url).json()

print(data)
(Sign up for free to get an API token)
library(httr)
library(jsonlite)

url <- 'https://eodhd.com/api/sec-filings/AAPL.US/10q?api_token=YOUR_API_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")
}
(Sign up for free to get an API token)
New to coding? Our ChatGPT assistant can generate code in any language tailored to our API. Simply describe how you want to use our data, and get a working piece of code. Don’t forget to replace the API token with your own.

Try it now (it's free)!

How to use it (YouTube)

Response Fields

FieldTypeDescription
fiscal_quarter_endstringQuarter end date, ISO 8601 datetime, replaces fiscal_year_end
fiscal_quarterintegerQuarter number 1 to 4, see the caveat below

fiscal_quarter is derived from the calendar quarter of period_of_report (1 = Jan-Mar, 2 = Apr-Jun, 3 = Jul-Sep, 4 = Oct-Dec). For companies whose fiscal year does not end in December, this differs from the true fiscal quarter. For example, a Microsoft 10-Q for a period ending 31 March returns fiscal_quarter 1, although it is Microsoft’s fiscal Q3. Use period_of_report together with fiscal_year_end from the 10-K when the exact fiscal quarter matters.

Material Events (8-K)

GET /api/sec-filings/{symbol}/8k returns a paginated list of 8-K material-event reports, newest first. Each 8-K lists the SEC item codes it covers, the parsed text of each item section, and any attached exhibits.

Request Example

https://eodhd.com/api/sec-filings/AAPL.US/8k?api_token=YOUR_API_TOKEN
(Sign up for free to get an API token)
curl --location "https://eodhd.com/api/sec-filings/AAPL.US/8k?api_token=YOUR_API_TOKEN&fmt=json"
(Sign up for free to get an API token)
$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => 'https://eodhd.com/api/sec-filings/AAPL.US/8k?api_token=YOUR_API_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();
}
(Sign up for free to get an API token)
import requests

url = f'https://eodhd.com/api/sec-filings/AAPL.US/8k?api_token=YOUR_API_TOKEN&fmt=json'
data = requests.get(url).json()

print(data)
(Sign up for free to get an API token)
library(httr)
library(jsonlite)

url <- 'https://eodhd.com/api/sec-filings/AAPL.US/8k?api_token=YOUR_API_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")
}
(Sign up for free to get an API token)
New to coding? Our ChatGPT assistant can generate code in any language tailored to our API. Simply describe how you want to use our data, and get a working piece of code. Don’t forget to replace the API token with your own.

Try it now (it's free)!

How to use it (YouTube)

Response Example

{
  "data": [
    {
      "accession_number": "0000320193-26-000011",
      "filed_at": "2026-04-30",
      "period_of_report": "2026-04-30",
      "items": ["2.02", "9.01"],
      "item_sections": [
        {
          "item": "2.02",
          "title": "Results of Operations and Financial Condition",
          "text": "On April 30, 2026, Apple Inc. issued a press release regarding Apple's financial results ..."
        }
      ],
      "exhibits": [
        { "number": "99.1", "description": "Press release" }
      ]
    }
  ],
  "meta": { "total": 107, "page": { "offset": 0, "limit": 20 } },
  "links": { "next": "https://eodhd.com/api/sec-filings/AAPL.US/8k?page[offset]=20&page[limit]=20" }
}

Response Fields

FieldTypeDescription
accession_numberstringSEC accession number of the filing
filed_atstringFiling date, YYYY-MM-DD
period_of_reportstringEvent or report date, YYYY-MM-DD
itemsarrayList of SEC item codes covered, for example 2.02, 9.01
item_sectionsarrayOne object per item, each with item, title, and text
exhibitsarrayOne object per exhibit, each with number and description

Common 8-K item codes:

ItemMeaning
1.01Entry into a material definitive agreement
2.02Results of operations and financial condition
5.02Departure or appointment of directors or officers
7.01Regulation FD disclosure
8.01Other events
9.01Financial statements and exhibits

Response Codes

CodeMeaning
200Success; filing data returned
401Unauthorized; missing or invalid API token
402Daily API request limit exceeded
403Plan does not include SEC filings access
404Symbol not found
422Invalid query parameters
429Too many requests; rate limit exceeded

Known Limitations

  • Coverage. US-listed companies that file with SEC EDGAR. Filing history reaches back to 1994; depth per company varies.
  • Calendar vs fiscal quarter. The fiscal_quarter field reflects the calendar quarter of period_of_report and may differ from the company’s fiscal quarter when the fiscal year does not end in December.
  • Null financial fields. Financials are parsed from XBRL, so a line item is null when it is not reported or not tagged in the source filing. This is expected for items a company does not report (for example inventory for a bank, or research and development where there is none), and is more common for older filings from before XBRL was mandated. Check for null before relying on a value.
  • 8-K exhibits and section text. The exhibits array is populated for the large majority of 8-K filings. In the rare case where item 9.01 is present but exhibits is empty, the exhibit list is still available in the text of the 9.01 item section. Some item sections that only point to an attached press release (often 2.02 or 7.01) may carry a short or empty text field, with the detail in the referenced exhibit.
  • Control characters in 8-K text. The text field of 8-K item sections is taken from the source filing and can contain raw newlines and tabs. Parse it with a lenient JSON reader.
Compare plans and find your fit
Free and paid plans for individual and commercial use
Go to Pricing
Chat