DOCS

Buat satu pengiriman

Alur kerja CreateDeclarationShipment GraphQL membawa pengiriman Japan Post dari input mentah ke label yang dapat dicetak dalam satu perjalanan bolak-balik.

CreateDeclarationShipment merantai enam mutasi *Workflow menjadi satu permintaan GraphQL. Setiap langkah dibangun di atas data yang diberikan oleh langkah-langkah sebelumnya, dan semuanya disampaikan bersama-sama sehingga pengiriman lengkap dapat dibuat dalam satu perjalanan bolak-balik:

partyCreateWorkflow            → jelaskan pihak asal + tujuan
itemCreateWorkflow             → jelaskan item baris
cartonsCreateWorkflow          → jelaskan kemasan fisik
shipmentRatingCreateWorkflow   → catat kutipan tarif operator
landedCostCalculateWorkflow    → hitung bea cukai / pajak / biaya
shipmentCreateWorkflow         → buat pengiriman + label

Mutasi Workflow dirancang untuk dirantai: Anda tidak perlu mengalirkan ID dari satu langkah ke langkah berikutnya, dan Anda tidak perlu mengirim permintaan terpisah per langkah. Kirimkan seluruh dokumen, dapatkan Shipment akhir kembali.

Ketika serviceLevel pada langkah akhir adalah tingkat layanan Japan Post (japan_post.*), Zonos memanggil Japan Post Label API (kode 52) atas nama Anda menggunakan Nomor Pembayaran Kemudian Akun Terverifikasi Anda, menghasilkan label dan nomor pelacakan, membuat ID Deklarasi, dan menautkannya — semuanya di dalam langkah shipmentCreateWorkflow akhir itu.

Mengapa satu mutasi? Setiap langkah tergantung pada yang sebelumnya (biaya pendaratan membutuhkan item + pihak; label membutuhkan semuanya). Menggabungkannya ke dalam satu dokumen GraphQL menjaga data tetap konsisten dan menghindari lima perjalanan bolak-balik ekstra.

Endpoint dan autentikasi 

Permintaan dalam rantai ini semuanya menggunakan endpoint yang sama. Apa yang Anda sertakan di header tergantung pada setup Anda — pilih tab Anda.

URL:

https://api.zonos.com/graphql

Headers:

Anda mengirim pesanan Anda sendiri di bawah Akun Terverifikasi Anda sendiri. Autentikasi sebagai diri Anda sendiri — tidak ada kunci akun yang diperlukan.

credentialToken: {{YOUR_API_TOKEN}}

Di mana menemukannya: Zonos Dashboard → SettingsIntegrations → bagian Account Key. Salin token pada baris API key; itu adalah credentialToken Anda.

Contoh permintaan 

Permintaan CreateDeclarationShipment lengkap yang dapat Anda salin dan sesuaikan — mutasi, variabelnya, dan respons — untuk satu paket Japan Post yang dikirim DDP ke A.S. Setiap input dipecah dalam bagian langkah demi langkah di bawah.

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}

Langkah demi langkah 

Kolom Status pada setiap tabel di bawah menggunakan istilah-istilah berikut:

  • Diperlukan — permintaan gagal tanpanya.
  • Diperlukan untuk label — opsional dalam skema GraphQL, tetapi diperlukan untuk menghasilkan label A.S. Japan Post yang valid.
  • Kondisional — diperlukan tergantung pada bidang lain (dicatat secara inline).
  • Direkomendasikan — opsional, tetapi mendorong bea cukai dan pajak yang akurat.
  • Opsional — tidak diperlukan.

1. partyCreateWorkflow

Membuat pihak-pihak yang terlibat dalam pengiriman — minimal ORIGIN (tempat pengiriman dikirim) dan DESTINATION (pembeli / penerima).

BidangStatusCatatan
typeDiperlukanORIGIN dan DESTINATION adalah dua yang dibutuhkan alur ini. Lainnya (CONSIGNEE, EXPORTER, IMPORTER_OF_RECORD, PAYOR, dll.) ada tetapi tidak digunakan di sini.
location.countryCodeDiperlukanKode negara ISO-2.
location.line1, locality, administrativeAreaCode, postalCodeDiperlukan untuk labelBidang alamat diperlukan untuk label yang valid.
person.firstName, lastName, phoneDiperlukan untuk labelDetail kontak diperlukan untuk label yang valid.
person.companyName, emailOpsional

Contoh payload:

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

Respons mengembalikan ID Party yang dibuat dan bidang alamat yang diselesaikan.

2. itemCreateWorkflow

Membuat item baris yang membentuk pengiriman. Ini adalah SKU yang akan muncul pada faktur komersial dan mendorong perhitungan biaya pendaratan.

BidangStatusCatatan
currencyCodeDiperlukanMata uang harga unit.
quantityDiperlukanJumlah unit item ini.
amountKondisionalHarga unit (bukan total). Diperlukan kecuali totalAmount disediakan.
totalAmountOpsionalAlternatif untuk amount; amount diturunkan dari totalAmount / quantity.
hsCodeDirekomendasikanKode tarif Sistem Harmonis. Mendorong tarif bea cukai.
countryOfOriginDirekomendasikanKode ISO-2 tempat barang dibuat. Mendorong bea cukai / FTA.
name, descriptionDirekomendasikanNama produk + deskripsi menghadap pelanggan.
customsDescriptionOpsionalPenggantian deskripsi bea cukai.
sku, productIdOpsionalPengidentifikasi internal Anda.
measurementsOpsionalBerat / dimensi per unit.

Kode HS, negara asal, dan jumlah adalah tiga bidang yang paling mempengaruhi hasil bea cukai / pajak di langkah 5.

3. cartonsCreateWorkflow

Membuat paket fisik — kotak, polybag, atau surat yang akan menampung item.

BidangStatusCatatan
dimensionalUnitDiperlukanINCH atau CENTIMETER.
weight, weightUnitDiperlukan untuk labelJapan Post memerlukan berat paket.
length, width, heightOpsionalDimensi luar.
typeOpsionalGaya kemasan (kotak, polybag, surat). Default ke PACKAGE.

Setiap karton menjadi satu paket pada label operator di langkah 6. Beberapa karton → pengiriman multi-piece dengan satu nomor pelacakan per karton.

4. shipmentRatingCreateWorkflow

Mencatat kutipan tarif yang dikenakan pedagang kepada pembeli untuk pengiriman.

BidangStatusCatatan
amountDiperlukanApa yang dibayar pembeli untuk pengiriman. Berikan 0 jika gratis.
currencyCodeDiperlukanMata uang amount.
serviceLevelCodeDiperlukanKode layanan operator (misalnya japan_post.air.parcel). Lihat Tingkat layanan Japan Post untuk daftar lengkap.
displayNameOpsionalNama yang mudah dibaca untuk tanda terima / faktur.

Ini adalah tarif yang dijumlahkan pembeli saat checkout. Ini masuk ke perhitungan biaya pendaratan sebagai subtotal "pengiriman" sehingga bea cukai dan pajak dihitung terhadap nilai CIF yang benar.

5. landedCostCalculateWorkflow

Menjalankan perhitungan bea cukai, pajak, dan biaya untuk negara tujuan. Menggunakan item, pihak, dan biaya pengiriman dari langkah-langkah sebelumnya.

BidangStatusCatatan
endUseDiperlukanNOT_FOR_RESALE atau FOR_RESALE. Beberapa tujuan menerapkan tarif berbeda untuk penggunaan akhir komersial vs pribadi.
tariffRateDiperlukanDefault ke ZONOS_PREFERRED jika dihilangkan. Memberitahu Zonos sumber tarif / metodologi mana yang akan diterapkan.
calculationMethodDirekomendasikanDDP (pembeli prabayar) atau DDU (pembeli membayar di pintu). Gunakan DDP untuk prabayar. Mendorong apakah LandedCost.amountSubtotals menyertakan bea cukai / pajak.
currencyCodeOpsionalMata uang subtotal biaya pendaratan dikembalikan.
arrivalDateOpsionalTarif FX dan jadwal tarif disematkan pada tanggal ini jika disediakan.

Respons mencakup amountSubtotals (duties, taxes, fees, shipping, landedCostTotal) — ini adalah angka yang Anda tampilkan kepada pembeli saat checkout dan yang dicetak pada faktur komersial.

6. shipmentCreateWorkflow

Langkah terminal — membuat entitas Shipment, menghasilkan label operator, dan (opsional) faktur komersial / slip kemasan.

Untuk Akun Terverifikasi Japan Post, ini juga tempat Zonos memanggil Japan Post Label API (kode 52) atas nama Anda, menyuntikkan Nomor Pembayaran Kemudian Anda, membuat ID Deklarasi, dan menautkan ID Deklarasi ke nomor pelacakan yang dikembalikan oleh Japan Post.

Bidang kunci:

BidangStatusCatatan
serviceLevelDiperlukan untuk labelLayanan Japan Post untuk dikirim dengan (misalnya japan_post.air.ems_merchandise). Harus berupa tingkat layanan japan_post.*.
generateLabelOpsionalDefault ke true; harus true untuk mengembalikan label.
contentsTypeDirekomendasikanMendorong perlakuan bea cukai. Salah satu dari SALE_OF_GOODS, ECOMMERCE_GOODS, COMMERCIAL_GOODS, COMMERCIAL_SAMPLE, RETURNED_GOODS, GIFT, DOCUMENTS, OTHER.
nonDeliveryOpsionalApa yang harus dilakukan Japan Post jika paket tidak dapat dikirim. Lihat di bawah.
referencesOpsionalNomor referensi yang disediakan pedagang dicetak pada label dan faktur komersial. Lihat di bawah.
declaredValue / isDeclaredValueOpsionalNilai asuransi untuk pengiriman.
shipmentConsolidationIdOpsionalDigunakan ketika pengiriman ini adalah bagian dari pengiriman batch.

Pada contentsType, dua nilai paling umum untuk lalu lintas Akun Terverifikasi adalah ECOMMERCE_GOODS (dijual kepada konsumen, BtoC) dan COMMERCIAL_GOODS (dijual antar bisnis, BtoB). Nilai-nilai ini menentukan pkgType yang dikirim Zonos pada panggilan label Japan Post, sehingga pilihan tersebut mengubah apa yang dicetak pada deklarasi bea cukai — bukan sekadar label.

Sub-input nonDelivery

Memberitahu Japan Post apa yang harus dilakukan dengan paket jika tidak dapat dikirim — ditolak oleh penerima, ditolak di perbatasan, atau tidak dapat dikirim sesuai alamat.

option menerima persis empat nilai ini. Tidak ada nilai RETURN — gunakan RETURN_AFTER_RETENTION atau RETURN_IMMEDIATELY untuk memilih kapan paket dikembalikan.

optionSetara di DashboardYang dilakukan Japan Post
RETURN_AFTER_RETENTIONReturnMenahan paket di kantor pos tujuan selama periode penahanannya, lalu mengembalikannya ke pengirim.
RETURN_IMMEDIATELYReturnMengembalikan paket ke pengirim segera, tanpa penahanan.
FORWARDRedirectionMengalihkan paket ke alamat lain. Berlaku biaya pos tambahan.
ABANDONRenounceMembuang paket di tujuan. Tidak ada yang dikembalikan dan tidak ada biaya pos pengembalian yang dikenakan.

API mengekspos kedua varian pengembalian secara terpisah; opsi Return pada Dashboard mencakup keduanya.

transportMethod menerima AIR atau MOST_ECONOMICAL, dan menentukan bagaimana paket yang dikembalikan melakukan perjalanan kembali. Ini hanya berlaku untuk dua opsi RETURN_* — Dashboard menampilkan bidang Return method yang sesuai hanya ketika Return dipilih.

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

Pemilih If undeliverable pada dialog Create label Dashboard menulis bidang yang sama ini, sehingga label yang dibuat di Dashboard dan label yang dibuat melalui API berperilaku identik.

Sub-input references

Bidang-bidang ini dicetak pada label operator dan / atau faktur komersial. Gunakan untuk menampilkan nomor PO, nomor lisensi, dan komentar teks bebas yang harus dilihat penerima atau otoritas bea cukai.

BidangStatusCatatanPanjang
invoiceNumberOpsionalNomor faktur pedagang.
purchaseOrderNumberOpsionalNomor PO pedagang.
licenseNumberOpsionalNomor lisensi ekspor / impor.
certificateNumberOpsionalNomor sertifikat bea cukai.
paymentConditionsOpsionalIstilah pembayaran teks bebas ditampilkan pada faktur komersial.Batasi hingga 200 karakter — nilai yang lebih panjang meluap pada faktur yang dicetak.
customsRemarksOpsionalKomentar bea cukai teks bebas.
taxCodeOpsionalKode pajak khusus dicetak pada label.

Respons

Bidang menarik pada Shipment yang dikembalikan adalah:

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

trackingDetails.number adalah nomor pelacakan Japan Post.

Objek label dapat mengembalikan label dengan dua cara — minta mana pun yang sesuai dengan alur kerja Anda (atau keduanya):

BidangMengembalikanGunakan ketika
urlTautan yang dihosting ke file label yang dirender (PDF), siap untuk diunduh atau dicetak.Anda ingin menyerahkan tautan — buka, email, atau ambil file nanti tanpa menyimpannya dalam payload.
labelImageGambar label yang dikodekan base64 (PNG/PDF/ZPL) inline dalam respons.Anda menginginkan byte label langsung dalam respons untuk melampirkan pada alur kerja pemenuhan atau menyimpan ke WMS Anda.

Pilih hanya bidang yang Anda butuhkan. Meminta url membuat respons kecil; meminta labelImage mengembalikan label lengkap inline sehingga Anda tidak memerlukan perjalanan bolak-balik kedua untuk mengambilnya. Contoh di atas meminta url.

Tingkat layanan Japan Post 

Berikan salah satu kode ini sebagai serviceLevelCode di shipmentRatingCreateWorkflow.

Kode tingkat layanan menggunakan titik, bukan garis bawah. Anda mungkin melihat bentuk garis bawah (japan_post_air_parcel) dalam pesan kesalahan dan referensi internal, tetapi itu bukan input yang valid.

Layanan udara

KodeLayanan Japan PostJenis pos
japan_post.air.ems_documentsEMS (dokumen)1-0
japan_post.air.ems_merchandiseEMS (barang dagangan)1-1
japan_post.air.parcelPaket internasional1-5
japan_post.air.packetInternational Air Packet1-8
japan_post.air.small_packetPaket kecil1-9
japan_post.air.printed_matter_registeredBarang cetakan, terdaftar1-A
japan_post.air.printed_matterBarang cetakan1-B
japan_post.air.letter_registeredSurat, terdaftar1-C
japan_post.air.letterSurat1-D

Layanan permukaan

KodeLayanan Japan PostJenis pos
japan_post.surface.parcelPaket internasional2-5
japan_post.surface.small_packetPaket kecil2-9
japan_post.surface.printed_matterBarang cetakan2-B
japan_post.surface.letterSurat2-D

Memilih di antara layanan serupa

Paket kecil vs. International Air Packet. Keduanya dibatasi hingga 2 kg. japan_post.air.packet adalah layanan paket kecil Japan Post yang dapat dilacak. japan_post.air.small_packet adalah setara yang tidak dapat dilacak. Jika Anda memerlukan pelacakan pada paket ringan, gunakan japan_post.air.packet.

Varian terdaftar. Untuk surat dan barang cetakan, pelacakan ditambahkan oleh versi terdaftar (書留) dari layanan tersebut. japan_post.air.printed_matter dan japan_post.air.letter tidak menyertakannya sendiri.

Kode yang tidak digunakan lagi

japan_post.air.epacket_light sebelumnya adalah International e-Packet Light. Japan Post mengganti nama layanan ini menjadi International Air Packet pada 1 Juni 2026, dan memperluasnya ke semua negara dan wilayah. Layanan itu sendiri tidak berubah.

Kode lama masih dapat digunakan sehingga integrasi yang ada tetap berfungsi, tetapi gunakan japan_post.air.packet untuk pekerjaan baru.

Kode mode transportasi

japan_post.air, japan_post.surface, japan_post.economy_air, dan japan_post.custom juga dapat digunakan, tetapi kode-kode ini mengidentifikasi mode transportasi atau fallback, bukan produk pos tertentu. Gunakan salah satu kode layanan di atas untuk pengiriman normal.

Validasi kode yang Anda kirim

serviceLevelCode yang tidak dikenali tidak memunculkan kesalahan. Permintaan mengembalikan HTTP 200 tanpa array errors, serviceLevel kembali sebagai null, dan biaya pengiriman hilang dari total biaya pendaratan — sehingga respons terlihat benar padahal jumlahnya salah.

Selalu pastikan bahwa shipmentRatingCreateWorkflow.serviceLevel tidak bernilai null sebelum mengandalkan totalnya.

Untuk mengambil daftar saat ini kapan saja:

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

Kueri ini menggunakan ID operator. Memberikan kode operator japan_post mengembalikan daftar kosong tanpa kesalahan.

Penanganan kesalahan 

  • Kesalahan validasi (bidang yang diperlukan hilang, kode negara tidak valid, dll.) kembali dalam array errors GraphQL standar dan menghentikan sisa rantai.
  • Kesalahan Japan Post (kegagalan pembuatan label, alamat tidak valid, dll.) muncul sebagai kesalahan GraphQL pada shipmentCreateWorkflow. Jika diperlukan percobaan lagi, hubungi dukungan — jalur yang disarankan adalah mengirim ulang mutasi lengkap dengan input yang diperbaiki.

VALIDATION_INVALID_TYPE_VARIABLE

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

Kesalahan ini menyebutkan seluruh variabel, bukan bidang yang sebenarnya salah. Ini hampir selalu berarti satu nilai enum di dalam variabel tersebut bukan anggota dari enum-nya — paling sering nonDelivery.option, contentsType, atau serviceLevel.

Ini bukan masalah tipe JSON. Memberi atau menghapus tanda kutip pada boolean dan angka Anda tidak akan mengubahnya, karena payload tidak pernah mencapai tahap itu — enum ditolak lebih dulu.

Untuk menemukan bidang yang salah, periksa setiap bidang bernilai enum dalam variabel tersebut terhadap nilai yang diterimanya:

BidangNilai yang diterima
nonDelivery.optionRETURN_AFTER_RETENTION, RETURN_IMMEDIATELY, FORWARD, ABANDON — bukan RETURN
nonDelivery.transportMethodAIR, MOST_ECONOMICAL
contentsTypeSALE_OF_GOODS, ECOMMERCE_GOODS, COMMERCIAL_GOODS, COMMERCIAL_SAMPLE, RETURNED_GOODS, GIFT, DOCUMENTS, OTHER
serviceLevelKode tingkat layanan japan_post.*

Anggota enum lengkap untuk input apa pun tercantum pada halaman jenisnya di referensi API.

Izin 

Setiap langkah diamankan secara independen. Kunci API Anda harus memegang cakupan penulisan untuk setiap entitas dalam rantai (ITEM_WRITE, CARTON_WRITE, SHIPMENT_RATING_WRITE, LANDED_COST_WRITE, SHIPMENT_WRITE). Peran pedagang standar pada Akun Terverifikasi memberikan semuanya.

Langkah selanjutnya 

Pesan demo

Apakah halaman ini bermanfaat?