W System / Blog / Peppol participant lookup in 2026: SML, SMP and the new OpenPeppol zone
Peppol participant lookup in 2026: query the OpenPeppol SML, not the old EC zone
In short: to find out whether a company can receive Peppol invoices, you hash its participant id, look it up in the SML (a DNS zone) to get its SMP, and ask the SMP which document types it accepts. Since 2 September 2026 the production SML is run by OpenPeppol under participant.sml.prod.tech.peppol.org; Access Points had to switch by 31 August. Code that still queries the old European Commission zone edelivery.tech.ec.europa.eu is reading a system that is no longer the production one, and on 22 October 2026 a validating resolver (Cloudflare 1.1.1.1) refused our lookup there with a DNSSEC error. The hashing is unchanged, so the fix is one line. Below: the timeline, the lookup step by step, a 30-line Python example, and two traps (the Peppol Directory and the participant scheme).
What changed, and when
| Date | What changes |
|---|---|
| 19 March 2026 | Migration window opens; the OpenPeppol SML starts running next to the European Commission one. |
| 31 May 2026 | Deadline for SMP providers to register participants through the new OpenPeppol management API (api.sml.prod.tech.peppol.org). |
| 31 August 2026 | Deadline for Access Points to switch DNS lookups to participant.sml.prod.tech.peppol.org (test: participant.sml.test.tech.peppol.org). |
| 2 September 2026 | The OpenPeppol SML is the production system. The old edelivery.tech.ec.europa.eu zone is no longer part of the production chain. |
OpenPeppol's own summary: the only change for service providers is the new DNS lookup domain (for Access Points) and the new registration endpoint (for SMPs); dynamic discovery itself works as before. The same applies to anyone else who does lookups: ERP and invoicing vendors checking a buyer before a send, onboarding flows, monitoring and analytics.
The lookup, step by step
- Participant id. Scheme code plus value, for example
0245:2020273893(a Slovak DIČ) or0208:0202239951(a Belgian enterprise number). The identifier scheme isiso6523-actorid-upis. - DNS name. Lowercase the id, take its SHA-256 hash, Base32-encode it and drop the
=padding, then append.iso6523-actorid-upis.participant.sml.prod.tech.peppol.org. OpenPeppol's own example:9915:testbecomeseh5boavaktmbgzyh2a63dz4qov33fvp5nsdvqklucfraayoodw6a. - NAPTR record. Query that name for type NAPTR. A registered participant has a U-NAPTR record with the service
Meta:SMPwhose regular expression holds the SMP base URL. NXDOMAIN means the id is not registered on Peppol. The olderB-<md5>CNAME records were replaced by NAPTR in 2025, so don't build new code on them. - SMP service group.
GET <SMP URL>/iso6523-actorid-upis%3A%3A0245%3A2020273893lists one reference per document type the participant accepts. Look for the Peppol BIS Billing 3.0 invoice and credit note ids. A 404 means the SML entry exists but the SMP doesn't publish it. - Endpoint (sending only). An Access Point then reads the signed service metadata for the chosen document type to get the receiving endpoint and certificate. For a "can they receive?" check you can stop at step 4.
Example: the lookup in plain Python
No dependencies; DNS goes through DNS over HTTPS so it runs anywhere. Tested on 22 October 2026 against 0245:2020273893 (Slovak Telekom, a.s.): the SML pointed to https://sml.peppol-smp.sk and the SMP listed five document types, including Peppol BIS Billing 3.0 invoices and credit notes. In production, also guard the SMP URL before fetching it (http or https, host names only, no internal addresses), set short timeouts and cache the answers.
import base64, hashlib, json, re, urllib.parse, urllib.request
ZONE = "iso6523-actorid-upis.participant.sml.prod.tech.peppol.org" # OpenPeppol SML since 2 Sep 2026
def sml_name(pid): # pid like "0245:2020273893"
h = hashlib.sha256(pid.strip().lower().encode()).digest()
return base64.b32encode(h).decode().rstrip("=") + "." + ZONE
def smp_url(pid):
q = urllib.parse.urlencode({"name": sml_name(pid), "type": "NAPTR"})
req = urllib.request.Request("https://cloudflare-dns.com/dns-query?" + q, headers={"accept": "application/dns-json"})
ans = json.load(urllib.request.urlopen(req, timeout=5))
for a in ans.get("Answer", []):
m = re.search(r'"Meta:SMP" "!\.\*!([^!]+)!"', a["data"])
if m:
return m.group(1)
return None # NXDOMAIN or no U-NAPTR: not registered on Peppol
pid = "0245:2020273893"
base = smp_url(pid)
print(base)
if base:
url = base.rstrip("/") + "/" + urllib.parse.quote("iso6523-actorid-upis::" + pid, safe="")
xml = urllib.request.urlopen(url, timeout=6).read().decode()
refs = re.findall(r'ServiceMetadataReference[^>]*href="([^"]+)"', xml)
print(len(refs), "document types")
Trap 1: the Peppol Directory is not the register
The public Peppol Directory is the easy way to search by name or id, but a business card there is optional, so a company can be fully reachable on Peppol and still be missing from it. Slovak Telekom above is one: the Directory had no card for either of its likely ids on 22 October 2026, while the SML and its SMP showed it can receive BIS 3 invoices. A good order is: Directory first (it gives a name and country), then SML and SMP when the Directory has nothing. The Directory's REST API also states a limit of 2 queries per second.
Trap 2: look up the scheme companies actually use
A company registers under one participant id, and it is often not the VAT-based scheme. In the Directory, most Slovak companies use 0245 with the DIČ rather than 9950:SK…, French companies 0225 with the SIREN, Belgian ones 0208 with the enterprise number, and Dutch and Estonian ones often their registry codes (0106 KvK, 0191). Code that derives one id from the VAT number and stops there will report "not on Peppol" for companies that are. Try the likely schemes for the buyer's country, and ask the buyer to confirm the id before the first live send.
Checklist
- Search your code and config for
edelivery.tech.ec.europa.euandacc.edelivery.tech.ec.europa.eu; replace them withparticipant.sml.prod.tech.peppol.organdparticipant.sml.test.tech.peppol.org. - Use NAPTR (
Meta:SMP), not the legacy CNAME records. - Treat NXDOMAIN as "not registered" and DNS or HTTP errors as "unknown", never as "not registered".
- Don't rely on the Directory alone; fall back to the SML and SMP.
- Try every likely scheme for the country, not only the VAT-based one.
- If you run an SMP, make sure your registrations go to
api.sml.prod.tech.peppol.org.
If you'd rather call one endpoint
Disclosure: W System, which publishes this page, makes the API in this section. GET https://api.wsystem.dev/einvoice/route?id=SK2020273893 takes a VAT number, checks it in VIES, tries the participant ids used in that country (with a registry-code lookup for NL, EE and LT), searches the Peppol Directory and then the OpenPeppol SML and SMP, and says which schemes it tried and where it found the company. It also returns the country's e-invoicing mandate. No key needed for a few calls a day. Real response from the live API on 22 October 2026 (shortened):
{
"query": "SK2020273893",
"vat": {
"status": "valid",
"name": "Slovak Telekom, a.s."
},
"peppol": {
"participant_id": "iso6523-actorid-upis::0245:2020273893",
"registered": true,
"source": "smp",
"smp_host": "sml.peppol-smp.sk",
"supports_peppol_bis3_invoice": true,
"supports_peppol_bis3_creditnote": true,
"ids_detail": [
{
"id": "iso6523-actorid-upis::0245:2020273893",
"directory": false,
"smp": true
},
{
"id": "iso6523-actorid-upis::9950:sk2020273893",
"directory": false,
"smp": false
}
],
"note": "Registered on Peppol (found in the SML/SMP), but no business card is published in the Peppol Directory, so the name is not shown. Document types come from the participant's SMP."
}
}
It checks only the ids it tries; a company registered under some other scheme can still be missed. More on the e-invoicing API page.
Questions and answers
Which DNS zone do I use for Peppol participant lookups now?
Production: iso6523-actorid-upis.participant.sml.prod.tech.peppol.org. Test: iso6523-actorid-upis.participant.sml.test.tech.peppol.org. OpenPeppol made these mandatory for Access Point lookups from 31 August 2026; the old European Commission zone edelivery.tech.ec.europa.eu is no longer the production SML.
Did the hashing of the participant id change?
No. The DNS label is still the Base32 encoding (padding removed) of the SHA-256 hash of the lowercased participant id, for example 9915:test, followed by the scheme and the SML zone, and the answer is a U-NAPTR record with the service Meta:SMP that holds the SMP base URL. Only the zone changed.
Is the Peppol Directory enough to tell whether a company can receive Peppol invoices?
No. Publishing a business card in the Peppol Directory is up to the service provider, so a registered participant can be missing from it. The SML and the participant's SMP are what Access Points actually use; check them when the Directory has no card.
Which participant id should I look up for a company?
The one the company is registered under, which is often not the VAT-based scheme: most Slovak companies use 0245 with the DIČ, French companies 0225 with the SIREN, Belgian ones 0208 with the enterprise number, Dutch ones often 0106 with the KvK number and Estonian ones 0191 with the registry code. Try the likely schemes for the country, not one.
Do I need an Access Point to do these lookups?
No. The SML is public DNS and SMPs answer public HTTP GET requests. You only need an Access Point to send the invoice itself.
Sources
- OpenPeppol: SML Insourcing (migration summary, new domains, deadlines)
- AgID (Italian Peppol Authority): activities for the migration of the SML
- OpenPeppol: Peppol CNAME to NAPTR Migration Process v1.0.0 (17 April 2025)
- Peppol Directory REST API documentation
Related
- Belgium Peppol e-invoicing for software builders (0208 addressing)
- Slovakia eFaktúra 2027 (Peppol BIS 3 with 0245:DIČ)
- Norway e-invoicing from 1 January 2027 (EHF / Peppol BIS)
- Free e-invoice validator (EN 16931, no key)
Checked against the OpenPeppol and AgID pages and with live DNS and SMP lookups on 22 October 2026.
Facts checked 2026-10-22. W System is the maker of this product. Not affiliated with the European Commission. Not legal or tax advice.