Docs menuexpand_more
Data quality
Where every number comes from, and how fresh it is
Listings and coverage were counted on 2026-10-20 from /stable/stock-list and /stable/industry-benchmarks in the dev environment. Coverage is stocks with a computable ROE (3,745) divided by all stocks (4,014). The endpoint count comes from /openapi.json, and the test count from the API software’s automated tests (a vitest run of the backend).
1. Coverage
We cover 4,568 stocks, ETFs and REITs listed on the Tokyo, Nagoya, Fukuoka and Sapporo exchanges.
domain4,568 listings
4,014 stocks, 491 ETFs and 63 REITs. By exchange: Tokyo 4,454, Nagoya 65, Fukuoka 30, Sapporo 19.
table_chartFinancial data coverage
Of 4,014 stocks, 3,745 (93%) have an ROE computable from the latest results and 3,772 (94%) a computable PBR. ROE needs both net income and equity, so it is a good proxy for how complete the financial data is.
| Data | Source | Scope and history | Updates |
|---|---|---|---|
| Financial statements (P/L, B/S, cash flow, metrics) | TDnet earnings releases and EDINET annual reports | Example: Toyota Motor has 13 full years from 2014-03 to 2026-03, plus quarters. Ranges vary by company | Daily (around 16:30 for releases, 19:00 for annual reports) |
| Dividends (actual, forecast, changes, streaks) | TDnet earnings releases and dividend forecast revisions | Example: Mitsubishi Corp. has 41 records since 2013-03. Split-adjusted, with the unadjusted amount alongside | Daily (around 16:30) |
| Structured annual report data (major shareholders, directors, pay, strategic holdings, subsidiaries, segments, human capital, narrative text) | EDINET annual securities reports | Per filed report (once a year). The latest report by default; most endpoints accept a fiscal period for earlier reports | Daily (around 19:00) |
| Timely disclosures, extraordinary reports, large holdings, events | TDnet and EDINET | Disclosure lists with document IDs and links to the originals | About hourly (delivery cache 15 to 30 minutes) |
| Daily prices (split-adjusted) and price-based metrics | Exchange price data (adjustments and metrics calculated in-house) | From January 2010 (e.g. Toyota Motor from January 4, 2010) | Daily (end-of-day, around 16:30) |
| Listings (stocks, ETFs, REITs) | Listed company information | 4,568 listings (4,014 stocks, 491 ETFs, 63 REITs) | Rebuilt Mon to Sat at 16:45 and 19:45 |
| Economic indicators and the Fear & Greed index | FRED (Federal Reserve Bank of St. Louis) and in-house calculation | Varies by series | FRED every 6 hours; Fear & Greed every minute |
History lengths are examples measured in the dev environment on 2026-10-20.
2. Field coverage
For key fields: the share of rows with a value, together with the denominator, the period basis and why values are missing.
Coverage is the share of values that are present, not a measure of correctness. Blanks are correct for items such as operating income at banks and insurers, ordinary income under IFRS or US GAAP, and the payout ratio in loss-making years. The denominator excludes 218 companies without a full-year result yet (including 186 on TOKYO PRO Market and 25 listed within the last 12 months). The 10-year rate counts company × year cells over each company's last ten full years.
| Field | Coverage (latest full year) | Last 10 years | Denominator | Period basis | Main reasons for missing values |
|---|---|---|---|---|---|
Revenue (incl. operating / ordinary revenue) revenue | 99.3% | 99.7% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) |
|
Operating income operatingIncome | 96.6% | 96.8% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) |
|
Ordinary income ordinaryIncome | 91.6% | 93.5% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) |
|
Net income attributable to owners netIncome | 99.6% | 99.9% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) |
|
Total assets totalAssets | 99.9% | 100.0% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) |
|
Equity ratio equityRatio | 100.0% | 100.0% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) | |
EPS eps | 99.6% | 99.9% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) |
|
BPS bps | 99.5% | 99.7% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) |
|
Dividend per share (actual) dividendPerShare | 97.7% | 99.2% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) |
|
Payout ratio payoutRatio | 85.6% | 86.2% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) |
|
Operating cash flow operatingCashFlow | 99.5% | 99.9% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) |
|
Investing cash flow investingCashFlow | 99.4% | 99.8% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) |
|
Financing cash flow financingCashFlow | 99.0% | 99.6% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) |
|
ROE roe | 98.8% | 99.1% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) |
|
ROA roa | 98.9% | 99.4% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) |
|
Employees (from annual reports) employees | 95.3% | 98.1% | 3,796 listed equities with a latest full-year result | Latest full year (fiscal periods from April 2025) |
|
Measured as of 2026-10-20.
3. Update schedule (JST)
For each kind of data we define when it should have been updated by, and watch for delays.
| Time (JST) | What happens |
|---|---|
| Every 15 minutes | Each dataset is checked for changes; when the data has changed, its version (X-Data-Version) and point in time (asOf) advance together. Freshness is judged on these values. |
| Hourly | Expected update for timely disclosures, extraordinary reports and the events feed (flagged as late if not updated 15 minutes after) |
| 16:30 | Expected daily update for TDnet-based data (earnings release financials, dividends, prices, profiles) |
| 16:45 / 19:45 (Mon to Sat) | Snapshots for whole-market data (listings, screener, rankings, earnings and dividend calendars, sector comparisons) are rebuilt |
| 19:00 | Expected daily update for EDINET-based data (annual report financials, major shareholders, directors, narrative text and more) |
| 3:15 / 9:15 / 15:15 / 21:15 | Economic indicators are synced from FRED. Roughly the last three years are re-fetched every time, so retroactive revisions are picked up |
All times are Japan Standard Time. Expected update times are the monitoring threshold (“should have been updated by”); if the source (TDnet or EDINET) publishes late, our update follows.
4. Freshness you can check
Response headers and public monitoring endpoints let your code check how current the data is. We track the update time of 72 datasets (a separate count from the number of endpoints or MCP tools).
| Header | Meaning |
|---|---|
| X-Data-Version | Dataset version. It advances when the source updates, and a new version switches the delivery cache over |
| X-Data-As-Of | The point in time of the data used to build that version (a UTC timestamp; the latest trading date for prices) |
| X-Dataset | Which dataset the response came from (same id as in the freshness list) |
| X-Cache | Whether the delivery cache was hit (HIT / MISS) |
| Server-Timing | On a cache miss, a breakdown of processing time (version check, source read and so on) |
monitor_heart/stable/system/freshness and /stable/system/status
Neither needs an API key. freshness returns, per dataset, the expected update time, asOf, age in seconds and a stale flag; status returns overall health and the number and names of late datasets.
curl "https://api.zenithcode.net/stable/system/freshness" curl "https://api.zenithcode.net/stable/system/status"
Stale rule: a dataset is stale if asOf is older than the most recent expected update time. Expected times include a grace period of 60 minutes for daily data and 15 minutes for hourly data.
One freshness row (fetched from the dev environment on 2026-10-19)
{
"id": "income-statement",
"group": "financials",
"path": "/stable/income-statement",
"expected": "daily-16:30-JST",
"ttlSec": 21600,
"asOf": "2026-10-19T13:24:17.564Z",
"ageSec": 17886,
"expectedAt": "2026-10-19T07:30:00.000Z",
"stale": false
}5. Provenance
Every response lets you trace which filing a number came from.
- check_circleEach financial statement row carries provenance (source, document ID, publication time, link to the original PDF). source is tdnet (earnings release) or edinet (annual or quarterly report, etc.). For older periods where the detailed statement is not available and values come from the summary of business results or the earnings release summary, that document is the source and basis: "summary" is set. When different items come from different documents, fieldSources lists the document for each item (for example, revenue from the annual report and operating income from the earnings release). Rows whose source document is not known have provenance null. In a 2026-10-21 sample (40 companies, 2,936 rows with values), 99.9% of rows had a source document and a link to the original.
- check_circleAnnual-report data such as major shareholders, directors and strategic holdings carries the document ID (docId) and the EDINET URL of the original.
- check_circleDisclosure lists, dividend changes, dividend policies and shareholder benefits carry the TDnet document ID and a PDF link. Dividend history and stock splits carry no document ID; dividends only carry dataSource (where the data was ingested from). Prices and computed metrics are not built from documents, so they have no source document.
- check_circleMCP returns the same responses, so you can trace a number in an AI answer back to the original filing.
- check_circleLinks to original PDFs go through ZENITH Code (/stable/filing-document, API key required). When a PDF is not available the link is null; we do not return links that cannot be opened.
- check_circleCorrections: when a company files a correction, we replace values with the newer filing. In financial statements, categories replaced by an amended earnings release carry amended: true and the amending document (amendedDocId, amendedArchiveUrl) in provenance; docId stays the original. For annual-report data, docTypeCode 130 tells you the values come from an amended report. When the data platform fixes an ingestion error, values are also replaced; the API does not expose a flag or the previous value for these fixes. Values ZENITH Code withholds as obvious scale errors are returned as null with a reason (sharesNote, suppressedFields).
From an income-statement sample response (Toyota Motor)
{
"symbol": "7203",
"fiscalPeriod": "2026-03",
"provenance": {
"source": "edinet",
"docId": "S100Y8NY",
"announcedAt": "2026-06-10T06:33:00Z",
"sourceUrl": "https://disclosure2.edinet-fsa.go.jp/WZEK0040.aspx?S100Y8NY",
"archiveUrl": "https://api-dev.zenithcode.net/stable/filing-document?docId=S100Y8NY&type=pdf"
}
}6. Statement hierarchy (the tree as filed)
/stable/financial-statement-full returns the balance sheet, income statement, cash-flow statement, statement of changes in equity (SS), comprehensive income (CI) and the kessan tanshin (earnings summary) summary as the presentation tree of the filing (XBRL). You can also check which line a standardized value came from.
merge_typeAccount-name normalization
Line items (XBRL tags) that differ by company and accounting standard are mapped to common standard items. Standard and Short fields use these normalized values, and you can trace each one back to its filing row through the as-filed tree below and the standard key (master_key). Company-specific items that cannot be mapped are kept in their as-filed form.
Counts of items with disclosure tags mapped in our normalization definitions as of 2026-10-23. This does not mean every company and period has every item (see the coverage table above).
Reproduce the statement exactly as filed
Order (sort), depth, parent (parent_key) and line names (label_ja) match the filing, so you can rebuild the table the company published.
Company-specific line items are kept
Industry- or company-specific lines (e.g. receivables related to financial services) are filed under the company’s own extension tags. Lines that disappear in standardized fields are returned here with their original_tag.
Check subtotals
With is_subtotal and parent_key you can add up child lines and compare them with the subtotal line — useful for checking ingestion and signs, or as the basis of your own aggregation.
Linked to standardized fields
Lines with a master_key map to standardized fields in income-statement, balance-sheet-statement and so on, so you can trace which line a standardized value came from.
| Field | Meaning |
|---|---|
depth | Depth in the tree; 1 is the top level (Summary and SS may start at 0). |
parent_key | The tree_tag of the parent line; null at the top level. |
sort | Display order in the filing; sort ascending to get the original order. |
is_abstract | A heading-only line; it has no value, so value is null. |
is_subtotal | A total or subtotal line; heading lines are also true. |
original_tag | XBRL tag in the filing. Tags starting with jppfs_cor_, jpigp_cor_, jpcrp_cor_ etc. are standard taxonomy; others (e.g. tse-qcediffr-72030_…) are the company’s extension tags. |
label_ja | The line name given by the company; label_en is the English name and may be empty. |
master_key | The mapped ZENITH Code standardized field (e.g. cash_and_equivalents); null for company-specific lines and similar. |
context_id | The XBRL context (instant or duration), e.g. CurrentQuarterInstant (quarter end) or CurrentYTDDuration (year to date); null on headings. |
source | How the value was obtained: xbrl is taken from the filing, calculated is a subtotal filled in by calculation. |
value | The amount in JPY. Ratios in the Summary are 0–1 decimals (0.104 in the API, 10.4% on screen). Outflows are negative, as disclosed. |
Example: the first lines of the income statement and balance sheet of 7203, 2026-06 Q1 (sample response fetched on 2026-10-23). Amounts are in ¥100 millions.
Income statement (PL)
| Line (depth, tag) | Amount (¥100 mn) |
|---|---|
営業収益HeadingExtension depth=1 · tse-qcediffr-72030_SalesRevenuesIFRSAbstract_pl | — |
Sales of productsExtension depth=2 · tse-qcediffr-72030_SalesOfProductsIFRS_pl | 121,423 |
Financing operationsExtension depth=2 · tse-qcediffr-72030_FinancingOperationsIFRS_pl | 13,831 |
Total net revenuesSubtotalExtension depth=2 · tse-qcediffr-72030_TotalNetRevenuesIFRS_pl | 135,254 |
売上原価並びに販売費及び一般管理費HeadingExtension depth=1 · tse-qcediffr-72030_CostsAndExpensesIFRSAbstract_pl | — |
Balance sheet (BS)
| Line (depth, tag) | Amount (¥100 mn) |
|---|---|
資産Heading depth=1 · jpigp_cor_AssetsIFRSAbstract_bs | — |
Current AssetsHeading depth=2 · jpigp_cor_CurrentAssetsIFRSAbstract_bs | — |
Cash and Cash Equivalentscash_and_equivalents depth=3 · jpigp_cor_CashAndCashEquivalentsIFRS_bs | 103,431 |
Notes and Accounts Receivablenotes_and_accounts_receivable depth=3 · jpigp_cor_TradeAndOtherReceivablesCAIFRS_bs | 40,196 |
Receivables related to financial servicesExtension depth=3 · tse-qcediffr-72030_ReceivablesRelatedToFinancialServicesCAIFRS_bs | 140,863 |
Sample responses keep only the first few items of long arrays, so the tree is cut short; real responses contain every line. “Extension” marks a company-specific tag; a tag such as cash_and_equivalents shows the mapped standard field (master_key).
Related: /stable/financial-statement-full · How metrics are calculated
7. Testing and verification
Both the API’s shape and its data are protected in two ways. First, automated tests of the ZENITH Code API and MCP software itself: 1,756 tests in 74 files, all run before each deploy (as of 2026-10-20). Second, checks in the data pipeline: at 19:20 JST every business day, 179 checks run across the data for every stock, and each ingested filing goes through 7 separate checks. Items 1–5 below are software tests; item 6 is a check on live data.
OpenAPI completeness
Checks, against the /openapi.json actually served, that every public endpoint has auth, English and Japanese descriptions, a token cost, a freshness registration and a response schema. Also checks that MCP tools only use endpoints and parameters that exist.
Schema cross-check
Compares the columns the API reads with the production database’s column list. A single non-existent column would break every endpoint reading that table, so the definitions are pinned to the audited column list.
Every route
Sends a representative request to every endpoint and checks the success response, required-parameter validation, the empty-data response, CSV output and Japanese labels.
MCP end-to-end
Sends tool listing and tool calls to the MCP server and checks that calls go through real auth and quota to the right endpoint, and that errors are flagged correctly.
Freshness logic
Tests the expected-time, grace and versioning calculations for daily, hourly, weekly and every-n-hours schedules.
Live-data smoke test (85 endpoints)
Calls 85 endpoints against live data in the dev environment and lists the HTTP status, row count, cache status, data version and asOf, and response time. Every public endpoint is covered, including shareholder benefits, dividend policies and document files (filing-document), except the two system endpoints that return service status and freshness.
ruleHow we handle the data
- check_circleDividends and prices are split-adjusted, and dividends also carry the unadjusted amount (rawAmount).
- check_circleDividend streaks are calculated in-house from annual dividends, and the response says whether they match the separately counted value (matchesReported).
- check_circleExtreme outliers are excluded or set to null so they do not distort comparisons and rankings (for example, rankings exclude ROE above 100%).
- check_circleItems a company does not disclose are returned as null, never estimated.
- check_circleWe only deliver public disclosures (TDnet and EDINET), data from sources whose rights we have confirmed, and metrics we calculate ourselves.
8. Current limitations
What the data does not do, and what to keep in mind.
Prices are end-of-day only; there are no real-time intraday prices. Price history starts in January 2010.
How far back financials and dividends go varies by company. Recently listed companies start from their post-listing disclosures.
Annual-report data (major shareholders, directors, human capital and so on) updates when the yearly report is filed, not every quarter.
Errors or corrections in the source data (TDnet, EDINET) can affect our data.
Figures on this page were measured on 2026-10-20. We do not warrant the accuracy, completeness or timeliness of the data. Investment decisions are your own responsibility (see the Terms of Service).
conveyor_beltHow the data is made, in detail
We have written up where our shareholder-benefit and dividend-policy data comes from and how it is checked before it is published.
Read how benefits and dividend policies workarrow_forwardSee the data for yourself
The endpoint list and sample responses are open without signing in.

