DPD Label Print Shipment API
The DPD Label Print Webservice (REST API) enables server-side integration of DPD shipping services into your ERP, CRM, or e-commerce platform — without requiring the desktop application. Generate labels, track parcels, and schedule pickups programmatically.
The Shipment API enables you to integrate DPD shipping services into your applications — including shipment creation, tracking, parcel shop lookup, and pickup scheduling.
Base URL: https://label-print-shipments.dpd.ch
API Version: v1
Auth: JWT Bearer token (see Authentication)
API Reference
| API | Endpoints | Description |
|---|---|---|
| Authentication | 2 | User login and JWT token generation |
| Shipments | 1 | Create shipments with automatic label generation |
| Tracking | 1 | Real-time parcel tracking information |
| Parcel Shops | 3 | Search and retrieve parcel shop details |
| Collection Requests | 1 | Schedule one-time parcel collections |
| Pickup Orders | 1 | Create recurring pickup schedules |
Quick Start
1. Get an access token
curl -X POST "https://label-print-shipments.dpd.ch/api/v1/login" \
-H "Content-Type: application/json" \
-d '{
"username": "your_username",
"password": "your_password"
}'
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "..."
}
2. Call any API endpoint
Include the token in every request:
curl -X GET "https://label-print-shipments.dpd.ch/api/v1/tracking/05305000123456" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
Common Concepts
Address Validation
All address fields follow consistent rules:
{
"name": "Company Name", // required, max 35 chars
"countryCode": "CH", // required, ISO 2-letter
"zipCode": "8000", // required, max 9 chars
"city": "Zürich", // required, max 35 chars
"street": "Bahnhofstrasse 1", // required, max 35 chars
"phone": "+41441234567", // required for GB
"email": "info@company.ch" // required for non-CH/LI
}
Country-specific requirements:
- NL:
houseNumberis mandatory - GB:
phoneis mandatory (international format) - US/CA:
stateCodeis mandatory - Non-CH/LI:
emailis mandatory (except GB)
Service Codes
| Code | Service | Description |
|---|---|---|
B2B | DPD CLASSIC | Standard domestic and international delivery |
B2BI | DPD CLASSIC International | International B2B shipment |
B2BP | DPD CLASSIC Predict | With recipient notification |
PM2 | DPD CLASSIC Guarantee | Guaranteed delivery by 18:00 |
B2C | DPD COMFORT | With recipient notification |
HOME | DPD HOME | With recipient notification |
AM1 | DPD EXPRESS 10:00 | Guaranteed delivery by 10:00 |
AM2 | DPD EXPRESS 12:00 | Guaranteed delivery by 12:00 |
PSD | DPD SHOP | Parcel shop delivery |
PL | DPD PARCEL LETTER | Small items, max 2 kg |
PBOX | DPD PARCELBOX | GPS + photo, max 5 kg |
RET | Return | Return goods |
CR | Collection Request | Pickup from customer to end customer |
LQ | Limited Quantities | Hazardous goods (limited quantities) |
SWAP | SWAP | Quick replacement for rejected goods |
TYRE | Tyres | Bulk tyre shipping |
Error Responses
All endpoints return consistent error objects:
{
"timestamp": "2025-10-30T10:30:00Z",
"status": 400,
"error": "Bad Request",
"message": "Validation failed",
"path": "/api/v1/shipments"
}
207 Multi-Status — partial success (some items succeeded, others failed):
{
"tracingId": "TRACE-123",
"success": [],
"failed": [
{
"id": 2,
"fieldErrors": {
"field.name": ["error_code"]
}
}
]
}
Supported Languages
Pass the locale header or query parameter to get localised messages and tracking descriptions:
| Language | Locale values |
|---|---|
| German | de_CH, de_DE |
| English | en_US, en_GB |
| French | fr_CH, fr_FR |
| Italian | it_CH, it_IT |
Environments
| Environment | Base URL |
|---|---|
| Production | https://label-print-shipments.dpd.ch |
| Staging | https://label-print-shipments-st.dpd.ch |
Rate Limiting
All endpoints are rate-limited. Exceeded limits return 429 Too Many Requests.
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed in the window |
X-RateLimit-Remaining | Requests remaining in the current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Recommendations:
- Cache parcel shop data (it changes infrequently) to reduce API calls
- Implement exponential back-off when you receive a
429response - Use batch shipment requests instead of individual calls where possible
OpenAPI / Swagger
Interactive API documentation and machine-readable specs are available directly on each service:
| Resource | URL |
|---|---|
| Swagger UI | https://label-print-shipments.dpd.ch/swagger-ui/index.html |
| OpenAPI JSON | https://label-print-shipments.dpd.ch/v3/api-docs |
| OpenAPI YAML | https://label-print-shipments.dpd.ch/v3/api-docs.yaml |
Best Practices
- Tokens: store securely, refresh before expiry, never expose in URLs or logs
- Rate limiting: handle
429 Too Many Requestswith exponential back-off; cache parcel shop data - Error handling: check HTTP status codes; implement retry logic for 5xx errors
- Validation: validate data client-side before sending; pay attention to country-specific rules
- Batching: use batch shipment creation to minimise round trips and rate-limit consumption