DOCS

Crea un'unica spedizione

Il workflow GraphQL CreateDeclarationShipment porta una spedizione Japan Post dagli input grezzi a un'etichetta stampabile in un solo round trip.

CreateDeclarationShipment concatena sei mutazioni *Workflow in un'unica richiesta GraphQL. Ogni passaggio si basa sui dati forniti dai passaggi precedenti e vengono inviati tutti insieme, in modo da poter creare una spedizione completa in un solo round trip:

partyCreateWorkflow            → describe origin + destination parties
itemCreateWorkflow             → describe the line items
cartonsCreateWorkflow          → describe the physical packaging
shipmentRatingCreateWorkflow   → record the carrier rate quote
landedCostCalculateWorkflow    → calculate duties / taxes / fees
shipmentCreateWorkflow         → create the shipment + label

Le mutazioni Workflow sono progettate per essere concatenate: non è necessario passare gli ID da un passaggio all'altro né inviare una richiesta separata per ogni passaggio. Invia l'intero documento e ottieni indietro lo Shipment finale.

Quando il serviceLevel dell'ultimo passaggio è un livello di servizio Japan Post (japan_post.*), Zonos chiama per tuo conto l'API etichette di Japan Post (codice 52) utilizzando i Later Pay Number del tuo Verified Account, genera l'etichetta e il numero di tracciamento, crea il Declaration ID e li collega — tutto all'interno di quello stesso passaggio finale shipmentCreateWorkflow.

Perché un'unica mutazione? Ogni passaggio dipende dal precedente (il costo allo sbarco richiede gli articoli e le parti; l'etichetta richiede tutto). Raggruppare tutto in un unico documento GraphQL mantiene i dati coerenti ed evita cinque round trip aggiuntivi.

Endpoint e autenticazione 

Le richieste di questa catena usano tutte lo stesso endpoint. Ciò che passi nelle intestazioni dipende dalla tua configurazione: scegli la scheda che ti riguarda.

URL:

https://api.zonos.com/graphql

Intestazioni:

Spedisci i tuoi ordini con il tuo Verified Account. Autenticati come te stesso — non serve nessuna account key.

credentialToken: {{YOUR_API_TOKEN}}

Dove trovarlo: Zonos Dashboard → SettingsIntegrations → la sezione Account Key. Copia il token nella riga API key: quello è il tuo credentialToken.

Richiesta di esempio 

Una richiesta CreateDeclarationShipment completa che puoi copiare e adattare — la mutazione, le sue variabili e la risposta — per una singola spedizione Japan Post inviata in DDP verso gli Stati Uniti. Ogni input viene descritto nel dettaglio nella sezione passo-passo qui sotto.

1mutation CreateDeclarationShipment(
2$partyInput: [PartyCreateWorkflowInput!]!
3$itemInput: [ItemCreateWorkflowInput!]!
4$cartonInput: [CartonCreateWorkflowInput!]!
5$shipmentRatingInput: ShipmentRatingCreateWorkflowInput!
6$landedCostInput: LandedCostWorkFlowInput!
7$shipmentInput: ShipmentCreateWorkflowInput!
8) {
9 partyCreateWorkflow(input: $partyInput) {
10 id
11 type
12 location {
13 line1
14 locality
15 postalCode
16 countryCode
17 }
18 }
19 itemCreateWorkflow(input: $itemInput) {
20 id
21 name
22 sku
23 amount
24 currencyCode
25 hsCode
26 }
27 cartonsCreateWorkflow(input: $cartonInput) {
28 id
29 length
30 width
31 height
32 dimensionalUnit
33 weight
34 weightUnit
35 }
36 shipmentRatingCreateWorkflow(input: $shipmentRatingInput) {
37 id
38 amount
39 }
40 landedCostCalculateWorkflow(input: $landedCostInput) {
41 id
42 method
43 currencyCode
44 amountSubtotals {
45 duties
46 taxes
47 fees
48 shipping
49 landedCostTotal
50 }
51 }
52 shipmentCreateWorkflow(input: $shipmentInput) {
53 id
54 trackingDetails {
55 number
56 }
57 shipmentCartons {
58 label {
59 url
60 }
61 }
62 }
63}

Passo per passo 

La colonna Status in ciascuna tabella qui sotto usa questi termini:

  • Obbligatorio — la richiesta fallisce senza questo campo.
  • Obbligatorio per l'etichetta — facoltativo nello schema GraphQL, ma necessario per produrre un'etichetta Japan Post statunitense valida.
  • Condizionale — obbligatorio in base a un altro campo (indicato nella nota).
  • Consigliato — facoltativo, ma determina dazi e tasse accurati.
  • Facoltativo — non necessario.

1. partyCreateWorkflow

Crea le parti coinvolte nella spedizione — come minimo un ORIGIN (da dove parte la spedizione) e un DESTINATION (l'acquirente / destinatario).

CampoStatusNote
typeObbligatorioORIGIN e DESTINATION sono i due valori richiesti da questo flusso. Ne esistono altri (CONSIGNEE, EXPORTER, IMPORTER_OF_RECORD, PAYOR, ecc.), ma non sono usati qui.
location.countryCodeObbligatorioCodice paese ISO-2.
location.line1, locality, administrativeAreaCode, postalCodeObbligatorio per l'etichettaCampi indirizzo necessari per un'etichetta valida.
person.firstName, lastName, phoneObbligatorio per l'etichettaDettagli di contatto necessari per un'etichetta valida.
person.companyName, emailFacoltativo

Example payload:

[
  { "type": "DESTINATION", "location": { "countryCode": "US" }, "person": {} },
  { "type": "ORIGIN", "location": { "countryCode": "JP" }, "person": {} }
]

La risposta restituisce gli ID Party creati e i campi indirizzo risolti.

2. itemCreateWorkflow

Crea le righe articolo che compongono la spedizione. Sono gli SKU che compariranno sulla fattura commerciale e che determinano il calcolo del costo allo sbarco.

CampoStatusNote
currencyCodeObbligatorioValuta del prezzo unitario.
quantityObbligatorioNumero di unità di questo articolo.
amountCondizionalePrezzo unitario (non totale). Obbligatorio a meno che non venga fornito totalAmount.
totalAmountFacoltativoAlternativa ad amount; amount viene derivato da totalAmount / quantity.
hsCodeConsigliatoCodice tariffario del Sistema Armonizzato. Determina le aliquote daziarie.
countryOfOriginConsigliatoCodice ISO-2 del paese in cui è stato realizzato l'articolo. Determina dazi / FTA.
name, descriptionConsigliatoNome del prodotto e descrizione rivolti al cliente.
customsDescriptionFacoltativoDescrizione doganale alternativa.
sku, productIdFacoltativoI tuoi identificatori interni.
measurementsFacoltativoPeso / dimensioni per unità.

Il codice HS, il paese di origine e l'importo sono i tre campi che influenzano maggiormente l'esito di dazi/tasse nel passaggio 5.

3. cartonsCreateWorkflow

Crea i colli fisici — le scatole, i polybag o le buste che conterranno gli articoli.

CampoStatusNote
dimensionalUnitObbligatorioINCH o CENTIMETER.
weight, weightUnitObbligatorio per l'etichettaJapan Post richiede il peso del collo.
length, width, heightFacoltativoDimensioni esterne.
typeFacoltativoStile di imballaggio (scatola, polybag, busta). Il valore predefinito è PACKAGE.

Ogni collo diventa un pacco sull'etichetta del corriere nel passaggio 6. Più colli → spedizione multi-collo con un numero di tracciamento per collo.

4. shipmentRatingCreateWorkflow

Registra il preventivo tariffario che il commerciante addebita all'acquirente per la spedizione.

CampoStatusNote
amountObbligatorioQuanto paga l'acquirente per la spedizione. Passa 0 se gratuita.
currencyCodeObbligatorioValuta di amount.
serviceLevelCodeObbligatorioCodice servizio del corriere (es. japan_post.air.parcel). Vedi Livelli di servizio Japan Post per l'elenco completo.
displayNameFacoltativoNome descrittivo per la ricevuta / fattura.

Questa è la tariffa proposta all'acquirente al checkout. Confluisce nel calcolo del costo allo sbarco come subtotale "shipping", così dazi e tasse vengono calcolati sul valore CIF corretto.

5. landedCostCalculateWorkflow

Esegue il calcolo di dazi, tasse e commissioni per il paese di destinazione. Utilizza gli articoli, le parti e il costo di spedizione dei passaggi precedenti.

CampoStatusNote
endUseObbligatorioNOT_FOR_RESALE o FOR_RESALE. Alcune destinazioni applicano aliquote diverse per uso commerciale rispetto a uso personale.
tariffRateObbligatorioIl valore predefinito è ZONOS_PREFERRED se omesso. Indica a Zonos quale fonte/metodologia tariffaria applicare.
calculationMethodConsigliatoDDP (l'acquirente paga in anticipo) o DDU (l'acquirente paga alla consegna). Usa DDP per il prepagato. Determina se LandedCost.amountSubtotals include dazi/tasse.
currencyCodeFacoltativoValuta in cui vengono restituiti i subtotali del costo allo sbarco.
arrivalDateFacoltativoSe fornita, i tassi di cambio e le tabelle tariffarie vengono fissati a questa data.

La risposta include amountSubtotals (duties, taxes, fees, shipping, landedCostTotal) — questi sono i valori che mostri all'acquirente al checkout e che vengono stampati sulla fattura commerciale.

6. shipmentCreateWorkflow

Il passaggio finale — crea la Shipment, genera l'etichetta del corriere e (facoltativamente) la fattura commerciale / packing slip.

Per i Verified Account Japan Post, è anche qui che Zonos chiama per tuo conto l'API etichette di Japan Post (codice 52), inserisce i tuoi Later Pay Number, crea il Declaration ID e collega il Declaration ID al numero di tracciamento restituito da Japan Post.

Campi principali:

CampoStatusNote
serviceLevelObbligatorio per l'etichettaIl servizio Japan Post con cui spedire (es. japan_post.air.ems_merchandise). Deve essere un livello di servizio japan_post.*.
generateLabelFacoltativoIl valore predefinito è true; deve essere true per restituire un'etichetta.
contentsTypeConsigliatoDetermina il trattamento doganale. Uno tra SALE_OF_GOODS, ECOMMERCE_GOODS, COMMERCIAL_GOODS, COMMERCIAL_SAMPLE, RETURNED_GOODS, GIFT, DOCUMENTS, OTHER.
nonDeliveryFacoltativoCosa deve fare Japan Post se il pacco non può essere consegnato. Vedi sotto.
referencesFacoltativoNumeri di riferimento forniti dal commerciante, stampati sull'etichetta e sulla fattura commerciale. Vedi sotto.
declaredValue / isDeclaredValueFacoltativoValore assicurativo della spedizione.
shipmentConsolidationIdFacoltativoUtilizzato quando questa spedizione fa parte di un invio in batch.

Per contentsType, i due valori più comuni per il traffico dei Verified Account sono ECOMMERCE_GOODS (venduto a un consumatore, BtoC) e COMMERCIAL_GOODS (venduto tra aziende, BtoB). Questi valori determinano il pkgType che Zonos invia nella chiamata all'etichetta Japan Post, quindi la scelta cambia ciò che viene stampato sulla dichiarazione doganale — non è solo una questione di etichetta.

Sotto-input nonDelivery

Indica a Japan Post cosa fare del pacco se non può essere consegnato — rifiutato dal destinatario, respinto alla frontiera o non recapitabile all'indirizzo indicato.

option accetta esattamente questi quattro valori. Non esiste un valore RETURN — usa RETURN_AFTER_RETENTION o RETURN_IMMEDIATELY per scegliere quando il pacco torna indietro.

optionEquivalente nella DashboardCosa fa Japan Post
RETURN_AFTER_RETENTIONReturnTrattiene il pacco presso l'ufficio postale di destinazione per il periodo di giacenza, poi lo restituisce al mittente.
RETURN_IMMEDIATELYReturnRestituisce subito il pacco al mittente, senza periodo di giacenza.
FORWARDRedirectionReindirizza il pacco a un indirizzo diverso. Si applicano costi di spedizione aggiuntivi.
ABANDONRenounceSmaltisce il pacco a destinazione. Nulla viene restituito e non viene addebitata alcuna spesa di reso.

L'API espone separatamente entrambe le varianti di reso; l'opzione Return della Dashboard le copre entrambe.

transportMethod accetta AIR o MOST_ECONOMICAL e determina come viaggia un pacco reso. Si applica solo alle due opzioni RETURN_* — la Dashboard mostra il campo Return method corrispondente solo quando è selezionato Return.

{
  "nonDelivery": {
    "option": "RETURN_AFTER_RETENTION",
    "transportMethod": "MOST_ECONOMICAL"
  }
}

Il selettore If undeliverable nella finestra di dialogo Create label della Dashboard scrive esattamente questo stesso campo, quindi un'etichetta creata dalla Dashboard e una creata tramite API si comportano in modo identico.

Sotto-input references

Questi campi vengono stampati sull'etichetta del corriere e/o sulla fattura commerciale. Usali per riportare numeri di ordine d'acquisto, numeri di licenza e note in testo libero che il destinatario o l'autorità doganale devono vedere.

CampoStatusNoteLunghezza
invoiceNumberFacoltativoNumero di fattura del commerciante.
purchaseOrderNumberFacoltativoNumero d'ordine del commerciante.
licenseNumberFacoltativoNumero di licenza di esportazione/importazione.
certificateNumberFacoltativoNumero di certificato doganale.
paymentConditionsFacoltativoTermini di pagamento in testo libero mostrati sulla fattura commerciale.Limite di 200 caratteri — valori più lunghi traboccano sulla fattura stampata.
customsRemarksFacoltativoNote doganali in testo libero.
taxCodeFacoltativoCodice fiscale personalizzato stampato sull'etichetta.

Response

I campi rilevanti sullo Shipment restituito sono:

{
  id
  trackingDetails {
    number
  }
  shipmentCartons {
    label {
      url
      labelImage
    }
  }
}

trackingDetails.number è il numero di tracciamento Japan Post.

L'oggetto label può restituire l'etichetta in due modi — richiedi quello più adatto al tuo workflow (o entrambi):

CampoRestituisceDa usare quando
urlUn link ospitato al file dell'etichetta renderizzata (PDF), pronto per il download o la stampa.Vuoi condividere un link — aprirlo, inviarlo via email o recuperare il file più avanti senza tenerlo nel payload.
labelImageL'immagine dell'etichetta codificata in base64 (PNG/PDF/ZPL) inline nella risposta.Vuoi i byte dell'etichetta direttamente nella risposta, da allegare a un workflow di evasione ordini o da salvare nel tuo WMS.

Seleziona solo i campi di cui hai bisogno. Richiedere url mantiene la risposta compatta; richiedere labelImage restituisce l'etichetta completa inline, così non serve un secondo round trip per recuperarla. L'esempio sopra richiede url.

Livelli di servizio Japan Post 

Passa uno di questi codici come serviceLevelCode in shipmentRatingCreateWorkflow.

I codici dei livelli di servizio usano punti, non underscore. Potresti vedere la forma con underscore (japan_post_air_parcel) nei messaggi di errore e nei riferimenti interni, ma non è un input valido.

Servizi aerei

CodiceServizio Japan PostTipo di posta
japan_post.air.ems_documentsEMS (documenti)1-0
japan_post.air.ems_merchandiseEMS (merce)1-1
japan_post.air.parcelPacco internazionale1-5
japan_post.air.packetInternational Air Packet1-8
japan_post.air.small_packetSmall packet1-9
japan_post.air.printed_matter_registeredStampe, raccomandate1-A
japan_post.air.printed_matterStampe1-B
japan_post.air.letter_registeredLettera, raccomandata1-C
japan_post.air.letterLettera1-D

Servizi di superficie

CodiceServizio Japan PostTipo di posta
japan_post.surface.parcelPacco internazionale2-5
japan_post.surface.small_packetSmall packet2-9
japan_post.surface.printed_matterStampe2-B
japan_post.surface.letterLettera2-D

Scegliere tra servizi simili

Small packet vs. International Air Packet. Entrambi hanno un limite di 2 kg. japan_post.air.packet è il servizio small-packet tracciato di Japan Post. japan_post.air.small_packet è l'equivalente non tracciato. Se ti serve il tracciamento su un pacco leggero, usa japan_post.air.packet.

Varianti raccomandate. Per lettere e stampe, il tracciamento viene aggiunto dalla versione raccomandata (書留) del servizio. japan_post.air.printed_matter e japan_post.air.letter non lo includono da soli.

Codici deprecati

japan_post.air.epacket_light era International e-Packet Light. Japan Post ha rinominato il servizio in International Air Packet il 1° giugno 2026, estendendolo a tutti i paesi e le regioni. Il servizio in sé è rimasto invariato.

Il vecchio codice continua a essere risolto, così le integrazioni esistenti continuano a funzionare, ma per i nuovi sviluppi usa japan_post.air.packet.

Codici di modalità di trasporto

Anche japan_post.air, japan_post.surface, japan_post.economy_air e japan_post.custom vengono risolti, ma identificano una modalità di trasporto o un fallback, non un prodotto postale specifico. Per le spedizioni normali usa uno dei codici servizio elencati sopra.

Convalida il codice che invii

Un serviceLevelCode non riconosciuto non genera un errore. La richiesta restituisce HTTP 200 senza array errors, serviceLevel torna null e il costo di spedizione esce dal totale del costo allo sbarco — quindi la risposta sembra corretta mentre gli importi sono sbagliati.

Verifica sempre che shipmentRatingCreateWorkflow.serviceLevel non sia nullo prima di fare affidamento sui totali.

Per recuperare l'elenco aggiornato in qualsiasi momento:

{
  serviceLevels(carrier: "carrier_00004c9b-9431-4518-bfbc-b9f8476335b1") {
    code
    name
  }
}

Questa query richiede l'ID del corriere. Passare il codice corriere japan_post restituisce un elenco vuoto senza errori.

Gestione degli errori 

  • Gli errori di convalida (campi obbligatori mancanti, codici paese non validi, ecc.) vengono restituiti nel consueto array GraphQL errors e interrompono il resto della catena.
  • Gli errori Japan Post (errore nella generazione dell'etichetta, indirizzo non valido, ecc.) compaiono come errori GraphQL su shipmentCreateWorkflow. Se è necessario un nuovo tentativo, contatta l'assistenza — il percorso consigliato è inviare di nuovo l'intera mutazione con l'input corretto.

VALIDATION_INVALID_TYPE_VARIABLE

{
  "errors": [
    {
      "message": "invalid type for variable: 'shipmentInput'",
      "extensions": {
        "name": "shipmentInput",
        "code": "VALIDATION_INVALID_TYPE_VARIABLE"
      }
    }
  ]
}

Questo errore indica l'intera variabile, non il campo che in realtà è sbagliato. Nella quasi totalità dei casi significa che un valore enum all'interno di quella variabile non appartiene al suo enum — più spesso nonDelivery.option, contentsType o serviceLevel.

Non è un problema di tipizzazione JSON. Mettere o togliere le virgolette da booleani e numeri non risolve nulla, perché il payload non arriva nemmeno a quel punto: l'enum viene respinto prima.

Per trovare il campo sbagliato, controlla ogni campo di tipo enum nella variabile rispetto ai suoi valori accettati:

CampoValori accettati
nonDelivery.optionRETURN_AFTER_RETENTION, RETURN_IMMEDIATELY, FORWARD, ABANDON — nessun RETURN
nonDelivery.transportMethodAIR, MOST_ECONOMICAL
contentsTypeSALE_OF_GOODS, ECOMMERCE_GOODS, COMMERCIAL_GOODS, COMMERCIAL_SAMPLE, RETURNED_GOODS, GIFT, DOCUMENTS, OTHER
serviceLevelUn codice livello di servizio japan_post.*

L'elenco completo dei membri dell'enum per qualsiasi input è disponibile nella pagina del suo tipo nella documentazione API.

Autorizzazioni 

Ogni passaggio è protetto in modo indipendente. La tua API key deve avere lo scope di scrittura per ogni entità della catena (ITEM_WRITE, CARTON_WRITE, SHIPMENT_RATING_WRITE, LANDED_COST_WRITE, SHIPMENT_WRITE). Il ruolo commerciante standard su un Verified Account concede tutti questi scope.

Passaggi successivi 

Questa pagina è stata utile?