Public data API
Everything this site publishes about a company — its history, the
management decisions that set its course, financial statements running
back decades, executives, shareholders, segments and headcount — is
also published as static JSON. There is no key and no
authentication: fetch any path below with a plain GET.
The files are flat objects on a CDN, so call them as often as you
need.
The archive covers 664 Japanese listed companies. Narrative fields — histories, commentary, event descriptions, shareholder and segment names — are written in Japanese; the descriptive metadata around them is in English. Translate the content with an LLM as needed.
Response schemas may change without notice. This is deliberate: agents reading these files are expected to interpret them through an LLM rather than a fixed parser, and to adapt.
Endpoints
{stock_code} is a company's four-digit Tokyo Stock
Exchange code. Every example below resolves it to 7974 —
Nintendo — so each link can be fetched as it stands. Relative paths
are against https://the-shashi.com.
| Method | Path | Returns | Scope |
|---|---|---|---|
| GET | /api/companies.json → /api/companies.json | All companies | Global |
| GET | /api/{stock_code}/manifest.json → /api/7974/manifest.json | Resource index | Per company |
| GET | /api/{stock_code}/history.json → /api/7974/history.json | History overview | Per company |
| GET | /api/{stock_code}/timeline.json → /api/7974/timeline.json | Chronology | Per company |
| GET | /api/decisions.json → /api/decisions.json | All management decisions (index) | Global |
| GET | /api/{stock_code}/decisions.json → /api/7974/decisions.json | Management decisions (index) | Per company |
| GET | /api/{stock_code}/decisions/{slug}.json → /api/7974/decisions/famicom-1983.json | One decision (full dossier) | Per company |
| GET | /api/{stock_code}/executives.json → /api/7974/executives.json | Executives | Per company |
| GET | /api/{stock_code}/shareholders.json → /api/7974/shareholders.json | Major shareholders | Per company |
| GET | /api/{stock_code}/financials.json → /api/7974/financials.json | Financial statements | Per company |
| GET | /api/{stock_code}/financials-longterm.json → /api/7974/financials-longterm.json | Long-term results | Per company |
| GET | /api/{stock_code}/segments.json → /api/7974/segments.json | Business segments | Per company |
| GET | /api/{stock_code}/regions.json → /api/7974/regions.json | Sales by region | Per company |
| GET | /api/{stock_code}/workforce.json → /api/7974/workforce.json | Workforce | Per company |
The common envelope
Every response opens with the same keys, before any payload. They come first so that a file still says what it is once it has been truncated, cached or detached from its URL. Character encoding is not declared: JSON is UTF-8 by definition.
| Key | Type | Meaning |
|---|---|---|
spec_version | string | Envelope generation. Currently 3. |
endpoint | string | Which endpoint this file is an instance of — workforce, segments, history … |
stock_code | string | The four-digit Tokyo Stock Exchange code. Absent on the two global endpoints. |
company_name | string | Registered Japanese name. Absent on the two global endpoints. |
content_lang | string | BCP 47 language of the content itself (titles, events, narrative). ja throughout. |
meta_lang | string | BCP 47 language of the descriptive metadata (labels, descriptions). en throughout. The two differ by design. |
canonical_url | string | The human-readable page this data belongs to. Cite this URL, not the JSON. |
api_url | string | This file's own path. |
updated | string (date) | When the content last changed — not when the file was last regenerated. |
license | string | © 2026 Yutaka Sugiura. All rights reserved. |
attribution | string | Suggested citation line. If you surface this data to a reader, show it with a link to canonical_url. |
source | object | Provenance of the numbers. Present on the data endpoints; absent on the narrative ones, which carry their citations inline. |
On the numeric endpoints the envelope carries source,
which says where the figures came from:
| Key | Type | Meaning |
|---|---|---|
source.primary | string[] | The primary sources behind the file, in Japanese — securities reports, company yearbooks and the like. Where rows carry their own source column it is computed from the rows actually used. |
source.extraction | string | How the source became data, e.g. machine extraction from EDINET XBRL. |
source.row_field | string | Name of the per-row field holding that row's own source. Prefer it over primary when attributing a single figure. |
source.caveat | string | What to watch for in these numbers — changing units, disclosure-segment breaks, consolidation scope. |
A worked example
GET https://the-shashi.com/api/7974/workforce.json
— the envelope, the provenance block, then the rows. Trimmed to a
single row here; the live file carries one per fiscal year.
{
"spec_version": "3",
"endpoint": "workforce",
"stock_code": "7974",
"company_name": "任天堂",
"content_lang": "ja",
"meta_lang": "en",
"canonical_url": "https://the-shashi.com/tse/7974/workforce/",
"api_url": "/api/7974/workforce.json",
"updated": "2026-08-05",
"license": "© 2026 Yutaka Sugiura. All rights reserved.",
"attribution": "The社史 (the-shashi.com) — https://the-shashi.com/tse/7974/workforce/",
"source": {
"primary": ["有価証券報告書(従業員の状況)"],
"extraction": "EDINET の XBRL から機械抽出",
"caveat": "平均年間給与・平均年齢は提出会社(単体)ベース。従業員数は連結/単体を列で区別している"
},
"employee": [
{
"FY": "FY05",
"period": "2006/3",
"consolidated_employees": null,
"non_consolidated_employees": 1348,
"avg_salary": 8995,
"avg_age": null
},
…
]
} Response shapes
What each endpoint carries beyond the common envelope. Fields that can
be absent are marked as such — a company is only as complete as its
filings, and null means the year was not disclosed, never
that the figure was zero.
/api/companies.json
The first call to make. Carries the public endpoint catalog and a minimal index of every company in the archive, in one request. Follow manifest.json for the detail of any one company.
Try it — https://the-shashi.com/api/companies.json
| Key | Type | Meaning |
|---|---|---|
version | string | API generation. Currently 3. |
base | string | https://the-shashi.com — prefix for every relative path in the response. |
endpoints[] | object[] | The endpoint catalog: id, method, path, label, description, scope (global | company), format (json | csv). This page is a reading of that catalog. |
contents[] | object[] | One entry per company: stock_code, name, name_en, industry, industry_detail. |
/api/{stock_code}/manifest.json
What exists for this company and where it lives. Read it before fetching anything else — resources tells you which endpoints are populated, and how much text each holds.
Try it — https://the-shashi.com/api/7974/manifest.json
| Key | Type | Meaning |
|---|---|---|
version | string | API generation. |
profile | object | company_color, industry, industry_detail, published, updated, old_name, name_kana, old_name_kana. |
profile.found | object | year, location, founder — the founding record. |
profile.listing | object | listed_year, delisted_year (nullable), unlisted (boolean). |
resources | object | Keyed by endpoint name (history, timeline, decisions, executives, shareholders, financials, financials-longterm, segments, regions, workforce, plus the three CSV mirrors). Each holds is_active, url, format, description and chars_ja — the character count of its Japanese text. |
resources.decisions.items[] | object[] | The catalog of this company's per-decision endpoints: slug, title, year, type, url, chars_ja. This is how you learn which slugs exist. |
resources.decisions.by_type[] | object[] | key, count, url — links to the per-theme index files. |
resources.decisions.by_decade[] | object[] | key, count, url — links to the per-decade index files. |
/api/{stock_code}/history.json
The corporate history essay, in chapters, with the summary and the key-question Q&A that sit at the top of the company page. The single largest text payload — tens of thousands of Japanese characters for a well-covered firm.
Try it — https://the-shashi.com/api/7974/history.json
| Key | Type | Meaning |
|---|---|---|
title | string | Title of the history. |
sections[] | object[] | Chapters, oldest first: start_year, end_year, main_title, subsections. |
sections[].subsections[] | object[] | title, text (the prose, paragraphs separated by \n\n), references, charts, factBasis. |
summary | object | title, text, and qa — the key questions. |
summary.qa[] | object[] | q, a, factBasis. |
auditVersion | number | Which revision of the fact-audit the text has been through. |
/api/{stock_code}/timeline.json
The company chronology — one row per dated event, oldest first.
Try it — https://the-shashi.com/api/7974/timeline.json
| Key | Type | Meaning |
|---|---|---|
timeline[] | object[] | One event per row. |
timeline[].date | string | Year, or year and month as 1947/11. Not a full ISO date — early events are only known to the year. |
timeline[].importance | number | 1–3. 3 marks the events that changed the company's course. |
timeline[].event | string | The event, in Japanese. |
timeline[].source | string | null | That row's own source. |
timeline[].link | string | Present when the event has a full decision dossier. Points at the human page. |
/api/decisions.json
Every published management decision across every company, with facet counts for type, tags, regions and decade. It holds no body text: filter here, then follow api_url for the dossier. It is a multi-megabyte file — if you already know the company, fetch that company's index instead.
Try it — https://the-shashi.com/api/decisions.json
| Key | Type | Meaning |
|---|---|---|
count | number | Decisions in the index. |
company_count | number | Companies represented. |
description | string | How the index is meant to be used. |
facets | object | types, tags, regions, decades — each an array of { key, count }. Decade keys read 1980s. |
decisions[] | object[] | code, company_name, industry, slug, decision_id, year, month, title, subtitle, type, tags[], regions[], status, status_label, decider, summary, url, api_url, last_updated. |
/api/{stock_code}/decisions.json
Which decisions this company has, and where each one lives. Index only — no body text. One decision is one endpoint, so follow api_url for the dossier you want rather than pulling them all.
Try it — https://the-shashi.com/api/7974/decisions.json
| Key | Type | Meaning |
|---|---|---|
count | number | Decisions for this company. |
description | string | How the index is meant to be used. |
decisions[] | object[] | slug, url, api_url, year, month, type, title, subtitle, status, status_label — oldest first. |
by_type[] | object[] | key, count, url — the same decisions narrowed to one theme. |
by_decade[] | object[] | key, count, url — the same decisions narrowed to one decade. |
/api/{stock_code}/decisions/{slug}.json
One management decision, in full: the structured header, a chaptered narrative running background → the decision → what came of it, and every primary source the narrative rests on. This is the unit of retrieval. Slugs come from the company's decisions.json or from manifest.json.
Try it — https://the-shashi.com/api/7974/decisions/famicom-1983.json
| Key | Type | Meaning |
|---|---|---|
slug, url, year, month | string / number | Identity and date. month is null when only the year is known. |
decision_id, schema_version | string | Stable identifier, and the schema generation of the dossier itself. |
type, tags[], regions[] | string / string[] | Classification — founding, m_and_a, restructuring, capital, alliance and so on. |
title, subtitle, issue | string | Headline, standfirst, and the question the decision answered. |
status, status_label | string | Machine key and its Japanese label, e.g. implemented. |
scheme, ratio | string | null | Deal structure and exchange ratio, where the decision was a transaction. |
decider[] | object[] | name, role — who made the call. |
highlights[] | object[] | label, text — the points worth knowing before reading on. |
parties[] | object[] | stock_code, name, role, at_deal — the counterparties, linked to their own pages where they are listed. |
dates | object | reported, announced, agreed, closed, terminated. Each nullable. |
breakdown | object | Deal economics, where they are known. |
timeline[] | object[] | year, month, title — the run-up and aftermath. |
snapshot | object | Where the parties stood in the fiscal year of the decision: fiscal_year, source, and companies[] with sales, profits, president, headquarters. |
report[] | object[] | The narrative. section, label, subsections[] — each subsection carries sub_title and paragraphs[]. |
references[] | string[] | Every primary source, de-duplicated. Verbatim quotations are not part of the API; the human page at url carries the quoted passages. |
authored, last_updated | string (date) | When the dossier was written, and when it last changed. |
/api/{stock_code}/executives.json
The board, three ways: who sat on it each year, what each member did before, and who they are now.
Try it — https://the-shashi.com/api/7974/executives.json
| Key | Type | Meaning |
|---|---|---|
executives[] | object[] | One row per fiscal year. FY holds the year; every other key is an officer's name, and its value is the title that officer held that year (null when they were not on the board). The key set is therefore per company, not fixed. |
careers[] | object[] | name, sort_index, year_month, description, linked_codes — one row per career step, in Japanese. linked_codes carries the stock codes named in that step. |
officer[] | object[] | name, as_of, birthdate, role, first_career, shares_held, romaji, specialty — the board as of the latest filing. |
/api/{stock_code}/shareholders.json
Who owns the company, by fiscal year — the named top holders, the ownership mix by holder category, and the long-run series reaching back before the electronic filings.
Try it — https://the-shashi.com/api/7974/shareholders.json
| Key | Type | Meaning |
|---|---|---|
shareholders[] | object[] | FY, period, rank, name, shareholding_ratio (per cent), shares_held. Holder names are in Japanese, custodians included. |
categories[] | object[] | FY, period, category_key, category, shareholders (holder count), shares_units, ratio. category_key is an English key — government, financial, financial_service, other_corporation, foreign_corporation, foreign_individual, individual, total — so the mix can be read without translating category. |
long_term[] | object[] | The same top-holder series carried further back: adds company_name_at_period (the company's name at that time), total_shares and a per-row source. |
commentary[] | object[] | heading, paragraphs[] — the written reading of the ownership structure, in Japanese. |
long_term_commentary[] | string[] | Notes on the long-run series, in Japanese. |
/api/{stock_code}/financials.json
Profit and loss, balance sheet and cash flow from FY01 onward, as filed. Every row states its own unit, accounting standard and consolidation scope, because all three change over a long series.
Try it — https://the-shashi.com/api/7974/financials.json
| Key | Type | Meaning |
|---|---|---|
financials[] | object[] | P&L: sales, cost_of_sales, sga, cost_others, gross_profit, operating_profit, ordinary_profit, extraordinary_income, extraordinary_loss, net_profit. |
bs[] | object[] | Balance sheet: total_assets, equity, interest_debt, securities, goodwill, intangible_assets, short_debt, long_debt, bond. |
cf[] | object[] | Cash flow: operating_cf, investing_cf, financing_cf, cash_equivalents. |
pl_detail[], bs_detail[] | object[] | Finer line items. Present only for companies whose filings carry them. |
…[].FY, period | string | FY25 and 2026/3 — the fiscal year label and the month it ended. |
…[].unit | string | The unit the row's figures are in, in Japanese: 百万円 (millions of yen), 千円 (thousands). It changes across a long series — read it per row, never assume. |
…[].accounting_standard | string | JGAAP, IFRS or US. |
…[].consolidation | string | 連結 (consolidated) or 単体 (parent-only). |
…[].{field}_jp | string | The Japanese label of the line item as it appears in the filing — the caption, not a second figure. sales carries the number; sales_jp carries 売上高. |
/api/{stock_code}/financials-longterm.json
The long series — sales, profit and headcount from as close to the founding as the record allows, stitched together from company yearbooks and pre-electronic filings. This is the endpoint to use for anything spanning decades.
Try it — https://the-shashi.com/api/7974/financials-longterm.json
| Key | Type | Meaning |
|---|---|---|
history[] | object[] | One row per fiscal year, oldest first. |
history[].year, month | number | The fiscal year and the month it closed. |
history[].company_name | string | The company's name in that year — it changes across a long series. |
history[].sales, operating_profit, ordinary_profit, net_profit | number | null | The figures. null where the year was not disclosed; do not read null as zero. |
history[].net_margin | number | null | Net profit over sales, per cent. |
history[].employees | number | null | Headcount as reported that year. |
history[].unit, consolidation, accounting_standard | string | Same meaning as on financials.json, and just as variable across the series. |
history[].reference | string | That row's own source. Named per row because the series is assembled from many. |
/api/{stock_code}/segments.json
Sales, profit and assets by reporting segment. Segment names are the company's own, in Japanese, and they are redrawn whenever the company reorganises — a break in the names is a break in the series, not an error.
Try it — https://the-shashi.com/api/7974/segments.json
| Key | Type | Meaning |
|---|---|---|
segment[] | object[] | FY, period, unit, accounting_standard, consolidation, segment, sales, profit, assets. |
segment[].segment | string | The segment name, in Japanese. セグメントなし marks a year with no segment disclosure. |
/api/{stock_code}/regions.json
Sales by geographic region, on the company's own regional grouping.
Try it — https://the-shashi.com/api/7974/regions.json
| Key | Type | Meaning |
|---|---|---|
region[] | object[] | FY, period, unit, accounting_standard, consolidation, region, sales. |
region[].region | string | null | The region name, in Japanese — 日本, 南北アメリカ, 欧州 and so on. null in years with no regional disclosure. |
/api/{stock_code}/workforce.json
Headcount and pay, from the employee section of the securities report. Headcount is given both consolidated and parent-only; pay and age are parent-only, as filed.
Try it — https://the-shashi.com/api/7974/workforce.json
| Key | Type | Meaning |
|---|---|---|
employee[] | object[] | One row per fiscal year. |
employee[].consolidated_employees | number | null | Group headcount. null before the company began disclosing it. |
employee[].non_consolidated_employees | number | null | Parent-company headcount. |
employee[].avg_salary | number | null | Average annual pay, in thousands of yen. 10060 means ¥10.06m. |
employee[].avg_age | number | null | Average age in years, to one decimal. |
Narrowed indexes and CSV mirrors
Five further paths exist. The first two are the decision index cut by theme or by decade; the rest are CSV copies of data already served as JSON, kept for spreadsheets.
| Method | Path | Returns | Notes |
|---|---|---|---|
| GET | /api/{stock_code}/decisions/by-type/{type}.json → /api/7974/decisions/by-type/founding.json | Decisions by theme | The company's decisions narrowed to one type. Same entry shape as decisions.json; keys and counts are listed under by_type there. |
| GET | /api/{stock_code}/decisions/by-decade/{decade}.json → /api/7974/decisions/by-decade/1980s.json | Decisions by decade | The same, narrowed to one decade. Keys and counts are listed under by_decade. |
| GET | /api/{stock_code}/financials.csv → /api/7974/financials.csv | Financials CSV | CSV mirror of financials.json. Offered for spreadsheets; the JSON is the better source. |
| GET | /api/{stock_code}/financials_history.csv → /api/7974/financials_history.csv | Long-term results CSV | CSV mirror of financials-longterm.json. |
| GET | /api/{stock_code}/segments.csv → /api/7974/segments.csv | Segments CSV | CSV mirror of segments.json. |
Using the data
Start at the top. Fetch
/api/companies.json for the company index and the
endpoint catalog, then a company's manifest.json to see
what it actually has. Both are small. Going straight to
/api/decisions.json pulls several megabytes you probably
do not need.
Delivery. Files are served from CloudFront as static
objects with ETag and Last-Modified, so
conditional requests work. The updated field in the
envelope is the better change signal: it moves when the content
changes, not when the file was regenerated.
Attribution. The data is © 2026 Yutaka Sugiura, all
rights reserved. If you surface any of it to a reader, show the
attribution line with a link to the response's
canonical_url. Commercial redistribution is not
permitted; see the disclaimer below.
The Japanese edition of this page carries the same specification as an OpenAPI 3.1 document. Back to the English edition.