curl --request GET \
--url https://api.numi.sh/v1/companies/{ref}/fundamentals/history \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.numi.sh/v1/companies/{ref}/fundamentals/history"
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.numi.sh/v1/companies/{ref}/fundamentals/history', 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.numi.sh/v1/companies/{ref}/fundamentals/history",
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.numi.sh/v1/companies/{ref}/fundamentals/history"
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.numi.sh/v1/companies/{ref}/fundamentals/history")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.numi.sh/v1/companies/{ref}/fundamentals/history")
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{
"data": {
"company": {
"cik": "0000789019",
"ticker": "MSFT",
"tickers": [
"<string>"
],
"name": "MICROSOFT CORPORATION",
"exchange": "Nasdaq",
"sic": "7372",
"sic_description": "Services-Prepackaged Software",
"state_of_incorporation": "WA",
"fiscal_year_end": "0630",
"filer_category": "Large accelerated filer",
"entity_type": "operating"
},
"period_type": "annual",
"view": "own",
"as_of": "2023-12-25",
"metric": "<string>",
"filings_checked": 1,
"reason": "not_covered",
"entries": [
{
"metric": "revenue",
"vintage": 1,
"concept": "RevenueFromContractWithCustomerExcludingAssessedTax",
"value": 123,
"unit": "<string>",
"currency": "USD",
"period_start": "2023-12-25",
"period_end": "2023-12-25",
"decimals": 123,
"filing": {
"id": 123,
"form_type": "10-K",
"filing_date": "2023-12-25",
"period_end": "2023-12-25",
"fiscal_year": 123,
"fiscal_period": "FY",
"period_type": "annual",
"is_amendment": true,
"extractor_version": "2026.11.1",
"has_segments": true,
"has_note": true,
"accession_number": "0000950170-25-100235",
"accepted_at": "2025-07-30T16:06:04.000Z",
"match_basis": "form_date_period",
"source_url": "<string>",
"document_url": "<string>"
}
}
]
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA",
"as_of": "2026-10-19T12:34:56.789Z"
}
}{
"error": {
"code": "bad_request",
"message": "limit: must be from 1 to 50"
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}{
"error": {
"code": "unauthorized",
"message": "The request has no API key. Send a numi API key in the X-API-Key header."
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}{
"error": {
"code": "sandbox_restricted",
"message": "TSLA is not in the sandbox. With a sandbox key, you can read 10 companies: MSFT, AAPL, NVDA, AMZN, GOOGL, META, NFLX, CVX, JPM and SONY. To read every company, upgrade to the Builder plan at https://numi.sh/account.",
"sandbox_companies": [
"MSFT",
"AAPL",
"NVDA",
"AMZN",
"GOOGL",
"META",
"NFLX",
"CVX",
"JPM",
"SONY"
]
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}{
"error": {
"code": "not_found",
"message": "The API has no route for GET /v1/nothing. Find the routes of the API at https://docs.numi.sh."
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "The sandbox plan has a limit of 20 requests a minute. Retry in 12 seconds.",
"retry_after": 12,
"scope": "minute"
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}Get the fundamentals across every filing
Returns the line items of a US SEC filer across its filings on Forms 10-K, 10-Q, 20-F and 40-F, of period_type, in the view you choose, ordered by metric, then period end, then period start, then filing date. Each entry is one line item with its vintage and the filing it came from. A period is the start and the end of a line item together, so a quarter’s revenue and a year-to-date cash flow are different periods. Under first and latest, the filing is chosen for each metric and period, so neighbouring entries can come from different filings. History explains the four views and as_of.
curl --request GET \
--url https://api.numi.sh/v1/companies/{ref}/fundamentals/history \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.numi.sh/v1/companies/{ref}/fundamentals/history"
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.numi.sh/v1/companies/{ref}/fundamentals/history', 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.numi.sh/v1/companies/{ref}/fundamentals/history",
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.numi.sh/v1/companies/{ref}/fundamentals/history"
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.numi.sh/v1/companies/{ref}/fundamentals/history")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.numi.sh/v1/companies/{ref}/fundamentals/history")
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{
"data": {
"company": {
"cik": "0000789019",
"ticker": "MSFT",
"tickers": [
"<string>"
],
"name": "MICROSOFT CORPORATION",
"exchange": "Nasdaq",
"sic": "7372",
"sic_description": "Services-Prepackaged Software",
"state_of_incorporation": "WA",
"fiscal_year_end": "0630",
"filer_category": "Large accelerated filer",
"entity_type": "operating"
},
"period_type": "annual",
"view": "own",
"as_of": "2023-12-25",
"metric": "<string>",
"filings_checked": 1,
"reason": "not_covered",
"entries": [
{
"metric": "revenue",
"vintage": 1,
"concept": "RevenueFromContractWithCustomerExcludingAssessedTax",
"value": 123,
"unit": "<string>",
"currency": "USD",
"period_start": "2023-12-25",
"period_end": "2023-12-25",
"decimals": 123,
"filing": {
"id": 123,
"form_type": "10-K",
"filing_date": "2023-12-25",
"period_end": "2023-12-25",
"fiscal_year": 123,
"fiscal_period": "FY",
"period_type": "annual",
"is_amendment": true,
"extractor_version": "2026.11.1",
"has_segments": true,
"has_note": true,
"accession_number": "0000950170-25-100235",
"accepted_at": "2025-07-30T16:06:04.000Z",
"match_basis": "form_date_period",
"source_url": "<string>",
"document_url": "<string>"
}
}
]
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA",
"as_of": "2026-10-19T12:34:56.789Z"
}
}{
"error": {
"code": "bad_request",
"message": "limit: must be from 1 to 50"
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}{
"error": {
"code": "unauthorized",
"message": "The request has no API key. Send a numi API key in the X-API-Key header."
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}{
"error": {
"code": "sandbox_restricted",
"message": "TSLA is not in the sandbox. With a sandbox key, you can read 10 companies: MSFT, AAPL, NVDA, AMZN, GOOGL, META, NFLX, CVX, JPM and SONY. To read every company, upgrade to the Builder plan at https://numi.sh/account.",
"sandbox_companies": [
"MSFT",
"AAPL",
"NVDA",
"AMZN",
"GOOGL",
"META",
"NFLX",
"CVX",
"JPM",
"SONY"
]
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}{
"error": {
"code": "not_found",
"message": "The API has no route for GET /v1/nothing. Find the routes of the API at https://docs.numi.sh."
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "The sandbox plan has a limit of 20 requests a minute. Retry in 12 seconds.",
"retry_after": 12,
"scope": "minute"
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}Authorizations
A numi API key, sent in the X-API-Key header.
Path Parameters
The company, as a ticker such as MSFT or BRK.B, or as cik: and the digits of its CIK (the SEC's Central Index Key), such as cik:789019. A ticker matches in upper or lower case, and . and - match each other, so BRK.B and BRK-B are the same company.
^([Cc][Ii][Kk]:[0-9]{1,10}|[A-Za-z0-9.-]{1,16})$"MSFT"
Query Parameters
Annual filings (10-K, 20-F, 40-F) or quarterly ones (10-Q).
annual, quarterly How the history reads the filings. Without view, the value is own.
owngives each filing's own period, one entry per filing, amendments included.firstgives each fiscal period once, from the earliest filing in numi's data that carries it, in any vintage.latestgives each fiscal period once, from the newest filing that carries it, in any vintage: the latest recast series.allgives every period of every filing, vintages included.
How a history read the filings. own is each filing's own period, first the earliest filing that carries each fiscal period, latest the newest, and all every period of every filing.
own, first, latest, all A date as YYYY-MM-DD. Only filings with a filing date on or before it count, in every view. It is a snapshot by filing date, at day granularity, not a cut by the hour. A value that is not a date on the calendar, such as 2026-02-30, is a 400.
Returns this metric only, such as revenue or net_income. Without metric, the response has every metric.
revenue, cost_of_revenue, gross_profit, operating_income, net_income, eps_basic, eps_diluted, total_assets, total_liabilities, shareholders_equity, cash_and_equivalents, long_term_debt, operating_cash_flow, capital_expenditure "revenue"