DEV Community

Kuroshio Data
Kuroshio Data

Posted on

Tracking Japanese Activist Investors Without Reading Japanese: 5% Filings from EDINET as English JSON

When Elliott built its position in Dai Nippon Printing, the disclosure was public within days. When Oasis went after Fujitec, same thing. When one of the Murakami-affiliated vehicles like City Index Eleventh starts accumulating a mid-cap, the paper trail is right there, filed under Japan's large shareholding rule — the local equivalent of a SC 13D/13G, triggered when anyone crosses 5% of a listed company, with amendments required for every 1% move after that.

The catch is where "right there" is. These filings live on EDINET, Japan's EDGAR. EDINET has an API, which is genuinely good news, but the documents themselves are Japanese-language XBRL and CSV wrapped in ZIP archives. The filer's name is in Japanese. The purpose of the holding — the field that tells you whether this is a passive index adjustment or someone planning to show up at the AGM with proposals — is a free-form Japanese paragraph. There is no English feed. If you don't read Japanese, you find out about a 5% crossing when Bloomberg or a fund letter mentions it, which can be weeks later, or never for smaller names.

I read EDINET filings anyway (I'm a Japanese solo developer, and I was already pulling the API for my own screens), so I automated the part that's annoying even for me: fetching, unpacking the XBRL, normalizing names to English, and classifying the purpose text. The result is an Apify actor called Japan Activist & 5% Filings Tracker. It's paid — $0.05 per filing, pay-per-result, more on that below — and it turns each large shareholding report into a record like this:

{
  "docId": "S100XXQ7",
  "submittedAt": "2026-08-03 09:12",
  "filingType": "amendment",
  "holderNameEn": "Sompo Holdings, Inc.",
  "holderNameJa": "SOMPOホールディングス株式会社",
  "issuerNameJa": "株式会社ティアフォー",
  "issuerSecCode": "XXXX",
  "holdingRatioPct": 17.49,
  "previousRatioPct": 15.82,
  "ratioChangePct": 1.67,
  "crossedThreshold": false,
  "jointHolders": 1,
  "isPotentialActivist": false,
  "activistSignal": "none",
  "purposeEn": "pure_investment",
  "purposeJa": "純投資(政策投資を含む)",
  "edinetDocId": "S100XXQ7",
  "source": "EDINET"
}
Enter fullscreen mode Exit fullscreen mode

That one is boring on purpose: an insurer topping up an existing stake, crossedThreshold: false because it was already past 5%. The interesting rows are the ones where crossedThreshold flips to true, or where isPotentialActivist is set. That flag fires two ways. First, a maintained list of funds with an activist track record in Japan — Oasis, Effissimo, Elliott, the Murakami-affiliated entities, Strategic Capital, and so on, matched against the holder name even when they file through subsidiaries. Second, the purpose text itself: if the stated purpose signals intent to make "important proposals" to management (a specific legal phrase in these filings, because it changes the filing regime the holder is under), that gets flagged regardless of who the filer is. That second path is how you catch a fund you've never heard of before it has a reputation.

Running it

There's nothing to configure for the common case. Open the actor on Apify, hit Run with an empty input, and it fetches the latest large shareholding filings and writes them to a dataset you can read as JSON, CSV, or via the Apify API. To make it a feed rather than a one-off, add a Schedule in the Apify console — daily after Tokyo close works well, since EDINET filings cluster during Japanese business hours. Filers have five business days to disclose a crossing, so daily polling loses you nothing. From there it's a normal dataset: pipe it into a Slack webhook, a spreadsheet, or an LLM agent that reads purposeEn and holdingRatioPct and decides whether to wake you up.

What it costs, and where it falls short

Pricing is pay-per-result: $0.05 per filing returned, on top of Apify's small compute charge. A typical day in Japan produces a handful to a few dozen large shareholding reports, so a daily schedule usually lands in the range of a few dollars a month. No subscription, no minimum. If a run returns nothing new, you pay for nothing new.

Two honest limitations, both of which I hit while building it. The purpose field in the source is free-form Japanese prose, so purposeEn is a best-effort category (pure_investment, management_involvement, and a few others) plus the raw Japanese string — for edge cases you'll want the raw text and a translator. And the issuer side stays in Japanese: EDINET gives you the holder's English name but not a reliable English name for the company being bought, so the actor returns issuerNameJa plus the securities code rather than inventing an English name that might be wrong. The securities code is always there, which is what you should join on anyway.

If extraordinary reports are more your thing — Japan's rough 8-K equivalent, covering M&A decisions, board and major shareholder changes, AGM voting results — the companion Japan Corporate Events Monitor does the same treatment for those at $0.03 per filing, and there's a SEC Form 4 insider trades tracker if you want the US side from the same shape of pipeline.

Built and maintained by a solo dev. If something in the output looks wrong, the issue tracker on the actor page reaches me directly.

— kuroshio-data

Top comments (0)