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
serviceCodeStringOuiCode service DPD (PSD, PSI, PL, PBOX, RET)
mpsIdStringNonIdentifiant 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é
shipmentNoteStringNonNote sur l'expédition
parcelShopIdStringConditionnelRequis 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
stateCodeStringConditionnelRequis 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)
eoriStringConditionnelRequis pour GB/NO à l'international
vatStringConditionnelRequis pour GB/NO à l'international (non-CH)
languageStringNonISO 639-1 (DE, EN, FR, IT)
referenceStringNonRéférence d'adresse
noteString0–70NonInstructions de livraison
glnStringNonGlobal 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
serviceCodeStringOuiCode de service au niveau du colis — voir Services et options
optionCodesArray<String>NonCodes d'options de service supplémentaires — voir Services et options
contentStringNonDescription du contenu du colis (PCONTENT)
weightIntegerOuiPoids 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é
higherInsuranceObjectNonService supplémentaire d'assurance complémentaire (voir ci-dessous)
limitedQuantitiesObjectNonDonnées de quantités limitées (marchandises dangereuses) (voir ci-dessous)

Poids maximal du colisweight 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
amountNumberOuiMontant assuré
currencyStringOuiCode 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)
packagingGroupStringConditionnelGroupe 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 — identificationUnNounNumber, identificationClassklass, packingGrouppackagingGroup, packingCodecode, hazardousWeightsubWeight.

Données douanières (customsData)

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

ChampTypeLongueurObligatoireDescription
shipmentTypeString1–2OuiType de colis (PARCELTYPE) — voir valeurs ci-dessous
valueNumberOuiValeur en douane des marchandises (CAMOUNT)
currencyStringNonDevise ISO 4217 pour value
valueExNumberNonValeur en douane supplémentaire (CAMOUNTEX)
currencyExStringNonDevise 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
opCodeStringNonCode d'opération
preAlertStatusStringNonStatut de pré-alerte
contentStringNonDescription du contenu douanier (CCONTENT)
paperStringNonIndicateur de document (CPAPER)
highLowValueStringNonIndicateur 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
commentStringNonCommentaire douanier (CCOMMENT)
comment2StringNonEnregistrement dans le pays de destination (DESTCOUNTRYREG)
senderHMRCString0–209NonEnregistrement HMRC de l'expéditeur
senderInvoicingAddressObjectNonAdresse de facturation de l'expéditeur (objet adresse)
receiverInvoicingAddressObjectNonAdresse de facturation du destinataire (objet adresse)
numberOfInvoiceLinesIntegerNonNombre 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
productCodeStringNonCode 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/EPL150, 200/203, 300 ou 600 (défaut 200 ; les autres valeurs de 72600 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"
}
}
]'