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
idLong—OptionalRequest 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
senderAddressDTO—MandatoryAddress where parcels will be collected
receiverAddressDTO—MandatoryFinal destination address
requesterAddressDTO—OptionalPerson requesting the collection (defaults to receiver)
numberOfParcelsInteger—MandatoryExpected number of parcels. No range is enforced by the API
weightInteger—OptionalTotal weight of all parcels in grams
serviceCodeString—MandatoryMust 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.)