orakel
Docs navigation

Canonical

PRH / YTJ (Finland)

Finnish business register — companies from PRH and best-effort XBRL financials.

Updated 2026-04-21

Source: PRH (Patentti- ja rekisterihallitus / Finnish Patent and Registration Office) and Tilastokeskus (Statistics Finland, for XBRL financial filings) Data: Finnish companies (YTJ / Business Information System) and annual financial statements (XBRL) License: Finnish open data — PRH releases its datasets under a liberal open-data licence. Check https://www.prh.fi/en/kaupparekisteri/avoindata.html for the exact wording. Attribution is typically required. Attribution required: Yes — credit "Patentti- ja rekisterihallitus" (PRH) for companies and "Tilastokeskus" for statistics Link: https://www.prh.fi/en/kaupparekisteri/avoindata.html (PRH open data), https://stat.fi/en (Tilastokeskus) Update cadence: fi-companies runs weekly (0 3 * * 1, Mondays 03:00 UTC). fi-financials runs daily (0 4 * * *, 04:00 UTC) and chunks across the FI universe, oldest-updated first.

What it is

YTJ (Yritys- ja yhteisötietojärjestelmä) is Finland's Business Information System, operated jointly by PRH and the Tax Administration. Every Finnish legal entity is keyed by a Y-tunnus (business ID) in the form NNNNNNN-N.

Orakel ingests company records from PRH's open-data API and annual financial filings from the XBRL feed hosted by Tilastokeskus. Finland is Phase 1 — best-effort coverage, shipped on free public data only. Known gaps are documented below rather than filled with paid access.

Fields provided

Company fields

Sourced from PRH's /companies?businessId= endpoint. Rows are stored under country = "FI" in the Company model and populated by lib/ytj/companies.ts.

Field Type Notes
orgNumber string Y-tunnus (e.g. 0112038-9). Part of the composite key (country, orgNumber).
country string Always "FI" for PRH rows.
name string Current active registered name (selects the record with type = "1" and no end date).
orgFormCode / orgFormDescription string Current company form (Oyj, Oy, Ky, Tmi, etc.). English description preferred when available.
naceCode1 / naceDescription1 string Primary industry from PRH mainBusinessLine. Only one NACE code is exposed.
businessAddressStreet / businessAddressZip / businessAddressCity / businessAddressMuni / businessAddressMuniNo string Visit address. City is taken from the English post-office record, then Finnish, then first available.
postalAddressStreet / postalAddressZip / postalAddressCity string Postal address where separately registered.
website string Normalised to https://… when PRH returns a bare host.
foundingDate / registrationDate date Taken from businessId.registrationDate.
registeredInVat bool True if an open registeredEntries row exists with register = "6".
registeredInBiz bool True if tradeRegisterStatus = "1".

Fields not populated for FI rows (set to null / default): naceCode2, naceCode3, employeeCount, hasRegisteredEmployees, phone, isBankrupt, isBeingDissolved, isInGroup, parentOrgNumber, sectorCode, sectorDescription. These are either not exposed by the free PRH API or require paid Virre.

Financial fields

Sourced from the Tilastokeskus XBRL endpoints (/financials?businessId=… to list periods, /financial?businessId=…&financialDate=… to fetch each XBRL document). Rows are stored under country = "FI" in the Financial model and populated by lib/ytj/financials.ts.

Field Type Notes
orgNumber string Y-tunnus of the filer.
country string Always "FI".
regnskapstype string Always "SELSKAP" for FI filings.
periodFrom / periodTo date Fiscal period. Taken from the XBRL startDate/endDate, or derived from instant minus one year when only a balance-sheet date is present.
currency string From the XBRL unit, defaulting to "EUR".
totalAssets float Mapped from the dimensional concept fi_MC:x360 (Vastaavaa loppusumma / balance-sheet total).

Other Financial columns — revenue, operatingCosts, operatingResult, netFinancials, preTaxProfit, netResult, totalEquity, totalDebt — are part of the schema but are not yet mapped for FI filings. See Limitations.

Endpoints that surface this data

  • GET /api/companies/:orgNumber?country=FI — full company record for a Finnish Y-tunnus.
  • GET /api/companies?country=FI — search / list Finnish companies.

Limitations

The KNOWN_GAPS.FI entries from lib/countries.ts, verbatim:

  • roles — not exposed by free PRH APIs (paid Virre only)
  • financial field decoding — dimensional XBRL taxonomy; only totalAssets reliably mapped from one fixture, expand incrementally
  • financials coverage — ~30K digital filers; paper filings require paid Virre

Gotchas

  • Seed list, not full universe. The FI sync is driven by a built-in seed list (Nokia, KONE, Fazer, plus a known iXBRL verification case). The full Finnish company universe is not ingested in Phase 1 — contact hello@orakel.cloud to have a specific company added.
  • Name and form resolution. PRH returns full history for names and company forms. The transform picks the record with type = "1" and no endDate (current active), falling back to the first available entry.
  • City field picks English first. PRH post-office names come in multiple languages (1 = Finnish, 3 = English). The transform prefers English, then Finnish, then whatever is first in the list.
  • XBRL is dimensional, not flat. PRH/Tilastokeskus XBRL filings key every monetary fact on a fi_dim:MCY dimension member (e.g. fi_MC:x360). Mapping from fi_MC:x… codes to semantic fields is not published in a stable form — MC_TO_FIELD in lib/ytj/financials.ts is an incremental decode table. Unmapped concepts become null. When you observe a new filing where a field you expect remains null, add the corresponding fi_MC:x… code to the map.
  • Prior-year comparatives are skipped. XBRL contexts carrying a fi_dim:REF dimension represent prior-year comparison values within a current-year filing. The transform skips these to avoid overwriting the current-period value.