KPI & Operating Metrics API
Get the company KPIs and operating metrics that never make it into the financial statements — customer and subscriber counts, units delivered, volumes, capacity, pricing and per-unit economics — as clean JSON, for 3,000+ companies. Every value comes with quarterly and annual history and a link to its source document. Three calls take you from the list of companies covered to a full KPI history.
Available on the Max, Ultra and Enterprise plans.
Related endpoints: KPIs explain the numbers in the Financial Statements API and the Segment Financials API — revenue is volume times price. Hear management discuss the same metrics in the Earnings Call Transcripts API.
https://data.businessquant.com/kpi_v2/stocks?api_key={api_key}
https://data.businessquant.com/kpi_v2/categories?{identifier}&api_key={api_key}
https://data.businessquant.com/kpi_v2/data?{identifier}&id_category={id_category}&api_key={api_key}
How the KPI API Works
Three calls, each feeding the next — the same flow a company picker, a category dropdown and a chart use. Every company's KPIs are grouped the way the company reports them: a category is one table the company reports (for example "Operating Statistics"), and each row of that table is a sub-category (for example "Available seat miles").
Find a company
GET /kpi_v2/stocks
Every company with KPI data, with how many categories and sub-categories it reports. Fill a company dropdown from it.
Every plancik, ticker, companyname, count_category, count_subcategoryList its KPI categories
GET /kpi_v2/categories
Pass the company's ticker or CIK. Returns its KPI tables in the order it reports them, each with its number of sub-categories and its first and latest period. Fill a category dropdown from it.
Every planid_category, category, count_subcategory, last_reportperiodFetch the KPI values
GET /kpi_v2/data
Pass the same company and an id_category. Returns every series in that category with its context and unit, and its quarterly and annual values, newest first.
subcategory, context, unit and values with reportperiod, value, filingdate, url1. List the Companies Covered
/kpi_v2/stocks returns every company the KPI API covers, sorted by ticker, with the number of KPI categories and sub-categories each one reports. It takes no parameters besides your API key, and is open on every plan — use it to fill a company picker or to check coverage before you build.
| Parameter | Description |
|---|---|
| api_key | Required Your unique API key for authentication and usage tracking. |
A few companies have no listed stock. They are in the list with ticker set to null; ask for them by cik.
curl -X GET "https://data.businessquant.com/kpi_v2/stocks?api_key=YOUR_API_KEY"
{
"metadata": {
"note": ""
},
"data": [
{
"cik": 6201,
"ticker": "AAL",
"companyname": "American Airlines Group Inc.",
"companyname_short": "American Airlines",
"count_category": 55,
"count_subcategory": 317
},
{
"cik": 1561861,
"ticker": "AERO",
"companyname": "Grupo Aeromexico, S.A.B. de C.V.",
"companyname_short": "Grupo Aeromexico, S.A.B. de C.V",
"count_category": 3,
"count_subcategory": 16
},
{
"cik": 1362468,
"ticker": "ALGT",
"companyname": "Allegiant Travel CO",
"companyname_short": "Allegiant Travel",
"count_category": 28,
"count_subcategory": 109
},
{
"cik": 766421,
"ticker": "ALK",
"companyname": "Alaska Air Group, Inc.",
"companyname_short": "Alaska Air",
"count_category": 40,
"count_subcategory": 207
},
{
"cik": 1129137,
"ticker": "AMX",
"companyname": "America Movil Sab De Cv/",
"companyname_short": "America Movil Sab De Cv",
"count_category": 79,
"count_subcategory": 256
},
{
"cik": 1441683,
"ticker": "APPN",
"companyname": "Appian Corp",
"companyname_short": "Appian",
"count_category": 1,
"count_subcategory": 1
}
]
}
The full response lists every company covered, sorted by ticker; metadata.total_records counts them.
2. List a Company's KPI Categories
/kpi_v2/categories returns one company's KPI categories in the order the company reports them, each with its id_category, its number of sub-categories, and the first and latest period on file. Pass the company by ticker or by CIK. Open on every plan.
| Parameter | Description |
|---|---|
| api_key | Required Your unique API key for authentication and usage tracking. |
| ticker | Optional Stock ticker of the company. Any listed share class works (LBTYA or LBTYK). One of ticker or cik is required.Format: ticker=UAL |
| cik | Optional Central Index Key (CIK) of the company. Use it for companies without a listed ticker. When both are given, cik is used.Format: cik=100517 |
Use last_reportperiod to tell live tables from historical ones: a company sometimes stops publishing a table, and its history stays available.
curl -X GET "https://data.businessquant.com/kpi_v2/categories?ticker=UAL&api_key=YOUR_API_KEY"
{
"metadata": {
"cik": 100517,
"ticker": "UAL",
"companyname": "United Airlines Holdings, Inc.",
"companyname_short": "United Airlines Holdings",
"total_records": 62,
"note": ""
},
"data": [
{
"id_category": 1,
"category": "STATISTICS",
"count_subcategory": 19,
"first_reportperiod": "2000-12-31",
"last_reportperiod": "2026-09-30"
},
{
"id_category": 2,
"category": "Passenger load factor: (d)",
"count_subcategory": 7,
"first_reportperiod": "2005-09-30",
"last_reportperiod": "2026-09-30"
},
{
"id_category": 3,
"category": "NON-GAAP FINANCIAL RECONCILIATION",
"count_subcategory": 2,
"first_reportperiod": "2010-12-31",
"last_reportperiod": "2026-09-30"
},
{
"id_category": 4,
"category": "CASM-ex (in cents, except for percentage changes)",
"count_subcategory": 1,
"first_reportperiod": "2010-12-31",
"last_reportperiod": "2026-09-30"
}
// … 58 more items in the full API response
]
}
3. Fetch KPI Data for a Category
/kpi_v2/data returns every series in one category of one company. Each series carries its sub-category name, its context — the heading the company prints above the table — and its unit once, followed by its values, newest first. Narrow it to quarterly or annual figures, or to the sub-categories you need. Max plan and above.
| Parameter | Description |
|---|---|
| api_key | Required Your unique API key for authentication and usage tracking. |
| id_category | Required The category, from /kpi_v2/categories. Category ids belong to a company: category 1 of UAL is not category 1 of DAL.Format: id_category=1 |
| ticker | Optional Stock ticker of the company. One of ticker or cik is required.Format: ticker=UAL |
| cik | Optional Central Index Key (CIK) of the company. When both are given, cik is used.Format: cik=100517 |
| id_subcategory | Optional Only these sub-categories, comma-separated. Default: every sub-category in the category.Format: id_subcategory=2,3 |
| dimension | Optional quarter or annual. Default: both. A fourth quarter and its fiscal year end on the same date, so each value says which it is.Format: dimension=quarter |
curl -X GET "https://data.businessquant.com/kpi_v2/data?ticker=UAL&id_category=1&api_key=YOUR_API_KEY"
{
"metadata": {
"cik": 100517,
"ticker": "UAL",
"companyname": "United Airlines Holdings, Inc.",
"companyname_short": "United Airlines Holdings",
"id_category": 1,
"category": "STATISTICS",
"units": [
"$",
"%",
"¢"
],
"dimension": null,
"total_series": 20,
"total_records": 1095,
"note": ""
},
"data": [
{
"id_subcategory": 1,
"subcategory": "Passengers",
"id_tiebreaker": 6,
"context": "Certain consolidated statistical information for the Company's operations for the three months ended September 30 is as follows:",
"unit": null,
"values": [
{
"dimension": "Quarter",
"reportperiod": "2026-09-30",
"fiscal_year": 2026,
"fiscal_quarter": 3,
"value": 49527000,
"value_as_reported": "49527",
"derived": false,
"filingdate": "2026-10-21",
"formtype": "10-Q",
"accession": "0000100517-26-000186",
"url": "https://www.sec.gov/Archives/edgar/data/100517/000010051726000186/0000100517-26-000186-index.htm"
},
{
"dimension": "Quarter",
"reportperiod": "2026-06-30",
"fiscal_year": 2026,
"fiscal_quarter": 2,
"value": 48692000,
"value_as_reported": "48692",
"derived": false,
"filingdate": "2026-07-16",
"formtype": "10-Q",
"accession": "0000100517-26-000139",
"url": "https://www.sec.gov/Archives/edgar/data/100517/000010051726000139/0000100517-26-000139-index.htm"
},
{
"dimension": "Quarter",
"reportperiod": "2026-03-31",
"fiscal_year": 2026,
"fiscal_quarter": 1,
"value": 42486000,
"value_as_reported": "42486",
"derived": false,
"filingdate": "2026-04-22",
"formtype": "10-Q",
"accession": "0000100517-26-000091",
"url": "https://www.sec.gov/Archives/edgar/data/100517/000010051726000091/0000100517-26-000091-index.htm"
}
// … 74 more items in the full API response
]
},
{
"id_subcategory": 2,
"subcategory": "Revenue passenger miles (\"RPMs\" or \"traffic\")",
"id_tiebreaker": 6,
"context": "Certain consolidated statistical information for the Company's operations for the three months ended September 30 is as follows:",
"unit": null,
"values": [
{
"dimension": "Quarter",
"reportperiod": "2026-09-30",
"fiscal_year": 2026,
"fiscal_quarter": 3,
"value": 74278000000,
"value_as_reported": "74278",
"derived": false,
"filingdate": "2026-10-21",
"formtype": "10-Q",
"accession": "0000100517-26-000186",
"url": "https://www.sec.gov/Archives/edgar/data/100517/000010051726000186/0000100517-26-000186-index.htm"
},
{
"dimension": "Quarter",
"reportperiod": "2026-06-30",
"fiscal_year": 2026,
"fiscal_quarter": 2,
"value": 72765000000,
"value_as_reported": "72765",
"derived": false,
"filingdate": "2026-07-16",
"formtype": "10-Q",
"accession": "0000100517-26-000139",
"url": "https://www.sec.gov/Archives/edgar/data/100517/000010051726000139/0000100517-26-000139-index.htm"
},
{
"dimension": "Quarter",
"reportperiod": "2026-03-31",
"fiscal_year": 2026,
"fiscal_quarter": 1,
"value": 63385000000,
"value_as_reported": "63385",
"derived": false,
"filingdate": "2026-04-22",
"formtype": "10-Q",
"accession": "0000100517-26-000091",
"url": "https://www.sec.gov/Archives/edgar/data/100517/000010051726000091/0000100517-26-000091-index.htm"
}
// … 95 more items in the full API response
]
}
// … 18 more items in the full API response
]
}
4. Response Fields
Every response is a metadata object and a data list. metadata.note is always present: empty normally, and on Free and Pro it says the data call answered with a sample.
How a KPI series is identified
Ids are permanent: a company's categories, sub-categories and series keep their numbers as new periods are added, so you can store them.
context says how they differ.For example, Verizon reports "Wireless retail postpaid phone" connections in three tables — total company, Consumer and Business. They share an id_subcategory; each has its own id_tiebreaker, and context names its table.
/kpi_v2/stocks
| Field | Type | Description |
|---|---|---|
| metadata.total_records | integer | Number of companies in data. |
| cik | integer | Central Index Key (CIK). |
| ticker | string|null | Ticker. Null for companies without a listed stock. |
| companyname | string | Company name. |
| companyname_short | string | Short company name, for labels and dropdowns. |
| count_category | integer | Number of KPI categories the company reports. |
| count_subcategory | integer | Number of sub-categories across all of them. |
/kpi_v2/categories
| Field | Type | Description |
|---|---|---|
| metadata.cik / ticker / companyname / companyname_short | mixed | The company. |
| metadata.total_records | integer | Number of categories. |
| metadata.message | string | Only when data is empty: why (for example, a company with no KPI data yet). |
| id_category | integer | Category id. Pass it to /kpi_v2/data. |
| category | string | Category name, as the company titles the table. |
| count_subcategory | integer | Number of sub-categories in the category. |
| first_reportperiod | string | Earliest period on file (YYYY-MM-DD). |
| last_reportperiod | string | Latest period on file. |
/kpi_v2/data
data holds one object per series, ordered by id_subcategory then id_tiebreaker. Each series lists its values newest first; where a fourth quarter and its fiscal year share a date, the quarter comes first.
| Field | Type | Description |
|---|---|---|
| metadata.cik / ticker / companyname / companyname_short | mixed | The company. |
| metadata.id_category / category | integer / string | The category requested and its name. |
| metadata.units | array | Every unit used by the series in the response, such as ["$", "%", "¢"]. Each series also states its own. |
| metadata.dimension | string|null | quarter or annual when filtered, otherwise null. |
| metadata.total_series / total_records | integer | Number of series, and of values across them. |
| id_subcategory | integer | Sub-category id. |
| subcategory | string | Sub-category name, as the company prints it (e.g. Passenger load factor). |
| id_tiebreaker | integer | Tells apart series that share a sub-category name. |
| context | string|null | The heading or text the company prints above the table — what tells two series of the same name apart (e.g. Consumer vs Business). |
| unit | string|null | Unit of the values: %, $, ¢, €, £, R$ and so on. Null for counts (passengers, subscribers, miles). |
| values[].dimension | string | Quarter or Annual. |
| values[].reportperiod | string | Period end date (YYYY-MM-DD). |
| values[].fiscal_year / fiscal_quarter | integer | Fiscal year and quarter. fiscal_quarter is null on annual values. |
| values[].value | number | The value, fully scaled: a table "in thousands" showing 49,527 gives 49527000. |
| values[].value_as_reported | string | The value exactly as printed in the source document. |
| values[].derived | boolean | true when the value was worked out from other reported values rather than printed. |
| values[].filingdate | string | Date the source document was published. |
| values[].formtype | string | Type of the source document. |
| values[].accession | string | Identifier of the source document, where it has one. |
| values[].url | string | Link to the source document. |
5. Endpoint Variations
Copy any of the following directly into your application or HTTP client.
https://data.businessquant.com/kpi_v2/stocks?api_key=YOUR_API_KEY
https://data.businessquant.com/kpi_v2/categories?ticker=UAL&api_key=YOUR_API_KEY
https://data.businessquant.com/kpi_v2/categories?cik=732712&api_key=YOUR_API_KEY
https://data.businessquant.com/kpi_v2/data?ticker=UAL&id_category=1&api_key=YOUR_API_KEY
https://data.businessquant.com/kpi_v2/data?ticker=UAL&id_category=1&dimension=quarter&api_key=YOUR_API_KEY
https://data.businessquant.com/kpi_v2/data?ticker=UAL&id_category=1&id_subcategory=2,3&api_key=YOUR_API_KEY
https://data.businessquant.com/kpi_v2/data?ticker=VZ&id_category=1&dimension=quarter&api_key=YOUR_API_KEY
https://data.businessquant.com/kpi_v2/data?ticker=DAL&id_category=3&dimension=annual&api_key=YOUR_API_KEY
6. API Response Sample — KPI Categories
United Airlines' KPI categories as the categories call returns them — 62 tables, the first 12 shown.
API Response — KPI Categories
United Airlines Holdings, Inc. (UAL) · CIK 100517
| id_category | Category | Sub-categories | First Period | Latest Period |
|---|---|---|---|---|
| 1 | STATISTICS | 19 | 2000-12-31 | 2026-09-30 |
| 2 | Passenger load factor: (d) | 7 | 2005-09-30 | 2026-09-30 |
| 3 | NON-GAAP FINANCIAL RECONCILIATION | 2 | 2010-12-31 | 2026-09-30 |
| 4 | CASM-ex (in cents, except for percentage changes) | 1 | 2010-12-31 | 2026-09-30 |
| 5 | Operating Data | 221 | 2005-03-31 | 2026-09-30 |
| 6 | Aircraft Type | 8 | 2013-12-31 | 2026-03-31 |
| 9 | CASM Mainline Operations (cents) | 5 | 2007-12-31 | 2018-09-30 |
| 12 | CASM Consolidated Operations (cents) | 4 | 2010-12-31 | 2019-06-30 |
| 13 | Mainline Load Factor | 3 | 2012-12-31 | 2017-12-31 |
| 14 | Consolidated Load Factor | 2 | 2013-12-31 | 2016-12-31 |
| 15 | AVAILABLE SEAT MILES | 14 | 2012-12-31 | 2018-03-31 |
| 16 | PASSENGER LOAD FACTOR | 7 | 2015-03-31 | 2018-03-31 |
7. API Response Sample — Airline Operating Metrics
United Airlines' operating statistics — passengers, revenue passenger miles (RPMs), available seat miles (ASMs), load factor, PRASM, TRASM, yield and fuel — as the data call returns them: 20 series and 1,095 values. The table shows the latest four quarters of each series still being reported.
API Response — KPI Data
United Airlines Holdings, Inc. (UAL) · STATISTICS · id_category 1
| Sub-category | id | Q3 2026 | Q2 2026 | Q1 2026 | Q4 2025 |
|---|---|---|---|---|---|
| PassengersCertain consolidated statistical information for the Company's operations for the three m… | 1 / 6 | 49.53M | 48.69M | 42.49M | 45.68M |
| Revenue passenger miles ("RPMs" or "traffic")Certain consolidated statistical information for the Company's operations for the three m… | 2 / 6 | 74.28B | 72.77B | 63.39B | 68.25B |
| Available seat miles ("ASMs" or "capacity")Certain consolidated statistical information for the Company's operations for the three m… | 3 / 6 | 88.54B | 87.28B | 77.70B | 83.37B |
| Passenger load factorCertain consolidated statistical information for the Company's operations for the three m… | 4 / 6 | 83.90% | 83.40% | 81.60% | 81.90% |
| Passenger revenue per available seat mile ("PRASM") (cents)Certain consolidated statistical information for the Company's operations for the three m… | 5 / 6 | 18.34¢ | 18.45¢ | 16.95¢ | 16.71¢ |
| Total revenue per ASM ("TRASM") (cents)Certain consolidated statistical information for the Company's operations for the three m… | 6 / 6 | 20.19¢ | 20.25¢ | 18.80¢ | 18.47¢ |
| Average yield per revenue passenger mile ("Yield") (cents)Certain consolidated statistical information for the Company's operations for the three m… | 7 / 6 | 21.86¢ | 22.13¢ | 20.77¢ | 20.41¢ |
| Cargo revenue ton miles ("CTM")Certain consolidated statistical information for the Company's operations for the three m… | 8 / 6 | 936.00M | 932.00M | 878.00M | — |
| Average price per gallon of fuel, including fuel taxesCertain consolidated statistical information for the Company's operations for the three m… | 9 / 11 | 3.90 | 4.19 | 2.78 | 2.49 |
| Fuel gallons consumedCertain consolidated statistical information for the Company's operations for the three m… | 10 / 6 | 1.24B | 1.22B | 1.09B | 1.18B |
| ASMsSelect operating statistics are as follows: | 11 / 6 | 88.54B | 87.28B | 77.70B | 83.37B |
8. Key Capabilities
Operating KPIs, not just financials — The non-financial metrics companies report beside their statements: customers and subscribers, units, volumes, capacity, pricing and unit economics.
Built for pickers — Company, then category, then data: three calls that map one-to-one onto two dropdowns and a chart, with the catalogue open on every plan.
Context on every series — Two series with the same name (total company vs a segment) come apart cleanly, each with the heading the company gave its table.
Quarterly and annual — Both in one call, each value labelled with its fiscal year and quarter; filter to one with dimension.
Audit trail to the source — The source document, its date and link, and the as-printed figure on every value.
Fast responses — A whole category, thousands of values, comes back in one call; responses are cached, and the catalogue calls are small enough to load on every page view.
9. Use Cases
Operating metrics are where analysts start when they model a company. Common ways the KPI API is used:
KPI Dashboards
Let users pick a company and a KPI table and chart it: /kpi_v2/stocks fills the first dropdown, /kpi_v2/categories the second, and /kpi_v2/data the chart.
Driver-Based Models
Build revenue from its drivers — ASMs times load factor times yield for an airline, subscribers times ARPU for a carrier — and check each quarter's forecast against the reported KPIs.
Quant Signals
Track a KPI across an industry and trade the inflections. Each value has the date it was published, so backtests use only what was public at the time.
Peer Benchmarking
Line up the same KPI across competitors and see who is gaining share quarter by quarter.
Research Verification
Every number links to the document it came from and shows the figure as printed, so analysts and compliance teams can check a value in one click.
AI Assistants & LLMs
Give a model structured operating data with the context of each table, so it answers "how did United's load factor trend?" from reported figures, not guesses.
Frequently Asked Questions
What is a KPI and operating metrics API?
It is an API that returns the key performance indicators companies report outside their financial statements — customer and subscriber counts, units, volumes, capacity and pricing — as structured data. The Business Quant KPI API returns them as JSON for 3,000+ companies, with quarterly and annual history and a link to the source behind every value.
How do I get a company's KPI data?
Call /kpi_v2/categories with the company's ticker or CIK to list its KPI tables, pick an id_category, and call /kpi_v2/data with the same company and that id_category. /kpi_v2/stocks lists every company covered.
Which companies does the KPI API cover?
3,000+ companies. /kpi_v2/stocks lists every one of them, free on every plan, and /kpi_v2/categories shows the KPI tables each company reports.
What kinds of KPIs does it return?
The operating metrics a company reports about its own business: customer and subscriber counts, units sold and delivered, volumes and capacity, pricing and per-unit economics, and segment operating data. Each company's KPIs keep the names and grouping the company itself uses.
Why do some series share the same sub-category name?
Companies often print the same row in more than one table — total company and a segment, or mainline and consolidated. Each is its own series with its own id_tiebreaker, and its context field gives the heading of the table it comes from, so you can tell them apart.
Where does the KPI data come from?
From what the companies themselves publish. Every value carries the date and a link to the document it was reported in, and the figure exactly as printed.
Is the KPI and Operating Metrics API free?
The list of companies covered and each company's KPI categories are free on every plan. KPI values are on the Max plan and above; on the Free and Pro plans, the data endpoint returns a full sample response for United Airlines so you can see exactly what it returns.