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.