Aller au contenu principal

Expéditions

Créez une ou plusieurs expéditions en une seule requête. L'API valide tous les champs, génère les numéros de colis, enrichit les données de routage et retourne des étiquettes PDF.

Point de terminaisonAuthentification
POST /api/v1/shipmentsJeton JWT Bearer requis

Créer une expédition​

Requête​

Content-Type: application/json Corps: tableau d'objets expédition

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

Champs principaux de l'expédition​

ChampTypeLongueurObligatoireDescription
invoicingNumberString1–20OuiNuméro de facturation client
numberOfParcelsInteger1–2 chiffresOuiNombre total de colis
serviceCodeString—OuiCode service DPD (PSD, PSI, PL, PBOX, RET)
mpsIdString—NonIdentifiant Master Parcel Shipment pour regroupement
customerReferenceNumber1String0–35NonRéférence client 1. Tronqué, non rejeté
customerReferenceNumber2String0–35NonRéférence client 2. Tronqué, non rejeté
customerReferenceNumber3String0–35NonRéférence client 3. Tronqué, non rejeté
customerReferenceNumber4String0–35NonRéférence client 4. Tronqué, non rejeté
shipmentNoteString—NonNote sur l'expédition
parcelShopIdString—ConditionnelRequis pour les services de livraison en point relais
clientSoftwareString1–30OuiNom de l'application cliente
clientVersionString1–10OuiVersion de l'application cliente
identificationNumberString0–100NonVotre propre identifiant pour cet envoi, renvoyé dans failed[]
Certaines limites ne sont pas appliquées

Les noms d'adresse, les lignes de rue, le numéro de rue ainsi que les références de colis et de client ne sont pas rejetés lorsqu'ils sont trop longs. La valeur est coupée silencieusement à la limite et aucune erreur n'est signalée. Si la requête présente d'autres problèmes, vous obtenez ces erreurs à la place, qui peuvent sembler sans rapport avec le champ trop long. Appliquez ces longueurs dans votre propre code.

Comment les longueurs de champs sont vérifiées​

La colonne Longueur indique la limite appliquée par l'API. Un tiret signifie que la longueur n'est pas vérifiée.

  • invoicingNumber, clientSoftware, clientVersion et identificationNumber sont vérifiés avant le traitement du lot. Une valeur trop longue rejette toute la requête avec 400.
  • Toutes les autres limites sont vérifiées par envoi. Une valeur trop longue fait échouer cet envoi avec une entrée dans fieldErrors[], et la requête renvoie 207 (ou 400 si tous les envois ont échoué).
  • Les champs marqués tronqué dans les tableaux sont l'exception : ils sont raccourcis, pas rejetés.
  • Le poids du colis weight est vérifié par rapport à un maximum propre au produit, voir le tableau des poids ci-dessous.

Champs d'adresse (expéditeur / destinataire / retour)​

ChampTypeLongueurObligatoireRemarques
nameString1–35OuiNom de la société ou de la personne. Tronqué, non rejeté
name2String0–35NonLigne de nom supplémentaire. Tronqué, non rejeté
contactString0–35NonPersonne de contact. Tronqué, non rejeté
countryCodeString2OuiISO 3166-1 alpha-2
stateCodeString—ConditionnelRequis pour US/CA
zipCodeString1–9OuiCode postal
cityString1–35OuiVille. Tronqué, non rejeté
streetString1–35OuiNom et numéro de rue. Tronqué, non rejeté
street2String0–35NonLigne d'adresse supplémentaire. Tronqué, non rejeté
houseNumberString0–8ConditionnelRequis pour NL. Tronqué, non rejeté
phoneString0–35ConditionnelRequis pour GB — format international
emailString0–100ConditionnelRequis pour les pays non-CH/LI (sauf GB)
eoriString—ConditionnelRequis pour GB/NO à l'international
vatString—ConditionnelRequis pour GB/NO à l'international (non-CH)
languageString—NonISO 639-1 (DE, EN, FR, IT)
referenceString—NonRéférence d'adresse
noteString0–70NonInstructions de livraison
glnString—NonGlobal Location Number

Informations sur les colis (parcelInfo[])​

Tableau d'objets colis — une entrée par colis physique. Le nombre d'entrées doit correspondre à numberOfParcels.

ChampTypeLongueurObligatoireDescription
serviceCodeString—OuiCode de service au niveau du colis — voir Services et options
optionCodesArray<String>—NonCodes d'options de service supplémentaires — voir Services et options
contentString—NonDescription du contenu du colis (PCONTENT)
weightInteger—OuiPoids du colis en grammes — le maximum dépend du produit, voir ci-dessous
reference1String0–35NonRéférence colis 1. Tronqué, non rejeté
reference2String0–35NonRéférence colis 2. Tronqué, non rejeté
reference3String0–35NonRéférence colis 3. Tronqué, non rejeté
reference4String0–35NonRéférence colis 4. Tronqué, non rejeté
higherInsuranceObject—NonService supplémentaire d'assurance complémentaire (voir ci-dessous)
limitedQuantitiesObject—NonDonnées de quantités limitées (marchandises dangereuses) (voir ci-dessous)

Poids maximal du colis — weight est envoyé en grammes, et un colis au-delà de ces limites est rejeté avec une erreur sur le champ weight :

ProduitNationalInternational
PSD35 kg20 kg
PL2 kg2 kg
PBOX5 kg5 kg
Tous les autres produits35 kg31,5 kg

Champs higherInsurance :

ChampTypeLongueurObligatoireDescription
amountNumber—OuiMontant assuré
currencyString—OuiCode devise ISO 4217

Champs limitedQuantities :

ChampTypeLongueurObligatoireDescription
unNumberString0–4ConditionnelNuméro ONU de marchandises dangereuses (p. ex. 1234). Obligatoire pour les envois internationaux avec l'option LQ
codeString0–5NonCode d'emballage (p. ex. C1)
packagingGroupString—ConditionnelGroupe d'emballage (p. ex. I, II, III). Obligatoire pour les envois internationaux avec l'option LQ
klassString0–6NonClasse de marchandises dangereuses (p. ex. 8)
subWeightInteger0–6NonPoids de la substance

Remarques :

  • Aucun champ n'a de valeur par défaut — les champs omis restent vides.
  • Pour les envois internationaux (non nationaux) avec l'option de service LQ, unNumber et packagingGroup sont obligatoires ; sinon tous les champs sont facultatifs.
  • Caractères autorisés pour unNumber, code, klass, subWeight : lettres, chiffres, espace et . ( ) / _ | -. packagingGroup n'a aucune restriction de longueur ou de caractères.
  • Conseil d'intégration (correspondance de champs, non validée par cette API) : lors de la migration depuis le bloc Shivah WS <hazardous>, les champs correspondent comme suit — identificationUnNo → unNumber, identificationClass → klass, packingGroup → packagingGroup, packingCode → code, hazardousWeight → subWeight.

Données douanières (customsData)​

Requis pour les envois internationaux (dédouanement non national).

ChampTypeLongueurObligatoireDescription
shipmentTypeString1–2OuiType de colis (PARCELTYPE) — voir valeurs ci-dessous
valueNumber—OuiValeur en douane des marchandises (CAMOUNT)
currencyString—NonDevise ISO 4217 pour value
valueExNumber—NonValeur en douane supplémentaire (CAMOUNTEX)
currencyExString—NonDevise ISO 4217 pour valueEx
reasonForExportString1–35OuiCode de motif d'exportation — voir valeurs ci-dessous
termsOfDeliveryString1–35OuiIncoterms / conditions de livraison (CTERMS) — voir valeurs ci-dessous
clearanceClearedString1–35OuiIndicateur de dédouanement — voir valeurs ci-dessous
opCodeString—NonCode d'opération
preAlertStatusString—NonStatut de pré-alerte
contentString—NonDescription du contenu douanier (CCONTENT)
paperString—NonIndicateur de document (CPAPER)
highLowValueString—NonIndicateur de valeur haute/basse
invoiceNumberString0–35NonNuméro de facture commerciale (CINVOICE)
dateDate (yyyy-MM-dd)—OuiDate de facture (CINVOICEDATE)
exportMRNString0–209NonExport Movement Reference Number (SHIPMRN)
documentTypesArray<String>—NonTypes de documents douaniers
commentString—NonCommentaire douanier (CCOMMENT)
comment2String—NonEnregistrement dans le pays de destination (DESTCOUNTRYREG)
senderHMRCString0–209NonEnregistrement HMRC de l'expéditeur
senderInvoicingAddressObject—NonAdresse de facturation de l'expéditeur (objet adresse)
receiverInvoicingAddressObject—NonAdresse de facturation du destinataire (objet adresse)
numberOfInvoiceLinesInteger—NonNombre de lignes de facture (NUMBEROFARTICLE)
invoiceLinesArray<Object>—ConditionnelLignes de facture (voir ci-dessous). Nombre compris entre le nombre de colis et le nombre de colis + 20

Valeurs de shipmentType :

ValeurDescription
DDocument
PMarchandise (non-document)

Valeurs de reasonForExport :

ValeurDescription
01Vente (par défaut)
02Retour / remplacement
03Cadeau

Valeurs de termsOfDelivery :

ValeurDescription
01DAP, non dédouané
02DDP, rendu droits acquittés (droits inclus, taxes exclues)
03DDP, rendu droits acquittés (droits et taxes inclus)
05Départ usine (EXW)
06DAP
07DAP amélioré — droits et taxes prépayés par le destinataire

Valeurs de clearanceCleared :

ValeurDescription
NNon
FFranco
EDédouané à l'exportation
TDédouané en transit
IDédouané à l'importation
HHybride

Champs invoiceLines[] :

ChampTypeLongueurObligatoireDescription
natureOfGoodsString0–200NonNature des marchandises (CCONTENT)
hsCodeString6 ou 8 chiffresNonCode tarifaire SH
productCodeString—NonCode produit (CPRODCODE)
amountNumber13 chiffres + 2 décimalesNonMontant de la ligne (CAMOUNTLINE)
grossWeightIntegerjusqu'à 5 chiffresNonPoids brut (CGROSSWEIGHT)
qItemsIntegerjusqu'à 5 chiffresOuiQuantité d'articles
countryOfOriginString0–3NonPays d'origine ISO (CORIGIN)

Options d'impression​

ChampTypeObligatoireDescription
paperSizeStringNonTaille de l'étiquette : A4 ou A6 (défaut : A6)
printerLanguageStringNonFormat de sortie : PDF, ZPL ou EPL (défaut : PDF)
printerResolutionIntegerNonRésolution d'impression en dpi pour la sortie ZPL/EPL — 150, 200/203, 300 ou 600 (défaut 200 ; les autres valeurs de 72–600 sont acceptées mais retombent à 200 dpi ; ignoré pour PDF)
startPositionStringNonPosition de l'étiquette sur la feuille A4 : UPPER_LEFT, UPPER_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT
dropOffTypeStringNonContenu de l'étiquette : FULL_LABEL (défaut, étiquette d'expédition complète), QR_CODE (étiquette QR PNG numérique) ou BOTH
splitLabelsBooleanNonSi true, la réponse contient une étiquette par entrée de parcelNumbers[] au lieu d'un seul champ label fusionné (défaut : false, voir Étiquettes par numéro de colis)
includeBarcodeBooleanNonSi true, chaque entrée de parcelNumbers[] contient aussi le barcode imprimé sur l'étiquette de ce colis (défaut : false, voir Code-barres de routage dans la réponse)

Remarque : les options d'impression s'appliquent à toute la requête — le premier printOptions renseigné dans la liste des expéditions est utilisé.

Format et taille d'étiquette : les termes labelFormat/labelSize correspondent à printerLanguage (format) et paperSize (taille). Les formats pris en charge sont PDF (défaut), ZPL et EPL ; les tailles prises en charge sont A4 et A6. Un dropOffType QR_CODE/BOTH renvoie une étiquette QR PNG numérique. Les champs Shivah WS équivalents sont printerLanguage (PDF/ZPL) et paperFormat — voir ShipmentService.


Réponse​

201 Created — toutes les expéditions créées. Par défaut, toutes les étiquettes sont fusionnées dans le champ label de premier niveau (base64) :

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

207 Multi-Status — succès partiel. Chaque entrée de failed[] porte une identificationNumber (reprend la valeur fournie par le client, lorsque l'élément d'entrée en avait une) et un errorCode ; les violations de champ apparaissent comme un tableau fieldErrors[] plat, chaque entrée portant son propre path — le même code peut apparaître à plusieurs path (p. ex. à la fois sender.email et 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."
}
]
}
]
}

Un échec transitoire (sans fieldErrors — une panne n'est pas un problème de champ) se présente ainsi :

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

Codes de statut :

CodeDescription
201 CreatedToutes les expéditions créées avec succès
207 Multi-StatusCertaines ont réussi, d'autres ont échoué
400 Bad RequestCharge utile de requête invalide, ou tous les éléments du lot ont échoué — quelle que soit la cause, y compris une panne du moteur de routage
401 UnauthorizedJeton manquant ou invalide

Étiquettes par numéro de colis​

Avec "printOptions": { "splitLabels": true }, le champ label de premier niveau est omis et chaque entrée de parcelNumbers[] contient sa propre label base64 avec uniquement les étiquettes générées pour ce numéro de colis :

{
"tracingId": "TRACE-123",
"success": [
{
"tracingId": "05305000123456",
"parcelNumbers": [
{
"serviceCode": "B2B",
"number": "05305000123456",
"label": "base64-encoded-label..."
},
{
"serviceCode": "B2B",
"number": "05305000123457",
"label": "base64-encoded-label..."
}
]
}
],
"failed": []
}
  • Fonctionne avec tous les formats d'étiquette et tailles de papier. En sortie PDF avec paperSize: A4, chaque numéro de colis reçoit son propre document A4 au lieu de plusieurs étiquettes sur une même feuille.
  • Les numéros de colis de retour et de swap apparaissent comme des entrées distinctes dans parcelNumbers[] avec leurs propres étiquettes.
  • Sans le flag (ou avec splitLabels: false), la réponse reste inchangée : une seule label fusionnée de premier niveau, aucun champ label dans parcelNumbers[].

Code-barres de routage dans la réponse​

Avec "printOptions": { "includeBarcode": true }, chaque entrée de parcelNumbers[] contient aussi le champ barcode — le contenu Code128 exact du code-barres de routage imprimé sur l'étiquette de ce colis, c'est-à-dire ce qu'un scanner lit sur l'étiquette :

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

La valeur est l'indicatif % suivi de 27 caractères :

PartieLongueurContenu
Indicatif1Toujours %
Code postal7Code postal du destinataire, en majuscules et complété à gauche par des 0
Numéro de colis14Le numéro de colis de cette entrée
Code SO3Code de service de routage de ce colis
Pays3Code numérique ISO 3166 du pays de livraison
  • La ligne lisible sous le code-barres sur l'étiquette ajoute une clé de contrôle (IEC 7064 mod 37,36) et des groupes de quatre ; le champ barcode ne contient ni l'une ni l'autre.
  • Les numéros de colis de retour et de swap portent le code-barres de leur propre étiquette, qui route sur un autre code SO et sur le code postal du destinataire du retour, et non sur les valeurs du colis aller.
  • Indépendant de printerLanguage, paperSize, splitLabels et dropOffType.
  • Sans le flag (ou avec includeBarcode: false), le champ barcode est entièrement omis.
  • Le code-barres nécessite une expédition routée. Si les données de routage d'un colis sont incomplètes, l'entrée est renvoyée sans barcode au lieu de faire échouer la requête.

Exemple​

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"
}
}
]'