Zum Hauptinhalt springen

Sendungen

Erstellen Sie eine oder mehrere Sendungen in einer einzigen Anfrage. Die API validiert alle Felder, generiert Paketnummern, reichert Routing-Daten an und gibt PDF-Etiketten zurück.

EndpunktAuthentifizierung
POST /api/v1/shipmentsBearer JWT-Token erforderlich

Sendung erstellen​

Anfrage​

Content-Type: application/json Body: Array von Sendungsobjekten

[
{
"invoicingNumber": "12345678",
"serviceCode": "PSD",
"sender": { },
"receiver": { },
"parcelInfo": [ ],
"customsData": { },
"printOptions": { }
}
]

Sendungs-Hauptfelder​

FeldTypLängePflichtfeldBeschreibung
invoicingNumberString1–20JaKundenrechnungsnummer
numberOfParcelsInteger1–2 StellenJaGesamtpakete
serviceCodeString—JaDPD-Servicecode (PSD, PSI, PL, PBOX, RET)
mpsIdString—NeinMaster-Sendungs-ID zur Gruppierung
customerReferenceNumber1String0–35NeinKundenreferenz 1. Gekürzt, nicht abgewiesen
customerReferenceNumber2String0–35NeinKundenreferenz 2. Gekürzt, nicht abgewiesen
customerReferenceNumber3String0–35NeinKundenreferenz 3. Gekürzt, nicht abgewiesen
customerReferenceNumber4String0–35NeinKundenreferenz 4. Gekürzt, nicht abgewiesen
shipmentNoteString—NeinSendungsnotiz
parcelShopIdString—BedingtErforderlich für Paketshop-Lieferdienste
clientSoftwareString1–30JaName der Client-Anwendung
clientVersionString1–10JaVersion der Client-Anwendung
identificationNumberString0–100NeinIhre eigene Kennung für diese Sendung, wird in failed[] zurückgegeben
Einige Grenzen werden nicht durchgesetzt

Adressnamen, Strassenzeilen, Hausnummer sowie die Paket- und Kundenreferenzen werden nicht abgewiesen, wenn sie zu lang sind. Der Wert wird stillschweigend auf die Grenze gekürzt, und es wird kein Fehler gemeldet. Hat die Anfrage andere Probleme, erhalten Sie stattdessen diese Fehler, die mit dem zu langen Feld nichts zu tun zu haben scheinen. Erzwingen Sie diese Längen in Ihrem eigenen Code.

So werden Feldlängen geprüft​

Die Spalte Länge zeigt die Grenze, die die API anwendet. Ein Gedankenstrich bedeutet, dass die Länge nicht geprüft wird.

  • invoicingNumber, clientSoftware, clientVersion und identificationNumber werden geprüft, bevor der Batch verarbeitet wird. Ein zu langer Wert weist die gesamte Anfrage mit 400 ab.
  • Alle anderen Grenzen werden pro Sendung geprüft. Ein zu langer Wert lässt diese Sendung mit einem Eintrag in fieldErrors[] fehlschlagen, und die Anfrage liefert 207 (oder 400, wenn jede Sendung fehlgeschlagen ist).
  • Felder, die in den Tabellen als gekürzt markiert sind, sind die Ausnahme: sie werden gekürzt, nicht abgewiesen.
  • Das Paketgewicht weight wird gegen ein produktabhängiges Maximum geprüft, siehe die Gewichtstabelle unten.

Adressfelder (Absender / Empfänger / Rücksendung)​

FeldTypLängePflichtfeldHinweise
nameString1–35JaFirmen- oder Personenname. Gekürzt, nicht abgewiesen
name2String0–35NeinZusätzliche Namenszeile. Gekürzt, nicht abgewiesen
contactString0–35NeinKontaktperson. Gekürzt, nicht abgewiesen
countryCodeString2JaISO 3166-1 Alpha-2
stateCodeString—BedingtPflichtfeld für US/CA
zipCodeString1–9JaPostleitzahl
cityString1–35JaStadt. Gekürzt, nicht abgewiesen
streetString1–35JaStrassenname und Hausnummer. Gekürzt, nicht abgewiesen
street2String0–35NeinZusätzliche Adresszeile. Gekürzt, nicht abgewiesen
houseNumberString0–8BedingtPflichtfeld für NL. Gekürzt, nicht abgewiesen
phoneString0–35BedingtPflichtfeld für GB — internationales Format
emailString0–100BedingtPflichtfeld für Nicht-CH/LI-Länder (ausser GB)
eoriString—BedingtPflichtfeld für GB/NO international
vatString—BedingtPflichtfeld für GB/NO international (Nicht-CH)
languageString—NeinISO 639-1 (DE, EN, FR, IT)
referenceString—NeinAdressreferenz
noteString0–70NeinZustellanweisungen
glnString—NeinGlobal Location Number

Paketinformationen (parcelInfo[])​

Array von Paketobjekten — ein Eintrag pro physischem Paket. Die Anzahl der Einträge sollte numberOfParcels entsprechen.

FeldTypLängePflichtfeldBeschreibung
serviceCodeString—JaService-Code auf Paketebene — siehe Services und Optionen
optionCodesArray<String>—NeinZusätzliche Service-Optionscodes — siehe Services und Optionen
contentString—NeinPaketinhaltsbeschreibung (PCONTENT)
weightInteger—JaPaketgewicht in Gramm — das Maximum hängt vom Produkt ab, siehe unten
reference1String0–35NeinPaketreferenz 1. Gekürzt, nicht abgewiesen
reference2String0–35NeinPaketreferenz 2. Gekürzt, nicht abgewiesen
reference3String0–35NeinPaketreferenz 3. Gekürzt, nicht abgewiesen
reference4String0–35NeinPaketreferenz 4. Gekürzt, nicht abgewiesen
higherInsuranceObject—NeinZusatzleistung Höherversicherung (siehe unten)
limitedQuantitiesObject—NeinDaten zu begrenzten Mengen (Gefahrgut) (siehe unten)

Maximales Paketgewicht — weight wird in Gramm gesendet, und ein Paket über diesen Grenzen wird mit einem Feldfehler auf weight abgewiesen:

ProduktInlandInternational
PSD35 kg20 kg
PL2 kg2 kg
PBOX5 kg5 kg
Alle anderen Produkte35 kg31,5 kg

higherInsurance-Felder:

FeldTypLängePflichtfeldBeschreibung
amountNumber—JaVersicherter Betrag
currencyString—JaISO-4217-Währungscode

limitedQuantities-Felder:

FeldTypLängePflichtfeldBeschreibung
unNumberString0–4BedingtUN-Gefahrgutnummer (z. B. 1234). Pflichtfeld für internationale Sendungen mit der Option LQ
codeString0–5NeinVerpackungscode (z. B. C1)
packagingGroupString—BedingtVerpackungsgruppe (z. B. I, II, III). Pflichtfeld für internationale Sendungen mit der Option LQ
klassString0–6NeinGefahrgutklasse (z. B. 8)
subWeightInteger0–6NeinSubstanzgewicht

Hinweise:

  • Kein Feld hat einen Standardwert — weggelassene Felder bleiben leer.
  • Für internationale (nicht-inländische) Sendungen mit der Serviceoption LQ sind unNumber und packagingGroup Pflichtfelder; andernfalls sind alle Felder optional.
  • Erlaubte Zeichen für unNumber, code, klass, subWeight: Buchstaben, Ziffern, Leerzeichen sowie . ( ) / _ | -. packagingGroup hat keine Längen- oder Zeichenbeschränkung.
  • Integrationshinweis (Feldzuordnung, von dieser API nicht validiert): Bei der Migration vom Shivah-WS-Block <hazardous> entsprechen sich die Felder wie folgt — identificationUnNo → unNumber, identificationClass → klass, packingGroup → packagingGroup, packingCode → code, hazardousWeight → subWeight.

Zolldaten (customsData)​

Erforderlich für internationale Sendungen (nicht-inländische Verzollung).

FeldTypLängePflichtfeldBeschreibung
shipmentTypeString1–2JaPakettyp (PARCELTYPE) — siehe Werte unten
valueNumber—JaZollwert der Waren (CAMOUNT)
currencyString—NeinISO-4217-Währung für value
valueExNumber—NeinZusätzlicher Zollwert (CAMOUNTEX)
currencyExString—NeinISO-4217-Währung für valueEx
reasonForExportString1–35JaAusfuhrgrund-Code — siehe Werte unten
termsOfDeliveryString1–35JaIncoterms / Lieferbedingungen (CTERMS) — siehe Werte unten
clearanceClearedString1–35JaVerzollungs-Flag — siehe Werte unten
opCodeString—NeinOperationscode
preAlertStatusString—NeinPre-Alert-Status
contentString—NeinZollinhaltsbeschreibung (CCONTENT)
paperString—NeinDokumenten-Flag (CPAPER)
highLowValueString—NeinHigh/Low-Value-Indikator
invoiceNumberString0–35NeinHandelsrechnungsnummer (CINVOICE)
dateDate (yyyy-MM-dd)—JaRechnungsdatum (CINVOICEDATE)
exportMRNString0–209NeinExport Movement Reference Number (SHIPMRN)
documentTypesArray<String>—NeinZolldokumenttypen
commentString—NeinZollkommentar (CCOMMENT)
comment2String—NeinRegistrierung im Zielland (DESTCOUNTRYREG)
senderHMRCString0–209NeinHMRC-Registrierung des Absenders
senderInvoicingAddressObject—NeinRechnungsadresse des Absenders (Adressobjekt)
receiverInvoicingAddressObject—NeinRechnungsadresse des Empfängers (Adressobjekt)
numberOfInvoiceLinesInteger—NeinAnzahl der Rechnungspositionen (NUMBEROFARTICLE)
invoiceLinesArray<Object>—BedingtRechnungspositionen (siehe unten). Anzahl zwischen Paketanzahl und Paketanzahl + 20

shipmentType-Werte:

WertBeschreibung
DDokument
PNicht-Dokument

reasonForExport-Werte:

WertBeschreibung
01Verkauf (Standard)
02Rückgabe / Ersatz
03Geschenk

termsOfDelivery-Werte:

WertBeschreibung
01DAP, nicht verzollt
02DDP, verzollt (inkl. Zölle, exkl. Steuern)
03DDP, verzollt (inkl. Zölle und Steuern)
05Ab Werk (EXW)
06DAP
07DAP erweitert — Zölle und Steuern vom Empfänger im Voraus bezahlt

clearanceCleared-Werte:

WertBeschreibung
NNein
FFrei
EAusfuhrverzollt
TTransitverzollt
IEinfuhrverzollt
HHybrid

invoiceLines[]-Felder:

FeldTypLängePflichtfeldBeschreibung
natureOfGoodsString0–200NeinArt der Waren (CCONTENT)
hsCodeString6 oder 8 ZiffernNeinHS-Zolltarifcode
productCodeString—NeinProduktcode (CPRODCODE)
amountNumber13 Stellen + 2 DezimalstellenNeinPositionsbetrag (CAMOUNTLINE)
grossWeightIntegerbis zu 5 StellenNeinBruttogewicht (CGROSSWEIGHT)
qItemsIntegerbis zu 5 StellenJaArtikelmenge
countryOfOriginString0–3NeinISO-Ursprungsland (CORIGIN)

Druckoptionen​

FeldTypPflichtfeldBeschreibung
paperSizeStringNeinEtikettengrösse: A4 oder A6 (Standard: A6)
printerLanguageStringNeinAusgabeformat: PDF, ZPL oder EPL (Standard: PDF)
printerResolutionIntegerNeinDruckauflösung in dpi für ZPL/EPL-Ausgabe — 150, 200/203, 300 oder 600 (Standard 200; andere Werte in 72–600 werden akzeptiert, fallen aber auf 200 dpi zurück; bei PDF ignoriert)
startPositionStringNeinEtikettenposition auf A4-Blatt: UPPER_LEFT, UPPER_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT
dropOffTypeStringNeinEtiketteninhalt: FULL_LABEL (Standard, vollständiges Versandetikett), QR_CODE (digitales PNG-QR-Etikett) oder BOTH
splitLabelsBooleanNeinWenn true, enthält jeder Eintrag in parcelNumbers[] ein eigenes label statt eines einzelnen zusammengeführten label (Standard: false, siehe Etiketten pro Paketnummer)
includeBarcodeBooleanNeinWenn true, enthält jeder Eintrag in parcelNumbers[] zusätzlich den barcode, der auf dem Etikett dieses Pakets gedruckt wird (Standard: false, siehe Routing-Barcode in der Antwort)

Hinweis: Druckoptionen gelten für die gesamte Anfrage — verwendet wird das erste gesetzte printOptions in der Sendungsliste.

Etikettenformat & -grösse: Die Begriffe labelFormat/labelSize entsprechen printerLanguage (Format) und paperSize (Grösse). Unterstützte Formate sind PDF (Standard), ZPL und EPL; unterstützte Grössen sind A4 und A6. Ein dropOffType von QR_CODE/BOTH liefert ein digitales PNG-QR-Etikett. Die entsprechenden Shivah-WS-Felder sind printerLanguage (PDF/ZPL) und paperFormat — siehe ShipmentService.


Antwort​

201 Created – alle Sendungen erfolgreich erstellt. Standardmäßig werden alle Etiketten in das übergeordnete Feld label (Base64) zusammengeführt:

{
"tracingId": "TRACE-123",
"label": "base64-encoded-labels...",
"success": [
{
"tracingId": "05305000123456",
"parcelNumbers": [
{ "serviceCode": "B2B", "number": "05305000123456" },
{ "serviceCode": "B2B", "number": "05305000123457" }
]
}
],
"failed": []
}

207 Multi-Status – Teilerfolg. Jeder Eintrag in failed[] enthält eine identificationNumber (spiegelt den vom Client übergebenen Wert, sofern der Eingabe-Eintrag einen hatte) und einen errorCode; Feldfehler erscheinen als flaches fieldErrors[]-Array, wobei jeder Eintrag seinen eigenen path trägt — derselbe code kann bei mehreren path-Werten auftreten (z. B. sowohl sender.email als auch receiver.email):

{
"tracingId": "TRACE-456",
"label": "base64-encoded-labels...",
"success": [
{
"tracingId": "05305000123456",
"parcelNumbers": [ { "serviceCode": "B2B", "number": "05305000123456" } ]
}
],
"failed": [
{
"identificationNumber": "client-supplied-id-9",
"errorCode": "SYS-VALIDATION-FAILURE",
"fieldErrors": [
{
"path": "receiver.countryCode",
"code": "SHP-VAL-COUNTRYCODE-ALLOWED-CHARACTERS",
"message": "Country code contains invalid characters."
},
{
"path": "receiver.email",
"code": "SHP-VAL-EMAIL-REQUIRED",
"message": "Email address is required."
}
]
}
]
}

Ein vorübergehender Fehler (ohne fieldErrors – ein Ausfall ist kein Feldproblem) sieht dagegen so aus:

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

Statuscodes:

CodeBeschreibung
201 CreatedAlle Sendungen erfolgreich erstellt
207 Multi-StatusTeilerfolg
400 Bad RequestUngültige Anfrage, oder alle Positionen der Sammelanfrage sind fehlgeschlagen — unabhängig von der Ursache, auch bei einem Ausfall der Routing-Engine
401 UnauthorizedToken fehlt oder ungültig

Etiketten pro Paketnummer​

Mit "printOptions": { "splitLabels": true } entfällt das übergeordnete label, und jeder Eintrag in parcelNumbers[] enthält ein eigenes Base64-label mit ausschließlich den für diese Paketnummer erzeugten Etiketten:

{
"tracingId": "TRACE-123",
"success": [
{
"tracingId": "05305000123456",
"parcelNumbers": [
{
"serviceCode": "B2B",
"number": "05305000123456",
"label": "base64-encoded-label..."
},
{
"serviceCode": "B2B",
"number": "05305000123457",
"label": "base64-encoded-label..."
}
]
}
],
"failed": []
}
  • Funktioniert mit allen Etikettenformaten und Papiergrößen. Bei PDF-Ausgabe mit paperSize: A4 erhält jede Paketnummer ein eigenes A4-Dokument statt mehrerer Etiketten auf einem Blatt.
  • Retouren- und Swap-Paketnummern erscheinen als eigene Einträge in parcelNumbers[] und enthalten ihre eigenen Etiketten.
  • Ohne das Flag (oder mit splitLabels: false) bleibt die Antwort unverändert: ein zusammengeführtes übergeordnetes label, kein label-Feld innerhalb von parcelNumbers[].

Routing-Barcode in der Antwort​

Mit "printOptions": { "includeBarcode": true } enthält jeder Eintrag in parcelNumbers[] zusätzlich das Feld barcode — den exakten Code128-Inhalt des Routing-Barcodes, der auf dem Etikett dieses Pakets gedruckt wird, also genau das, was ein Scanner vom Etikett liest:

{
"tracingId": "TRACE-123",
"label": "base64-encoded-labels...",
"success": [
{
"tracingId": "05305000123456",
"parcelNumbers": [
{
"serviceCode": "B2B",
"number": "05305000123456",
"barcode": "%000815305305000123456420756"
}
]
}
],
"failed": []
}

Der Wert besteht aus dem Kennzeichen % gefolgt von 27 Zeichen:

TeilLängeInhalt
Kennzeichen1Immer %
Postleitzahl7PLZ des Empfängers, in Großbuchstaben und links mit 0 aufgefüllt
Paketnummer14Die Paketnummer dieses Eintrags
SO-Code3Routing-Servicecode dieses Pakets
Land3ISO-3166-Nummerncode des Zustelllandes
  • Die lesbare Zeile unter dem Barcode auf dem Etikett enthält zusätzlich eine Prüfziffer (IEC 7064 mod 37,36) und Vierergruppen; das Feld barcode enthält beides nicht.
  • Retouren- und Swap-Paketnummern tragen den Barcode ihres eigenen Etiketts: dieses routet über einen anderen SO-Code und über die PLZ des Retourenempfängers, nicht über die Werte des Hinweg-Pakets.
  • Unabhängig von printerLanguage, paperSize, splitLabels und dropOffType.
  • Ohne das Flag (oder mit includeBarcode: false) entfällt das Feld barcode vollständig.
  • Der Barcode setzt eine geroutete Sendung voraus. Sind die Routing-Daten eines Pakets unvollständig, wird der Eintrag ohne barcode zurückgegeben, statt die Anfrage abzubrechen.

Beispiel​

curl -X POST "https://label-print-shipments.dpd.ch/api/v1/shipments" \
-H "Authorization: Bearer <jwt_token>" \
-H "Content-Type: application/json" \
-d '[
{
"invoicingNumber": "12345678",
"serviceCode": "PSD",
"numberOfParcels": 1,
"sender": {
"name": "Sender AG",
"countryCode": "CH",
"zipCode": "8000",
"city": "Zürich",
"street": "Industriestrasse 25"
},
"receiver": {
"name": "Receiver GmbH",
"countryCode": "DE",
"zipCode": "10115",
"city": "Berlin",
"street": "Alexanderplatz 1",
"email": "info@receiver.de"
},
"parcelInfo": [
{ "weight": 2500 }
],
"printOptions": {
"paperSize": "A6"
}
}
]'