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
serviceCodeString—ObbligatorioCodice servizio DPD (PSD, PSI, PL, PBOX, RET)
mpsIdString—FacoltativoID 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
shipmentNoteString—FacoltativoNota sulla spedizione
parcelShopIdString—CondizionaleRichiesto 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
stateCodeString—CondizionaleObbligatorio 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)
eoriString—CondizionaleObbligatorio per spedizioni internazionali GB/NO
vatString—CondizionaleObbligatorio per spedizioni internazionali GB/NO (non-CH)
languageString—FacoltativoISO 639-1 (DE, EN, FR, IT)
referenceString—FacoltativoRiferimento indirizzo
noteString0–70FacoltativoIstruzioni di consegna
glnString—FacoltativoGlobal 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
serviceCodeString—ObbligatorioCodice servizio a livello di collo — vedi Servizi e opzioni
optionCodesArray<String>—FacoltativoCodici opzione di servizio aggiuntivi — vedi Servizi e opzioni
contentString—FacoltativoDescrizione del contenuto del collo (PCONTENT)
weightInteger—ObbligatorioPeso 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
higherInsuranceObject—FacoltativoServizio aggiuntivo di assicurazione integrativa (vedi sotto)
limitedQuantitiesObject—FacoltativoDati quantità limitate (merci pericolose) (vedi sotto)

Peso massimo del collo — weight 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
amountNumber—ObbligatorioImporto assicurato
currencyString—ObbligatorioCodice 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)
packagingGroupString—CondizionaleGruppo 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 — identificationUnNo → unNumber, identificationClass → klass, packingGroup → packagingGroup, packingCode → code, hazardousWeight → subWeight.

Dati doganali (customsData)​

Obbligatorio per le spedizioni internazionali (sdoganamento non nazionale).

CampoTipoLunghezzaObbligatorioDescrizione
shipmentTypeString1–2ObbligatorioTipo di collo (PARCELTYPE) — vedi valori sotto
valueNumber—ObbligatorioValore doganale della merce (CAMOUNT)
currencyString—FacoltativoValuta ISO 4217 per value
valueExNumber—FacoltativoValore doganale aggiuntivo (CAMOUNTEX)
currencyExString—FacoltativoValuta 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
opCodeString—FacoltativoCodice operazione
preAlertStatusString—FacoltativoStato pre-alert
contentString—FacoltativoDescrizione del contenuto doganale (CCONTENT)
paperString—FacoltativoFlag documento (CPAPER)
highLowValueString—FacoltativoIndicatore 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
commentString—FacoltativoCommento doganale (CCOMMENT)
comment2String—FacoltativoRegistrazione nel paese di destinazione (DESTCOUNTRYREG)
senderHMRCString0–209FacoltativoRegistrazione HMRC del mittente
senderInvoicingAddressObject—FacoltativoIndirizzo di fatturazione del mittente (oggetto indirizzo)
receiverInvoicingAddressObject—FacoltativoIndirizzo di fatturazione del destinatario (oggetto indirizzo)
numberOfInvoiceLinesInteger—FacoltativoNumero 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
productCodeString—FacoltativoCodice 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/EPL — 150, 200/203, 300 o 600 (predefinito 200; altri valori in 72–600 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"
}
}
]'