Get non-GAAP metrics
curl --request GET \
--url https://api.financialdatasets.ai/kpi/non-gaap \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.financialdatasets.ai/kpi/non-gaap"
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/kpi/non-gaap', 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/kpi/non-gaap",
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/kpi/non-gaap"
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/kpi/non-gaap")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/kpi/non-gaap")
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{
"kpi_non_gaap": [
{
"ticker": "DAL",
"metric_name": "Adjusted Diluted EPS",
"value": 0.64,
"unit": "USD per share",
"period": "Q1 2026",
"period_type": "quarterly",
"gaap_equivalent": "Diluted earnings per share",
"key_adjustments": "Excludes restructuring charges of $150M",
"source_text": "<string>",
"source_url": "<string>"
}
],
"next_page_url": "<string>"
}{
"error": "Bad Request",
"message": "Invalid request parameters"
}{
"error": "Unauthorized",
"message": "Invalid API key provided"
}Operating KPIs
Non-GAAP Metrics
Get non-GAAP financial metrics with GAAP reconciliation context.
GET
/
kpi
/
non-gaap
Get non-GAAP metrics
curl --request GET \
--url https://api.financialdatasets.ai/kpi/non-gaap \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.financialdatasets.ai/kpi/non-gaap"
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/kpi/non-gaap', 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/kpi/non-gaap",
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/kpi/non-gaap"
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/kpi/non-gaap")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/kpi/non-gaap")
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{
"kpi_non_gaap": [
{
"ticker": "DAL",
"metric_name": "Adjusted Diluted EPS",
"value": 0.64,
"unit": "USD per share",
"period": "Q1 2026",
"period_type": "quarterly",
"gaap_equivalent": "Diluted earnings per share",
"key_adjustments": "Excludes restructuring charges of $150M",
"source_text": "<string>",
"source_url": "<string>"
}
],
"next_page_url": "<string>"
}{
"error": "Bad Request",
"message": "Invalid request parameters"
}{
"error": "Unauthorized",
"message": "Invalid API key provided"
}Overview
The KPI Non-GAAP API returns adjusted financial metrics extracted from earnings releases, paired with their GAAP equivalents and the key adjustments between them. Examples: Adjusted EPS, Adjusted EBITDA, Free Cash Flow, Non-GAAP Operating Income, Core FFO, CASM-ex-fuel.Coverage
| Tickers | Years of Coverage | Updated |
|---|---|---|
| 600+ | 3+ years | Within 10 seconds |
Available Tickers
You can fetch a list of available tickers with aGET request to:
https://api.financialdatasets.ai/kpi/non-gaap/tickers/
Getting Started
- Add your API key to the header of the request as
X-API-KEY. - Add the required query param
ticker. - Execute the API request.
Filtering the Data
| Parameter | Required | Description |
|---|---|---|
ticker | Yes | Stock ticker symbol (e.g., DAL, BAC) |
metric_name | No | Filter to a specific metric |
period | No | quarterly (default) or annual |
report_period_gte | No | Only return metrics on or after this date (YYYY-MM-DD) |
report_period_lte | No | Only return metrics on or before this date (YYYY-MM-DD) |
limit | No | Number of periods to return (default: 4, max: 50) |
Example
KPI Non-GAAP
import requests
headers = {
"X-API-KEY": "your_api_key_here"
}
ticker = "DAL"
url = f"https://api.financialdatasets.ai/kpi/non-gaap?ticker={ticker}"
response = requests.get(url, headers=headers)
data = response.json()
kpi_non_gaap = data["kpi_non_gaap"]
Example Response
{
"kpi_non_gaap": [
{
"ticker": "DAL",
"metric_name": "Adjusted Operating Revenue",
"value": 14200000000.0,
"unit": "USD",
"period": "Q1 2026",
"period_type": "quarterly",
"gaap_equivalent": "Total operating revenue",
"key_adjustments": "Excludes third-party refinery sales of $1,654M",
"source_text": "Adjusted operating revenue",
"source_url": "https://www.sec.gov/Archives/..."
},
{
"ticker": "DAL",
"metric_name": "Adjusted Diluted EPS",
"value": 0.64,
"unit": "USD per share",
"period": "Q1 2026",
"period_type": "quarterly",
"gaap_equivalent": "Diluted (loss)/earnings per share",
"key_adjustments": "Excludes MTM adjustments on investments, MTM adjustments and settlements on hedges",
"source_text": "Adjusted diluted earnings per share",
"source_url": "https://www.sec.gov/Archives/..."
}
]
}
Response Fields
| Field | Type | Description |
|---|---|---|
gaap_equivalent | string | The GAAP line item this metric adjusts (e.g., “Total operating revenue”, “Net income”) |
key_adjustments | string | Description of the adjustments made (e.g., “Excludes restructuring charges of $150M”) |
Notes
- Non-GAAP metrics often include both current and prior-year values from the same filing.
- The
source_urllinks directly to the source document with text highlighting when available.
Authorizations
API key for authentication.
Query Parameters
The ticker symbol.
Filter to a specific metric.
Filter by period type: quarterly or annual.
Available options:
quarterly, annual Only return metrics on or after this date (YYYY-MM-DD).
Only return metrics on or before this date (YYYY-MM-DD).
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.
Required range:
x <= 50Opaque 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.