Skip to main content

Peppol Identifiers

Every participant on the Peppol network has a unique identifier. Understanding how these identifiers work is essential for successful document exchange.

Identifier Structureโ€‹

A Peppol identifier consists of two parts:

{scheme}:{identifier}

For example:

  • 0106:12345678 โ€” Netherlands Chamber of Commerce number
  • 0204:DE123456789 โ€” German VAT number
  • 9925:0123456789 โ€” French SIRET number

Common Identifier Schemesโ€‹

European Schemesโ€‹

SchemeCountryNameFormat Example
0007๐Ÿ‡ธ๐Ÿ‡ช SwedenOrganisationsnummer1234567890
0088๐ŸŒ GlobalEAN/GLN1234567890123
0096๐Ÿ‡ฉ๐Ÿ‡ฐ DenmarkCVR12345678
0106๐Ÿ‡ณ๐Ÿ‡ฑ NetherlandsKVK12345678
0130๐Ÿ‡ช๐Ÿ‡บ EUDirectorates-GeneralDIGIT.B.3
0184๐Ÿ‡ฉ๐Ÿ‡ฐ DenmarkCVR (alternative)DK12345678
0190๐Ÿ‡ณ๐Ÿ‡ฑ NetherlandsOIN00000001234567890000
0192๐Ÿ‡ณ๐Ÿ‡ด NorwayOrganisasjonsnummer123456789
0195๐Ÿ‡ธ๐Ÿ‡ฌ SingaporeUENS12345678A
0196๐Ÿ‡ฎ๐Ÿ‡ธ IcelandKennitala1234567890
0198๐Ÿ‡ฉ๐Ÿ‡ฐ DenmarkERSTORG12345678
0200๐Ÿ‡ฑ๐Ÿ‡น LithuaniaCompany Code123456789
0201๐Ÿ‡ฑ๐Ÿ‡น LithuaniaVATLT123456789
0204๐Ÿ‡ฉ๐Ÿ‡ช GermanyVATDE123456789
0208๐Ÿ‡ง๐Ÿ‡ช BelgiumEnterprise Number0123456789
0209๐Ÿ‡ฉ๐Ÿ‡ช GermanyLeitweg-ID991-12345-67
0210๐Ÿ‡ฎ๐Ÿ‡น ItalyCodice Fiscale12345678901
0211๐Ÿ‡ฎ๐Ÿ‡น ItalyIPA CodeABC123
0213๐Ÿ‡ช๐Ÿ‡ช EstoniaRegistry Code12345678
0215๐Ÿ‡ซ๐Ÿ‡ฎ FinlandY-tunnus1234567-8
0216๐Ÿ‡ซ๐Ÿ‡ฎ FinlandOVT003712345678
0221๐Ÿ‡ฏ๐Ÿ‡ต JapanCorporate Number1234567890123
0230๐Ÿ‡ฒ๐Ÿ‡พ MalaysiaBRN202301012345

VAT-based Schemesโ€‹

SchemeCountryFormat
9906๐Ÿ‡ฎ๐Ÿ‡น ItalyIT + 11 digits
9914๐Ÿ‡ฆ๐Ÿ‡น AustriaATU + 8 digits
9917๐Ÿ‡ณ๐Ÿ‡ฑ NetherlandsNL + 9 digits + B + 2 digits
9918๐Ÿ‡ช๐Ÿ‡ช EstoniaEE + 9 digits
9919๐Ÿ‡ช๐Ÿ‡ธ SpainESX + 8 digits
9920๐Ÿ‡ฆ๐Ÿ‡น AustriaAT + 9 digits
9922๐Ÿ‡ฆ๐Ÿ‡ฉ AndorraAD + 8 digits
9923๐Ÿ‡ฆ๐Ÿ‡ฑ AlbaniaAL + 10 digits
9924๐Ÿ‡ง๐Ÿ‡ฆ BosniaBA + 12 digits
9925๐Ÿ‡ซ๐Ÿ‡ท FranceFR + 11 digits (SIRET)
9926๐Ÿ‡ญ๐Ÿ‡บ HungaryHU + 8 digits
9930๐Ÿ‡ฎ๐Ÿ‡น ItalyIT + Partita IVA
9955๐Ÿ‡ธ๐Ÿ‡ช SwedenSE + 12 digits
9956๐Ÿ‡ง๐Ÿ‡ช BelgiumBE + 10 digits
9957๐Ÿ‡ซ๐Ÿ‡ท FranceFR + 11 digits
9959๐Ÿ‡ช๐Ÿ‡บ EUEmployer ID Number

Validating Identifiersโ€‹

GoRoute validates identifiers before accepting documents:

import requests

# Validate a participant identifier
response = requests.get(
"https://app.goroute.ai/peppol-api/api/v1/validate/participant",
params={
"scheme": "0106",
"identifier": "12345678"
},
headers={
"X-API-Key": "your_api_key"
}
)

result = response.json()
print(f"Valid: {result['valid']}")
print(f"Format: {result['format_description']}")

Looking Up Participantsโ€‹

Check if a participant is registered on Peppol:

import requests

# Lookup participant on the Peppol network
response = requests.get(
"https://app.goroute.ai/peppol-api/api/v1/participants/lookup",
params={
"scheme": "0106",
"identifier": "12345678"
},
headers={
"X-API-Key": "your_api_key"
}
)

if response.status_code == 200:
participant = response.json()
print(f"Participant found: {participant['name']}")
print(f"Document types: {participant['document_types']}")
else:
print("Participant not found on Peppol network")

Identifier Requirementsโ€‹

Format Rulesโ€‹

Each scheme has specific format requirements:

SchemeLengthFormatCheck Digit
01068Numeric onlyNo
01929Numeric onlyModulo 11
020411DE + 9 digitsYes
020810Numeric onlyModulo 97

Common Validation Errorsโ€‹

Common Mistakes
  • Including country prefix when not required (e.g., NL in KVK numbers)
  • Omitting country prefix when required (e.g., DE in German VAT)
  • Wrong number of digits
  • Including spaces or special characters

Best Practicesโ€‹

1. Validate Earlyโ€‹

Always validate identifiers before storing:

def validate_peppol_id(scheme: str, identifier: str) -> bool:
"""Validate a Peppol identifier format."""
response = requests.get(
f"{API_BASE}/validate/participant",
params={"scheme": scheme, "identifier": identifier},
headers={"X-API-Key": API_KEY}
)
return response.json().get("valid", False)

2. Normalize Before Storageโ€‹

Store identifiers in a consistent format:

def normalize_identifier(scheme: str, identifier: str) -> str:
"""Normalize identifier for storage."""
# Remove spaces and convert to uppercase
identifier = identifier.replace(" ", "").upper()

# Remove common separators
identifier = identifier.replace("-", "").replace(".", "")

return identifier

3. Use the Correct Schemeโ€‹

Different schemes may cover the same organization:

# A Dutch company might be registered with:
# - 0106 (KVK number) - Preferred for Peppol
# - 0190 (OIN) - Government organizations
# - 9917 (VAT) - VAT number scheme

# Always check which scheme the receiver is registered with

Scheme Selection Guideโ€‹

When should you use which scheme?

CountryB2BB2GRecommended
๐Ÿ‡ณ๐Ÿ‡ฑ Netherlands010601900106 (KVK)
๐Ÿ‡ฉ๐Ÿ‡ช Germany020402090204 (VAT)
๐Ÿ‡ง๐Ÿ‡ช Belgium020802080208 (CBE)
๐Ÿ‡ซ๐Ÿ‡ท France992500099925 (SIRET)
๐Ÿ‡ฎ๐Ÿ‡น Italy021002110210 (Codice Fiscale)
๐Ÿ‡ณ๐Ÿ‡ด Norway019201920192 (Org.nr)
๐Ÿ‡ธ๐Ÿ‡ช Sweden000700070007 (Org.nr)

API Referenceโ€‹

Validate Identifierโ€‹

GET /api/v1/validate/participant

Parameters:

NameTypeRequiredDescription
schemestringYesThe scheme code
identifierstringYesThe participant identifier

Response:

{
"valid": true,
"scheme": "0106",
"identifier": "12345678",
"scheme_name": "KVK",
"country": "NL",
"format_description": "8-digit Dutch Chamber of Commerce number"
}

Lookup Participantโ€‹

GET /api/v1/participants/lookup

Parameters:

NameTypeRequiredDescription
schemestringYesThe scheme code
identifierstringYesThe participant identifier

Response:

{
"found": true,
"participant": {
"scheme": "0106",
"identifier": "12345678",
"name": "Example BV",
"country": "NL",
"registered_at": "2024-01-15T10:30:00Z",
"document_types": [
"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2",
"urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2"
]
}
}

Next Stepsโ€‹