The SEC Company Analytics API turns raw SEC EDGAR filings into ready-to-use company financials and metrics: full annual and quarterly statements, financial ratios, growth rates, trailing-twelve-month aggregates, a one-call snapshot, and revenue segments — plus a directory of covered companies. Everything is computed from the same parsed 10-K and 10-Q filings that power the SEC Filings API, so the numbers trace straight back to the source documents. If you are looking for standardized, multi-source company fundamentals, see the Fundamentals API; this endpoint is the SEC-EDGAR-native view of the same kind of data.
You can try these endpoints without an account using the demo API token (api_token=demo). For SEC data the demo token is limited to three tickers: AAPL.US, TSLA.US, and AMZN.US.
Coverage
Analytics cover roughly 5,900 US-listed companies that file with SEC EDGAR, refreshed daily as new filings are parsed. Financial history follows the underlying filings, which for large, frequently reporting issuers currently start between 2015 and 2020. Every metric is derived from a company’s own 10-K and 10-Q filings — there is no third-party estimate or vendor blend.
API Endpoints
| Method | Endpoint | Returns |
|---|---|---|
| GET | /api/sec-companies | Directory of covered companies (paginated) |
| GET | /api/sec-companies/{symbol}/financials | Annual and quarterly financial statements |
| GET | /api/sec-companies/{symbol}/ratios | Financial ratios per period |
| GET | /api/sec-companies/{symbol}/growth | Year-over-year growth rates per period |
| GET | /api/sec-companies/{symbol}/ttm | Trailing-twelve-month aggregates |
| GET | /api/sec-companies/{symbol}/snapshot | Combined latest annual, ratios, growth, and TTM |
| GET | /api/sec-companies/{symbol}/segments | Revenue by business segment |
Path Parameter
symbol
string
required
Query Parameters
api_token
string
required
page[offset]
integer
optional
page[limit]
integer
optional
years
integer
optional
axis
enum
optional
Response Envelope
Every response is a JSON object with data, meta, and links. The directory endpoint returns data as an array with pagination in meta and links. The per-company endpoints return data as an object that always includes a company block (cik, name, ticker, exchange) alongside the requested payload.
Company Directory
GET /api/sec-companies returns a paginated list of every company covered, with its SEC identifiers and ticker aliases. Useful for discovery and for mapping a CIK to its tickers.
Request Example
https://eodhd.com/api/sec-companies?api_token=YOUR_API_TOKEN
curl --location "https://eodhd.com/api/sec-companies?api_token=YOUR_API_TOKEN&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/sec-companies?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();
}
import requests
url = f'https://eodhd.com/api/sec-companies?api_token=YOUR_API_TOKEN&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/sec-companies?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")
}
Try it now (it's free)!
How to use it (YouTube)
Response Example
{
"data": [
{
"cik": "0001084869",
"name": "1-800-FLOWERS.COM, Inc.",
"ticker": "FLWS",
"exchange": "US",
"sic_code": "5990",
"state_of_incorporation": "DE",
"fiscal_year_end": "0630",
"tickers": [ { "ticker": "FLWS", "exchange": "US", "is_primary": true } ]
}
],
"meta": { "total": 5939, "page": { "offset": 0, "limit": 20 } },
"links": { "next": "https://eodhd.com/api/sec-companies?page[offset]=20&page[limit]=20" }
}
Response Fields
| Field | Type | Description |
|---|---|---|
| cik | string | SEC Central Index Key, zero-padded |
| name | string | Company name |
| ticker | string | Primary ticker |
| exchange | string | Exchange code, US for US listings |
| sic_code | string | SEC Standard Industrial Classification code |
| state_of_incorporation | string | State or country of incorporation |
| fiscal_year_end | string | Fiscal year end as MMDD, for example 0630 |
| tickers | array | All ticker aliases for the CIK, each with ticker, exchange, and is_primary |
Financials
GET /api/sec-companies/{symbol}/financials returns the full annual and quarterly statement history for a company. Each row carries the same financial fields as the SEC Filings API 10-K and 10-Q endpoints (revenue, income, EPS, balance sheet, and cash flow), keyed by reporting period.
Request Example
https://eodhd.com/api/sec-companies/AAPL.US/financials?api_token=YOUR_API_TOKEN
curl --location "https://eodhd.com/api/sec-companies/AAPL.US/financials?api_token=YOUR_API_TOKEN&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/sec-companies/AAPL.US/financials?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();
}
import requests
url = f'https://eodhd.com/api/sec-companies/AAPL.US/financials?api_token=YOUR_API_TOKEN&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/sec-companies/AAPL.US/financials?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")
}
Try it now (it's free)!
How to use it (YouTube)
Response Example
{
"data": {
"company": { "cik": "0000320193", "name": "Apple Inc.", "ticker": "AAPL", "exchange": "US" },
"annual": [
{ "period": "2025-09-27", "revenue": 416161000000, "net_income": 112010000000, "eps_diluted": 7.46, "free_cash_flow": 98767000000 }
],
"quarterly": [
{ "period": "2026-03-28", "revenue": 254940000000, "net_income": 71675000000, "eps_diluted": 4.85 }
]
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
| company | object | Company identifiers (cik, name, ticker, exchange) |
| annual | array | Annual statements, newest first. Each row uses the SEC Filings 10-K field set, keyed by period |
| quarterly | array | Quarterly statements, newest first. Each row uses the SEC Filings 10-Q field set, keyed by period |
Ratios
GET /api/sec-companies/{symbol}/ratios returns financial ratios computed per reporting period, newest first. Use the years parameter to limit how many periods are returned.
Request Example
https://eodhd.com/api/sec-companies/AAPL.US/ratios?api_token=YOUR_API_TOKEN
curl --location "https://eodhd.com/api/sec-companies/AAPL.US/ratios?api_token=YOUR_API_TOKEN&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/sec-companies/AAPL.US/ratios?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();
}
import requests
url = f'https://eodhd.com/api/sec-companies/AAPL.US/ratios?api_token=YOUR_API_TOKEN&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/sec-companies/AAPL.US/ratios?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")
}
Try it now (it's free)!
How to use it (YouTube)
Response Example
{
"data": {
"company": { "cik": "0000320193", "name": "Apple Inc.", "ticker": "AAPL", "exchange": "US" },
"ratios": [
{
"period": "2025-09-27",
"gross_margin": 0.4691, "operating_margin": 0.3197, "net_margin": 0.2692,
"roa": 0.3118, "roe": 1.5191, "ebitda_margin": 0.3478,
"current_ratio": 0.8933, "quick_ratio": 0.8588, "debt_to_equity": 3.8722,
"working_capital": -17674000000, "tangible_book_value": 73733000000, "net_debt": 42394000000
}
]
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
| period | string | Reporting period end date, YYYY-MM-DD |
| gross_margin | number or null | Gross profit divided by revenue |
| operating_margin | number or null | Operating income divided by revenue |
| net_margin | number or null | Net income divided by revenue |
| roa | number or null | Return on assets |
| roe | number or null | Return on equity |
| ebitda_margin | number or null | EBITDA divided by revenue |
| current_ratio | number or null | Current assets divided by current liabilities |
| quick_ratio | number or null | Quick assets divided by current liabilities |
| debt_to_equity | number or null | Total liabilities divided by equity |
| working_capital | integer or null | Current assets minus current liabilities |
| tangible_book_value | integer or null | Equity minus goodwill and intangibles |
| net_debt | integer or null | Total debt minus cash and equivalents |
Growth
GET /api/sec-companies/{symbol}/growth returns year-over-year growth rates per period, newest first. A period needs a prior-year comparison to produce values, so the earliest year in a company’s history returns nulls. The years parameter limits the number of periods.
Request Example
https://eodhd.com/api/sec-companies/AAPL.US/growth?api_token=YOUR_API_TOKEN
curl --location "https://eodhd.com/api/sec-companies/AAPL.US/growth?api_token=YOUR_API_TOKEN&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/sec-companies/AAPL.US/growth?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();
}
import requests
url = f'https://eodhd.com/api/sec-companies/AAPL.US/growth?api_token=YOUR_API_TOKEN&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/sec-companies/AAPL.US/growth?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")
}
Try it now (it's free)!
How to use it (YouTube)
Response Fields
| Field | Type | Description |
|---|---|---|
| period | string | Reporting period end date, YYYY-MM-DD |
| revenue_growth | number or null | Year-over-year revenue growth |
| net_income_growth | number or null | Year-over-year net income growth |
| operating_income_growth | number or null | Year-over-year operating income growth |
| total_assets_growth | number or null | Year-over-year total assets growth |
| eps_diluted_growth | number or null | Year-over-year diluted EPS growth |
| operating_cash_flow_growth | number or null | Year-over-year operating cash flow growth |
| free_cash_flow_growth | number or null | Year-over-year free cash flow growth |
Trailing Twelve Months
GET /api/sec-companies/{symbol}/ttm returns a single object of trailing-twelve-month aggregates, summing the last four quarters for flow items and taking the latest value for balance-sheet items.
Request Example
https://eodhd.com/api/sec-companies/AAPL.US/ttm?api_token=YOUR_API_TOKEN
curl --location "https://eodhd.com/api/sec-companies/AAPL.US/ttm?api_token=YOUR_API_TOKEN&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/sec-companies/AAPL.US/ttm?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();
}
import requests
url = f'https://eodhd.com/api/sec-companies/AAPL.US/ttm?api_token=YOUR_API_TOKEN&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/sec-companies/AAPL.US/ttm?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")
}
Try it now (it's free)!
How to use it (YouTube)
Response Fields
TTM fields
| Field | Type | Description |
|---|---|---|
| revenue | integer or null | Trailing-twelve-month revenue |
| net_income | integer or null | Trailing-twelve-month net income |
| operating_income | integer or null | Trailing-twelve-month operating income |
| cost_of_revenue | integer or null | Trailing-twelve-month cost of revenue |
| gross_profit | integer or null | Trailing-twelve-month gross profit |
| operating_cash_flow | integer or null | Trailing-twelve-month operating cash flow |
| free_cash_flow | integer or null | Trailing-twelve-month free cash flow |
| capital_expenditure | integer or null | Trailing-twelve-month capital expenditure |
| interest_expense | integer or null | Trailing-twelve-month interest expense |
| income_tax_expense | integer or null | Trailing-twelve-month income tax expense |
| depreciation_amortization | integer or null | Trailing-twelve-month depreciation and amortization |
| dividends_paid | integer or null | Trailing-twelve-month dividends paid |
| share_repurchase | integer or null | Trailing-twelve-month share repurchases |
| total_assets | integer or null | Latest total assets |
| total_liabilities | integer or null | Latest total liabilities |
| stockholders_equity | integer or null | Latest stockholders equity |
| total_current_assets | integer or null | Latest total current assets |
| total_current_liabilities | integer or null | Latest total current liabilities |
| cash_and_equivalents | integer or null | Latest cash and equivalents |
| long_term_debt | integer or null | Latest long-term debt |
| total_equity | integer or null | Latest total equity |
| accounts_receivable | integer or null | Latest accounts receivable |
| inventory | integer or null | Latest inventory |
| goodwill | integer or null | Latest goodwill |
Snapshot
GET /api/sec-companies/{symbol}/snapshot bundles the most useful views into one call: the latest annual statement, the latest ratios and growth, and the TTM aggregates. Ideal for a company profile page where you want everything in a single request.
Request Example
https://eodhd.com/api/sec-companies/AAPL.US/snapshot?api_token=YOUR_API_TOKEN
curl --location "https://eodhd.com/api/sec-companies/AAPL.US/snapshot?api_token=YOUR_API_TOKEN&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/sec-companies/AAPL.US/snapshot?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();
}
import requests
url = f'https://eodhd.com/api/sec-companies/AAPL.US/snapshot?api_token=YOUR_API_TOKEN&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/sec-companies/AAPL.US/snapshot?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")
}
Try it now (it's free)!
How to use it (YouTube)
Response Fields
| Field | Type | Description |
|---|---|---|
| company | object | Company identifiers |
| latest_annual | object | Most recent annual statement (SEC Filings 10-K field set) |
| ratios | object | Ratios for the latest period (see Ratios) |
| growth | object | Growth for the latest period (see Growth) |
| ttm | object | Trailing-twelve-month aggregates (see Trailing Twelve Months) |
Segments
GET /api/sec-companies/{symbol}/segments returns revenue broken down by business segment, as disclosed in the filing XBRL. Use the axis parameter to filter by dimension.
Request Example
https://eodhd.com/api/sec-companies/AAPL.US/segments?api_token=YOUR_API_TOKEN
curl --location "https://eodhd.com/api/sec-companies/AAPL.US/segments?api_token=YOUR_API_TOKEN&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/sec-companies/AAPL.US/segments?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();
}
import requests
url = f'https://eodhd.com/api/sec-companies/AAPL.US/segments?api_token=YOUR_API_TOKEN&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/sec-companies/AAPL.US/segments?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")
}
Try it now (it's free)!
How to use it (YouTube)
Response Example
{
"data": [
{
"axis": "Geographic",
"member": "CN",
"concept": "RevenueFromContractWithCustomerExcludingAssessedTax",
"value": 64377000000,
"unit": "USD",
"period_end": "2025-09-27"
}
]
}
Response Fields
| Field | Type | Description |
|---|---|---|
| axis | string | Segment dimension, for example Geographic or ProductOrService |
| member | string | Segment member within the axis, for example a country code or product line |
| concept | string | The reported XBRL concept, typically a revenue concept |
| value | integer | Reported value for the segment |
| unit | string | Value unit, typically USD |
| period_end | string | Reporting period end date, YYYY-MM-DD |
Response Codes
| Code | Meaning |
|---|---|
| 200 | Success; data returned |
| 401 | Unauthorized; missing or invalid API token |
| 402 | Daily API request limit exceeded |
| 403 | Plan does not include SEC data access |
| 404 | Symbol not found |
| 422 | Invalid query parameters |
| 429 | Too many requests; rate limit exceeded |
Known Limitations
- Derived from filings. Every metric comes from a company’s own 10-K and 10-Q filings. When a source line item is not reported, dependent ratios and aggregates are null rather than estimated.
- Industry-specific ratios. Some ratios do not apply to every business. Banks and other financial firms, for example, do not report a classified balance sheet, so current ratio, quick ratio, and working capital are null for them; gross margin is null where a company does not report gross profit.
- Growth needs a prior year. Year-over-year growth is null for the earliest period in a company’s history, since there is no comparison period.
- Segments are as-disclosed. Segment rows exist only when the company discloses segment revenue in its XBRL. Single-segment filers return no segment rows.
Related APIs
- SEC Filings API — the raw 10-K, 10-Q, and 8-K filings these analytics are built on.
- Fundamentals API — standardized company fundamentals across global markets.
- Insider Transactions API — SEC Form 4 insider buys and sells for the same companies.