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
serviceCodeStringJaDPD-Servicecode (PSD, PSI, PL, PBOX, RET)
mpsIdStringNeinMaster-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
shipmentNoteStringNeinSendungsnotiz
parcelShopIdStringBedingtErforderlich 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
stateCodeStringBedingtPflichtfeld 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)
eoriStringBedingtPflichtfeld für GB/NO international
vatStringBedingtPflichtfeld für GB/NO international (Nicht-CH)
languageStringNeinISO 639-1 (DE, EN, FR, IT)
referenceStringNeinAdressreferenz
noteString0–70NeinZustellanweisungen
glnStringNeinGlobal Location Number

Paketinformationen (parcelInfo[])

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

FeldTypLängePflichtfeldBeschreibung
serviceCodeStringJaService-Code auf Paketebene — siehe Services und Optionen
optionCodesArray<String>NeinZusätzliche Service-Optionscodes — siehe Services und Optionen
contentStringNeinPaketinhaltsbeschreibung (PCONTENT)
weightIntegerJaPaketgewicht 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
higherInsuranceObjectNeinZusatzleistung Höherversicherung (siehe unten)
limitedQuantitiesObjectNeinDaten zu begrenzten Mengen (Gefahrgut) (siehe unten)

Maximales Paketgewichtweight 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
amountNumberJaVersicherter Betrag
currencyStringJaISO-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)
packagingGroupStringBedingtVerpackungsgruppe (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 — identificationUnNounNumber, identificationClassklass, packingGrouppackagingGroup, packingCodecode, hazardousWeightsubWeight.

Zolldaten (customsData)

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

FeldTypLängePflichtfeldBeschreibung
shipmentTypeString1–2JaPakettyp (PARCELTYPE) — siehe Werte unten
valueNumberJaZollwert der Waren (CAMOUNT)
currencyStringNeinISO-4217-Währung für value
valueExNumberNeinZusätzlicher Zollwert (CAMOUNTEX)
currencyExStringNeinISO-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
opCodeStringNeinOperationscode
preAlertStatusStringNeinPre-Alert-Status
contentStringNeinZollinhaltsbeschreibung (CCONTENT)
paperStringNeinDokumenten-Flag (CPAPER)
highLowValueStringNeinHigh/Low-Value-Indikator
invoiceNumberString0–35NeinHandelsrechnungsnummer (CINVOICE)
dateDate (yyyy-MM-dd)JaRechnungsdatum (CINVOICEDATE)
exportMRNString0–209NeinExport Movement Reference Number (SHIPMRN)
documentTypesArray<String>NeinZolldokumenttypen
commentStringNeinZollkommentar (CCOMMENT)
comment2StringNeinRegistrierung im Zielland (DESTCOUNTRYREG)
senderHMRCString0–209NeinHMRC-Registrierung des Absenders
senderInvoicingAddressObjectNeinRechnungsadresse des Absenders (Adressobjekt)
receiverInvoicingAddressObjectNeinRechnungsadresse des Empfängers (Adressobjekt)
numberOfInvoiceLinesIntegerNeinAnzahl 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
productCodeStringNeinProduktcode (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 72600 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"
}
}
]'