DOCS

Utwórz pojedynczą przesyłkę

Przepływ GraphQL CreateDeclarationShipment tworzy przesyłkę Japan Post od danych wejściowych do gotowej do druku etykiety w jednej rundzie.

CreateDeclarationShipment łączy w łańcuch sześć mutacji *Workflow w jedno żądanie GraphQL. Każdy krok opiera się na danych dostarczonych przez poprzednie kroki, a wszystkie są przesyłane razem, dzięki czemu kompletną przesyłkę można utworzyć w jednej rundzie:

partyCreateWorkflow            → opisz strony źródłową i docelową
itemCreateWorkflow             → opisz pozycje towarowe
cartonsCreateWorkflow          → opisz fizyczne opakowanie
shipmentRatingCreateWorkflow   → zarejestruj ofertę stawki przewoźnika
landedCostCalculateWorkflow    → oblicz cła / podatki / opłaty
shipmentCreateWorkflow         → utwórz przesyłkę + etykietę

Mutacje Workflow są zaprojektowane do łańcuchowania: nie musisz przekazywać identyfikatorów z jednego kroku do następnego i nie musisz wysyłać osobnego żądania na każdy krok. Przesyłasz cały dokument i otrzymujesz ostateczny Shipment.

Gdy serviceLevel w ostatnim kroku jest poziomem usług Japan Post (japan_post.*), Zonos wywołuje w Twoim imieniu Japan Post Label API (kod 52), używając numerów Later Pay Twojego konta zweryfikowanego, generuje etykietę i numer śledzenia, tworzy identyfikator deklaracji i łączy je – wszystko wewnątrz tego ostatniego kroku shipmentCreateWorkflow.

Dlaczego jedna mutacja? Każdy krok zależy od poprzedniego (Landed cost wymaga pozycji towarowych i stron; etykieta wymaga wszystkiego). Zebranie ich w jednym dokumencie GraphQL zapewnia spójność danych i pozwala uniknąć pięciu dodatkowych rund.

Punkt końcowy i uwierzytelnianie 

Wszystkie żądania w tym łańcuchu używają tego samego punktu końcowego. Co przesyłasz w nagłówkach, zależy od Twojej konfiguracji – wybierz swoją kartę.

URL:

https://api.zonos.com/graphql

Nagłówki:

Wysyłasz własne zamówienia w ramach swojego konta zweryfikowanego. Uwierzytelniaj się jako Ty sam – nie jest potrzebny klucz konta.

credentialToken: {{YOUR_API_TOKEN}}

Gdzie go znaleźć: Zonos Dashboard → UstawieniaIntegracje → sekcja Klucz konta. Skopiuj token w wierszu Klucz API; to jest Twój credentialToken.

Przykładowe żądanie 

Pełne żądanie CreateDeclarationShipment, które możesz skopiować i dostosować – mutacja, jej zmienne i odpowiedź – dla pojedynczej paczki Japan Post wysłanej DDP do USA. Każde wejście zostało rozłożone na czynniki w sekcji krok po kroku poniżej.

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}

Krok po kroku 

Kolumna Status w każdej tabeli poniżej używa tych terminów:

  • Wymagane – żądanie nie powiedzie się bez tego.
  • Wymagane dla etykiety – opcjonalne w schemacie GraphQL, ale potrzebne do utworzenia prawidłowej etykiety Japan Post dla USA.
  • Warunkowe – wymagane w zależności od innego pola (zanotowane w tekście).
  • Rekomendowane – opcjonalne, ale zapewnia dokładne cła i podatki.
  • Opcjonalne – nie jest potrzebne.

1. partyCreateWorkflow

Tworzy strony zaangażowane w przesyłkę – co najmniej ORIGIN (miejsce, z którego wysyłana jest przesyłka) i DESTINATION (kupujący / odbiorca).

PoleStatusUwagi
typeWymaganeORIGIN i DESTINATION to dwa typy potrzebne w tym przepływie. Inne (CONSIGNEE, EXPORTER, IMPORTER_OF_RECORD, PAYOR itd.) istnieją, ale nie są tu używane.
location.countryCodeWymaganeKod kraju ISO-2.
location.line1, locality, administrativeAreaCode, postalCodeWymagane dla etykietyPola adresu potrzebne do prawidłowej etykiety.
person.firstName, lastName, phoneWymagane dla etykietyDane kontaktowe potrzebne do prawidłowej etykiety.
person.companyName, emailOpcjonalne

Przykładowy payload:

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

Odpowiedź zwraca utworzone identyfikatory Party i uzupełnione pola adresu.

2. itemCreateWorkflow

Tworzy pozycje towarowe, które składają się na przesyłkę. Są to jednostki SKU, które pojawią się na fakturze handlowej i zasilą obliczenie Landed cost.

PoleStatusUwagi
currencyCodeWymaganeWaluta ceny jednostkowej.
quantityWymaganeLiczba jednostek tego elementu.
amountWarunkoweCena jednostkowa (nie całkowita). Wymagane, chyba że podano totalAmount.
totalAmountOpcjonalneAlternatywa dla amount; amount jest wyliczane z totalAmount / quantity.
hsCodeRekomendowaneKod taryfowy Zharmonizowanego Systemu (HS). Wpływa na stawki ceł.
countryOfOriginRekomendowaneKod ISO-2 kraju, w którym wytworzono towar. Wpływa na cło / FTA.
name, descriptionRekomendowaneNazwa produktu widoczna dla klienta + opis.
customsDescriptionOpcjonalneZastąpienie opisu celnego.
sku, productIdOpcjonalneTwoje wewnętrzne identyfikatory.
measurementsOpcjonalneWaga / wymiary na jednostkę.

Kod HS, kraj pochodzenia i kwota to trzy pola, które najbardziej wpływają na wynik cła / podatku w kroku 5.

3. cartonsCreateWorkflow

Tworzy paczki fizyczne – pudełka, worki foliowe lub listy, które będą zawierać towary.

PoleStatusUwagi
dimensionalUnitWymaganeINCH lub CENTIMETER.
weight, weightUnitWymagane dla etykietyJapan Post wymaga wagi paczki.
length, width, heightOpcjonalneWymiary zewnętrzne.
typeOpcjonalneStyl opakowania (pudełko, worek foliowy, list). Domyślnie PACKAGE.

Każdy karton staje się jedną przesyłką na etykiecie przewoźnika w kroku 6. Wiele kartonów → przesyłka wieloczęściowa z jednym numerem śledzenia na karton.

4. shipmentRatingCreateWorkflow

Rejestruje ofertę stawki, którą kupiec pobiera od kupującego za wysyłkę.

PoleStatusUwagi
amountWymaganeCo kupujący płaci za wysyłkę. Przesyłaj 0, jeśli jest darmowa.
currencyCodeWymaganeWaluta amount.
serviceLevelCodeWymaganeKod usługi przewoźnika (np. japan_post.air.parcel). Pełną listę znajdziesz w Poziomach usług Japan Post.
displayNameOpcjonalneŁadna nazwa do paragonu / faktury.

To jest stawka, jaką kupujący otrzymał w kasie. Zasila ona obliczenie Landed cost jako podsumę „shipping”, dzięki czemu cła i podatki są liczone względem prawidłowej wartości CIF.

5. landedCostCalculateWorkflow

Uruchamia obliczenie ceł, podatków i opłat dla kraju docelowego. Wykorzystuje towary, strony i koszt wysyłki z poprzednich kroków.

PoleStatusUwagi
endUseWymaganeNOT_FOR_RESALE lub FOR_RESALE. Niektóre miejsca docelowe stosują różne stawki dla użytku handlowego w porównaniu z osobistym.
tariffRateWymaganeDomyślnie ZONOS_PREFERRED, jeśli pominięte. Mówi Zonos, które źródło taryfy / metodologię zastosować.
calculationMethodRekomendowaneDDP (kupujący płaci z góry) lub DDU (kupujący płaci przy drzwiach). Użyj DDP dla opłaconego z góry. Determinuje, czy LandedCost.amountSubtotals obejmuje cło / podatek.
currencyCodeOpcjonalneWaluta, w której zwracane są podsumy kosztu Landed cost.
arrivalDateOpcjonalneKursy walut i harmonogramy taryf są przypięte do tej daty, jeśli została podana.

Odpowiedź zawiera amountSubtotals (duties, taxes, fees, shipping, landedCostTotal) – to są liczby, które pokazujesz kupującemu w kasie i które są drukowane na fakturze handlowej.

6. shipmentCreateWorkflow

Krok końcowy – tworzy encję Shipment, generuje etykietę przewoźnika i (opcjonalnie) fakturę handlową / listę pakowania.

W przypadku kont zweryfikowanych Japan Post to również tutaj Zonos wywołuje w Twoim imieniu Japan Post Label API (kod 52), wstrzykuje Twoje numery Later Pay, tworzy identyfikator deklaracji i łączy identyfikator deklaracji z numerem śledzenia zwracanym przez Japan Post.

Pola kluczowe:

PoleStatusUwagi
serviceLevelWymagane dla etykietyUsługa Japan Post, którą wysyłasz (np. japan_post.air.ems_merchandise). Musi być poziomem usługi japan_post.*.
generateLabelOpcjonalneDomyślnie true; musi być true, aby zwrócić etykietę.
contentsTypeRekomendowaneDeterminuje sposób obsługi celnej. Jedna z wartości: SALE_OF_GOODS, ECOMMERCE_GOODS, COMMERCIAL_GOODS, COMMERCIAL_SAMPLE, RETURNED_GOODS, GIFT, DOCUMENTS, OTHER.
nonDeliveryOpcjonalneCo Japan Post powinien zrobić, jeśli paczki nie można dostarczyć. Patrz poniżej.
referencesOpcjonalneNumery referencyjne dostarczone przez handlowca, drukowane na etykiecie i fakturze handlowej. Patrz poniżej.
declaredValue / isDeclaredValueOpcjonalneWartość ubezpieczenia dla przesyłki.
shipmentConsolidationIdOpcjonalneUżywane, gdy ta przesyłka jest częścią dispatchu zbiorczego.

W przypadku contentsType dwie najczęstsze wartości dla ruchu na kontach zweryfikowanych to ECOMMERCE_GOODS (sprzedaż konsumentowi, BtoC) i COMMERCIAL_GOODS (sprzedaż między firmami, BtoB). Ustawiają one pkgType, który Zonos przesyła w wywołaniu etykiety Japan Post, więc ten wybór zmienia to, co drukuje się na zgłoszeniu celnym – to nie jest tylko etykieta.

Podpole nonDelivery

Informuje Japan Post, co zrobić z paczką, jeśli nie można jej dostarczyć – odbiorca odmówił jej przyjęcia, została odrzucona na granicy albo nie można jej dostarczyć na podany adres.

option przyjmuje wyłącznie te cztery wartości. Nie istnieje wartość RETURN – użyj RETURN_AFTER_RETENTION lub RETURN_IMMEDIATELY, aby wybrać, kiedy paczka wraca.

optionOdpowiednik w DashboardCo robi Japan Post
RETURN_AFTER_RETENTIONZwrotPrzechowuje paczkę w urzędzie pocztowym docelowym przez okres retencji, a następnie zwraca ją nadawcy.
RETURN_IMMEDIATELYZwrotZwraca paczkę nadawcy od razu, bez okresu retencji.
FORWARDPrzekierowaniePrzekierowuje paczkę na inny adres. Obowiązuje dodatkowa opłata pocztowa.
ABANDONZrzeczenie sięUtylizuje paczkę w miejscu docelowym. Nic nie jest zwracane i nie jest naliczana opłata za zwrot.

API udostępnia oba warianty zwrotu niezależnie od siebie; opcja Zwrot w Dashboard obejmuje oba.

transportMethod przyjmuje AIR lub MOST_ECONOMICAL i określa, jak wraca zwracana paczka. Dotyczy to tylko dwóch opcji RETURN_* – Dashboard wyświetla odpowiadające pole Metoda zwrotu tylko wtedy, gdy wybrano Zwrot.

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

Selektor Jeśli nie można dostarczyć w oknie dialogowym Utwórz etykietę w Dashboard zapisuje to samo pole, więc etykieta utworzona w Dashboard i etykieta utworzona przez API zachowują się identycznie.

Podpole references

Te pola są drukowane na etykiecie przewoźnika i / lub fakturze handlowej. Użyj ich, aby przekazać numery PO, numery licencji i uwagi w formie wolnego tekstu, które musi zobaczyć odbiorca lub organ celny.

PoleStatusUwagiDługość
invoiceNumberOpcjonalneNumer faktury handlowca.
purchaseOrderNumberOpcjonalneNumer PO handlowca.
licenseNumberOpcjonalneNumer licencji eksportowej / importowej.
certificateNumberOpcjonalneNumer certyfikatu celnego.
paymentConditionsOpcjonalneWarunki płatności w formie wolnego tekstu, widoczne na fakturze handlowej.Ogranicz do 200 znaków – dłuższe wartości powodują przepełnienie na wydrukowanej fakturze.
customsRemarksOpcjonalneUwagi celne w formie wolnego tekstu.
taxCodeOpcjonalneNiestandardowy kod podatkowy drukowany na etykiecie.

Odpowiedź

Interesujące pola zwracanego Shipment:

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

trackingDetails.number to numer śledzenia Japan Post.

Obiekt label może zwrócić etykietę na dwa sposoby – zażądaj tego, który pasuje do Twojego przepływu pracy (lub obu):

PoleZwracaUżyj gdy
urlHostowany link do wyrenderowanego pliku etykiety (PDF), gotowy do pobrania lub wydruku.Chcesz przekazać link – otworzyć go, wysłać e-mailem lub pobrać plik później, bez przechowywania go w treści odpowiedzi.
labelImageObraz etykiety zakodowany w base64 (PNG / PDF / ZPL) umieszczony w treści odpowiedzi.Chcesz mieć bajty etykiety bezpośrednio w odpowiedzi, aby dołączyć je do przepływu realizacji zamówienia lub zapisać w swoim systemie WMS.

Wybierz tylko pola, których potrzebujesz. Żądanie url utrzymuje odpowiedź w małym rozmiarze; żądanie labelImage zwraca pełną etykietę w treści odpowiedzi, dzięki czemu nie potrzebujesz drugiej rundy, aby ją pobrać. Powyższy przykład żąda pola url.

Poziomy usług Japan Post 

Przekaż jeden z tych kodów jako serviceLevelCode w shipmentRatingCreateWorkflow.

Kody poziomów usług używają kropek, nie podkreśleń. Możesz zobaczyć formę z podkreśleniem (japan_post_air_parcel) w komunikatach o błędach i wewnętrznych odniesieniach, ale nie jest to prawidłowe wejście.

Usługi lotnicze

KodUsługa Japan PostTyp przesyłki
japan_post.air.ems_documentsEMS (documents)1-0
japan_post.air.ems_merchandiseEMS (merchandise)1-1
japan_post.air.parcelInternational parcel1-5
japan_post.air.packetInternational Air Packet1-8
japan_post.air.small_packetSmall packet1-9
japan_post.air.printed_matter_registeredPrinted matter, registered1-A
japan_post.air.printed_matterPrinted matter1-B
japan_post.air.letter_registeredLetter, registered1-C
japan_post.air.letterLetter1-D

Usługi powierzchniowe

KodUsługa Japan PostTyp przesyłki
japan_post.surface.parcelInternational parcel2-5
japan_post.surface.small_packetSmall packet2-9
japan_post.surface.printed_matterPrinted matter2-B
japan_post.surface.letterLetter2-D

Wybór między podobnymi usługami

Small packet a International Air Packet. Obie usługi są ograniczone do 2 kg. japan_post.air.packet to śledzona usługa Small packet firmy Japan Post. japan_post.air.small_packet to jej nieśledzony odpowiednik. Jeśli potrzebujesz śledzenia lekkiej paczki, użyj japan_post.air.packet.

Warianty rejestrowane. W przypadku listów i druków śledzenie jest dodawane przez zarejestrowaną (書留) wersję usługi. japan_post.air.printed_matter i japan_post.air.letter nie zawierają go samodzielnie.

Kody przestarzałe

japan_post.air.epacket_light oznaczał International e-Packet Light. Japan Post zmieniło nazwę tej usługi na International Air Packet 1 czerwca 2026 roku i rozszerzyło ją na wszystkie kraje i regiony. Sama usługa nie zmieniła się.

Stary kod wciąż działa, dzięki czemu istniejące integracje nie przestają funkcjonować, ale w nowych rozwiązaniach należy używać japan_post.air.packet.

Kody trybu transportu

japan_post.air, japan_post.surface, japan_post.economy_air i japan_post.custom również działają, ale określają tryb transportu lub rozwiązanie zastępcze, a nie konkretny produkt pocztowy. W przypadku standardowych przesyłek użyj jednego z powyższych kodów usług.

Zweryfikuj wysyłany kod

Nierozpoznany serviceLevelCode nie powoduje błędu. Żądanie zwraca HTTP 200 bez tablicy errors, serviceLevel wraca jako null, a koszt wysyłki wypada z sumy Landed cost – więc odpowiedź wygląda prawidłowo, mimo że kwoty są błędne.

Zawsze sprawdzaj, czy shipmentRatingCreateWorkflow.serviceLevel nie jest null, zanim zaczniesz polegać na sumach.

Aby w każdej chwili pobrać aktualną listę:

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

To zapytanie przyjmuje ID przewoźnika. Przekazanie kodu przewoźnika japan_post zwraca pustą listę bez błędu.

Obsługa błędów 

  • Błędy walidacji (brakujące wymagane pola, nieprawidłowe kody krajów itp.) wracają w standardowej tablicy GraphQL errors i przerywają resztę łańcucha.
  • Błędy Japan Post (niepowodzenie generowania etykiety, nieprawidłowy adres itp.) pojawiają się jako błędy GraphQL w shipmentCreateWorkflow. Jeśli potrzebna jest ponowna próba, skontaktuj się z pomocą techniczną – zalecaną ścieżką jest ponowne przesłanie całej mutacji z poprawionymi danymi wejściowymi.

VALIDATION_INVALID_TYPE_VARIABLE

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

Ten błąd wskazuje całą zmienną, a nie pole, które faktycznie jest nieprawidłowe. Prawie zawsze oznacza to, że jedna z wartości enum wewnątrz tej zmiennej nie jest członkiem swojego enuma – najczęściej nonDelivery.option, contentsType lub serviceLevel.

To nie jest problem z typowaniem JSON. Cytowanie lub odcytowanie wartości logicznych i liczbowych niczego nie zmieni, ponieważ ładunek nigdy nie dociera tak daleko – enum jest odrzucany wcześniej.

Aby znaleźć błędne pole, sprawdź każde pole typu enum w zmiennej pod kątem jego akceptowanych wartości:

PoleAkceptowane wartości
nonDelivery.optionRETURN_AFTER_RETENTION, RETURN_IMMEDIATELY, FORWARD, ABANDON – brak RETURN
nonDelivery.transportMethodAIR, MOST_ECONOMICAL
contentsTypeSALE_OF_GOODS, ECOMMERCE_GOODS, COMMERCIAL_GOODS, COMMERCIAL_SAMPLE, RETURNED_GOODS, GIFT, DOCUMENTS, OTHER
serviceLevelKod poziomu usługi japan_post.*

Pełna lista wartości enum dla każdego wejścia znajduje się na jego stronie typu w dokumentacji API.

Uprawnienia 

Każdy krok jest niezależnie zabezpieczony. Twój klucz API musi posiadać zakres zapisu dla każdej encji w łańcuchu (ITEM_WRITE, CARTON_WRITE, SHIPMENT_RATING_WRITE, LANDED_COST_WRITE, SHIPMENT_WRITE). Standardowa rola handlowca na koncie zweryfikowanym przyznaje wszystkie te uprawnienia.

Następne kroki 

Czy ta strona była pomocna?