Skip to main content

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:

  1. Who you are — Your Peppol identifier
  2. What you can receive — Document types and processes
  3. How to reach you — Your Access Point's endpoint
  4. 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
Deregistration

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
Environment Isolation

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"

  1. Check if registration completed successfully
  2. Verify you're using the correct environment (test/prod)
  3. 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

  1. Register Early — Complete SMP registration before going live
  2. Test First — Always register in test environment before production
  3. Minimal Capabilities — Only register document types you can actually process
  4. Monitor Status — Set up alerts for SMP registration changes
  5. 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

Next Steps