Sandbox
- 10 companies
- 250 requests a day
- 20 requests a minute
- The bulk sample
$0
Get a sandbox keyThe companies: MSFT, AAPL, NVDA, AMZN, GOOGL, META, NFLX, CVX, JPM and SONY.
Ask how much of a company's revenue comes from a product, a business or a region. You get the answer from its SEC filings, with each breakdown checked against the revenue the company reported.
AAPL Apple Inc.10-K, year to 2025-09-27, USD millions
srt:ProductOrServiceAxis
| iPhone | 209,586 | |
|---|---|---|
| Service | 109,158 | |
| Wearables Home and Accessories | 35,686 | |
| Mac | 33,708 | |
| iPad | 28,023 | |
| Sum of the rows | 416,161 | |
| Revenue reported | 416,161 |
Press "All in one list" to see what a source that drops the axis returns.
5,540 companies and 28,555 filings, extracted with plain code and no AI model. You can try 10 of the companies free in the sandbox, without a card.
All of it comes from the company's SEC filings, and you can get it over REST, MCP or bulk files.
Revenue for each business, product line and region, with operating income, assets and depreciation where the filing tags them.
One breakdown across every filing, with each restatement kept beside the filing it appeared in.
The text of the segment note, for when you need the context behind a number.
14 lines from the income statement, balance sheet and cash flow statement, as filed.
Every 10-K, 10-Q, 20-F and 40-F, annual and quarterly, with its dates and fiscal period, amendments marked.
Parquet and CSV of every table, rebuilt each day, for a notebook or a warehouse.
In a 10-K, the company breaks the same revenue down more than once: by operating segment, by product line and by region. Each breakdown adds up to total revenue on its own, and the company tags each one in XBRL as an axis. A source that drops the axis puts every row in one list, and in that list revenue is counted two or three times, with no warning.
Run the open-source checker on segment lists in JSON to see whether each axis adds up. It's under the MIT licence, on GitHub.
Here segments.json has two lists: Microsoft's rows from numi, and a list from a source that drops the axis. The second list has no ticker, so it appears as #2 in the output.
$ npx @numi-sh/reconcile segments.json
MSFT: reconciled, business 100.0%, product 100.0%, geography 100.0%
#2: mixed_axes_likely, 143.0% of totalA breakdown that misses its total is marked over or under, and it stays in the data with its numbers instead of being rounded into a pass.
The rows, with any reconciling items, come to 95% to 105% of the revenue the filing reports.
Microsoft's business segments come to 331,839 of 331,839 million, or 100.0%.
Above 105%, which usually means two breakdowns share one axis.
Meta lists US Canada
and United States
as separate regions, so US revenue counts twice: 275,746 of 200,966 million, or 137.2%.
Below 95%, which means the company tags rows for only part of its revenue.
Netflix tags one regional row, United States
, at 18,500 of 45,183 million, or 40.9%.
There's no total to check against, or no row has revenue.
Chevron's regional rows, United States
and Non-US
, have no revenue figure.
Ask for a company by ticker or CIK and an axis. Every row comes with its XBRL member, and every axis with its total and its result.
curl "https://api.numi.sh/v1/companies/MSFT/segments?axis=product" \
-H "X-API-Key: $NUMI_API_KEY"import os
from numi import AuthenticatedClient
from numi.api.default import get_segments
from numi.models import AxisName
client = AuthenticatedClient(
base_url="https://api.numi.sh/v1",
token=os.environ["NUMI_API_KEY"],
prefix="",
auth_header_name="X-API-Key",
)
with client:
answer = get_segments.sync(ref="MSFT", client=client, axis=AxisName.PRODUCT)
for axis in answer.data.axes:
print(axis.reconciliation.value, axis.coverage_ratio)import { createNumi } from 'numi-sh';
const numi = createNumi({ apiKey: process.env.NUMI_API_KEY ?? '' });
const { data } = await numi.GET('/companies/{ref}/segments', {
params: { path: { ref: 'MSFT' }, query: { axis: 'product' } },
});
for (const axis of data?.data.axes ?? []) {
console.log(axis.reconciliation, axis.coverage_ratio);
}The response, first two of 10 rows shown
{
"axis": "product",
"reconciliation": "reconciled",the result
"coverage_ratio": 1,sum of rows รท revenue
"revenue_total": 331839000000,
"currency": "USD",
"segments": [
{
"member": "msft:ServerProductsAndCloudServicesMember",
"label": "Server Products and Cloud Services",
"revenue": 129425000000,
"revenue_share": 0.390023
},
{
"member": "msft:MicrosoftThreeSixFiveCommercialProductsAndCloudServicesMember",
"label": "Microsoft 365 Commercial Products and Cloud Services",
"revenue": 101997000000,
"revenue_share": 0.307369
}
]
}
The MCP server works with Claude, ChatGPT, Cursor, Claude Code and any client that supports remote servers. In a client that supports OAuth you sign in with your account; in the others you add an API key.
Serverhttps://api.numi.sh/mcp
Open Settings, then Connectors, and add a custom connector with the server's URL.
Open Settings, then Apps and connectors, and add a connector with the server's URL.
Add the server to ~/.cursor/mcp.json:
{
"mcpServers": {
"numi": {
"url": "https://api.numi.sh/mcp",
"headers": {
"Authorization": "Bearer YOUR_NUMI_API_KEY"
}
}
}
}Run this in a terminal:
claude mcp add --transport http numi https://api.numi.sh/mcp --header "Authorization: Bearer YOUR_NUMI_API_KEY"Each of the 14 lines has the XBRL concept it came from, its unit and its period.
| Line | Value | Unit | XBRL concept |
|---|---|---|---|
| Revenue | 331,839 | USD millions | Revenue |
| Operating income | 155,237 | USD millions | Operating |
| Net income | 133,749 | USD millions | Net |
| Diluted earnings per share | 17.95 | USD per share | Earnings |
As of 2026-10-26, the data has 36,463 axes from 28,555 filings of 5,540 companies. 84.1% of all axes reconcile, and 63.2% of companies have a reconciled business or product axis in their latest annual report.
| Axis | Reconciled | Over | Under | Unknown | All |
|---|---|---|---|---|---|
| Business segments | 12,287 | 366 | 426 | 1,652 | 14,731 |
| Product lines | 11,061 | 611 | 1,104 | 675 | 13,451 |
| Regions | 7,309 | 499 | 312 | 161 | 8,281 |
| Every axis | 30,657 | 1,476 | 1,842 | 2,488 | 36,463 |
| Result | Business | Product | Regions | All |
|---|---|---|---|---|
| Reconciled | 12,287 | 11,061 | 7,309 | 30,657 |
| Over | 366 | 611 | 499 | 1,476 |
| Under | 426 | 1,104 | 312 | 1,842 |
| Unknown | 1,652 | 675 | 161 | 2,488 |
| Every axis | 14,731 | 13,451 | 8,281 | 36,463 |
You can use the data commercially on both plans, and start on the sandbox without a card.
$0
Get a sandbox keyThe companies: MSFT, AAPL, NVDA, AMZN, GOOGL, META, NFLX, CVX, JPM and SONY.
$20 a month
Start with BuilderPlus local tax where it applies.
Sign up, then upgrade from your account page.
sandbox_restricted.