ediverse Explore the platform

Spotlight PEPPOL BIS Billing 3.0 The EU e-invoicing mandate is here — France Sept 2026, Belgium Jan 2026, Germany 2025.

IČO + DIČ — legal company identifiers

Every Czech company has two distinct identifiers: IČO (Identifikační číslo organizace, 8 digits) for the legal identity at the Justice.cz registry via ARES, and DIČ (Daňové identifikační číslo, prefixed CZ + digits) for VAT when the entity is registered. PEPPOL directory code ICD 0151. Checksum algorithm publicly documented by ČSÚ.

History — from Czechoslovakia to ARES 2026

IČO has existed since 1989 — it was created under socialist Czechoslovakia by the Federální statistický úřad. At the 1993 split, the Czech Republic kept the 8-digit format and transferred it to ČSÚ. The DIČ was added at EU accession in 2004 for intra-EU VIES needs. The ARES portal, launched in 2010 then overhauled in 2014 and 2023, made the Czech Republic one of the EU's most advanced countries on company open data.

text ico-dic-timeline.txt
1989       | Creation of IČO in Czechoslovakia — 8 digits, managed by
           | the Federální statistický úřad (FSÚ).
           |
1993       | 1 January: Czechoslovakia split. Czech Republic keeps the
           | 8-digit IČO. ČSÚ (Czech Statistical Office) takes over
           | attribution.
           |
2004       | EU accession. Czech DIČ aligns with the VAT directive:
           | format CZ + digits (ISO prefix + IČO most often).
           |
2010       | Launch of ARES (Administrativní registr ekonomických
           | subjektů) — unified administrative registry on
           | wwwinfo.mfcr.cz.
           |
2014       | ARES overhaul — public REST API, JSON and XML, free
           | access without authentication.
           |
2018       | PEPPOL registry inscription — IČO gets ICD 0151
           | (Czech Republic IČO). PEPPOL OPC addresses in
           | 0151:NNNNNNNN.
           |
2023       | ARES v2 upgrade — GraphQL API, WebSocket for near-real-time
           | notifications. Retroactive coverage back to 1990.
           |
2024-2026  | ARES v2 reaches 3.3M registered entities (companies,
           | OSVČ self-employed, associations, foundations).

Governance — Justice.cz + ČSÚ + GFŘ

Three distinct actors manage the identifiers:

  • ČSÚ (Czech Statistical Office) — attributes IČO, maintains and revokes it. Authoritative source of the identifier.
  • Justice.cz (Obchodní rejstřík, commercial register) — legal registry of companies (s.r.o., a.s., k.s., v.o.s.). Publishes statutes, directors, annual accounts.
  • GFŘ (General Financial Directorate) — attributes DIČ at VAT registration, maintains it via the DPH portal.

The ARES portal (Administrativní registr ekonomických subjektů) consolidates data from all three sources: MF ČR, ČSÚ and Justice.cz. It is hosted on wwwinfo.mfcr.cz and publicly accessible without authentication.

Schema — IČO checksum algorithm

IČO is an 8-digit number whose 8th position is a check digit computed from the first 7 by a mod-11 algorithm:

python ico-checksum.py
# IČO — Check digit calculation algorithm
# Specification: ČSÚ Methodology 2010, public on statistickyurad.cz

# Format: 8 digits total (7 significant + 1 check digit)
# Example: IČO = 12345678 (where 8 is the check digit)

def calculate_ico_check(seven_digits: str) -> int:
    """Compute the 8th position (check) from the first 7."""
    weights = [8, 7, 6, 5, 4, 3, 2]
    sum_weighted = sum(int(d) * w for d, w in zip(seven_digits, weights))
    rest = sum_weighted % 11

    if rest == 0:
        return 1
    if rest == 1:
        return 0
    return 11 - rest

# Real examples (Czech public entities)
# ČEZ a.s.            : IČO 45274649
# Škoda Auto a.s.     : IČO 00177041
# Komerční banka a.s. : IČO 45317054
# Česká spořitelna    : IČO 45244782

# Validation
assert calculate_ico_check("4527464") == 9   # ČEZ
assert calculate_ico_check("0017704") == 1   # Škoda Auto
assert calculate_ico_check("4531705") == 4   # Komerční banka
assert calculate_ico_check("4524478") == 2   # Česká spořitelna

The algorithm is public and documented by ČSÚ. Every business library in the Czech Republic implements it — every Czech ERP rejects on input an IČO with a wrong check digit. Old IČO with 7 digits (companies created before 1989) are prefixed with a zero to reach 8 positions (e.g. Škoda Auto: 00177041).

IČO/DIČ vs V4 identifiers

CountryLegal IDVAT IDRegistry / DirectoryPEPPOL ICD
Czech RepublicIČO (8 digits)CZ + IČOARES + Justice.cz0151
SlovakiaIČO (8 digits)SK + 10 digitsFinStat + ORSR0203
PolandNIP (10) + REGON (9/14)PL + NIPCEIDG + KRS0205
HungaryAdószám (8+1+2)HU + Adószáme-Cégjegyzék0151 (HU separate)
GermanyHRB + USt-IdNrDE + USt-IdNrHandelsregister + BZSt0204
FranceSIREN (9) + SIRET (14)FR + key + SIRENSirene INSEE0009

Adoption — ARES + ICD 0151 PEPPOL

  • ARES v2 API — REST endpoint https://ares.gov.cz/ekonomicke-subjekty/rest/, JSON + XML, ~50M requests/year. No authentication, no reasonable quota.
  • Justice.cz / OR API — dedicated endpoint for the commercial register, annual accounts, directors, statutes. Accessible via or.justice.cz.
  • VIES check — intra-EU DIČ verification on ec.europa.eu/taxation_customs/vies/. Every Czech DIČ appears with CZ prefix.
  • PEPPOL SMP — addresses in format 0151:12345678 in UBL Buyer/Seller. Automated routing via PEPPOL SML.
  • EN 16931 (BT-29 / BT-46 / BT-44) — IČO and DIČ map respectively to BT-29 (Seller legal registration ID) with scheme ID 0151, and BT-46 (Seller VAT identifier).

Common pitfalls

  • Confusing IČO and DIČ. IČO exists for every company. DIČ only exists if VAT-registered. Many OSVČ under threshold have only an IČO, no DIČ.
  • IČO without leading zero. IČO created before 1989 are 7 digits + 1 check. Entered without leading zero, they look like 7 digits and trigger validation errors on ARES side.
  • Prefixing DIČ without CZ. Czech DIČ must have the ISO prefix CZ for intra-EU flows (VIES). Without prefix, DIČ is considered "national" without EU recognition.
  • Wrong PEPPOL ICD. For PEPPOL flows, the ICD is 0151 for IČO on the entity side, not 9931 (which designates Czech OPC for financial banking transactions, different context).
  • Individual VAT number (rodné číslo). If the OSVČ has its DIČ based on rodné číslo (10 digits), it is personal data — ÚOOÚ (Czech DPA) has published guidance: do not display publicly.