Home / Developers / Financial Statements API
API reference

Financial Statements API

Get a company's financial statements from its latest 10-K or 10-Q filings as JSON, built from the filing's XBRL. Dimensional breakdowns are removed so you get the totals each statement reports, plus an Excel export of any single filing. Product overview →

Endpoints

/v1/financial-statements

GEThttps://secfeedapi.com/v1/financial-statements

Income statement, balance sheet, cash flow (totals) for the latest n 10-K or 10-Q.

ParameterTypeDescriptionExample
tickerstringCompany ticker. Pass ticker or cik.NVDA
cikintegerCompany CIK. Pass ticker or cik.1045810
formTypestringWhich filings to read: 10-K or 10-Q. Default 10-K.10-Q
nintegerHow many of the latest filings of that form to return. Default 1.2

/v1/financial-statements/xlsx

GEThttps://secfeedapi.com/v1/financial-statements/xlsx

One filing's statements as an Excel workbook: a sheet per statement, periods as columns.

ParameterTypeDescriptionExample
accessionNorequiredstringFiling to export.0000320193-26-000020
cikintegerFiler CIK, recommended so the filing is found directly.320193

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

FieldTypeMeaning
[]arrayOne entry per filing, newest first.
[].accessionNostringFiling the statements come from.
[].StatementsOfIncomeobjectIncome statement: each key is an XBRL concept name, each value a list of facts.
[].StatementsOfComprehensiveIncomeobjectComprehensive income statement, same shape.
[].BalanceSheetsobjectBalance sheet, same shape. Facts use period.instant.
[].StatementsOfCashFlowsobjectCash flow statement, same shape.
[].StatementsOfShareholdersEquityobjectStatement of shareholders' equity, same shape.
[].CoverPageobjectCover page data: DocumentType, DocumentPeriodEndDate, EntityRegistrantName and more.
[].<statement>.<Concept>[]arrayFacts for one concept, for example Revenues or AssetsCurrent. Company extension concepts carry a prefix such as nvda_.
[].<statement>.<Concept>[].valuestringReported value as a string, in the unit given by unitRef.
[].<statement>.<Concept>[].period.startDatestringStart of a duration period.
[].<statement>.<Concept>[].period.endDatestringEnd of a duration period.
[].<statement>.<Concept>[].period.instantstringDate of a point in time value (balance sheet).
[].<statement>.<Concept>[].unitRefstringUnit, for example usd or shares. Absent on text facts.
[].<statement>.<Concept>[].decimalsstringXBRL precision, -6 means rounded to millions.

Statement keys

KeyStatement
StatementsOfIncomeIncome statement
StatementsOfComprehensiveIncomeComprehensive income
BalanceSheetsBalance sheet
StatementsOfCashFlowsCash flow statement
StatementsOfShareholdersEquityShareholders' equity
CoverPageDocument 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

See also the error codes every endpoint shares.

Try it with your own key

500 free calls a month.

Get free API key →