DOCS

创建单个发货单

CreateDeclarationShipment GraphQL 工作流在一次往返中将日本邮政发货单从原始输入转换为可打印的标签。

CreateDeclarationShipment 将六个 *Workflow 变更链接到一个 GraphQL 请求中。每个步骤都建立在前面步骤提供的数据之上,所有这些都一起提交,以便完整的发货单可以在一次往返中创建:

partyCreateWorkflow            → 描述原点和目的地参与方
itemCreateWorkflow             → 描述产品行项目
cartonsCreateWorkflow          → 描述物理包装
shipmentRatingCreateWorkflow   → 记录承运人报价
landedCostCalculateWorkflow    → 计算关税/税金/费用
shipmentCreateWorkflow         → 创建发货单 + 标签

Workflow 变更被设计为链式的:你不需要将 ID 从一个步骤传递到下一个步骤,也不需要为每个步骤单独发送请求。提交整个文档,即可获得最终的 Shipment

当最后一个步骤的 serviceLevel 是日本邮政服务等级(japan_post.*)时,Zonos 代表你使用你的 Verified Account 的 Later Pay Numbers 调用日本邮政标签 API(代码 52),生成标签和跟踪号,创建申报 ID,并在最后的 shipmentCreateWorkflow 步骤中链接它们。

为什么是一个变更? 每个步骤都取决于前一个步骤(落地成本需要产品和参与方;标签需要一切)。将它们捆绑到一个 GraphQL 文档中可以保持数据一致并避免五个额外的往返。

端点和认证 

此链中的请求都使用相同的端点。你在头中传递的内容取决于你的设置 — 选择你的选项卡。

URL:

https://api.zonos.com/graphql

Headers:

你在自己的 Verified Account 下发送自己的订单。以自己的身份进行身份验证 — 不需要账户密钥。

credentialToken: {{YOUR_API_TOKEN}}

查找位置: Zonos Dashboard → SettingsIntegrationsAccount Key 部分。复制 API key 行上的令牌;这就是你的 credentialToken

示例请求 

一个完整的 CreateDeclarationShipment 请求 — 变更、变量及响应 — 你可以直接复制并调整,用于以 DDP 方式发往美国的单个日本邮政包裹。下面的逐步说明部分对每个输入都做了拆解。

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}

逐步说明 

下面每个表格中的 Status 列使用这些术语:

  • Required — 没有它请求会失败。
  • Required for label — 在 GraphQL 架构中是可选的,但需要生成有效的日本邮政美国标签。
  • Conditional — 根据另一个字段(注明内联)是否需要。
  • Recommended — 可选,但提高关税和税金的准确性。
  • Optional — 不需要。

1. partyCreateWorkflow

创建发货单中涉及的参与方 — 至少一个 ORIGIN(发货单发送的地方)和一个 DESTINATION(买家/收货人)。

字段状态说明
typeRequired此流程需要的两种类型是 ORIGINDESTINATION。其他类型(CONSIGNEEEXPORTERIMPORTER_OF_RECORDPAYOR 等)也存在,但此处不使用。
location.countryCodeRequiredISO-2 国家代码。
location.line1, locality, administrativeAreaCode, postalCodeRequired for label生成有效标签所需的地址字段。
person.firstName, lastName, phoneRequired for label生成有效标签所需的联系人详情。
person.companyName, emailOptional

示例负载:

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

响应返回创建的 Party ID 和解析的地址字段。

2. itemCreateWorkflow

创建组成发货单的产品行项目。这些是将出现在商业发票上并驱动落地成本计算的 SKU。

字段状态说明
currencyCodeRequired单价的货币。
quantityRequired此项目的单位数。
amountConditional单价(不是总价)。除非提供了 totalAmount,否则需要。
totalAmountOptionalamount 的替代方案;amounttotalAmount / quantity 派生。
hsCodeRecommended协调制度关税代码。驱动关税率。
countryOfOriginRecommended制造产品的 ISO-2 代码。驱动关税/自由贸易协定。
name, descriptionRecommended面向客户的产品名称和描述。
customsDescriptionOptional海关描述覆盖。
sku, productIdOptional你的内部标识符。
measurementsOptional每单位重量/尺寸。

HS 代码、原产国和金额是影响第 5 步关税/税金结果最多的三个字段。

3. cartonsCreateWorkflow

创建物理包装 — 将容纳产品的纸箱、聚袋或信件。

字段状态说明
dimensionalUnitRequiredINCHCENTIMETER
weight, weightUnitRequired for label日本邮政需要包装重量。
length, width, heightOptional外部尺寸。
typeOptional包装风格(纸箱、聚袋、信件)。默认为 PACKAGE

每个纸箱成为第 6 步中运单上的一个包裹。多个纸箱 → 多件发货单,每个纸箱有一个跟踪号。

4. shipmentRatingCreateWorkflow

记录商家向买家收取的运费报价

字段状态说明
amountRequired买家为运费支付的费用。免费时传递 0
currencyCodeRequiredamount 的货币。
serviceLevelCodeRequired承运人服务代码(例如 japan_post.air.parcel)。完整列表见日本邮政服务等级
displayNameOptional收据/发票的漂亮名称。

这是买家在结账时报价的费率。它作为"运费"小计进入落地成本计算,以便针对正确的 CIF 值计算关税和税金。

5. landedCostCalculateWorkflow

运行目的地国家的关税、税金和费用计算。使用前面步骤中的产品、参与方和运费成本。

字段状态说明
endUseRequiredNOT_FOR_RESALEFOR_RESALE。某些目的地对商业与个人终端用途应用不同的费率。
tariffRateRequired如果省略,默认为 ZONOS_PREFERRED。告诉 Zonos 应用哪个关税来源/方法。
calculationMethodRecommendedDDP(买家预付)或 DDU(买家在门口支付)。对预付使用 DDP。驱动 LandedCost.amountSubtotals 是否包括关税/税金。
currencyCodeOptional返回落地成本小计的货币。
arrivalDateOptional如果提供,外汇汇率和关税表将固定在此日期。

响应包括 amountSubtotalsdutiestaxesfeesshippinglandedCostTotal) — 这些是你在结账时向买家显示的数字,并打印在商业发票上。

6. shipmentCreateWorkflow

最终步骤 — 创建**Shipment** 实体、生成运单标签和(可选)商业发票/装箱单。

对于日本邮政 Verified Account,这也是 Zonos 代表你调用日本邮政标签 API(代码 52)、注入你的 Later Pay Numbers、创建申报 ID 并将申报 ID 链接到日本邮政返回的跟踪号的地方。

关键字段:

字段状态说明
serviceLevelRequired for label要发货的日本邮政服务(例如 japan_post.air.ems_merchandise)。必须是 japan_post.* 服务等级。
generateLabelOptional默认为 true;必须为 true 以返回标签。
contentsTypeRecommended驱动海关处理方式。取值为 SALE_OF_GOODSECOMMERCE_GOODSCOMMERCIAL_GOODSCOMMERCIAL_SAMPLERETURNED_GOODSGIFTDOCUMENTSOTHER 之一。
nonDeliveryOptional如果包裹无法送达,日本邮政应采取的处理方式。见下文。
referencesOptional商家提供的参考号打印在标签和商业发票上。见下面。
declaredValue / isDeclaredValueOptional发货单的保险价值。
shipmentConsolidationIdOptional当此发货单是批量调度的一部分时使用。

对于 contentsType,Verified Account 流量中最常见的两个取值是 ECOMMERCE_GOODS(卖给消费者,BtoC)和 COMMERCIAL_GOODS(企业间交易,BtoB)。它们决定了 Zonos 在调用日本邮政标签 API 时发送的 pkgType,因此这一选择会改变海关申报单上打印的内容 — 它不仅仅是一个标签字段。

nonDelivery 子输入

告诉日本邮政在包裹无法送达时该如何处理 — 被收货人拒收、在边境被拒绝入境,或按地址无法送达。

option 只接受以下四个值。没有 RETURN 这个值 — 使用 RETURN_AFTER_RETENTIONRETURN_IMMEDIATELY 来选择包裹返回的时机

optionDashboard 对应项日本邮政的处理方式
RETURN_AFTER_RETENTIONReturn在目的地邮局保留包裹至保留期结束,然后退回给寄件人。
RETURN_IMMEDIATELYReturn立即将包裹退回给寄件人,不设保留期。
FORWARDRedirection将包裹转寄到另一个地址。需额外支付邮费。
ABANDONRenounce在目的地处置该包裹。不退回任何东西,也不收取退件邮费。

API 将两种退件方式分别开放;Dashboard 的 Return 选项则同时覆盖这两者。

transportMethod 接受 AIRMOST_ECONOMICAL,用于设置退回包裹的运输方式。它仅适用于两个 RETURN_* 选项 — 只有在选择了 Return 时,Dashboard 才会显示对应的 Return method 字段。

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

Dashboard Create label 对话框中的 If undeliverable 选择器写入的正是这同一个字段,因此在 Dashboard 中创建的标签和通过 API 创建的标签行为完全一致。

references 子输入

这些字段打印在运单标签和/或商业发票上。使用它们来显示收货人或海关部门需要看到的 PO 号、许可号和自由文本注释。

字段状态说明长度
invoiceNumberOptional商家发票号。
purchaseOrderNumberOptional商家 PO 号。
licenseNumberOptional出口/进口许可号。
certificateNumberOptional海关证书号。
paymentConditionsOptional商业发票上显示的自由文本付款条款。限制 200 个字符 — 较长的值会在打印发票上溢出。
customsRemarksOptional自由文本海关备注。
taxCodeOptional打印在标签上的自定义税法代码。

响应

返回的 Shipment 上有趣的字段是:

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

trackingDetails.number 是日本邮政跟踪号。

label 对象可以通过两种方式返回标签 — 请求符合你的工作流的任何一个(或两个):

字段返回值使用场景
url指向渲染标签文件(PDF)的托管链接,可随时下载或打印。你想交付一个链接 — 打开它、通过电子邮件发送或稍后在不将其保存在负载中的情况下获取文件。
labelImagebase64 编码的标签图像(PNG/PDF/ZPL)内联在响应中。你想要响应中的标签字节来附加到履行工作流或保存到你的 WMS。

仅选择你需要的字段。请求 url 会保持响应较小;请求 labelImage 会返回完整的标签内联,所以你不需要第二次往返来获取它。上面的示例请求 url

日本邮政服务等级 

shipmentRatingCreateWorkflow 中,将以下代码之一作为 serviceLevelCode 传入。

服务等级代码使用点号,不是下划线。你可能会在错误消息和内部引用中看到下划线形式(japan_post_air_parcel),但它不是有效的输入。

航空服务

代码日本邮政服务邮件类型
japan_post.air.ems_documentsEMS(文件)1-0
japan_post.air.ems_merchandiseEMS(货物)1-1
japan_post.air.parcel国际包裹1-5
japan_post.air.packet国际航空小包1-8
japan_post.air.small_packet小包1-9
japan_post.air.printed_matter_registered印刷品,挂号1-A
japan_post.air.printed_matter印刷品1-B
japan_post.air.letter_registered信函,挂号1-C
japan_post.air.letter信函1-D

水陆服务

代码日本邮政服务邮件类型
japan_post.surface.parcel国际包裹2-5
japan_post.surface.small_packet小包2-9
japan_post.surface.printed_matter印刷品2-B
japan_post.surface.letter信函2-D

在相似服务之间选择

小包与国际航空小包。 两者上限都是 2 公斤。japan_post.air.packet 是日本邮政可跟踪的小包服务。japan_post.air.small_packet 是不可跟踪的等效服务。如果轻量包裹需要跟踪,请使用 japan_post.air.packet

挂号变体。 对于信函和印刷品,跟踪功能由该服务的挂号(書留)版本提供。japan_post.air.printed_matterjapan_post.air.letter 本身不包含跟踪功能。

已弃用的代码

japan_post.air.epacket_light 曾是国际 e-Packet Light。日本邮政已于2026 年 6 月 1 日将该服务重命名为国际航空小包,并将其扩展到所有国家和地区。服务本身没有变化。

旧代码仍然有效,因此现有集成可以继续正常工作,但新工作请使用 japan_post.air.packet

传输方式代码

japan_post.airjapan_post.surfacejapan_post.economy_airjapan_post.custom 同样有效,但它们标识的是一种传输方式或后备选项,而不是特定的邮件产品。正常发货请使用上面的服务代码之一。

验证你发送的代码

无法识别的 serviceLevelCode 不会引发错误。请求会返回 HTTP 200,没有 errors 数组,serviceLevel 会返回 null,运费也会从落地成本总额中消失 — 因此响应看起来是正确的,但金额是错的。

在依赖总额之前,务必断言 shipmentRatingCreateWorkflow.serviceLevel 不为空。

要随时获取当前列表:

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

此查询接受承运人的 ID。传入承运人代码 japan_post 会返回一个空列表,且不会报错。

错误处理 

  • 验证错误(缺少必需字段、无效国家代码等)在标准 GraphQL errors 数组中返回并中止链的其余部分。
  • 日本邮政错误(标签生成失败、地址无效等)在 shipmentCreateWorkflow 上作为 GraphQL 错误出现。如果需要重试,请联系支持 — 推荐的路径是使用更正的输入重新提交完整的变更。

VALIDATION_INVALID_TYPE_VARIABLE

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

此错误指明的是整个变量,而不是真正出错的字段。它几乎总是意味着该变量内部有一个枚举值不属于其枚举成员 — 最常见的是 nonDelivery.optioncontentsTypeserviceLevel

不是 JSON 类型问题。给布尔值和数字加引号或去掉引号都不会改变结果,因为负载根本没到那一步 — 枚举值先被拒绝了。

要找出出错的字段,请对照每个枚举字段的可接受值逐一核对该变量:

字段可接受的值
nonDelivery.optionRETURN_AFTER_RETENTIONRETURN_IMMEDIATELYFORWARDABANDON — 没有 RETURN
nonDelivery.transportMethodAIRMOST_ECONOMICAL
contentsTypeSALE_OF_GOODSECOMMERCE_GOODSCOMMERCIAL_GOODSCOMMERCIAL_SAMPLERETURNED_GOODSGIFTDOCUMENTSOTHER
serviceLevel一个 japan_post.* 服务等级代码

任何输入的完整枚举成员都列在其类型页面上,见 API 参考

权限 

每个步骤都独立保护。你的 API 密钥必须为链中的每个实体持有写入作用域(ITEM_WRITECARTON_WRITESHIPMENT_RATING_WRITELANDED_COST_WRITESHIPMENT_WRITE)。Verified Account 上的标准商家角色授予所有这些。

后续步骤 

预约演示

这个页面有帮助吗?


获取支持·法律文件·© 2026 Zonos
在此页面: