curl --request GET \
--url https://api.financialdatasets.ai/financials/as-reported \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.financialdatasets.ai/financials/as-reported"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://api.financialdatasets.ai/financials/as-reported', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.financialdatasets.ai/financials/as-reported",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.financialdatasets.ai/financials/as-reported"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.financialdatasets.ai/financials/as-reported")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/financials/as-reported")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"financials": [
{
"ticker": "<string>",
"report_period": "2023-12-25",
"fiscal_period": "<string>",
"period": "quarterly",
"currency": "<string>",
"accession_number": "<string>",
"filing_url": "<string>",
"income_statement": {
"line_items": [
{
"label": "<string>",
"full_label": "<string>",
"value": 123,
"children": "<array>"
}
]
},
"balance_sheet": {
"line_items": [
{
"label": "<string>",
"full_label": "<string>",
"value": 123,
"children": "<array>"
}
]
},
"cash_flow_statement": {
"line_items": [
{
"label": "<string>",
"full_label": "<string>",
"value": 123,
"children": "<array>"
}
]
}
}
],
"next_page_url": "<string>"
}{
"error": "Bad Request",
"message": "Invalid request parameters"
}{
"error": "Unauthorized",
"message": "Invalid API key provided"
}{
"error": "Payment Required",
"message": "This endpoint requires a paid subscription. Please upgrade your plan."
}{
"error": "Not Found",
"message": "Ticker XXXX not found"
}As-Reported Financial Statements API
Income statements, balance sheets, and cash flow statements as the company filed them: each line with its label, value, and place in the statement, from 2010 onward.
curl --request GET \
--url https://api.financialdatasets.ai/financials/as-reported \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.financialdatasets.ai/financials/as-reported"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://api.financialdatasets.ai/financials/as-reported', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.financialdatasets.ai/financials/as-reported",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.financialdatasets.ai/financials/as-reported"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.financialdatasets.ai/financials/as-reported")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/financials/as-reported")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"financials": [
{
"ticker": "<string>",
"report_period": "2023-12-25",
"fiscal_period": "<string>",
"period": "quarterly",
"currency": "<string>",
"accession_number": "<string>",
"filing_url": "<string>",
"income_statement": {
"line_items": [
{
"label": "<string>",
"full_label": "<string>",
"value": 123,
"children": "<array>"
}
]
},
"balance_sheet": {
"line_items": [
{
"label": "<string>",
"full_label": "<string>",
"value": 123,
"children": "<array>"
}
]
},
"cash_flow_statement": {
"line_items": [
{
"label": "<string>",
"full_label": "<string>",
"value": 123,
"children": "<array>"
}
]
}
}
],
"next_page_url": "<string>"
}{
"error": "Bad Request",
"message": "Invalid request parameters"
}{
"error": "Unauthorized",
"message": "Invalid API key provided"
}{
"error": "Payment Required",
"message": "This endpoint requires a paid subscription. Please upgrade your plan."
}{
"error": "Not Found",
"message": "Ticker XXXX not found"
}Overview
The Financial Datasets as-reported financial statements API returns a company’s income statement, balance sheet, and cash flow statement as the company filed them: every line in the company’s own order, with its value and its place in the statement’s hierarchy. The standardized statements map every company onto the same fields so companies compare. The as-reported statements keep the lines the company actually reported. They are parsed directly from SEC filings (data provenance) and are available from 2010 onward. UK and French companies are also covered, annual only (market coverage). You can call it as a REST endpoint with an API key, or from Claude, ChatGPT, Cursor, and other AI apps through the MCP server. Pricing starts at $20. To get started, please create an account and grab your API key at financialdatasets.ai.Endpoints
| Statement | Endpoint |
|---|---|
| All three statements | GET /financials/as-reported |
| Income statement | GET /financials/income-statements/as-reported |
| Balance sheet | GET /financials/balance-sheets/as-reported |
| Cash flow statement | GET /financials/cash-flow-statements/as-reported |
Filtering the Data
ticker,cik, orisin: one is required.market:US(the default),UK, orFR. Or passisinalone for a UK or French company.period(required):annualorquarterly. There is nottm. UK and French companies are annual only.limit: the maximum number of periods to return. Each page holds up to 10 periods, linked bynext_page_url.report_period,report_period_gte,report_period_lte,report_period_gt,report_period_lt: filter by report period date (YYYY-MM-DD).
Response
Each period carriesticker, report_period, fiscal_period, period, currency, accession_number, and filing_url. The all-statements endpoint returns income_statement, balance_sheet, and cash_flow_statement objects per period under financials; any of the three may be null when data is missing. The single-statement endpoints return one statement per period under income_statements, balance_sheets, or cash_flow_statements.
Each statement holds line_items, a tree of nodes:
| Field | Meaning |
|---|---|
label | The label as printed on the face of the filing. |
full_label | The canonical taxonomy label for the underlying concept. |
value | The numeric value as reported. null for section headers and subtotals with no direct value. |
children | The nested line items beneath this row. |
Example
import requests
# add your API key to the headers
headers = {
"X-API-KEY": "your_api_key_here"
}
# set your query params
params = {
"ticker": "AAPL", # stock ticker
"period": "annual", # annual or quarterly
"limit": 2, # number of periods to return
}
# make API request
url = "https://api.financialdatasets.ai/financials/as-reported"
response = requests.get(url, headers=headers, params=params)
# parse financials from the response
financials = response.json().get("financials")
# print the latest income statement as an indented tree
def print_lines(nodes, depth=0):
for node in nodes:
print(" " * depth + f"{node['label']}: {node['value']}")
print_lines(node.get("children", []), depth + 1)
print_lines(financials[0]["income_statement"]["line_items"])
FAQ
What is the difference between as-reported and standardized statements?
Standardized statements map every company onto the same fields, such asrevenue and net_income, so you can compare companies. As-reported statements keep each company’s own lines, order, and hierarchy, so you see what the filing shows.
How far back does the data go?
To 2010.Which periods are available?
Annual and quarterly for US companies. Annual only for UK and French companies. There is no TTM.Can an AI agent use this data?
Yes. Claude, ChatGPT, Cursor, and other MCP clients reach it through the Financial Datasets MCP server. Its financial statements tool returns the as-reported line items whenas_reported is true.Authorizations
API key for authentication.
Query Parameters
The ticker symbol. Required if cik or isin is not provided.
The market the company is listed in: US (the default), UK or FR. For a UK or French company the statement comes back as the company printed it in its annual report, in its own order and wording.
US, UK, FR Deprecated alias of market: LSE means market=UK. Existing requests keep working. France has no alias: name it with market=FR.
The ISIN (International Securities Identification Number) of a non-US listing. An alternative to ticker and market.
The time period of the data.
annual, quarterly The maximum number of periods to return. This is the total across all pages, not a page size: each page holds up to 10 records, linked by next_page_url.
The Central Index Key (CIK) of the company.
Filter by exact report period date in YYYY-MM-DD format.
Filter by report period greater than or equal to date in YYYY-MM-DD format.
Filter by report period less than or equal to date in YYYY-MM-DD format.
Filter by report period greater than date in YYYY-MM-DD format.
Filter by report period less than date in YYYY-MM-DD format.
Opaque pagination cursor from a previous response's next_page_url. When provided, all other query parameters are ignored: the cursor carries the original request's filters. Treat it as opaque; do not construct or modify it.