Skip to main content

Collection Requests

Schedule a one-time parcel collection from your location. DPD will pick up the parcels on the requested date within a specified time window.

EndpointAuth
POST /api/v1/collection-requestsBearer JWT token required

Request

Query parameter: lang (optional) — localise error messages (e.g., de_CH, en_US, fr_CH, it_CH)

Body: List<CollectionRequestDTO>

Fields

FieldTypeLengthRequiredDescription
idLongOptionalRequest identifier for tracking in response
invoicingNumberString1–20MandatoryYour DPD customer billing number
pickupDateString10MandatoryRequested pickup date (yyyy-MM-dd), must be a future date
referenceNumberString0–50OptionalYour internal reference number
noteString0–255OptionalSpecial collection instructions
senderAddressDTOMandatoryAddress where parcels will be collected
receiverAddressDTOMandatoryFinal destination address
requesterAddressDTOOptionalPerson requesting the collection (defaults to receiver)
numberOfParcelsIntegerMandatoryExpected number of parcels. No range is enforced by the API
weightIntegerOptionalTotal weight of all parcels in grams
serviceCodeStringMandatoryMust be present, but the value is ignored — collection requests are always created as B2B
clientSoftwareString1–30MandatoryYour application name. The request is rejected if this is missing or blank
clientVersionString1–10MandatoryYour application version. The request is rejected if this is missing or blank

Example

curl -X POST "https://label-print-shipments.dpd.ch/api/v1/collection-requests?lang=de_CH" \
-H "Authorization: Bearer <jwt_token>" \
-H "Content-Type: application/json" \
-d '[
{
"invoicingNumber": "12345678",
"pickupDate": "<next working day, yyyy-MM-dd>",
"serviceCode": "B2B",
"numberOfParcels": 5,
"weight": 25000,
"clientSoftware": "My Integration",
"clientVersion": "1.0.0",
"sender": {
"name": "Sender Company AG",
"countryCode": "CH",
"zipCode": "8000",
"city": "Zürich",
"street": "Industriestrasse 25",
"phone": "+41441234567"
},
"receiver": {
"name": "Receiver GmbH",
"countryCode": "DE",
"zipCode": "10115",
"city": "Berlin",
"street": "Alexanderplatz 1"
}
}
]'

Response

201 Created — all requests created:

{
"tracingId": "TRACE-789",
"success": [
{ "tracingId": "BPsEYzTIZ" }
],
"failed": []
}

Each success[] item carries the tracingId assigned to the created request, plus identificationNumber echoed back when the request item supplied one. There is no id and no referenceNumber on a success item — id appears only on failed[] items.

Null fields are omitted from responses, so a success item commonly contains nothing but tracingId.

207 Multi-Status — partial success. Each failed[] item carries an identificationNumber (echoes the client-supplied value, when the request item had one), an errorCode; field violations are a flat fieldErrors[] array, each entry with its own path:

{
"tracingId": "TRACE-790",
"success": [],
"failed": [
{
"identificationNumber": "client-supplied-id-4",
"errorCode": "SYS-VALIDATION-FAILURE",
"fieldErrors": [
{
"path": "pickup.date",
"code": "SHP-VAL-PICKUP-DATE-INVALID",
"message": "Pickup date is invalid."
}
]
}
]
}

A transient failure (no fieldErrors — an outage is not a field problem) looks like this instead:

{
"identificationNumber": "client-supplied-id-6",
"errorCode": "SHP-ROUTING-ENGINE-UNAVAILABLE",
"reason": "SHP-ROUTING-ENGINE-UNAVAILABLE: Routing engine is temporarily unavailable. Please try again."
}

Status codes:

CodeDescription
201 CreatedAll collection requests created
207 Multi-StatusSome succeeded, some failed
400 Bad RequestValidation error, or every item in the batch failed (whatever the cause, including a routing-engine outage)
401 UnauthorizedMissing or invalid token

Notes

  • pickupDate must be a future date; past dates are rejected
  • weight is in grams (e.g., 25000 = 25 kg)
  • Address validation follows the same country-specific rules as Shipments (NL house number, GB phone, non-CH/LI email, etc.)