FINANCIALS · XBRL-NORMALIZED

The SEC financials API, without the XBRL.

Company fundamentals live in SEC EDGAR as raw XBRL — inconsistent tags, dimensional contexts, unit scaling. Filingrail's financials endpoint returns the income statement, balance sheet, and cash flow already parsed, normalized, and typed into clean JSON, with a link back to the exact 10-K or 10-Q on every response.

Free tier: 50 requests/day, no credit card. Endpoint: GET /v1/companies/{ticker}/financials

The fields

What every record carries.

Filingrail parses the underlying SEC filing into a flat, typed JSON object. These are the fields you get on each record:

Fields returned by the SEC Financials API
Field What it is
revenue Total revenue / net sales for the period, in USD.
gross_profit Revenue minus cost of revenue.
operating_income Income from operations, before interest and tax.
net_income Bottom-line net income attributable to the company.
eps_diluted Diluted earnings per share, as reported.
total_assets Total assets from the balance sheet, in USD.
total_liabilities Total liabilities from the balance sheet.
stockholders_equity Total stockholders' equity.
operating_cash_flow Net cash provided by operating activities.
capex Capital expenditure (purchases of PP&E), from the cash-flow statement.
statement_type income_statement, balance_sheet, or cash_flow — which statement the row is from.
period_type annual, quarterly, or ytd.

SAMPLE

A real-shaped response.

One GET returns the data array plus a meta block. The values below are an illustrative example of the response shape.

The field that matters most for trust is the link to the source filing on sec.govfiling_url on each record where the rows come from many filings, and meta.source_filing_url where one filing backs the whole response. Either way, any value you surface traces back to its source.

GET /v1/companies/AAPL/financials · 200 OK
{
  "data": [
    {
      "ticker": "AAPL",
      "statement_type": "income_statement",
      "period_type": "annual",
      "period_end": "2025-09-27",
      "revenue": 391035000000,
      "gross_profit": 180683000000,
      "operating_income": 123216000000,
      "net_income": 93736000000,
      "eps_diluted": 6.08,
      "currency": "USD"
    }
  ],
  "meta": {
    "ticker": "AAPL",
    "as_of": "2026-07-07T08:00:00Z",
    "source_filing_url": "https://www.sec.gov/Archives/edgar/data/320193/.../aapl-10k.htm",
    "source_filing_date": "2025-11-01",
    "accession_number": "0000320193-25-000098"
  }
}

Illustrative example. Every record links to its source filing.

HOW-TO

How to pull normalized SEC financials with Filingrail

Subscribe on RapidAPI, call the financials endpoint for a ticker, and read normalized income, balance-sheet, and cash-flow rows — each traceable to its filing.

  1. 1

    Subscribe on RapidAPI

    Subscribe to the free Basic tier (50 requests/day) on the Filingrail RapidAPI listing and copy your X-RapidAPI-Key.

  2. 2

    Call the financials endpoint

    Request GET /v1/companies/{ticker}/financials with your X-RapidAPI-Key and X-RapidAPI-Host headers.

  3. 3

    Read the normalized rows

    Filter data[] by statement_type (income_statement / balance_sheet / cash_flow) and period_type, then read the typed USD figures.

  4. 4

    Trace any number to its filing

    Open meta.source_filing_url to verify any figure against the original 10-K or 10-Q on sec.gov.

curl · SEC Financials API
curl --request GET \
  --url 'https://filingrail.p.rapidapi.com/v1/companies/AAPL/financials' \
  --header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
  --header 'X-RapidAPI-Host: filingrail.p.rapidapi.com'
Python · margins.py
import os, requests

API = "https://filingrail.p.rapidapi.com"
HEADERS = {
    "X-RapidAPI-Key": os.environ["RAPIDAPI_KEY"],
    "X-RapidAPI-Host": "filingrail.p.rapidapi.com",
}

def financials(ticker):
    r = requests.get(f"{API}/v1/companies/{ticker}/financials",
                     headers=HEADERS, timeout=10)
    r.raise_for_status()
    return r.json()

payload = financials("AAPL")
inc = [row for row in payload["data"]
       if row["statement_type"] == "income_statement"]
for row in inc:
    if row.get("revenue"):
        margin = row["net_income"] / row["revenue"]
        print(f'{row["period_end"]}  net margin {margin:.1%}  '
              f'src={payload["meta"]["source_filing_url"]}')

FAQ

Common questions

Still wondering something? Email support@hudsonenterprisesllc.com — same business day response.

What is a SEC financials API?
It returns company financial statements from SEC filings — income statement, balance sheet, and cash flow — as structured JSON instead of raw XBRL. Filingrail parses the XBRL from each 10-K and 10-Q, normalizes the concepts to a consistent set of fields, applies unit scaling, and serves typed USD figures behind one endpoint.
What is the endpoint and what does it return?
GET /v1/companies/{ticker_or_cik}/financials. It returns an array of normalized statement rows for the company, keyed by statement_type and period_type, plus a meta block with the source filing URL and date. There is also a /financials/history variant for a multi-period series of any line item.
How is this different from the SEC company-facts JSON?
The SEC's company-facts endpoint gives you every XBRL concept a filer ever tagged, under the filer's own concept names, with dimensional contexts and mixed units — you still write the normalization. Filingrail does that normalization: one consistent set of fields, unit-scaled to USD, one row per statement and period. And every response carries meta.source_filing_url so you can still open the original filing.
How current is the data?
Filingrail refreshes from SEC EDGAR daily. The exact ingest timestamp for any response is in meta.as_of, so you never have to guess how fresh a result is. New 10-Ks and 10-Qs appear after the daily ingest window.
How far back does history go?
The financials corpus is backed by 1.85M+ XBRL rows spanning modern EDGAR history. Use /v1/companies/{ticker}/financials/history to pull a series (up to 20 periods per call). Confirm coverage for a specific ticker on the free tier before you build on it.
Is there a free tier?
Yes — the Basic plan on RapidAPI is $0 with a hard cap of 50 requests/day, no credit card. Pro is $9/mo for 5,000 requests, Ultra $49/mo for 50,000, Mega $199/mo for 500,000. RapidAPI handles billing, keys, and rate limiting.
Why does every response include a source filing URL?
So any figure you surface can be traced back to the exact SEC filing it came from. meta.source_filing_url opens the 10-K or 10-Q on sec.gov — audit-grade provenance that most financial-data APIs abstract away.

Start on the free tier.

50 requests/day, no credit card. Query the endpoint and read the source filing behind every record.