Migrating Access Points
Switch your Peppol registration from another Access Point to GoRoute, or transfer participants between providers.
Migration Overview​
Current AP GoRoute
│ │
â–¼ â–¼
1. Request ───────────────▶ 2. GoRoute receives
migration migration request
│
â–¼
3. Current AP ◀────────────── GoRoute sends
deregisters SMP update request
from SMP │
â–¼
4. Complete ◀────────────── GoRoute registers
in SMP
Initiate Migration​
Request Migration to GoRoute​
import requests
def request_migration(
scheme: str,
identifier: str,
name: str,
country: str,
current_access_point: str = None
) -> dict:
"""Request migration of a participant to GoRoute."""
response = requests.post(
"https://app.goroute.ai/peppol-api/api/v1/participants/migrate",
headers={
"X-API-Key": "your_api_key",
"Content-Type": "application/json"
},
json={
"scheme": scheme,
"identifier": identifier,
"name": name,
"country": country,
"current_access_point": current_access_point,
"contact_email": "admin@company.com"
}
)
return response.json()
# Request migration
result = request_migration(
scheme="0106",
identifier="12345678",
name="My Company BV",
country="NL",
current_access_point="Storecove"
)
print(f"Migration ID: {result['migration_id']}")
print(f"Status: {result['status']}")
print(f"Instructions: {result['next_steps']}")
Migration Response​
{
"migration_id": "mig_abc123",
"status": "pending_deregistration",
"participant": {
"scheme": "0106",
"identifier": "12345678",
"name": "My Company BV"
},
"current_access_point": {
"name": "Previous AP",
"peppol_id": "POP001234"
},
"next_steps": [
"Contact your current Access Point to request deregistration",
"Provide them with migration ID: mig_abc123",
"Once deregistered, GoRoute will complete the migration"
],
"estimated_completion": "24-48 hours after deregistration",
"created_at": "2024-01-15T10:30:00Z"
}
Migration Steps​
Step 1: Contact Current Provider​
Before GoRoute can register your participant, your current Access Point must deregister you from the SMP.
What to tell them:
- You are migrating to GoRoute (POP000991)
- Request immediate SMP deregistration
- Provide the migration ID
Step 2: Deregistration Confirmation​
Once your current AP deregisters:
def check_migration_status(migration_id: str) -> dict:
"""Check the status of a migration."""
response = requests.get(
f"https://app.goroute.ai/peppol-api/api/v1/migrations/{migration_id}",
headers={"X-API-Key": "your_api_key"}
)
return response.json()
status = check_migration_status("mig_abc123")
print(f"Status: {status['status']}")
# Possible statuses:
# - pending_deregistration: Waiting for current AP to deregister
# - deregistration_confirmed: Current AP has deregistered
# - registering: GoRoute is registering in SMP
# - completed: Migration successful
# - failed: Migration failed (see error)
Step 3: GoRoute Completes Registration​
GoRoute monitors for deregistration and automatically completes the migration:
# Migration completed webhook event
{
"type": "migration.completed",
"data": {
"migration_id": "mig_abc123",
"participant": {
"id": "part_xyz789",
"scheme": "0106",
"identifier": "12345678",
"name": "My Company BV"
},
"completed_at": "2024-01-16T14:30:00Z"
}
}
Automatic Migration Detection​
GoRoute can detect when a participant becomes available:
# Enable automatic migration monitoring
response = requests.post(
"https://app.goroute.ai/peppol-api/api/v1/migrations/watch",
headers={
"X-API-Key": "your_api_key",
"Content-Type": "application/json"
},
json={
"scheme": "0106",
"identifier": "12345678",
"name": "My Company BV",
"auto_register": True # Automatically register when available
}
)
Migration from Specific Providers​
From Storecove​
- Log into Storecove dashboard
- Navigate to Settings → Peppol
- Click "Request Deregistration"
- Contact support@storecove.com if needed
From Basware​
- Contact your Basware account manager
- Request Peppol participant deregistration
- Provide GoRoute's Peppol ID: POP000991
From Generic Provider​
Send this email template to your current provider:
Subject: Peppol Participant Deregistration Request
Dear Support,
We are migrating our Peppol registration to a new Access Point.
Participant Details:
- Peppol ID: [scheme]:[identifier]
- Company Name: [your company name]
Please deregister this participant from your SMP as soon as possible.
Our new Access Point (GoRoute) will complete the migration once deregistration is confirmed.
Thank you,
[Your name]
Bulk Migration​
Migrate multiple participants at once:
def bulk_migration(participants: list[dict]) -> dict:
"""Request migration for multiple participants."""
response = requests.post(
"https://app.goroute.ai/peppol-api/api/v1/migrations/bulk",
headers={
"X-API-Key": "your_api_key",
"Content-Type": "application/json"
},
json={
"participants": participants,
"notify_email": "admin@company.com"
}
)
return response.json()
# Migrate multiple companies
participants = [
{"scheme": "0106", "identifier": "12345678", "name": "Company A BV", "country": "NL"},
{"scheme": "0106", "identifier": "87654321", "name": "Company B BV", "country": "NL"},
{"scheme": "0208", "identifier": "0123456789", "name": "Company C NV", "country": "BE"}
]
result = bulk_migration(participants)
print(f"Bulk migration ID: {result['bulk_migration_id']}")
print(f"Total: {result['total']}")
print(f"In progress: {result['in_progress']}")
Migration Timeline​
| Phase | Duration |
|---|---|
| Request submitted | Immediate |
| Current AP notified | 1-2 business days |
| Deregistration | 1-4 hours |
| GoRoute registration | < 15 minutes |
| DNS propagation | Up to 24 hours |
Total typical time: 2-3 business days
Troubleshooting​
Migration Stuck in Pending​
# Force check for deregistration
response = requests.post(
f"https://app.goroute.ai/peppol-api/api/v1/migrations/{migration_id}/check",
headers={"X-API-Key": "your_api_key"}
)
result = response.json()
if result["still_registered"]:
print(f"Participant still registered with: {result['current_ap']}")
else:
print("Deregistration confirmed, migration will proceed")
Participant Already Registered​
{
"error": {
"code": "ALREADY_REGISTERED",
"message": "Participant is registered with another Access Point",
"current_access_point": {
"name": "Other AP",
"peppol_id": "POP001234"
}
}
}
Solution: Contact the current AP for deregistration first.
Failed Migration​
# Get failure details
status = check_migration_status("mig_abc123")
if status["status"] == "failed":
print(f"Failure reason: {status['error']['message']}")
# Retry the migration
response = requests.post(
f"https://app.goroute.ai/peppol-api/api/v1/migrations/{migration_id}/retry",
headers={"X-API-Key": "your_api_key"}
)
Post-Migration Checklist​
After migration is complete:
- Verify participant appears in GoRoute dashboard
- Test sending an invoice
- Test receiving an invoice
- Update webhook URLs if needed
- Verify document capabilities are correct
- Notify trading partners of AP change (optional)
Zero-Downtime Migration​
To ensure no documents are lost during migration:
-
Before migration:
- Inform key trading partners of the change
- Note any pending incoming documents
-
During migration:
- Documents sent during migration may bounce
- Senders will receive errors and can retry
-
After migration:
- Ask senders to retry any failed deliveries
- Verify received document counts match