---
title: "Disclosed major shareholders of an EDINET securities-report filer"
method: GET
path: "/v1/shareholders"
tags: ["Disclosure"]
---

# Disclosed major shareholders of an EDINET securities-report filer

`GET /v1/shareholders`

## Request

- Base URL: `https://jp-verify.obolpay.xyz`
- URL: `https://jp-verify.obolpay.xyz/v1/shareholders`
- Auth: one of:
  - none
  - API key in header `X-API-Key`

The 「大株主の状況」 table a 有価証券報告書 / 半期報告書 filer publishes on EDINET,
keyed by 法人番号 — facts as filed, never a determination.

**Honest scope.** What is published about a company's owners depends on its legal
form. A 株式会社's 株主名簿 is inspectable by its own shareholders and creditors, on a
stated reason (会社法 125条2項) — the route the Act gives an outsider is a 親会社社員's,
with a court's permission (125条4項) — and its shareholders are not among the
registered items (会社法 911条3項). A 持分会社 keeps no 株主名簿, and the members who
execute its business and represent it ARE registered items (会社法 914条六・七 for a
合同会社), a public record this service does not carry. Major-shareholder facts of the
kind this endpoint serves therefore exist only for corporations that file a
有価証券報告書 or 半期報告書 — MEASURED 4,918 code-list rows / 4,917 distinct 法人番号
on the 2026-09-18 list, 0.098 % of 5,009,012 active corporations. For any other
法人番号 this endpoint answers with a structured **no-public-disclosure certificate**
(`status: no_public_disclosure`) that cites those provisions — each with the legal
form it holds for — and the code-list date it was checked against; it never says the
corporation has no shareholders.

**Privacy (mode A).** A holder is named only when it is positively an organisation —
resolved to exactly one active 法人番号 by exact name match, or carrying an
organisation marker from a pinned table. Every other holder is served as
`unresolved` with rank, share count and ratio only; its published name and the
address column of every row are discarded in memory at parse time and are never
stored, logged, signed or served. A row whose name cell was nil or empty in the
filing is `unknown` — likewise nameless, and withheld by the same gate. Per-ROW
figures for holders served without a name go only to a key whose onboarding recorded
the Terms Art. 7(3) representation while the operator's counsel record is in place;
every other caller — and always the sandbox — receives them in aggregate
(`holders_form: "aggregate"`, with the reason beside it).

1 unit on every tier including the sandbox; a 400, a 404 (`doc_id` not retained) and
a 503 (no sidecar) are free. The 404 body is `{error, corporate_number, hint}` — it
does NOT carry `filings[]`, which is part of the metered answer.

## Query parameters

- `corporate_number` string: a 13-digit 法人番号 (Corporate Number, check-digit validated)
- `t_number` string: alternative input: T + 13-digit 法人番号
- `as_of` string: YYYY-MM-DD — select the latest retained filing submitted on or before this date (what a reader could have seen then); the holdings themselves are as of the filing's own basis_date
- `doc_id` string: select one retained filing by its EDINET docID (書類管理番号); a docID this deployment does not retain is a free 404 that carries no document index
- `sign` integer: Ed25519-signed record (Growth/Reseller keys)

## Headers

- `X-API-Key` string

## Response `200`

The filer's 「大株主の状況」 table, or a structured statement of why none is published. Both generated examples are real responses of this code on a synthetic sidecar.

- unknown

## Other responses

- `400`: Malformed input — refused before metering; nothing was charged.
- `401`: Unknown, inactive, or expired API key.
- `404`: `doc_id=` names a document this deployment does not retain for this corporation. The reference is bad, not the answer: nothing was charged, and the retained document index (`filings[]`) is in the 200 of the same call without `doc_id=`.
- `422`: Validation Error
- `429`: Quota exceeded for the caller's tier.
- `503`: The register, or an optional feature, is unavailable or not configured on this deployment. A register 503 (since 1.4.1) also carries the mirror's `data_as_of` with the source fields — `source_latest_diff_date` (the newest 差分 the NTA 公表サイト listed when the sync last read it), `source_checked_at`, `source_gap_business_days` and `freshness.rule` (`stale` here) — so a caller can tell a mirror that is behind its source (`data_date` older than `source_latest_diff_date`) from a source that has not published (equal, but `source_checked_at` older than `freshness.source_check_max_hours`); `data_as_of` is null when the mirror is absent. Nothing was charged.

---

[API](https://skmtc.dev/obolpay/apis/jp-verify.md) · [All operations](https://skmtc.dev/obolpay/apis/jp-verify/llms.txt) · [OpenAPI document](https://skmtc.dev/obolpay/apis/jp-verify/revisions/bf8851690df0?raw)
