> ## Documentation Index
> Fetch the complete documentation index at: https://docs.topograph.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Activity Codes

> How a register’s own activity codes become ISIC Rev. 5 and NACE Rev. 2.1

Every business register classifies what a company does, and almost every one of them uses its own
scheme: PKD in Poland, ATECO in Italy, NAF in France, EMTAK in Estonia, OKVED in Russia, NAICS in
the United States. Topograph publishes the register's own code exactly as it was declared, and
alongside it two international standards you can build one integration against:

* **ISIC Rev. 5**, the global standard maintained by the United Nations Statistics Division
* **NACE Rev. 2.1**, the European standard maintained by Eurostat, in force for EU statistics
  from 2025

## Three layers, always

```mermaid theme={null}
flowchart LR
  A["Register's own code<br/><i>PKD 62.01.Z</i>"] --> B["NACE Rev. 2.1<br/><i>62.10</i>"]
  B --> C["ISIC Rev. 5<br/><i>621</i>"]
  A -.->|"published as declared"| A2["activities.PKD"]
  B --> B2["activities.NACE"]
  C --> C2["activities.ISIC"]
```

Whenever a company has any activity classification at all, the response carries **both** `ISIC` and
`NACE`. If a register publishes only one of the two, we derive the other. The register's own code
keeps its own key, in the register's own format, untouched.

The only time these are absent is when the source register exposes no activity data for the company.

## Why the revision matters

This is the single most common source of confusion, so it is worth being precise.

NACE Rev. 2.1 replaced NACE Rev. 2 for EU statistics from 2025. It is **not** a renaming: a
substantial number of four-digit codes were reused for a different activity.

| Code    | Meaning in NACE Rev. 2                       | Meaning in NACE Rev. 2.1                                 |
| ------- | -------------------------------------------- | -------------------------------------------------------- |
| `46.71` | Wholesale of solid, liquid and gaseous fuels | Wholesale of motor vehicles                              |
| `47.62` | Retail sale of newspapers and stationery     | Retail sale of newspapers and periodicals                |
| `11.03` | Manufacture of cider and other fruit wines   | Manufacture of cider and other fruit fermented beverages |

A register that has not yet migrated still reports Rev. 2. We transition those codes to Rev. 2.1
using the official Eurostat correspondence before publishing them under `activities.NACE`, so
everything on that key is Rev. 2.1 regardless of where it came from.

<Warning>
  If you hold historical Topograph responses, or you compare our output against a register's raw
  export, expect Rev. 2 and Rev. 2.1 codes to disagree on the same company. Compare the
  **descriptions**, not the digits.
</Warning>

## ISIC and NACE do not share their four-digit codes

NACE Rev. 2.1 is built on ISIC Rev. 5, but the two are only identical down to the **two-digit
division**. Below that they diverge: NACE subdivides more finely (651 classes against ISIC's 463)
and numbers its classes independently.

```mermaid theme={null}
flowchart TB
  subgraph D["Division 46 · Wholesale trade (identical in both standards)"]
    direction LR
    N["NACE Rev. 2.1<br/>46.71 Wholesale of motor vehicles"]
    I["ISIC Rev. 5<br/>4661 Wholesale of motor vehicles"]
    N <-->|"correspondence"| I
  end
  X["ISIC Rev. 5 4671<br/>Wholesale of fuels"]
  N -.->|"NOT the same activity"| X
```

The practical consequence: **never assume an ISIC code and a NACE code with the same four digits
mean the same thing.** ISIC `4671` is wholesale of fuels; NACE `46.71` is wholesale of motor
vehicles. If you segment your portfolio on the two-digit division, the two standards agree exactly,
and that is the safest cross-standard key.

<Note>
  No official NACE Rev. 2.1 to ISIC Rev. 5 correspondence table is published by either Eurostat or
  the UNSD. Ours is derived from the two official structures, matching classes on their official
  headings and falling back to the guaranteed division containment. Every published pair sits
  inside the division both standards share.
</Note>

## 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.

Classification systems do not line up one-to-one. When a declared class corresponds 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 code the correspondence actually supports:

```mermaid theme={null}
flowchart TB
  S["Declared code"] --> Q1{"Corresponds to exactly<br/>one class?"}
  Q1 -->|Yes| R1["Publish that class<br/><i>69.20 → 6920</i>"]
  Q1 -->|No| Q2{"Do all candidates<br/>share a group?"}
  Q2 -->|Yes| R2["Publish the group<br/><i>62.10 → 621</i>"]
  Q2 -->|No| Q3{"Do they share<br/>a division?"}
  Q3 -->|Yes| R3["Publish the division<br/><i>38.22 → 38</i>"]
  Q3 -->|No| R4["Publish nothing standardized<br/><i>register's own code only</i>"]
```

| The declared code corresponds to              | What you get                                                        |
| --------------------------------------------- | ------------------------------------------------------------------- |
| Exactly one class in the target standard      | That class                                                          |
| Several classes in one group                  | Their shared group (`64.2` rather than guessing `64.21` or `64.22`) |
| Several classes across groups of one division | Their shared division (`47`)                                        |
| Classes scattered across unrelated divisions  | No standardized code, the register's own code only                  |

<Note>
  A shorter code is not missing data. `64.2` means the register told us the company is a holding
  company but not which kind, and that is the most specific statement the source supports. The
  register's own code is always published in full alongside it.
</Note>

Of the 651 NACE Rev. 2.1 classes, 554 correspond to a single four-digit ISIC class. The remaining
97 are finer than any ISIC class, so they resolve to an ISIC group or division by design.

## Deterministic first, AI only as a fallback

Most of the work is a table lookup, not a model.

```mermaid theme={null}
flowchart TB
  A["Register response"] --> B{"Did the register give<br/>a NACE-family code?"}
  B -->|Yes| C["Transition to NACE Rev. 2.1<br/>(official Eurostat table)"]
  C --> D["Derive ISIC Rev. 5<br/>(correspondence table)"]
  B -->|No| E{"A local code or a<br/>free-text description?"}
  E -->|Yes| F["Match to an ISIC class<br/>with a language model"]
  F --> G["Derive NACE Rev. 2.1<br/>(correspondence table)"]
  E -->|No| H["No activity data"]
  D --> Z["Response"]
  G --> Z
  style F fill:#fef3c7,stroke:#b45309,color:#111
```

The AI step runs only when a register publishes a classification we hold no formal correspondence
for (a national scheme such as ATECO or SIC), or only a free-text description of the business. It
chooses from the 463 ISIC Rev. 5 classes and nothing else: it cannot invent a code, and it cannot
return a coarse section or division. When it is not confident, it returns nothing rather than
guessing.

### `isAIInferred`

Every activity code carries this flag, so you can always tell how it was produced.

| Value   | Meaning                                                                                                                     |
| ------- | --------------------------------------------------------------------------------------------------------------------------- |
| `false` | The register declared this code, or we derived it through an official correspondence table. Deterministic and reproducible. |
| `true`  | A language model chose this code from the company's description or a national code we hold no formal correspondence for.    |

A derived code inherits the flag of the code it came from: an ISIC class matched by AI produces a
NACE code that is also marked `true`.

<Note>
  If your compliance process requires register-sourced classification only, filter on
  `isAIInferred: false`.
</Note>

## National classifications

Where a register publishes its own national scheme, you get it under its own key, in its own
format, in addition to `ISIC` and `NACE`.

| Key                   | Standard                                                      | Countries              |
| --------------------- | ------------------------------------------------------------- | ---------------------- |
| `NAF` / `NAFREV2`     | Nomenclature d'activités française                            | France                 |
| `NACE_BEL`            | NACE-BEL                                                      | Belgium                |
| `ATECO`               | ATECO                                                         | Italy                  |
| `PKD`                 | Polska Klasyfikacja Działalności                              | Poland                 |
| `EMTAK`               | Eesti majanduse tegevusalade klassifikaator                   | Estonia                |
| `SKD`                 | Standardna klasifikacija dejavnosti                           | Slovenia               |
| `ISAT`                | Íslensk atvinnugreinaflokkun                                  | Iceland                |
| `KD`                  | Klasifikacija djelatnosti                                     | Bosnia and Herzegovina |
| `CAEM-2` / `CAEM-1.1` | Clasificatorul activităților din economia Moldovei            | Moldova                |
| `OKVED`               | Общероссийский классификатор видов экономической деятельности | Russia                 |
| `TEÁOR`               | Tevékenységek egységes ágazati osztályozási rendszere         | Hungary                |
| `CNAE`                | Clasificación Nacional de Actividades Económicas              | Spain                  |
| `WZ2008`              | Klassifikation der Wirtschaftszweige                          | Germany                |
| `NOGA`                | Nomenclature générale des activités économiques               | Switzerland            |
| `SBI`                 | Standaard Bedrijfsindeling                                    | Netherlands            |
| `SIC`                 | Standard Industrial Classification                            | United Kingdom         |
| `NAICS`               | North American Industry Classification System                 | United States          |

<Warning>
  National keys carry the register's own revision, which is frequently NACE Rev. 2 rather than
  Rev. 2.1, and their descriptions are the labels of that revision. Only `activities.NACE` is
  guaranteed to be Rev. 2.1. Do not compare a national code to a NACE code digit by digit.
</Warning>

## Example response

A Polish company whose register entry declares one PKD activity:

```json theme={null}
{
  "activities": {
    "PKD": [
      {
        "code": "62.01.Z",
        "description": "Działalność związana z oprogramowaniem",
        "isAIInferred": false
      }
    ],
    "NACE": [
      {
        "code": "62.10",
        "description": "Computer programming activities",
        "isAIInferred": false
      }
    ],
    "ISIC": [
      {
        "code": "621",
        "description": "Computer programming activities",
        "isAIInferred": false
      }
    ]
  }
}
```

The PKD code is the register's, in the register's format. NACE `62.10` is the Rev. 2.1 class the
Rev. 2 code `62.01` transitions to. ISIC `621` is a group rather than a class because NACE `62.10`
covers the whole of ISIC group `621`, and naming one of its children would claim a precision the
register never gave.

## Working with the data

<AccordionGroup>
  <Accordion title="Segmenting a portfolio by industry">
    Use the two-digit division. It is identical in ISIC Rev. 5 and NACE Rev. 2.1, present on every
    standardized code we publish, and stable across the Rev. 2 to Rev. 2.1 transition for most
    divisions. Take the first two characters of either `activities.NACE[].code` or
    `activities.ISIC[].code`.
  </Accordion>

  <Accordion title="Matching a specific activity">
    Match on the full code, and handle codes shorter than four digits. Treat a three-digit ISIC
    group or two-digit division as "within this family, precision not available", not as a
    non-match. Never pad or truncate a code to force a comparison.
  </Accordion>

  <Accordion title="Comparing against your own register extract">
    Compare descriptions rather than digits, and check which revision your extract uses. A register
    export that predates the 2025 transition is NACE Rev. 2, and its four-digit codes will disagree
    with ours for a substantial number of activities.
  </Accordion>

  <Accordion title="Auditing classification provenance">
    Filter on `isAIInferred`. `false` means register-declared or derived through an official
    correspondence, and is reproducible. The register's own code under its national key is always
    `false`.
  </Accordion>
</AccordionGroup>
