엔드포인트 및 인증
이 체인의 모든 요청은 동일한 엔드포인트를 사용합니다. 헤더에 전달하는 값은 설정에 따라 다릅니다 — 해당 탭을 선택하세요.
URL:
https://api.zonos.com/graphql
헤더:
귀하의 Verified Account로 자체 주문을 발송합니다. 본인으로 인증하면 됩니다 — account key가 필요하지 않습니다.
credentialToken: {{YOUR_API_TOKEN}}
확인 위치: Zonos Dashboard → Settings → Integrations → Account Key 섹션. API key 행의 token을 복사하면 credentialToken입니다.
예제 요청
DDP로 미국에 발송하는 단일 Japan Post 소포에 대한 CreateDeclarationShipment 요청 전체 — 뮤테이션, 변수, 응답 — 을 복사하여 수정할 수 있습니다. 각 입력은 아래 단계별 섹션에서 설명합니다.
mutation CreateDeclarationShipment($partyInput: [PartyCreateWorkflowInput!]!$itemInput: [ItemCreateWorkflowInput!]!$cartonInput: [CartonCreateWorkflowInput!]!$shipmentRatingInput: ShipmentRatingCreateWorkflowInput!$landedCostInput: LandedCostWorkFlowInput!$shipmentInput: ShipmentCreateWorkflowInput!) { partyCreateWorkflow(input: $partyInput) { id type location { line1 locality postalCode countryCode } } itemCreateWorkflow(input: $itemInput) { id name sku amount currencyCode hsCode } cartonsCreateWorkflow(input: $cartonInput) { id length width height dimensionalUnit weight weightUnit } shipmentRatingCreateWorkflow(input: $shipmentRatingInput) { id amount } landedCostCalculateWorkflow(input: $landedCostInput) { id method currencyCode amountSubtotals { duties taxes fees shipping landedCostTotal } } shipmentCreateWorkflow(input: $shipmentInput) { id trackingDetails { number } shipmentCartons { label { url } } }}단계별 설명
아래 각 표의 Status 열은 다음 용어를 사용합니다:
- 필수 — 없으면 요청이 실패합니다.
- 라벨 생성에 필수 — GraphQL 스키마상 선택이지만, 유효한 Japan Post 미국 라벨을 생성하려면 필요합니다.
- 조건부 — 다른 필드에 따라 필수(본문에 표기).
- 권장 — 선택이지만 관세·세금 정확도에 영향을 줍니다.
- 선택 — 필요하지 않습니다.
1. partyCreateWorkflow
배송에 관련된 parties를 생성합니다 — 최소 ORIGIN(발송지)과 DESTINATION(구매자/수취인)이 필요합니다.
| 필드↕ | 상태↕ | 설명↕ |
|---|---|---|
type | 필수 | ORIGIN과 DESTINATION이 이 플로우에 필요한 두 가지 유형입니다. 그 외(CONSIGNEE, EXPORTER, IMPORTER_OF_RECORD, PAYOR 등)도 존재하지만 여기서는 사용하지 않습니다. |
location.countryCode | 필수 | ISO-2 국가 코드. |
location.line1, locality, administrativeAreaCode, postalCode | 라벨 생성에 필수 | 유효한 라벨에 필요한 주소 필드. |
person.firstName, lastName, phone | 라벨 생성에 필수 | 유효한 라벨에 필요한 연락처. |
person.companyName, email | 선택 |
예제 페이로드:
[
{ "type": "DESTINATION", "location": { "countryCode": "US" }, "person": {} },
{ "type": "ORIGIN", "location": { "countryCode": "JP" }, "person": {} }
]
응답에는 생성된 Party ID와 해석된 주소 필드가 포함됩니다.
2. itemCreateWorkflow
배송을 구성하는 line items를 생성합니다. commercial invoice에 표시되고 landed cost 계산을 주도하는 SKU입니다.
| 필드↕ | 상태↕ | 설명↕ |
|---|---|---|
currencyCode | 필수 | 단가 통화. |
quantity | 필수 | 해당 item의 수량. |
amount | 조건부 | 단가(총액 아님). totalAmount를 제공하지 않으면 필수. |
totalAmount | 선택 | amount 대안; amount는 totalAmount / quantity에서 계산됩니다. |
hsCode | 권장 | Harmonized System 관세 코드. 관세율을 결정합니다. |
countryOfOrigin | 권장 | 제조국 ISO-2 코드. 관세/FTA에 영향을 줍니다. |
name, description | 권장 | 고객 대면 제품명 및 설명. |
customsDescription | 선택 | 통관용 설명 재정의. |
sku, productId | 선택 | 내부 식별자. |
measurements | 선택 | 단위당 중량/치수. |
HS code, country of origin, amount는 5단계에서 관세/세금 결과에 가장 큰 영향을 주는 세 필드입니다.
3. cartonsCreateWorkflow
물리적 패키지 — item을 담는 박스, 폴리백, 봉투 — 를 생성합니다.
| 필드↕ | 상태↕ | 설명↕ |
|---|---|---|
dimensionalUnit | 필수 | INCH 또는 CENTIMETER. |
weight, weightUnit | 라벨 생성에 필수 | Japan Post는 패키지 중량을 요구합니다. |
length, width, height | 선택 | 외부 치수. |
type | 선택 | 포장 유형(박스, 폴리백, 봉투). 기본값은 PACKAGE. |
각 carton은 6단계에서 carrier 라벨의 하나의 parcel이 됩니다. carton이 여러 개이면 parcel당 추적 번호 하나씩인 다피스 배송입니다.
4. shipmentRatingCreateWorkflow
구매자에게 청구하는 배송 요금 견적을 기록합니다.
| 필드↕ | 상태↕ | 설명↕ |
|---|---|---|
amount | 필수 | 구매자가 배송에 지불하는 금액. 무료 배송이면 0을 전달. |
currencyCode | 필수 | amount의 통화. |
serviceLevelCode | 필수 | carrier 서비스 코드(예: japan_post.air.parcel). |
displayName | 선택 | 영수증/invoice용 표시 이름. |
이것은 checkout에서 구매자에게 제시된 요금입니다. landed cost 계산의 "shipping" 소계로 반영되어 관세·세금이 올바른 CIF 값 기준으로 계산됩니다.
5. landedCostCalculateWorkflow
목적지 국가에 대한 관세, 세금, 수수료 계산을 실행합니다. 이전 단계의 items, parties, 배송비를 사용합니다.
| 필드↕ | 상태↕ | 설명↕ |
|---|---|---|
endUse | 필수 | NOT_FOR_RESALE 또는 FOR_RESALE. 일부 목적지는 상업용/개인용 end use에 따라 다른 요율을 적용합니다. |
tariffRate | 필수 | 생략 시 기본값 ZONOS_PREFERRED. Zonos에 적용할 관세 출처/방법론을 지정합니다. |
calculationMethod | 권장 | DDP(구매자 선납) 또는 DDU(구매자 착불). 선납에는 DDP를 사용. LandedCost.amountSubtotals에 관세/세금 포함 여부를 결정합니다. |
currencyCode | 선택 | landed cost 소계 반환 통화. |
arrivalDate | 선택 | 제공 시 환율 및 관세 일정이 이 날짜에 고정됩니다. |
응답에는 amountSubtotals(duties, taxes, fees, shipping, landedCostTotal)가 포함됩니다 — checkout에서 구매자에게 표시하고 commercial invoice에 인쇄하는 수치입니다.
6. shipmentCreateWorkflow
마지막 단계 — Shipment 엔티티를 생성하고, carrier 라벨을 생성하며, (선택) commercial invoice / packing slip을 생성합니다.
Japan Post Verified Account의 경우, Zonos는 여기서 귀하를 대신해 Japan Post Label API(code 52)를 호출하고, Later Pay Number를 주입하며, Declaration ID를 생성하고 Japan Post가 반환한 추적 번호에 Declaration ID를 연결합니다.
주요 필드:
| 필드↕ | 상태↕ | 설명↕ |
|---|---|---|
serviceLevel | 라벨 생성에 필수 | 발송할 Japan Post 서비스(예: japan_post.air.ems_merchandise). japan_post.* 서비스 레벨이어야 합니다. |
generateLabel | 선택 | 기본값 true; 라벨을 반환하려면 true여야 합니다. |
contentsType | 권장 | 통관 처리를 결정합니다. SALE_OF_GOODS, ECOMMERCE_GOODS, COMMERCIAL_GOODS, COMMERCIAL_SAMPLE, RETURNED_GOODS, GIFT, DOCUMENTS, OTHER 중 하나. |
nonDelivery | 선택 | 소포를 배송할 수 없을 때 Japan Post가 취할 조치. 아래 참고. |
references | 선택 | 라벨 및 commercial invoice에 인쇄되는 판매자 제공 참조 번호. 아래 참고. |
declaredValue / isDeclaredValue | 선택 | 배송 보험 가치. |
shipmentConsolidationId | 선택 | 이 배송이 일괄 dispatch의 일부일 때 사용합니다. |
contentsType의 경우, Verified Account 트래픽에서 가장 흔한 값은 ECOMMERCE_GOODS(소비자에게 판매, BtoC)와 COMMERCIAL_GOODS(기업 간 판매, BtoB)입니다. 이 값은 Zonos가 Japan Post 라벨 호출 시 전송하는 pkgType을 결정하므로, 선택에 따라 통관 신고서에 인쇄되는 내용이 달라집니다 — 단순한 라벨 표기 이상의 의미입니다.
nonDelivery 하위 입력
소포를 배송할 수 없는 경우 — 수취인이 수령을 거부하거나, 국경에서 반려되거나, 주소 오류로 배송 불가한 경우 — Japan Post가 취할 조치를 지정합니다.
option은 정확히 다음 네 가지 값만 허용합니다. RETURN 값은 존재하지 않습니다 — 소포가 반송되는 _시점_을 지정하려면 RETURN_AFTER_RETENTION 또는 RETURN_IMMEDIATELY를 사용하세요.
option↕ | Dashboard 대응 항목↕ | Japan Post의 동작↕ |
|---|---|---|
RETURN_AFTER_RETENTION | Return | 목적지 우체국에서 보관 기간 동안 소포를 보관한 후 발송인에게 반송합니다. |
RETURN_IMMEDIATELY | Return | 보관 없이 즉시 소포를 발송인에게 반송합니다. |
FORWARD | Redirection | 소포를 다른 주소로 전달합니다. 추가 우편 요금이 부과됩니다. |
ABANDON | Renounce | 목적지에서 소포를 폐기합니다. 반송되는 것이 없으며 반송 요금도 없습니다. |
API는 두 반송 변형을 각각 노출하지만, Dashboard의 Return 옵션은 두 가지를 모두 포괄합니다.
transportMethod는 AIR 또는 MOST_ECONOMICAL을 허용하며, 반송되는 소포가 돌아오는 방식을 지정합니다. 두 RETURN_* 옵션에만 적용됩니다 — Dashboard는 Return이 선택된 경우에만 대응하는 Return method 필드를 표시합니다.
{
"nonDelivery": {
"option": "RETURN_AFTER_RETENTION",
"transportMethod": "MOST_ECONOMICAL"
}
}
Dashboard의 Create label 대화상자에 있는 If undeliverable 선택 항목이 동일한 필드에 값을 씁니다. 따라서 Dashboard에서 생성한 라벨과 API로 생성한 라벨은 동일하게 동작합니다.
references 하위 입력
이 필드는 carrier 라벨 및/또는 commercial invoice에 인쇄됩니다. PO 번호, license 번호, 수취인 또는 세관이 확인해야 하는 자유 텍스트 비고를 표시하는 데 사용하세요.
| 필드↕ | 상태↕ | 설명↕ | 길이↕ |
|---|---|---|---|
invoiceNumber | 선택 | 판매자 invoice 번호. | — |
purchaseOrderNumber | 선택 | 판매자 PO 번호. | — |
licenseNumber | 선택 | 수출/수입 license 번호. | — |
certificateNumber | 선택 | 통관 certificate 번호. | — |
paymentConditions | 선택 | commercial invoice에 표시되는 자유 텍스트 결제 조건. | 200자 이내로 제한 — 더 긴 값은 인쇄된 invoice에서 넘칩니다. |
customsRemarks | 선택 | 자유 텍스트 통관 비고. | — |
taxCode | 선택 | 라벨에 인쇄되는 사용자 정의 tax code. | — |
응답
반환된 Shipment의 주요 필드는 다음과 같습니다:
{
id
trackingDetails {
number
}
shipmentCartons {
label {
url
labelImage
}
}
}
trackingDetails.number는 Japan Post 추적 번호입니다.
label 객체는 라벨을 두 가지 방식으로 반환할 수 있습니다 — 워크플로에 맞는 방식(또는 둘 다)을 요청하세요:
| 필드↕ | 반환값↕ | 사용 시점↕ |
|---|---|---|
url | 렌더링된 라벨 파일(PDF)의 호스팅 링크. 다운로드 또는 인쇄 가능. | 링크를 전달할 때 — 열기, 이메일 전송, 또는 payload에 파일을 담지 않고 나중에 가져올 때. |
labelImage | 응답에 inline으로 포함된 base64 인코딩 라벨 이미지(PNG/PDF/ZPL). | fulfillment 워크플로에 첨부하거나 WMS에 저장하기 위해 라벨 바이트를 응답에서 직접 받을 때. |
필요한 필드만 선택하세요. url을 요청하면 응답 크기가 작아지고, labelImage를 요청하면 전체 라벨이 inline으로 반환되어 가져오기 위한 두 번째 round trip이 필요 없습니다. 위 예제는 url을 요청합니다.
오류 처리
- 유효성 검사 오류(필수 필드 누락, 잘못된 국가 코드 등)는 표준 GraphQL
errors배열로 반환되며 체인의 나머지를 중단합니다. - Japan Post 오류(라벨 생성 실패, 잘못된 주소 등)는
shipmentCreateWorkflow의 GraphQL 오류로 표시됩니다. 재시도가 필요하면 지원팀에 문의하세요 — 권장 경로는 수정된 입력으로 전체 뮤테이션을 다시 제출하는 것입니다.
VALIDATION_INVALID_TYPE_VARIABLE
{
"errors": [
{
"message": "invalid type for variable: 'shipmentInput'",
"extensions": {
"name": "shipmentInput",
"code": "VALIDATION_INVALID_TYPE_VARIABLE"
}
}
]
}
이 오류는 실제로 잘못된 필드가 아니라 변수 전체의 이름을 표시합니다. 거의 항상 해당 변수 안의 enum 값 하나가 자신의 enum 멤버가 아니라는 의미입니다 — 가장 흔한 경우는 nonDelivery.option, contentsType, 또는 serviceLevel입니다.
JSON 타입 문제가 아닙니다. boolean과 숫자에 따옴표를 붙이거나 제거해도 바뀌지 않습니다. payload가 거기까지 도달하지 못하고 enum 단계에서 먼저 거부되기 때문입니다.
잘못된 필드를 찾으려면 변수 안의 모든 enum 값 필드를 허용 값과 비교하세요:
| 필드↕ | 허용 값↕ |
|---|---|
nonDelivery.option | RETURN_AFTER_RETENTION, RETURN_IMMEDIATELY, FORWARD, ABANDON — RETURN은 없음 |
nonDelivery.transportMethod | AIR, MOST_ECONOMICAL |
contentsType | SALE_OF_GOODS, ECOMMERCE_GOODS, COMMERCIAL_GOODS, COMMERCIAL_SAMPLE, RETURNED_GOODS, GIFT, DOCUMENTS, OTHER |
serviceLevel | japan_post.* 서비스 레벨 코드 |
모든 입력의 전체 enum 멤버는 API reference의 해당 타입 페이지에 나열되어 있습니다.
권한
각 단계는 독립적으로 보호됩니다. API key는 체인의 각 엔티티에 대한 write scope(ITEM_WRITE, CARTON_WRITE, SHIPMENT_RATING_WRITE, LANDED_COST_WRITE, SHIPMENT_WRITE)를 보유해야 합니다. Verified Account의 표준 판매자 역할은 이를 모두 부여합니다.
다음 단계
- 일괄 dispatch(consolidation) — 하루 소포를 하나의 Japan Post 후납 dispatch slip으로 묶습니다.
단일 배송 생성
CreateDeclarationShipmentGraphQL 워크플로는 Japan Post 배송을 원시 입력부터 인쇄 가능한 라벨까지 한 번의 round trip으로 처리합니다.CreateDeclarationShipment는 여섯 개의*Workflow뮤테이션을 하나의 GraphQL 요청으로 연결합니다. 각 단계는 이전 단계에서 제공한 데이터를 기반으로 하며, 모두 함께 제출되어 한 번의 round trip으로 완전한 배송을 생성할 수 있습니다:Workflow뮤테이션은 체인 방식으로 설계되었습니다: 한 단계의 ID를 다음 단계로 전달할 필요가 없으며, 단계별로 별도 요청을 보낼 필요도 없습니다. 전체 문서를 제출하면 최종Shipment가 반환됩니다.마지막 단계의
serviceLevel이 Japan Post 서비스 레벨(japan_post.*)이면, Zonos는 Verified Account의 Later Pay Number를 사용하여 귀하를 대신해 Japan Post Label API(code 52)를 호출하고, 라벨과 추적 번호를 생성하며, Declaration ID를 생성하고 연결합니다 — 모두 마지막shipmentCreateWorkflow단계 안에서 처리됩니다.