Endpoints
/v1/financial-statements
https://secfeedapi.com/v1/financial-statementsIncome statement, balance sheet, cash flow (totals) for the latest n 10-K or 10-Q.
| Parameter | Type | Description | Example |
|---|---|---|---|
ticker | string | Company ticker. Pass ticker or cik. | NVDA |
cik | integer | Company CIK. Pass ticker or cik. | 1045810 |
formType | string | Which filings to read: 10-K or 10-Q. Default 10-K. | 10-Q |
n | integer | How many of the latest filings of that form to return. Default 1. | 2 |
- Returns a JSON array, newest filing first.
- Values are strings exactly as tagged; convert with the unitRef and decimals you need.
- A concept can list the same fact more than once when the filing tags it in several places; deduplicate on value and period.
- An unknown formType returns an empty array, not an error.
/v1/financial-statements/xlsx
https://secfeedapi.com/v1/financial-statements/xlsxOne filing's statements as an Excel workbook: a sheet per statement, periods as columns.
| Parameter | Type | Description | Example |
|---|---|---|---|
accessionNorequired | string | Filing to export. | 0000320193-26-000020 |
cik | integer | Filer CIK, recommended so the filing is found directly. | 320193 |
- Returns an .xlsx workbook with one sheet per statement, concepts as rows and periods as columns.
- Numeric facts are written as numbers; text facts are cut to 300 characters.
Request examples
Every response below is real output from the API, trimmed to the first records.
Latest annual statements
One 10-K with the income statement, balance sheet, cash flows, equity statement and cover page.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/financial-statements?ticker=NVDA&formType=10-K"
import os, requests
r = requests.get(
"https://secfeedapi.com/v1/financial-statements",
params={'ticker': 'NVDA', 'formType': '10-K'},
headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
timeout=60,
)
r.raise_for_status()
print(r.json())[
{
"accessionNo": "0001045810-26-000021",
"StatementsOfIncome": {
"Revenues": [
{
"value": "215938000000",
"period": {
"startDate": "2025-01-27",
"endDate": "2026-01-25"
},
"unitRef": "usd",
"decimals": "-6"
},
{
"value": "130497000000",
"period": {
"startDate": "2024-01-29",
"endDate": "2025-01-26"
},
"unitRef": "usd",
"decimals": "-6"
}
],
"CostOfRevenue": [
{
"value": "62475000000",
"period": {
"startDate": "2025-01-27",
"endDate": "2026-01-25"
},
"unitRef": "usd",
"decimals": "-6"
},
{
"value": "32639000000",
"period": {
"startDate": "2024-01-29",
"endDate": "2025-01-26"
},
"unitRef": "usd",
"decimals": "-6"
}
],
"GrossProfit": [
{
"value": "153463000000",
"period": {
"startDate": "2025-01-27",
"endDate": "2026-01-25"
},
"unitRef": "usd",
"decimals": "-6"
},
{
"value": "97858000000",
"period": {
"startDate": "2024-01-29",
"endDate": "2025-01-26"
},
...The last two quarters
n sets how many recent filings you get. Each 10-Q includes the quarter and year to date periods.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/financial-statements?ticker=AAPL&formType=10-Q&n=2"
import os, requests
r = requests.get(
"https://secfeedapi.com/v1/financial-statements",
params={'ticker': 'AAPL', 'formType': '10-Q', 'n': '2'},
headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
timeout=60,
)
r.raise_for_status()
print(r.json())[
{
"accessionNo": "0000320193-26-000020",
"StatementsOfIncome": {
"RevenueFromContractWithCustomerExcludingAssessedTax": [
{
"value": "109417000000",
"period": {
"startDate": "2026-03-29",
"endDate": "2026-06-27"
},
"unitRef": "usd",
"decimals": "-6"
},
{
"value": "94036000000",
"period": {
"startDate": "2025-03-30",
"endDate": "2025-06-28"
},
"unitRef": "usd",
"decimals": "-6"
}
],
"CostOfGoodsAndServicesSold": [
{
"value": "54647000000",
"period": {
"startDate": "2026-03-29",
"endDate": "2026-06-27"
},
"unitRef": "usd",
"decimals": "-6"
},
{
"value": "50318000000",
"period": {
"startDate": "2025-03-30",
"endDate": "2025-06-28"
},
"unitRef": "usd",
"decimals": "-6"
}
],
"GrossProfit": [
{
"value": "54770000000",
"period": {
"startDate": "2026-03-29",
"endDate": "2026-06-27"
},
"unitRef": "usd",
"decimals": "-6"
},
{
"value": "43718000000",
"period": {
"startDate": "2025-03-30",
"endDate": "2025-06-28"
},
...Statements of a company by CIK
Use cik when you have it, for example from a filing search, to skip the ticker lookup.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/financial-statements?cik=789019&formType=10-K"
import os, requests
r = requests.get(
"https://secfeedapi.com/v1/financial-statements",
params={'cik': '789019', 'formType': '10-K'},
headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
timeout=60,
)
r.raise_for_status()
print(r.json())[
{
"accessionNo": "0001193125-26-323660"
}
]Response fields
| Field | Type | Meaning |
|---|---|---|
[] | array | One entry per filing, newest first. |
[].accessionNo | string | Filing the statements come from. |
[].StatementsOfIncome | object | Income statement: each key is an XBRL concept name, each value a list of facts. |
[].StatementsOfComprehensiveIncome | object | Comprehensive income statement, same shape. |
[].BalanceSheets | object | Balance sheet, same shape. Facts use period.instant. |
[].StatementsOfCashFlows | object | Cash flow statement, same shape. |
[].StatementsOfShareholdersEquity | object | Statement of shareholders' equity, same shape. |
[].CoverPage | object | Cover page data: DocumentType, DocumentPeriodEndDate, EntityRegistrantName and more. |
[].<statement>.<Concept>[] | array | Facts for one concept, for example Revenues or AssetsCurrent. Company extension concepts carry a prefix such as nvda_. |
[].<statement>.<Concept>[].value | string | Reported value as a string, in the unit given by unitRef. |
[].<statement>.<Concept>[].period.startDate | string | Start of a duration period. |
[].<statement>.<Concept>[].period.endDate | string | End of a duration period. |
[].<statement>.<Concept>[].period.instant | string | Date of a point in time value (balance sheet). |
[].<statement>.<Concept>[].unitRef | string | Unit, for example usd or shares. Absent on text facts. |
[].<statement>.<Concept>[].decimals | string | XBRL precision, -6 means rounded to millions. |
Statement keys
| Key | Statement |
|---|---|
| StatementsOfIncome | Income statement |
| StatementsOfComprehensiveIncome | Comprehensive income |
| BalanceSheets | Balance sheet |
| StatementsOfCashFlows | Cash flow statement |
| StatementsOfShareholdersEquity | Shareholders' equity |
| CoverPage | Document and entity information |
How to
How do I get revenue for the latest fiscal year?
Read StatementsOfIncome from the latest 10-K and take the fact whose period ends on DocumentPeriodEndDate. Companies tag revenue as Revenues or RevenueFromContractWithCustomerExcludingAssessedTax.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/financial-statements?ticker=NVDA&formType=10-K"
How do I compare the last two quarters?
Ask for n=2 10-Q filings and line up the same concept by period.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/financial-statements?ticker=AAPL&formType=10-Q&n=2"
How do I tell quarter values from year to date values in a 10-Q?
Compare period.startDate and period.endDate: a three month span is the quarter, a longer span is year to date.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/financial-statements?ticker=AAPL&formType=10-Q"
How do I read balance sheet values?
Balance sheet facts use period.instant instead of a start and end date. The latest instant is the reporting date.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/financial-statements?ticker=NVDA&formType=10-K"
How do I convert a value to a number?
value is a string. Parse it as a decimal; decimals tells you the rounding the company used, not a scale factor.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/financial-statements?ticker=NVDA&formType=10-K"
How do I get the statements in Excel?
Pass the accession number of the filing to the xlsx endpoint; you get one sheet per statement.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/financial-statements/xlsx?accessionNo=0000320193-26-000020&cik=320193"
How do I find the accession number for the Excel export?
Every entry of /v1/financial-statements starts with accessionNo.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/financial-statements?ticker=AAPL&formType=10-Q"
How do I get segment or geographic breakdowns?
This endpoint keeps totals only. Use /v1/xbrl-to-json for the full filing including dimensional facts.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/financial-statements?ticker=NVDA&formType=10-K"
Why do I see the same fact twice?
The XBRL can tag one number in several places of the filing. Deduplicate on value plus period.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/financial-statements?ticker=NVDA&formType=10-K"
Errors
- 400 for an unknown ticker.
- An unknown formType returns [] with status 200.
See also the error codes every endpoint shares.
Try it with your own key
500 free calls a month.