- Build consistent logic across countries without country-specific conditionals
- Compare companies from different jurisdictions using the same classification systems
- Integrate with downstream systems that expect standardized formats
- Reduce complexity in your codebase by handling variations at the API level
1. Legal Forms
Understanding a company’s legal structure is fundamental to risk assessment, compliance, and business relationships. Different legal forms carry different liability implications, regulatory requirements, and governance structures. However, each country uses its own terminology and classification system, making cross-border comparisons difficult. We map thousands of local legal forms to both a standardized English translation and an ISO 20275 code. The ISO 20275 standard (Entity Legal Forms) provides a globally recognized classification system maintained by GLEIF (Global Legal Entity Identifier Foundation). This enables precise identification and comparison of legal entity types across jurisdictions. How we do it: We use AI-powered translation and semantic matching against the official ISO 20275 code list. We are on version 1.6, published 19 February 2026, which contains 3,599 entity legal forms across 200 jurisdictions in 130 countries. When available, we also perform vector similarity search against the GLEIF-maintained database to find the most accurate ISO code match. Example: Germany- Local: “Gesellschaft mit beschränkter Haftung”
- ISO 20275:
2HBR - Standardized:
Limited Liability Company
The ISO 20275 standard is maintained by GLEIF and provides a comprehensive,
internationally recognized classification system. Learn more about ISO 20275
Entity Legal Forms Code
List.
2. Roles
Identifying who has legal authority to represent a company is critical for due diligence, contract execution, and compliance checks. However, role titles vary dramatically across languages and legal systems. What’s called a “Manager” in one country might be a “Gérant” in France or a “Geschäftsführer” in Germany, each with subtly different legal powers. We map these diverse role titles to a standardized English classification and, for legal representatives, assign an ISO 5009 code. ISO 5009 (Official Organizational Roles) provides a standardized way to identify organizational roles within legal entities, enabling consistent role-based analysis across jurisdictions. How we do it: We use AI to translate role titles to English and classify them into standardized categories. For legal representatives, we perform semantic matching against the ISO 5009 code list, which is contextually aware of both the role title and the company’s legal form (ISO 20275 code), ensuring accurate role classification. We are on ISO 5009 version 1.0.0, published June 2023 — the only edition GLEIF has released. An ISO 5009 code identifies a role within a specific legal form, so the same job title carries a different code depending on the company it is held in. The examples below are each scoped to that country’s private limited company:
Because coverage is scoped this way, a legal form GLEIF has no role rows for
returns a role with no
iso5009Code. That is an honest gap rather than a
near-miss from a neighbouring legal form.
ISO 5009 codes provide standardized role identification within legal entities.
The standard is maintained by GLEIF and enables consistent role-based
analysis. Learn more about ISO 5009 Official Organizational Roles Code
List.
3. Activity Codes (Activity Mapping)
Economic activity classification is essential for industry analysis, market research, regulatory compliance, and risk assessment. However, countries use different classification systems: Italy uses ATECO, the UK uses SIC, Germany uses WZ codes, and France uses NAF/APE codes. Even within the EU, while NACE is the standard, local implementations vary. We map these diverse local activity codes to international standards: ISIC Rev.5 (the global standard) and NACE Rev.2.1 (the European standard). This enables you to compare companies across borders, perform industry-level analysis, and integrate with systems that expect standardized activity codes.Mapping Process
Topograph uses AI to standardize the activity sector of companies through a two-step process, prioritizing precision over recall.Step 1: Local Classifications → ISIC Rev.5
We use AI to map local activity codes to ISIC Rev.5. Priority order:- Local Classification Codes (Primary source)
- Country-specific codes (e.g., ATECO for Italy)
- Sector-specific codes (e.g., SIC, RAE, SAE)
- Official business register classifications
- Activity Descriptions (Fallback source)
- Free-text activity descriptions when no local codes are available
Step 2: ISIC Rev.5 → NACE Rev.2.1
Formal mapping from ISIC to NACE. NACE Rev.2.1 is the European implementation of ISIC Rev.5, so the two share the same structure and the correspondence is deterministic.- 100% coverage of ISIC Rev.5 classes
- Deterministic correspondence, derived from the official UNSD and Eurostat structures
- Register-native NACE codes are upconverted to NACE Rev.2.1 from the official Eurostat transition table
Both standards, always together
Whenever a company has any activity classification, the response carries bothISIC and NACE. If a register publishes only one of the two (most EU registers publish NACE-based codes; some sources expose only ISIC), we derive the other from the official ISIC Rev.5 to NACE Rev.2.1 correspondence. So you can rely on activities.ISIC and activities.NACE being present together across every country, alongside the register’s own local code (NAF, ATECO, SIC, and so on) under its own key.
The only time these are absent is when the source register exposes no activity data at all for the
company, or — for Croatia alone — when every code it holds is stamped NKD 1994, which predates
Croatia’s NACE alignment and so cannot be crosswalked from. See
Where two revisions run side by side.
Which version of each classification?
Two revisions are fixed platform-wide, for every country and every source:
These never vary by country. A register that publishes NACE Rev. 2 is upconverted to Rev. 2.1
using the official Eurostat transition correspondence before we publish it, so
activities.NACE
is Rev. 2.1 even where the source is not.
Every other key is the register’s own national code, published exactly as the register records
it. We do not restate, renumber, or re-version those.
Every key states its revision
A key likeSIC or SBI says which classification a code belongs to but not which revision, and
the same code can mean different things across revisions. So alongside each of those, we publish a
second key that names the revision: <SYSTEM>_<VERSION>.
Nothing was renamed or removed. The original keys keep the exact contents they have always
had. If you read
activities.NACE or activities.SIC today, that keeps working unchanged; the
versioned keys are additive.These are the revisions the registers serve, which is not always the revision the national
statistics office has most recently adopted. The two routinely disagree, in both directions: a
register can serve an older revision for years after a new one is published, and sometimes the
register moves first. The Dutch Handelsregister converted every active registration to SBI 2025
in September 2025 while CBS is still phasing SBI 2025 into its own statistics through 2029.
Where two revisions run side by side
Belgium and Croatia stamp each activity record with the revision it was filed under, so a single company can carry codes from more than one. Rather than average that into one answer, you get a key per revision:- Belgium. The register’s activity file marks every row
2003,2008or2025, so the codes arrive underNACE_BEL_2003,NACE_BEL_2008orNACE_BEL_2025accordingly. - Croatia. The court register stamps each business-scope entry, giving
NKD_1994,NKD_2007orNKD_2025. A company filed across revisions returns one key for each. NKD 2007 and NKD 2025 are Croatia’s NACE Rev. 2 and Rev. 2.1 transpositions, so both also feedNACE; codes stamped NKD 1994 predate that alignment and are excluded, since reading one as Rev. 2 would produce a class the register never declared.
Where we do not state a revision
These keys are published with no revision-explicit sibling, because the register does not record which revision the code belongs to. We would rather publish no version than a wrong one:One code in, one code out
We never publish an activity the register did not declare. You get one standardized class per declared code — never a list of candidates we could not choose between. This matters because classification systems do not line up one-to-one. When a company’s declared class maps to several classes in the target standard, the true one is unknowable from the code alone. Rather than return all of them, we return the most precise class the correspondence actually supports:A shorter code is not missing data:
64.2 means the register told us the company is a holding
company but not which kind. It is the most specific statement the source supports. The register’s
own code is always published in full alongside it.isAIInferred: true so you can tell it apart from a formal mapping.
When you need the register’s own NACE class
Upconverting to Rev. 2.1 is the right default, but it has a hard limit: Rev. 2.1 deleted some Rev. 2 classes.86.90 has no Rev. 2.1 class of its own, so the most precise standardized answer
is the group 86.9; for 17 further classes the successors scatter across unrelated divisions and
there is no honest Rev. 2.1 code at all, so activities.NACE is absent.
Where the register itself publishes NACE Rev. 2, we also publish that class verbatim under
NACE_REV2. Today that is France, whose NAF rév. 2 is the French implementation of NACE
Rev. 2 — an APE code’s first four digits are the Rev. 2 class, the trailing letter a French
subdivision below it — so the key is present on every French company whose APE code we hold:
NACE_REV2 when you need a 4-digit class for every company and can accept the older revision;
read NACE / NACE_REV21 when you need one revision you can compare across countries. They are
different revisions of the same classification, so never mix them in one field: 86.90 is not a
NACE Rev. 2.1 code and 86.9 is not a Rev. 2 class.
The register’s own answer beats any table
Where the register itself publishes the company’s class in the target revision, we read that and convert nothing. France is the worked case: INSEE assigns every active company its NAF 2025 code — the French implementation of NACE Rev. 2.1, i.e. a Rev. 2.1 class with one French letter appended — and publishes it in Sirene ahead of the 2027 cutover. A code-level correspondence can only say where a code went; INSEE says where the company went, and the two differ whenever INSEE recoded the company on its actual activity (a consultancy filed as62.02A that INSEE recoded to 73.12Y, media representation). So for France,
NACE is the first four digits of the NAF 2025 code, the code itself is published under NAF_2025, and the
rules below only apply to the small population INSEE has not assigned one (units still coded in
pre-2008 nomenclatures, almost all ceased).
National sub-classes are used as evidence
Some registers publish a code that is finer than the standard class it sits in. France’s APE/NAF code is the clearest case:8690F is the NACE Rev. 2 class 86.90 plus a French sub-class letter,
and the letter says something the class does not.
Where the national statistics office publishes an official correspondence for those sub-classes, we
resolve through it rather than through the class. So 6420Z returns NACE 64.21 (INSEE maps that
sub-class to a single Rev. 2.1 class) instead of the group 64.2 the bare class 64.20 would give.
The sub-class is only preferred when it names exactly one class; when it straddles several, the
class-level answer stands. Both codes are always published, so you can see the reasoning:
activities.NAFREV2 holds the register’s own code and activities.NACE the standardized class.
The main activity
Many registers designate one activity as the company’s main (primary, prevailing) activity — Belgium’sMAIN classification, Poland’s działalność przeważająca, Croatia’s pretežita
djelatnost, Hungary’s főtevékenység, and others — and some registers publish only the main
activity in the first place (France’s APE code, Finland’s main business line).
Where the register makes that distinction, the corresponding activity item carries
isMainActivity: true, and every code derived from it (NACE, ISIC, local crosswalks) inherits the
flag. At most one code per classification carries it, so
activities.NACE.find(a => a.isMainActivity) is a safe way to pick one code per company.
Where activity codes are AI-inferred from a free-text activity description, the single best-match
code is flagged as the main activity and is marked isAIInferred: true alongside, so a
register-declared main activity is always distinguishable from an inferred one.
Absence of
isMainActivity means the register does not say — not that the code is secondary. Do
not rely on array order to identify the main activity; the flag is the only guaranteed signal.Example: Italy
API Response
4. Addresses
Addresses are critical for verification, communication, and compliance (especially for KYC/AML requirements), but registries store them as unstructured text strings in various formats. Parsing addresses correctly is challenging because formats vary by country, and components like street numbers, postal codes, and administrative divisions are positioned differently. We parse and structure unstructured address strings into standardized component parts, enabling you to validate addresses, perform geocoding, and integrate with address validation services without writing country-specific parsing logic. How we do it: We use pattern recognition and country-specific parsing rules to extract address components, then normalize them according to international standards. Country codes follow ISO 3166-1 alpha-2 format for consistency.- Street
- House Number
- Postal Code
- City
- Country (ISO 3166-1 alpha-2)
5. Status
Company status information is crucial for risk assessment. You need to know if a company is active, dissolved, in liquidation, or bankrupt before entering into business relationships. However, registries use different terminology and status codes, and some countries have complex status hierarchies that don’t map cleanly to simple active/inactive states. We normalize company status to a simple active/inactive boolean plus a standardized status enum, a closure reason, and key dates. This makes it easy to filter and reason about company status across jurisdictions without learning each country’s specific status terminology. How we do it: We map local status codes and descriptions to a three-layer model (booleanactive, raw localName, and standardized statusDetails), preserving the original status information while providing a clean cross-country view.
active:true/falsestatusDetails.status:ACTIVE,UNDER_INSOLVENCY_PROCEEDING,CLOSED,UNKNOWNstatusDetails.closureReason(when closed or under insolvency):BANKRUPTCY,LIQUIDATION,VOLUNTARY_DISSOLUTION,ADMINISTRATIVE_DISSOLUTION,COURT_ORDER,MERGER,SPLIT,ACQUISITION,OTHER,UNKNOWN