DOCS

Criar um envio único

O fluxo GraphQL CreateDeclarationShipment leva um envio Japan Post de inputs brutos a uma etiqueta imprimível em uma única ida e volta.

CreateDeclarationShipment encadeia seis mutations *Workflow em uma única requisição GraphQL. Cada etapa usa os dados das anteriores, e todas são enviadas juntas para criar um envio completo em uma única ida e volta:

partyCreateWorkflow            → descrever partes de origem e destino
itemCreateWorkflow             → descrever os itens de linha
cartonsCreateWorkflow          → descrever a embalagem física
shipmentRatingCreateWorkflow   → registrar a cotação de frete da transportadora
landedCostCalculateWorkflow    → calcular impostos / tributos / taxas
shipmentCreateWorkflow         → criar o envio + etiqueta

As mutations Workflow são projetadas para ser encadeadas: você não precisa passar IDs de uma etapa para a próxima nem enviar uma requisição separada por etapa. Envie o documento inteiro e receba o Shipment final.

Quando o serviceLevel na etapa final é um nível de serviço Japan Post (japan_post.*), a Zonos chama a Japan Post Label API (código 52) em seu nome usando os Later Pay Numbers da sua Verified Account, gera a etiqueta e o número de rastreamento, cria o Declaration ID e os vincula — tudo na etapa final shipmentCreateWorkflow.

Por que uma mutation? Cada etapa depende da anterior (landed cost precisa dos itens + partes; a etiqueta precisa de tudo). Agrupá-las em um único documento GraphQL mantém os dados consistentes e evita cinco idas e voltas extras.

Enviando para a UE?

O fluxo é o mesmo para os destinos da UE compatíveis. Consulte Enviar para a UE para ver os campos de IOSS e VAT a serem definidos em landedCostCalculateWorkflow.

Endpoint e autenticação 

As requisições desta cadeia usam o mesmo endpoint. O que você passa nos cabeçalhos depende da sua configuração — escolha sua aba.

URL:

https://api.zonos.com/graphql

Cabeçalhos:

Você envia seus próprios pedidos sob sua Verified Account. Autentique-se como você — sem account key.

credentialToken: {{YOUR_API_TOKEN}}

Onde encontrar: Zonos Dashboard → Settings → Integrations → seção Account Key. Copie o token na linha API key; esse é seu credentialToken.

Exemplo de requisição 

Uma requisição CreateDeclarationShipment completa para copiar e adaptar — a mutation, variáveis e resposta — para um pacote Japan Post enviado DDP aos EUA. Cada input é detalhado na seção passo a passo abaixo.

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}

Passo a passo 

A coluna Status em cada tabela abaixo usa estes termos:

  • Obrigatório — a requisição falha sem ele.
  • Obrigatório para etiqueta — opcional no schema GraphQL, mas necessário para produzir uma etiqueta Japan Post válida para os EUA.
  • Condicional — obrigatório conforme outro campo (indicado inline).
  • Recomendado — opcional, mas determina impostos e tributos precisos.
  • Opcional — não necessário.

1. partyCreateWorkflow

Cria as partes envolvidas no envio — no mínimo um ORIGIN (de onde o envio parte) e um DESTINATION (comprador / destinatário).

Campo↕Status↕Observações↕
typeObrigatórioORIGIN e DESTINATION são os dois que este fluxo precisa. Outros (CONSIGNEE, EXPORTER, IMPORTER_OF_RECORD, PAYOR, etc.) existem, mas não são usados aqui.
location.countryCodeObrigatórioCódigo de país ISO-2.
location.line1, locality, administrativeAreaCode, postalCodeObrigatório para etiquetaCampos de endereço necessários para etiqueta válida.
person.firstName, lastName, phoneObrigatório para etiquetaDados de contato necessários para etiqueta válida.
person.companyName, emailOpcional

Exemplo de payload:

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

A resposta retorna os IDs Party criados e os campos de endereço resolvidos.

2. itemCreateWorkflow

Cria os itens de linha que compõem o envio. São os SKUs que aparecerão na fatura comercial e determinam o cálculo de landed cost.

Campo↕Status↕Observações↕
currencyCodeObrigatórioMoeda do preço unitário.
quantityObrigatórioNúmero de unidades deste item.
amountCondicionalPreço unitário (não total). Obrigatório salvo se totalAmount for informado.
totalAmountOpcionalAlternativa a amount; amount é derivado de totalAmount / quantity.
hsCodeRecomendadoCódigo tarifário Harmonized System. Determina tarifas de imposto.
countryOfOriginRecomendadoCódigo ISO-2 onde o item foi fabricado. Determina imposto / FTA.
name, descriptionRecomendadoNome e descrição do produto para o cliente.
customsDescriptionOpcionalSubstituição da descrição aduaneira.
skuCondicionalObrigatório em envios para os EUA a partir de 22 de outubro de 2026, salvo se você usar uma integração de canal. Deve corresponder ao SKU no seu catálogo Zonos. Veja abaixo.
productIdOpcionalSeu ID interno do produto.
measurementsOpcionalPeso / dimensões por unidade.

O código HS, país de origem e valor são os três campos que mais influenciam o resultado de imposto/tributo na etapa 5.

A partir de 22 de outubro de 2026: como a Zonos associa seus itens

A partir de 22 de outubro de 2026, a Zonos registra cada envio postal para os EUA como uma declaração aduaneira usando o registro de catálogo de cada item (código HS, país de origem e detalhes de PGA). A Zonos encontra esse registro de uma de duas formas:

  • Com uma integração de canal que sincroniza pedidos e itens de catálogo: adicione o número de rastreamento da Japan Post ao pedido no seu canal. A Zonos o sincroniza de volta e usa os itens de catálogo do pedido. Informar sku é recomendado, mas não obrigatório. Ele serve como alternativa caso o número de rastreamento esteja ausente do pedido ou ainda não tenha sido sincronizado (os pedidos são sincronizados a cada hora).
  • Sem uma integração de canal (catálogo importado por CSV ou pela Catalog API): informe sku em todos os itens. Ele deve corresponder exatamente ao SKU do item no seu catálogo Zonos. Sem ele, a Zonos não consegue associar o item aos seus dados de PGA.

Enviando para a UE? Você também precisa de identificadores de produto da UE.

3. cartonsCreateWorkflow

Cria os pacotes físicos — caixas, sacos plásticos ou cartas que conterão os itens.

Campo↕Status↕Observações↕
dimensionalUnitObrigatórioINCH ou CENTIMETER.
weight, weightUnitObrigatório para etiquetaJapan Post exige peso do pacote.
length, width, heightOpcionalDimensões externas.
typeOpcionalEstilo de embalagem (caixa, saco, carta). Padrão: PACKAGE.

Cada carton vira um pacote na etiqueta da transportadora na etapa 6. Vários cartons → envio multipiece com um número de rastreamento por carton.

4. shipmentRatingCreateWorkflow

Registra a cotação de frete que o comerciante cobra do comprador.

Campo↕Status↕Observações↕
amountObrigatórioO que o comprador paga pelo frete. Passe 0 se gratuito.
currencyCodeObrigatórioMoeda de amount.
serviceLevelCodeObrigatórioCódigo de serviço da transportadora (ex.: japan_post.air.parcel). Consulte Níveis de serviço Japan Post para a lista completa.
displayNameOpcionalNome amigável para recibo / fatura.

Esta é a tarifa cotada ao comprador no checkout. Alimenta o cálculo de landed cost como subtotal de "shipping" para que impostos e tributos sejam calculados sobre o valor CIF correto.

5. landedCostCalculateWorkflow

Executa o cálculo de impostos, tributos e taxas para o país de destino. Usa itens, partes e custo de frete das etapas anteriores.

Campo↕Status↕Observações↕
endUseObrigatórioNOT_FOR_RESALE ou FOR_RESALE. Alguns destinos aplicam tarifas diferentes para uso comercial vs pessoal.
tariffRateObrigatórioPadrão ZONOS_PREFERRED se omitido. Informa à Zonos qual fonte/metodologia tarifária aplicar.
calculationMethodRecomendadoDDP (comprador pré-paga) ou DDU (comprador paga na entrega). Use DDP para pré-pago. Determina se LandedCost.amountSubtotals inclui imposto/tributo.
currencyCodeOpcionalMoeda em que os subtotais de landed cost são retornados.
arrivalDateOpcionalTaxas FX e tarifários são fixados nesta data se informada.

A resposta inclui amountSubtotals (duties, taxes, fees, shipping, landedCostTotal) — números exibidos ao comprador no checkout e impressos na fatura comercial.

6. shipmentCreateWorkflow

Etapa final — cria a entidade Shipment, gera a etiqueta da transportadora e (opcionalmente) fatura comercial / packing slip.

Para Japan Post Verified Accounts, é aqui que a Zonos chama a Japan Post Label API (código 52) em seu nome, injeta seus Later Pay Numbers, cria o Declaration ID e o vincula ao número de rastreamento retornado pela Japan Post.

Campos principais:

Campo↕Status↕Observações↕
serviceLevelObrigatório para etiquetaServiço Japan Post para envio (ex.: japan_post.air.ems_merchandise). Deve ser nível japan_post.*.
generateLabelOpcionalPadrão true; deve ser true para retornar etiqueta.
contentsTypeRecomendadoDetermina o tratamento aduaneiro. Um de SALE_OF_GOODS, ECOMMERCE_GOODS, COMMERCIAL_GOODS, COMMERCIAL_SAMPLE, RETURNED_GOODS, GIFT, DOCUMENTS, OTHER.
nonDeliveryOpcionalO que a Japan Post deve fazer se o pacote não puder ser entregue. Veja abaixo.
referencesOpcionalNúmeros de referência do comerciante impressos na etiqueta e fatura comercial. Veja abaixo.
declaredValue / isDeclaredValueOpcionalValor segurado do envio.
shipmentConsolidationIdOpcionalUsado quando este envio faz parte de um despacho em lote.

Em contentsType, os dois valores mais comuns para tráfego de Verified Account são ECOMMERCE_GOODS (vendido a um consumidor, BtoC) e COMMERCIAL_GOODS (vendido entre empresas, BtoB). Eles definem o pkgType que a Zonos envia na chamada da etiqueta Japan Post, então a escolha muda o que é impresso na declaração aduaneira — não é apenas uma etiqueta.

Sub-input nonDelivery

Informa à Japan Post o que fazer com o pacote se ele não puder ser entregue — recusado pelo destinatário, rejeitado na fronteira ou não entregável no endereço informado.

option aceita exatamente estes quatro valores. Não existe o valor RETURN — use RETURN_AFTER_RETENTION ou RETURN_IMMEDIATELY para escolher quando o pacote retorna.

option↕Equivalente no Dashboard↕O que a Japan Post faz↕
RETURN_AFTER_RETENTIONReturnRetém o pacote no correio de destino durante o período de retenção e depois o devolve ao remetente.
RETURN_IMMEDIATELYReturnDevolve o pacote ao remetente imediatamente, sem período de retenção.
FORWARDRedirectionRedireciona o pacote para outro endereço. Aplica-se postagem adicional.
ABANDONRenounceDescarta o pacote no destino. Nada é devolvido e nenhuma postagem de retorno é cobrada.

A API expõe as duas variantes de devolução separadamente; a opção Return do Dashboard cobre ambas.

transportMethod aceita AIR ou MOST_ECONOMICAL e define como um pacote devolvido é transportado de volta. Aplica-se apenas às duas opções RETURN_* — o Dashboard exibe o campo correspondente Return method somente quando Return está selecionado.

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

O seletor If undeliverable no diálogo Create label do Dashboard grava esse mesmo campo, então uma etiqueta criada no Dashboard e uma etiqueta criada via API se comportam de forma idêntica.

Sub-input references

Estes campos são impressos na etiqueta da transportadora e/ou fatura comercial. Use-os para exibir números de PO, licenças e observações que o destinatário ou alfândega precisam ver.

Campo↕Status↕Observações↕Tamanho↕
invoiceNumberOpcionalNúmero da fatura do comerciante.—
purchaseOrderNumberOpcionalNúmero de PO do comerciante.—
licenseNumberOpcionalNúmero de licença de exportação/importação.—
certificateNumberOpcionalNúmero de certificado aduaneiro.—
paymentConditionsOpcionalTermos de pagamento em texto livre na fatura comercial.Limite de 200 caracteres — valores maiores estouram na fatura impressa.
customsRemarksOpcionalObservações aduaneiras em texto livre.—
taxCodeOpcionalCódigo fiscal personalizado impresso na etiqueta. Para envios à UE com seu próprio número IOSS, informe seu número IOSS aqui. Consulte Enviar para a UE.—

Resposta

Os campos relevantes no Shipment retornado são:

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

trackingDetails.number é o número de rastreamento Japan Post.

O objeto label pode retornar a etiqueta de duas formas — solicite a que se adaptar ao seu fluxo (ou ambas):

Campo↕Retorna↕Use quando↕
urlLink hospedado para o arquivo de etiqueta (PDF), pronto para download ou impressão.Você quer repassar um link — abrir, enviar por e-mail ou buscar o arquivo depois sem mantê-lo no payload.
labelImageImagem da etiqueta codificada em base64 (PNG/PDF/ZPL) inline na resposta.Você quer os bytes da etiqueta diretamente na resposta para anexar ao fulfillment ou salvar no WMS.

Selecione apenas os campos necessários. Solicitar url mantém a resposta pequena; solicitar labelImage retorna a etiqueta completa inline, sem segunda ida e volta. O exemplo acima solicita url.

Níveis de serviço Japan Post 

Passe um destes códigos como serviceLevelCode em shipmentRatingCreateWorkflow.

Os códigos de nível de serviço usam pontos, não underscores. Você pode ver a forma com underscore (japan_post_air_parcel) em mensagens de erro e referências internas, mas ela não é um input válido.

Serviços aéreos

Código↕Serviço Japan Post↕Tipo de correspondência↕
japan_post.air.ems_documentsEMS (documentos)1-0
japan_post.air.ems_merchandiseEMS (mercadorias)1-1
japan_post.air.parcelEncomenda internacional1-5
japan_post.air.packetInternational Air Packet1-8
japan_post.air.small_packetPacote pequeno1-9
japan_post.air.printed_matter_registeredImpresso, registrado1-A
japan_post.air.printed_matterImpresso1-B
japan_post.air.letter_registeredCarta, registrada1-C
japan_post.air.letterCarta1-D

Serviços de superfície

Código↕Serviço Japan Post↕Tipo de correspondência↕
japan_post.surface.parcelEncomenda internacional2-5
japan_post.surface.small_packetPacote pequeno2-9
japan_post.surface.printed_matterImpresso2-B
japan_post.surface.letterCarta2-D

Escolhendo entre serviços semelhantes

Pacote pequeno vs. International Air Packet. Ambos têm limite de 2 kg. japan_post.air.packet é o serviço de pacote pequeno rastreado da Japan Post. japan_post.air.small_packet é o equivalente não rastreado. Se precisar de rastreamento para uma encomenda leve, use japan_post.air.packet.

Variantes registradas. Para cartas e impressos, o rastreamento é adicionado pela versão registrada (書留) do serviço. japan_post.air.printed_matter e japan_post.air.letter não o incluem por padrão.

Códigos descontinuados

japan_post.air.epacket_light era o International e-Packet Light. A Japan Post renomeou o serviço para International Air Packet em 1º de junho de 2026 e o expandiu para todos os países e regiões. O serviço em si não mudou.

O código antigo ainda funciona, então integrações existentes continuam funcionando, mas use japan_post.air.packet para novos desenvolvimentos.

Códigos de modo de transporte

japan_post.air, japan_post.surface, japan_post.economy_air e japan_post.custom também funcionam, mas identificam um modo de transporte ou um fallback, e não um produto postal específico. Use um dos códigos de serviço acima para envios normais.

Valide o código que você envia

Um serviceLevelCode não reconhecido não gera um erro. A requisição retorna HTTP 200 sem array errors, serviceLevel volta como null, e o frete some do total de landed cost — então a resposta parece correta, mas os valores estão errados.

Sempre verifique se shipmentRatingCreateWorkflow.serviceLevel não é nulo antes de confiar nos totais.

Para obter a lista atual a qualquer momento:

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

Essa query recebe o ID da transportadora. Passar o código da transportadora japan_post retorna uma lista vazia sem erro.

Tratamento de erros 

  • Erros de validação (campos obrigatórios ausentes, códigos de país inválidos, etc.) retornam no array GraphQL errors padrão e abortam o restante da cadeia.
  • Erros Japan Post (falha na geração de etiqueta, endereço inválido, etc.) aparecem como erros GraphQL em shipmentCreateWorkflow. Se precisar tentar novamente, contate o suporte — o caminho recomendado é reenviar a mutation completa com input corrigido.

VALIDATION_INVALID_TYPE_VARIABLE

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

Este erro nomeia a variável inteira, não o campo que está realmente errado. Quase sempre significa que um valor de enum dentro dessa variável não é membro do seu enum — geralmente nonDelivery.option, contentsType ou serviceLevel.

Não é um problema de tipagem JSON. Colocar ou remover aspas dos seus booleanos e números não muda isso, porque o payload nem chega tão longe — o enum é rejeitado primeiro.

Para encontrar o campo problemático, verifique cada campo com valor de enum na variável em relação aos seus valores aceitos:

Campo↕Valores aceitos↕
nonDelivery.optionRETURN_AFTER_RETENTION, RETURN_IMMEDIATELY, FORWARD, ABANDON — sem RETURN
nonDelivery.transportMethodAIR, MOST_ECONOMICAL
contentsTypeSALE_OF_GOODS, ECOMMERCE_GOODS, COMMERCIAL_GOODS, COMMERCIAL_SAMPLE, RETURNED_GOODS, GIFT, DOCUMENTS, OTHER
serviceLevelUm código de nível de serviço japan_post.*

Os membros completos do enum para qualquer input estão listados na página de tipo correspondente na Referência da API.

Permissões 

Cada etapa é protegida independentemente. Sua API key deve ter escopo de escrita para cada entidade da cadeia (ITEM_WRITE, CARTON_WRITE, SHIPMENT_RATING_WRITE, LANDED_COST_WRITE, SHIPMENT_WRITE). A função padrão de comerciante em Verified Account concede todos.

Próximos passos 

Esta página foi útil?