DOCS

Skapa en enskild försändelse

GraphQL-arbetsflödet CreateDeclarationShipment tar en Japan Post-försändelse från rådata till en utskrivbar etikett i ett enda anrop.

CreateDeclarationShipment kedjar samman sex *Workflow-mutationer i en enda GraphQL-förfrågan. Varje steg bygger på de data föregående steg gav, och alla skickas in tillsammans så att en komplett försändelse kan skapas i ett enda anrop:

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

Workflow-mutationerna är utformade för att vara kedjade: du behöver inte skicka med ID:n från ett steg till nästa, och du behöver inte skicka en separat förfrågan för varje steg. Skicka in hela dokumentet och få tillbaka den slutliga Shipment-posten.

När serviceLevel i det sista steget är en Japan Post-servicenivå (japan_post.*) anropar Zonos Japan Post Label API (kod 52) å dina vägnar med hjälp av ditt verifierade kontos Later Pay-nummer, genererar etiketten och spårningsnumret, skapar deklarations-ID:t och kopplar samman dem — allt inom det sista shipmentCreateWorkflow-steget.

Varför en enda mutation? Varje steg är beroende av det föregående (landed cost behöver artiklarna och parterna; etiketten behöver allt). Genom att samla dem i ett enda GraphQL-dokument hålls data konsekvent och du undviker fem extra anrop.

Slutpunkt och autentisering 

Alla förfrågningar i den här kedjan använder samma slutpunkt. Vad du skickar i headers beror på din uppsättning — välj din flik.

URL:

https://api.zonos.com/graphql

Headers:

Du skickar dina egna beställningar under ditt eget verifierade konto. Autentisera dig som dig själv — ingen kontonyckel behövs.

credentialToken: {{YOUR_API_TOKEN}}

Var du hittar den: Zonos Dashboard → InställningarIntegrationer → avsnittet Kontonyckel. Kopiera token på raden API-nyckel; det är din credentialToken.

Exempel på förfrågan 

En komplett CreateDeclarationShipment-förfrågan som du kan kopiera och anpassa — mutationen, dess variabler och svaret — för en enskild Japan Post-försändelse som skickas DDP till USA. Varje indata beskrivs i detalj i avsnittet steg för steg nedan.

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}

Steg för steg 

Kolumnen Status i tabellerna nedan använder följande termer:

  • Krävs — förfrågan misslyckas utan det.
  • Krävs för etikett — valfritt i GraphQL-schemat, men behövs för att skapa en giltig Japan Post-etikett för USA.
  • Villkorat — krävs beroende på ett annat fält (anges i texten).
  • Rekommenderas — valfritt, men styr korrekta tullar och skatter.
  • Valfritt — behövs inte.

1. partyCreateWorkflow

Skapar de parter som ingår i försändelsen — minst en ORIGIN (varifrån försändelsen skickas) och en DESTINATION (köparen/mottagaren).

FältStatusAnteckningar
typeKrävsORIGIN och DESTINATION är de två som detta flöde behöver. Andra (CONSIGNEE, EXPORTER, IMPORTER_OF_RECORD, PAYOR osv.) finns men används inte här.
location.countryCodeKrävsISO-2-landskod.
location.line1, locality, administrativeAreaCode, postalCodeKrävs för etikettAdressfält som behövs för en giltig etikett.
person.firstName, lastName, phoneKrävs för etikettKontaktuppgifter som behövs för en giltig etikett.
person.companyName, emailValfritt

Exempel på nyttolast:

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

Svaret returnerar de skapade Party-ID:erna och de matchade adressfälten.

2. itemCreateWorkflow

Skapar de radartiklar som utgör försändelsen. Dessa är de SKU:er som visas på handelsfakturan och som styr beräkningen av landed cost.

FältStatusAnteckningar
currencyCodeKrävsValuta för enhetspriset.
quantityKrävsAntal enheter av denna artikel.
amountVillkoratEnhetspris (inte totalt). Krävs om inte totalAmount anges.
totalAmountValfrittAlternativ till amount; amount beräknas som totalAmount / quantity.
hsCodeRekommenderasHS-kod (Harmonized System). Styr tullsatser.
countryOfOriginRekommenderasISO-2-kod för landet där artikeln tillverkades. Styr tull/frihandelsavtal.
name, descriptionRekommenderasProduktnamn och beskrivning som visas för kunden.
customsDescriptionValfrittÅsidosätter tullbeskrivningen.
sku, productIdValfrittDina interna identifierare.
measurementsValfrittVikt/mått per enhet.

HS-koden, ursprungslandet och beloppet är de tre fält som mest påverkar resultatet för tull/skatt i steg 5.

3. cartonsCreateWorkflow

Skapar de fysiska paketen — de kartonger, polybags eller brev som ska innehålla artiklarna.

FältStatusAnteckningar
dimensionalUnitKrävsINCH eller CENTIMETER.
weight, weightUnitKrävs för etikettJapan Post kräver paketets vikt.
length, width, heightValfrittYttermått.
typeValfrittFörpackningstyp (kartong, polybag, brev). Standardvärde är PACKAGE.

Varje kartong blir ett paket på transportörens etikett i steg 6. Flera kartonger → en försändelse med flera delar och ett spårningsnummer per kartong.

4. shipmentRatingCreateWorkflow

Registrerar den fraktprisuppgift som handlaren tar ut av köparen för frakten.

FältStatusAnteckningar
amountKrävsVad köparen betalar för frakten. Ange 0 om den är gratis.
currencyCodeKrävsValuta för amount.
serviceLevelCodeKrävsTransportörens servicekod (t.ex. japan_post.air.parcel). Se Japan Post-servicenivåer för den fullständiga listan.
displayNameValfrittVisningsnamn för kvittot/fakturan.

Det här är det pris köparen fick vid kassan. Det ingår i beräkningen av landed cost som delsumman shipping, så att tullar och skatter beräknas mot rätt CIF-värde.

5. landedCostCalculateWorkflow

Kör beräkningen av tullar, skatter och avgifter för destinationslandet. Använder artiklarna, parterna och fraktkostnaden från de föregående stegen.

FältStatusAnteckningar
endUseKrävsNOT_FOR_RESALE eller FOR_RESALE. Vissa destinationer tillämpar olika satser för kommersiell respektive privat slutanvändning.
tariffRateKrävsStandardvärde är ZONOS_PREFERRED om det utelämnas. Anger för Zonos vilken tullkälla/metod som ska tillämpas.
calculationMethodRekommenderasDDP (köparen förbetalar) eller DDU (köparen betalar vid dörren). Använd DDP för förbetalning. Styr om LandedCost.amountSubtotals inkluderar tull/skatt.
currencyCodeValfrittValutan som delsummorna för landed cost returneras i.
arrivalDateValfrittVäxelkurser och tulltaxor låses till detta datum om det anges.

Svaret innehåller amountSubtotals (duties, taxes, fees, shipping, landedCostTotal) — det är de belopp du visar för köparen i kassan och som skrivs ut på handelsfakturan.

6. shipmentCreateWorkflow

Det avslutande steget — skapar entiteten Shipment, genererar transportörens etikett och (valfritt) handelsfakturan/packlistan.

För Japan Post-verifierade konton är det också här Zonos anropar Japan Post Label API (kod 52) å dina vägnar, infogar dina Later Pay-nummer, skapar deklarations-ID:t och kopplar deklarations-ID:t till spårningsnumret som returneras av Japan Post.

Viktiga fält:

FältStatusAnteckningar
serviceLevelKrävs för etikettJapan Post-tjänsten att skicka med (t.ex. japan_post.air.ems_merchandise). Måste vara en japan_post.*-servicenivå.
generateLabelValfrittStandardvärde är true; måste vara true för att en etikett ska returneras.
contentsTypeRekommenderasStyr tullhanteringen. En av SALE_OF_GOODS, ECOMMERCE_GOODS, COMMERCIAL_GOODS, COMMERCIAL_SAMPLE, RETURNED_GOODS, GIFT, DOCUMENTS, OTHER.
nonDeliveryValfrittVad Japan Post ska göra om paketet inte kan levereras. Se nedan.
referencesValfrittReferensnummer från handlaren som skrivs ut på etiketten och handelsfakturan. Se nedan.
declaredValue / isDeclaredValueValfrittFörsäkringsvärde för försändelsen.
shipmentConsolidationIdValfrittAnvänds när denna försändelse ingår i en samlad avsändning.

För contentsType är de två vanligaste värdena för trafik från verifierade konton ECOMMERCE_GOODS (säljs till en konsument, B2C) och COMMERCIAL_GOODS (säljs mellan företag, B2B). Dessa styr det pkgType som Zonos skickar i anropet till Japan Post-etiketten, så valet påverkar vad som skrivs ut på tulldeklarationen — det är inte bara en etikett.

Underindata nonDelivery

Anger vad Japan Post ska göra med paketet om det inte kan levereras — nekas av mottagaren, avvisas vid gränsen eller är omöjligt att leverera till den angivna adressen.

option accepterar exakt dessa fyra värden. Det finns inget värde RETURN — använd RETURN_AFTER_RETENTION eller RETURN_IMMEDIATELY för att välja när paketet skickas tillbaka.

optionMotsvarighet i DashboardVad Japan Post gör
RETURN_AFTER_RETENTIONReturHåller kvar paketet hos destinationspostkontoret under dess uppehållsperiod och returnerar det därefter till avsändaren.
RETURN_IMMEDIATELYReturReturnerar paketet till avsändaren omedelbart, utan uppehållsperiod.
FORWARDOmdirigeringOmdirigerar paketet till en annan adress. Ytterligare porto tillkommer.
ABANDONAvståGör sig av med paketet på destinationen. Inget returneras och inget returporto tas ut.

API:et exponerar båda returvarianterna separat; Dashboard-alternativet Retur täcker båda.

transportMethod accepterar AIR eller MOST_ECONOMICAL och anger hur ett returnerat paket transporteras tillbaka. Det gäller endast de två RETURN_*-alternativen — Dashboard visar motsvarande fält Returmetod endast när Retur är valt.

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

Väljaren Om ej leveransbar i Dashboard-dialogen Skapa etikett skriver till samma fält, så en etikett som skapas i Dashboard och en etikett som skapas via API:et beter sig identiskt.

Underindata references

Dessa fält skrivs ut på transportörens etikett och/eller handelsfakturan. Använd dem för att visa PO-nummer, licensnummer och fritextanmärkningar som mottagaren eller tullmyndigheten behöver se.

FältStatusAnteckningarLängd
invoiceNumberValfrittHandlarens fakturanummer.
purchaseOrderNumberValfrittHandlarens PO-nummer.
licenseNumberValfrittExport-/importlicensnummer.
certificateNumberValfrittTullcertifikatnummer.
paymentConditionsValfrittFritext med betalningsvillkor som visas på handelsfakturan.Begränsa till 200 tecken — längre värden får inte plats på den utskrivna fakturan.
customsRemarksValfrittFritext med tullanmärkningar.
taxCodeValfrittAnpassad skattekod som skrivs ut på etiketten.

Svar

De mest relevanta fälten på det returnerade Shipment-objektet är:

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

trackingDetails.number är Japan Posts spårningsnummer.

Objektet label kan returnera etiketten på två sätt — begär det som passar ditt arbetsflöde (eller båda):

FältReturnerarAnvänd när
urlEn värdbaserad länk till den renderade etikettfilen (PDF), redo att laddas ner eller skrivas ut.Du vill lämna över en länk — öppna den, mejla den eller hämta filen senare utan att behöva ha den i nyttolasten.
labelImageDen base64-kodade etikettbilden (PNG/PDF/ZPL) direkt i svaret.Du vill ha etikettens bytes direkt i svaret för att bifoga i ett orderhanteringsflöde eller spara i ditt WMS.

Välj bara de fält du behöver. Om du begär url hålls svaret litet; om du begär labelImage returneras hela etiketten direkt så att du inte behöver ett andra anrop för att hämta den. Exemplet ovan begär url.

Japan Post-servicenivåer 

Skicka en av dessa koder som serviceLevelCode i shipmentRatingCreateWorkflow.

Servicenivåkoder använder punkter, inte understreck. Du kan se understrecksformen (japan_post_air_parcel) i felmeddelanden och interna referenser, men den är inte giltig indata.

Flygtjänster

KodJapan Post-tjänstPosttyp
japan_post.air.ems_documentsEMS (dokument)1-0
japan_post.air.ems_merchandiseEMS (varor)1-1
japan_post.air.parcelInternationellt paket1-5
japan_post.air.packetInternational Air Packet1-8
japan_post.air.small_packetLitet paket1-9
japan_post.air.printed_matter_registeredTrycksaker, rekommenderat1-A
japan_post.air.printed_matterTrycksaker1-B
japan_post.air.letter_registeredBrev, rekommenderat1-C
japan_post.air.letterBrev1-D

Yttjänster

KodJapan Post-tjänstPosttyp
japan_post.surface.parcelInternationellt paket2-5
japan_post.surface.small_packetLitet paket2-9
japan_post.surface.printed_matterTrycksaker2-B
japan_post.surface.letterBrev2-D

Att välja mellan liknande tjänster

Litet paket jämfört med International Air Packet. Båda är begränsade till 2 kg. japan_post.air.packet är Japan Posts spårbara tjänst för mindre paket. japan_post.air.small_packet är motsvarigheten utan spårning. Om du behöver spårning för ett lätt paket, använd japan_post.air.packet.

Rekommenderade varianter. För brev och trycksaker läggs spårning till av den rekommenderade (書留) versionen av tjänsten. japan_post.air.printed_matter och japan_post.air.letter inkluderar den inte på egen hand.

Utfasade koder

japan_post.air.epacket_light var International e-Packet Light. Japan Post bytte namn på tjänsten till International Air Packet den 1 juni 2026 och utökade den till alla länder och regioner. Tjänsten i sig är oförändrad.

Den gamla koden fungerar fortfarande, så befintliga integrationer fortsätter att fungera, men använd japan_post.air.packet för nytt arbete.

Transportsättskoder

japan_post.air, japan_post.surface, japan_post.economy_air och japan_post.custom fungerar också, men de anger ett transportsätt eller en reservlösning snarare än en specifik posttjänst. Använd en av servicekoderna ovan för vanliga försändelser.

Validera koden du skickar

En okänd serviceLevelCode genererar inget fel. Förfrågan returnerar HTTP 200 utan någon errors-array, serviceLevel kommer tillbaka som null, och frakten faller bort ur den totala landed cost-summan — så svaret ser korrekt ut trots att beloppen är fel.

Kontrollera alltid att shipmentRatingCreateWorkflow.serviceLevel inte är null innan du litar på totalsummorna.

Hämta den aktuella listan när som helst:

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

Den här frågan tar transportörens ID. Om du skickar transportörskoden japan_post returneras en tom lista utan fel.

Felhantering 

  • Valideringsfel (saknade obligatoriska fält, ogiltiga landskoder osv.) kommer tillbaka i den vanliga GraphQL-arrayen errors och avbryter resten av kedjan.
  • Japan Post-fel (fel vid etikettgenerering, ogiltig adress osv.) visas som GraphQL-fel på shipmentCreateWorkflow. Om ett nytt försök behövs, kontakta supporten — den rekommenderade vägen är att skicka in hela mutationen igen med korrigerad indata.

VALIDATION_INVALID_TYPE_VARIABLE

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

Det här felet anger hela variabeln, inte det fält som faktiskt är felaktigt. Det betyder nästan alltid att ett enum-värde inuti variabeln inte är en medlem av sin enum — oftast nonDelivery.option, contentsType eller serviceLevel.

Det är inte ett JSON-typningsproblem. Att sätta eller ta bort citattecken kring dina booleaner och nummer ändrar inget, eftersom nyttolasten aldrig kommer så långt — enum-värdet avvisas först.

För att hitta det felaktiga fältet, kontrollera varje enum-fält i variabeln mot dess tillåtna värden:

FältTillåtna värden
nonDelivery.optionRETURN_AFTER_RETENTION, RETURN_IMMEDIATELY, FORWARD, ABANDON — inget RETURN
nonDelivery.transportMethodAIR, MOST_ECONOMICAL
contentsTypeSALE_OF_GOODS, ECOMMERCE_GOODS, COMMERCIAL_GOODS, COMMERCIAL_SAMPLE, RETURNED_GOODS, GIFT, DOCUMENTS, OTHER
serviceLevelEn japan_post.*-servicenivåkod

Alla enum-medlemmar för en indatatyp finns listade på dess typsida i API-referensen.

Behörigheter 

Varje steg säkras separat. Din API-nyckel måste ha skrivbehörighet (write scope) för varje entitet i kedjan (ITEM_WRITE, CARTON_WRITE, SHIPMENT_RATING_WRITE, LANDED_COST_WRITE, SHIPMENT_WRITE). Standardrollen för handlare på ett verifierat konto ger alla dessa.

Nästa steg 

Boka en demo

Var den här sidan till hjälp?