Skip to main content

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​

  1. Log into Storecove dashboard
  2. Navigate to Settings → Peppol
  3. Click "Request Deregistration"
  4. Contact support@storecove.com if needed

From Basware​

  1. Contact your Basware account manager
  2. Request Peppol participant deregistration
  3. 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​

PhaseDuration
Request submittedImmediate
Current AP notified1-2 business days
Deregistration1-4 hours
GoRoute registration< 15 minutes
DNS propagationUp 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:

  1. Before migration:

    • Inform key trading partners of the change
    • Note any pending incoming documents
  2. During migration:

    • Documents sent during migration may bounce
    • Senders will receive errors and can retry
  3. After migration:

    • Ask senders to retry any failed deliveries
    • Verify received document counts match

Next Steps​