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