SMP Registration
The Service Metadata Publisher (SMP) is the directory that tells the Peppol network where to find you. When you register in the SMP, other participants can discover your capabilities and send you documents.
What is SMP?
The SMP stores:
- Who you are — Your Peppol identifier
- What you can receive — Document types and processes
- How to reach you — Your Access Point's endpoint
- Security info — Certificates for message encryption
┌───────────────────────────────────────────────────────────────┐
│ SMP Record │
├───────────────────────────────────────────────────────────────┤
│ Participant: 0106:12345678 │
│ ├── Document: Invoice-2 │
│ │ └── Process: BIS Billing 3.0 │
│ │ └── Endpoint: https://ap.goroute.ai/as4 │
│ └── Document: CreditNote-2 │
│ └── Process: BIS Billing 3.0 │
│ └── Endpoint: https://ap.goroute.ai/as4 │
└───────────────────────────────────────────────────────────────┘
How SMP Lookup Works
When GoRoute sends an invoice to a receiver:
1. Sender provides: 0106:12345678 (receiver ID)
│
▼
2. GoRoute queries SML: Where is this participant's SMP?
│
▼
3. SML returns: smp-goroute.acc.edelivery.tech (SMP URL)
│
▼
4. GoRoute queries SMP: What are this participant's capabilities?
│
▼
5. SMP returns:
- Document types: Invoice, Credit Note
- Access Point: https://receiver-ap.example.com/as4
- Certificate: [X.509 certificate]
│
▼
6. GoRoute delivers invoice to receiver's Access Point
Registration Process
Step 1: Create Participant
First, create a participant record in GoRoute:
import requests
participant = {
"scheme": "0106",
"identifier": "12345678",
"name": "My Company BV",
"country": "NL",
"email": "invoices@mycompany.nl"
}
response = requests.post(
"https://app.goroute.ai/peppol-api/api/v1/participants",
headers={
"X-API-Key": "your_api_key",
"Content-Type": "application/json"
},
json=participant
)
result = response.json()
print(f"Participant ID: {result['id']}")
Step 2: Register in SMP
Then register in the SMP with document capabilities:
registration = {
"document_types": [
{
"document_type": "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2",
"process_id": "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0"
},
{
"document_type": "urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2",
"process_id": "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0"
}
]
}
response = requests.post(
f"https://app.goroute.ai/peppol-api/api/v1/participants/{participant_id}/smp/register",
headers={
"X-API-Key": "your_api_key",
"Content-Type": "application/json"
},
json=registration
)
result = response.json()
print(f"SMP Registration Status: {result['status']}")
Step 3: Verify Registration
Confirm the registration was successful:
response = requests.get(
f"https://app.goroute.ai/peppol-api/api/v1/participants/{participant_id}/smp/status",
headers={"X-API-Key": "your_api_key"}
)
status = response.json()
print(f"Registered: {status['registered']}")
print(f"Document Types: {status['document_types']}")
print(f"Last Sync: {status['last_sync']}")
SMP Record Structure
An SMP record contains:
Service Group
<?xml version="1.0" encoding="UTF-8"?>
<ServiceGroup xmlns="http://busdox.org/serviceMetadata/publishing/1.0/">
<ParticipantIdentifier scheme="iso6523-actorid-upis">0106:12345678</ParticipantIdentifier>
<ServiceMetadataReferenceCollection>
<ServiceMetadataReference
href="https://smp.goroute.ai/0106:12345678/services/urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"/>
</ServiceMetadataReferenceCollection>
</ServiceGroup>
Service Metadata
<?xml version="1.0" encoding="UTF-8"?>
<ServiceMetadata xmlns="http://busdox.org/serviceMetadata/publishing/1.0/">
<ServiceInformation>
<ParticipantIdentifier scheme="iso6523-actorid-upis">0106:12345678</ParticipantIdentifier>
<DocumentIdentifier scheme="busdox-docid-qns">
urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0::2.1
</DocumentIdentifier>
<ProcessList>
<Process>
<ProcessIdentifier scheme="cenbii-procid-ubl">
urn:fdc:peppol.eu:2017:poacc:billing:01:1.0
</ProcessIdentifier>
<ServiceEndpointList>
<Endpoint transportProfile="peppol-transport-as4-v2_0">
<EndpointURI>https://ap.goroute.ai/as4</EndpointURI>
<RequireBusinessLevelSignature>false</RequireBusinessLevelSignature>
<Certificate>MIIF...</Certificate>
<ServiceDescription>GoRoute Peppol Access Point</ServiceDescription>
<TechnicalContactUrl>https://goroute.ai/support</TechnicalContactUrl>
</Endpoint>
</ServiceEndpointList>
</Process>
</ProcessList>
</ServiceInformation>
</ServiceMetadata>
Document Capabilities
Billing Documents
Most participants register for billing documents:
BILLING_CAPABILITIES = [
{
"document_type": "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2",
"process_id": "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0",
"description": "Peppol BIS Billing 3.0 Invoice"
},
{
"document_type": "urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2",
"process_id": "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0",
"description": "Peppol BIS Billing 3.0 Credit Note"
}
]
Full Capabilities
For organizations needing all document types:
FULL_CAPABILITIES = [
# Billing
{"document_type": "Invoice-2", "process_id": "billing:01:1.0"},
{"document_type": "CreditNote-2", "process_id": "billing:01:1.0"},
# Ordering
{"document_type": "Order-2", "process_id": "ordering:01:1.0"},
{"document_type": "OrderResponse-2", "process_id": "ordering:01:1.0"},
# Catalogue
{"document_type": "Catalogue-2", "process_id": "catalogue:01:1.0"},
# Despatch
{"document_type": "DespatchAdvice-2", "process_id": "despatch:01:1.0"}
]
SMP Management
Update Registration
Modify document capabilities:
# Add new document type capability
response = requests.put(
f"https://app.goroute.ai/peppol-api/api/v1/participants/{participant_id}/smp/capabilities",
headers={
"X-API-Key": "your_api_key",
"Content-Type": "application/json"
},
json={
"document_types": [
# Include all capabilities (existing + new)
{"document_type": "Invoice-2", "process_id": "billing:01:1.0"},
{"document_type": "CreditNote-2", "process_id": "billing:01:1.0"},
{"document_type": "Order-2", "process_id": "ordering:01:1.0"} # New
]
}
)
Deregister from SMP
Remove participant from the Peppol network:
response = requests.delete(
f"https://app.goroute.ai/peppol-api/api/v1/participants/{participant_id}/smp/deregister",
headers={"X-API-Key": "your_api_key"}
)
# Participant will no longer be discoverable on Peppol
Deregistering from SMP means other participants can no longer send you documents via Peppol. Only do this if you're migrating to another Access Point or leaving the network.
Test vs Production
Test SMP
SML: acc.edelivery.tech
SMP: smp-test.goroute.ai
Production SMP
SML: edelivery.tech
SMP: smp.goroute.ai
Test and production are completely separate networks. A participant registered in test cannot receive documents from production, and vice versa.
Troubleshooting
Registration Failed
Error: "Participant already registered with another AP"
The identifier is already registered with a different Access Point. The previous provider must deregister before GoRoute can register.
# Contact GoRoute support for migration assistance
# support@goroute.ai
Lookup Returns Nothing
Error: "Participant not found in SMP"
- Check if registration completed successfully
- Verify you're using the correct environment (test/prod)
- Wait 5-10 minutes for DNS propagation
Wrong Document Types
Error: "Receiver does not support document type"
The receiver's SMP registration doesn't include the document type you're trying to send.
# Check receiver's capabilities first
response = requests.get(
"https://app.goroute.ai/peppol-api/api/v1/participants/lookup",
params={"scheme": "0106", "identifier": "receiver_id"},
headers={"X-API-Key": "your_api_key"}
)
capabilities = response.json()["document_types"]
Best Practices
- Register Early — Complete SMP registration before going live
- Test First — Always register in test environment before production
- Minimal Capabilities — Only register document types you can actually process
- Monitor Status — Set up alerts for SMP registration changes
- Keep Records — Maintain history of registration changes
API Reference
Register in SMP
POST /api/v1/participants/{participant_id}/smp/register
Check SMP Status
GET /api/v1/participants/{participant_id}/smp/status
Update Capabilities
PUT /api/v1/participants/{participant_id}/smp/capabilities
Deregister
DELETE /api/v1/participants/{participant_id}/smp/deregister