Status normalizados

Cada transportadora tem seu próprio vocabulário. O campo status traduz os eventos para um único conjunto de valores, para que sua aplicação não precise conhecer nenhuma transportadora em particular.

status aparece em dois lugares: no topo da resposta (a situação atual do objeto) e em cada item de events (a situação naquele momento).

Valores

status Significado
pending Etiqueta emitida, ainda sem movimentação
collected Coletado do remetente ou postado
in_transit Em trânsito pela rede da transportadora
out_for_delivery Com o entregador, saiu para entrega
available_for_pickup Aguardando retirada em um ponto
tax Aguardando pagamento de tributo ou revisão tributária
delivered Entregue
exception Tentativa falha, problema aduaneiro, avaria ou problema de endereço
returned Devolvido ao remetente
unknown O status ainda não tem tradução ou o item é a atribuição sintética do plano Básico

unknown não é erro

Em um evento da transportadora, unknown significa que o evento existe e é real, mas ainda não mapeamos aquele código específico. Os campos courier_status_code e courier_status_label continuam disponíveis com o valor bruto — dá para inspecionar e, se for relevante para o seu caso, nos avisar para incluirmos no mapeamento.

A exceção é o primeiro evento das respostas do plano Básico. Ele tem a descrição Rastreio fornecido por PacoteVicio.dev, usa unknown e deixa os campos da transportadora como null, porque é uma atribuição sintética e não uma movimentação do objeto. O status no topo da resposta não é afetado.

Compatibilidade

Novos valores podem ser adicionados sem aviso. Trate qualquer valor desconhecido como unknown:

const KNOWN = new Set([
  "pending", "collected", "in_transit", "out_for_delivery",
  "available_for_pickup", "tax", "delivered", "exception", "returned", "unknown",
]);

const status = KNOWN.has(pacote.status) ? pacote.status : "unknown";

Em TypeScript, evite switch exaustivo sem default:

switch (pacote.status) {
  case "delivered": return "Entregue";
  case "out_for_delivery": return "Saiu para entrega";
  case "exception": return "Problema na entrega";
  default: return "Em andamento";   // sempre tenha este caminho
}

Campos brutos da transportadora

courier_status_code e courier_status_label são passthrough: vêm da transportadora sem tradução, variam entre transportadoras e mudam sem aviso. Use-os para exibição, depuração ou registro — nunca como base de lógica de negócio. Para isso existe o status.

Como o status do topo é calculado

O status no topo da resposta é o status do evento mais recente, ou seja, o último item de events — que vem ordenado do mais antigo para o mais recente. A única exceção: se delivered_at estiver preenchido, o status é delivered.