Passa al contenuto principale

Spedizioni

Creare una o più spedizioni in una singola richiesta. L'API valida tutti i campi, genera i numeri di pacco, arricchisce i dati di instradamento e restituisce etichette PDF.

EndpointAutenticazione
POST /api/v1/shipmentsToken JWT Bearer obbligatorio

Crea spedizione

Richiesta

Content-Type: application/json Corpo: array di oggetti spedizione

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

Campi principali della spedizione

CampoTipoLunghezzaObbligatorioDescrizione
invoicingNumberString1–20ObbligatorioNumero di fatturazione cliente
numberOfParcelsInteger1–2 cifreObbligatorioNumero totale di pacchi
serviceCodeStringObbligatorioCodice servizio DPD (PSD, PSI, PL, PBOX, RET)
mpsIdStringFacoltativoID Master Parcel Shipment per il raggruppamento
customerReferenceNumber1String0–35FacoltativoRiferimento cliente 1. Troncato, non rifiutato
customerReferenceNumber2String0–35FacoltativoRiferimento cliente 2. Troncato, non rifiutato
customerReferenceNumber3String0–35FacoltativoRiferimento cliente 3. Troncato, non rifiutato
customerReferenceNumber4String0–35FacoltativoRiferimento cliente 4. Troncato, non rifiutato
shipmentNoteStringFacoltativoNota sulla spedizione
parcelShopIdStringCondizionaleRichiesto per i servizi di consegna in punto di ritiro
clientSoftwareString1–30ObbligatorioNome dell'applicazione client
clientVersionString1–10ObbligatorioVersione dell'applicazione client
identificationNumberString0–100FacoltativoIl tuo identificativo per questa spedizione, restituito in failed[]
Alcuni limiti non vengono applicati

I nomi dell'indirizzo, le righe della via, il numero civico e i riferimenti di collo e cliente non vengono rifiutati quando sono troppo lunghi. Il valore viene tagliato silenziosamente al limite e non viene segnalato alcun errore. Se la richiesta presenta altri problemi, ricevi quegli errori al suo posto, che possono sembrare non collegati al campo troppo lungo. Applica queste lunghezze nel tuo codice.

Come vengono verificate le lunghezze dei campi

La colonna Lunghezza indica il limite applicato dall'API. Un trattino significa che la lunghezza non viene verificata.

  • invoicingNumber, clientSoftware, clientVersion e identificationNumber vengono verificati prima dell'elaborazione del lotto. Un valore troppo lungo rifiuta l'intera richiesta con 400.
  • Tutti gli altri limiti vengono verificati per singola spedizione. Un valore troppo lungo fa fallire quella spedizione con una voce in fieldErrors[], e la richiesta restituisce 207 (o 400 se tutte le spedizioni sono fallite).
  • I campi contrassegnati come troncato nelle tabelle sono l'eccezione: vengono accorciati, non rifiutati.
  • Il peso del collo weight viene verificato rispetto a un massimo specifico per prodotto, vedi la tabella dei pesi qui sotto.

Campi indirizzo (mittente / destinatario / reso)

CampoTipoLunghezzaObbligatorioNote
nameString1–35ObbligatorioNome azienda o persona. Troncato, non rifiutato
name2String0–35FacoltativoRiga nome aggiuntiva. Troncato, non rifiutato
contactString0–35FacoltativoPersona di contatto. Troncato, non rifiutato
countryCodeString2ObbligatorioISO 3166-1 alpha-2
stateCodeStringCondizionaleObbligatorio per US/CA
zipCodeString1–9ObbligatorioCodice postale
cityString1–35ObbligatorioCittà. Troncato, non rifiutato
streetString1–35ObbligatorioNome e numero civico. Troncato, non rifiutato
street2String0–35FacoltativoRiga indirizzo aggiuntiva. Troncato, non rifiutato
houseNumberString0–8CondizionaleObbligatorio per NL. Troncato, non rifiutato
phoneString0–35CondizionaleObbligatorio per GB — formato internazionale
emailString0–100CondizionaleObbligatorio per i paesi non-CH/LI (eccetto GB)
eoriStringCondizionaleObbligatorio per spedizioni internazionali GB/NO
vatStringCondizionaleObbligatorio per spedizioni internazionali GB/NO (non-CH)
languageStringFacoltativoISO 639-1 (DE, EN, FR, IT)
referenceStringFacoltativoRiferimento indirizzo
noteString0–70FacoltativoIstruzioni di consegna
glnStringFacoltativoGlobal Location Number

Informazioni sui colli (parcelInfo[])

Array di oggetti collo — una voce per ogni collo fisico. Il numero di voci deve corrispondere a numberOfParcels.

CampoTipoLunghezzaObbligatorioDescrizione
serviceCodeStringObbligatorioCodice servizio a livello di collo — vedi Servizi e opzioni
optionCodesArray<String>FacoltativoCodici opzione di servizio aggiuntivi — vedi Servizi e opzioni
contentStringFacoltativoDescrizione del contenuto del collo (PCONTENT)
weightIntegerObbligatorioPeso del collo in grammi — il massimo dipende dal prodotto, vedi sotto
reference1String0–35FacoltativoRiferimento collo 1. Troncato, non rifiutato
reference2String0–35FacoltativoRiferimento collo 2. Troncato, non rifiutato
reference3String0–35FacoltativoRiferimento collo 3. Troncato, non rifiutato
reference4String0–35FacoltativoRiferimento collo 4. Troncato, non rifiutato
higherInsuranceObjectFacoltativoServizio aggiuntivo di assicurazione integrativa (vedi sotto)
limitedQuantitiesObjectFacoltativoDati quantità limitate (merci pericolose) (vedi sotto)

Peso massimo del colloweight viene inviato in grammi, e un collo oltre questi limiti viene rifiutato con un errore sul campo weight:

ProdottoNazionaleInternazionale
PSD35 kg20 kg
PL2 kg2 kg
PBOX5 kg5 kg
Tutti gli altri prodotti35 kg31,5 kg

Campi higherInsurance:

CampoTipoLunghezzaObbligatorioDescrizione
amountNumberObbligatorioImporto assicurato
currencyStringObbligatorioCodice valuta ISO 4217

Campi limitedQuantities:

CampoTipoLunghezzaObbligatorioDescrizione
unNumberString0–4CondizionaleNumero ONU merci pericolose (es. 1234). Obbligatorio per le spedizioni internazionali con l'opzione LQ
codeString0–5FacoltativoCodice di imballaggio (es. C1)
packagingGroupStringCondizionaleGruppo di imballaggio (es. I, II, III). Obbligatorio per le spedizioni internazionali con l'opzione LQ
klassString0–6FacoltativoClasse di merci pericolose (es. 8)
subWeightInteger0–6FacoltativoPeso della sostanza

Note:

  • Nessun campo ha un valore predefinito — i campi omessi restano vuoti.
  • Per le spedizioni internazionali (non nazionali) con l'opzione di servizio LQ, unNumber e packagingGroup sono obbligatori; altrimenti tutti i campi sono facoltativi.
  • Caratteri consentiti per unNumber, code, klass, subWeight: lettere, cifre, spazio e . ( ) / _ | -. packagingGroup non ha limiti di lunghezza o restrizioni sui caratteri.
  • Indicazione di integrazione (corrispondenza dei campi, non validata da questa API): durante la migrazione dal blocco Shivah WS <hazardous>, i campi corrispondono come segue — identificationUnNounNumber, identificationClassklass, packingGrouppackagingGroup, packingCodecode, hazardousWeightsubWeight.

Dati doganali (customsData)

Obbligatorio per le spedizioni internazionali (sdoganamento non nazionale).

CampoTipoLunghezzaObbligatorioDescrizione
shipmentTypeString1–2ObbligatorioTipo di collo (PARCELTYPE) — vedi valori sotto
valueNumberObbligatorioValore doganale della merce (CAMOUNT)
currencyStringFacoltativoValuta ISO 4217 per value
valueExNumberFacoltativoValore doganale aggiuntivo (CAMOUNTEX)
currencyExStringFacoltativoValuta ISO 4217 per valueEx
reasonForExportString1–35ObbligatorioCodice motivo di esportazione — vedi valori sotto
termsOfDeliveryString1–35ObbligatorioIncoterms / condizioni di consegna (CTERMS) — vedi valori sotto
clearanceClearedString1–35ObbligatorioFlag di sdoganamento — vedi valori sotto
opCodeStringFacoltativoCodice operazione
preAlertStatusStringFacoltativoStato pre-alert
contentStringFacoltativoDescrizione del contenuto doganale (CCONTENT)
paperStringFacoltativoFlag documento (CPAPER)
highLowValueStringFacoltativoIndicatore valore alto/basso
invoiceNumberString0–35FacoltativoNumero di fattura commerciale (CINVOICE)
dateDate (yyyy-MM-dd)ObbligatorioData fattura (CINVOICEDATE)
exportMRNString0–209FacoltativoExport Movement Reference Number (SHIPMRN)
documentTypesArray<String>FacoltativoTipi di documenti doganali
commentStringFacoltativoCommento doganale (CCOMMENT)
comment2StringFacoltativoRegistrazione nel paese di destinazione (DESTCOUNTRYREG)
senderHMRCString0–209FacoltativoRegistrazione HMRC del mittente
senderInvoicingAddressObjectFacoltativoIndirizzo di fatturazione del mittente (oggetto indirizzo)
receiverInvoicingAddressObjectFacoltativoIndirizzo di fatturazione del destinatario (oggetto indirizzo)
numberOfInvoiceLinesIntegerFacoltativoNumero di righe fattura (NUMBEROFARTICLE)
invoiceLinesArray<Object>CondizionaleRighe fattura (vedi sotto). Numero compreso tra il numero di colli e il numero di colli + 20

Valori di shipmentType:

ValoreDescrizione
DDocumento
PMerce (non-documento)

Valori di reasonForExport:

ValoreDescrizione
01Vendita (predefinito)
02Reso / sostituzione
03Regalo

Valori di termsOfDelivery:

ValoreDescrizione
01DAP, non sdoganato
02DDP, reso sdoganato (dazi inclusi, tasse escluse)
03DDP, reso sdoganato (dazi e tasse inclusi)
05Franco fabbrica (EXW)
06DAP
07DAP avanzato — dazi e tasse prepagati dal destinatario

Valori di clearanceCleared:

ValoreDescrizione
NNo
FFranco
ESdoganato all'esportazione
TSdoganato in transito
ISdoganato all'importazione
HIbrido

Campi invoiceLines[]:

CampoTipoLunghezzaObbligatorioDescrizione
natureOfGoodsString0–200FacoltativoNatura delle merci (CCONTENT)
hsCodeString6 o 8 cifreFacoltativoCodice tariffario SA
productCodeStringFacoltativoCodice prodotto (CPRODCODE)
amountNumber13 cifre + 2 decimaliFacoltativoImporto riga (CAMOUNTLINE)
grossWeightIntegerfino a 5 cifreFacoltativoPeso lordo (CGROSSWEIGHT)
qItemsIntegerfino a 5 cifreObbligatorioQuantità di articoli
countryOfOriginString0–3FacoltativoPaese di origine ISO (CORIGIN)

Opzioni di stampa

CampoTipoObbligatorioDescrizione
paperSizeStringFacoltativoDimensione etichetta: A4 o A6 (predefinito: A6)
printerLanguageStringFacoltativoFormato di output: PDF, ZPL o EPL (predefinito: PDF)
printerResolutionIntegerFacoltativoRisoluzione di stampa in dpi per l'output ZPL/EPL150, 200/203, 300 o 600 (predefinito 200; altri valori in 72600 sono accettati ma tornano a 200 dpi; ignorato per PDF)
startPositionStringFacoltativoPosizione etichetta sul foglio A4: UPPER_LEFT, UPPER_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT
dropOffTypeStringFacoltativoContenuto etichetta: FULL_LABEL (predefinito, etichetta di spedizione completa), QR_CODE (etichetta QR PNG digitale) o BOTH
splitLabelsBooleanFacoltativoSe true, la risposta restituisce un'etichetta per ogni voce di parcelNumbers[] invece di un unico campo label unificato (predefinito: false, vedi Etichette separate per numero di collo)
includeBarcodeBooleanFacoltativoSe true, ogni voce di parcelNumbers[] contiene anche il barcode stampato sull'etichetta di quel collo (predefinito: false, vedi Barcode di routing nella risposta)

Nota: le opzioni di stampa valgono per l'intera richiesta — viene usato il primo printOptions presente nella lista delle spedizioni.

Formato e dimensione etichetta: i termini labelFormat/labelSize corrispondono a printerLanguage (formato) e paperSize (dimensione). I formati supportati sono PDF (predefinito), ZPL ed EPL; le dimensioni supportate sono A4 e A6. Un dropOffType QR_CODE/BOTH restituisce un'etichetta QR PNG digitale. I campi Shivah WS equivalenti sono printerLanguage (PDF/ZPL) e paperFormat — vedi ShipmentService.


Risposta

201 Created — tutte le spedizioni create. Per impostazione predefinita tutte le etichette sono unite nel campo label di primo livello (base64):

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

207 Multi-Status — successo parziale. Ogni voce di failed[] porta un identificationNumber (riprende il valore fornito dal client, quando l'elemento di input ne aveva uno) e un errorCode; le violazioni di campo compaiono come un array fieldErrors[] piatto, con ogni voce che porta il proprio path — lo stesso code può comparire a più path (ad es. sia sender.email che 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 errore transitorio (senza fieldErrors — un'interruzione non è un problema di campo) si presenta invece così:

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

Codici di stato:

CodiceDescrizione
201 CreatedTutte le spedizioni create con successo
207 Multi-StatusAlcune riuscite, altre fallite
400 Bad RequestPayload della richiesta non valido, oppure tutti gli elementi del lotto sono falliti — indipendentemente dalla causa, anche in caso di guasto del motore di instradamento
401 UnauthorizedToken mancante o non valido

Etichette separate per numero di collo

Con "printOptions": { "splitLabels": true } il campo label di primo livello viene omesso e ogni voce di parcelNumbers[] contiene la propria label base64 con solo le etichette generate per quel numero di collo:

{
"tracingId": "TRACE-123",
"success": [
{
"tracingId": "05305000123456",
"parcelNumbers": [
{
"serviceCode": "B2B",
"number": "05305000123456",
"label": "base64-encoded-label..."
},
{
"serviceCode": "B2B",
"number": "05305000123457",
"label": "base64-encoded-label..."
}
]
}
],
"failed": []
}
  • Funziona con tutti i formati di etichetta e dimensioni carta. Con output PDF e paperSize: A4 ogni numero di collo riceve un proprio documento A4 invece di più etichette sullo stesso foglio.
  • I numeri di collo di reso e swap compaiono come voci separate in parcelNumbers[] e contengono le proprie etichette.
  • Senza il flag (o con splitLabels: false) la risposta resta invariata: un'unica label unificata di primo livello, nessun campo label dentro parcelNumbers[].

Barcode di routing nella risposta

Con "printOptions": { "includeBarcode": true } ogni voce di parcelNumbers[] contiene anche il campo barcode — l'esatto contenuto Code128 del barcode di routing stampato sull'etichetta di quel collo, cioè ciò che uno scanner legge dall'etichetta:

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

Il valore è il contrassegno % seguito da 27 caratteri:

ParteLunghezzaContenuto
Contrassegno1Sempre %
Codice postale7CAP del destinatario, in maiuscolo e completato a sinistra con 0
Numero di collo14Il numero di collo di questa voce
Codice SO3Codice di servizio di routing di questo collo
Paese3Codice numerico ISO 3166 del paese di consegna
  • La riga leggibile sotto il barcode sull'etichetta aggiunge una cifra di controllo (IEC 7064 mod 37,36) e raggruppa le cifre a quattro; il campo barcode non contiene nessuna delle due cose.
  • I numeri di collo di reso e swap riportano il barcode della propria etichetta, che instrada su un codice SO diverso e sul CAP del destinatario del reso, non sui valori del collo di andata.
  • Indipendente da printerLanguage, paperSize, splitLabels e dropOffType.
  • Senza il flag (o con includeBarcode: false) il campo barcode viene omesso completamente.
  • Il barcode richiede una spedizione instradata. Se i dati di routing di un collo sono incompleti, la voce viene restituita senza barcode invece di far fallire la richiesta.

Esempio

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