GET /v1/track/:tracking_code

Consulta o rastreamento de um objeto. A transportadora é detectada pelo formato do código, ou informada por você na rota.

Variações de rota

Rota Descrição
GET /v1/track/{tracking_code} Detecção automática, resposta normalizada
GET /v1/track/{tracking_code}/raw Detecção automática, payload original da transportadora
GET /v1/track/{courier}/{tracking_code} Transportadora forçada, resposta normalizada
GET /v1/track/{courier}/{tracking_code}/raw Transportadora forçada, payload original

Parâmetros de rota

Parâmetro Descrição
tracking_code De 1 a 40 caracteres, apenas letras, números e hífen. Espaços, inclusive nas extremidades, e códigos incompatíveis com a transportadora informada retornam 400 invalid_tracking_code.
courier Slug do catálogo — veja Transportadoras. Fora dele: 400 courier_not_supported

O segmento tracking_code é obrigatório. Sem ele, /v1/track/ não corresponde a uma rota e retorna 404 not_found, sem cobrança.

Query parameters

Parâmetro Obrigatório Padrão Valores
retry_level Não high low, medium, high

retry_level controla quanto tempo insistimos antes de desistir. Rastreamento depende de sistemas de terceiros que falham de forma intermitente; níveis mais altos toleram mais falhas temporárias, ao custo de latência.

Nível Orçamento de tempo Prazo máximo antes do 504
low 10 s 15 s
medium 20 s 25 s
high 45 s 50 s

Escolha pelo tempo que a sua aplicação pode esperar. Para uma tela que o usuário está olhando, low ou medium. Para um job em segundo plano, high.

Um valor fora da lista responde 400 invalid_retry_level, sem consumir cota.

Headers

Header Quando Descrição
X-Tracking-Document J&T Express CPF/CNPJ do destinatário, apenas dígitos

Veja Transportadoras para as regras completas.

Headers de resposta

Header Descrição
X-Courier Transportadora que respondeu — essencial nas rotas /raw com detecção automática
X-Billable Se esta requisição consumiu cota
X-Request-Id Identificador da requisição
RateLimit, RateLimit-Policy Estado dos limites — veja Limites de uso

Resposta normalizada

{
  "tracking_code": "BR123456789BR",
  "courier": "correios",
  "status": "collected",
  "status_updated_at": "2026-07-15T13:54:00Z",
  "service": "REGISTRADO CONVENCIONAL",
  "package_description": null,
  "origin": null,
  "destination": null,
  "estimated_delivery_date": null,
  "estimated_delivery": null,
  "delivered_at": null,
  "recipient": null,
  "events": [
    {
      "timestamp": "2026-06-12T15:10:00Z",
      "status": "collected",
      "description": "Objeto coletado",
      "location": {
        "country": "BR",
        "state": "SP",
        "city": "Franca",
        "facility": "Unidade de Distribuição",
        "street": "Rua Voluntários da Franca",
        "number": "1500",
        "neighborhood": "Centro"
      },
      "destination": null,
      "courier_status_code": "CO",
      "courier_status_label": "Objeto coletado",
      "detail": null,
      "comment": null
    },
    {
      "timestamp": "2026-07-15T13:54:00Z",
      "status": "collected",
      "description": "Objeto coletado",
      "location": { "country": "BR", "state": "SP", "city": "Sao Paulo", "facility": "Unidade de Distribuição" },
      "destination": null,
      "courier_status_code": "CO",
      "courier_status_label": "Objeto coletado",
      "detail": null,
      "comment": null
    }
  ]
}
Campo Tipo Descrição
tracking_code string O código consultado
courier string Slug da transportadora que respondeu
status string Status normalizado atual — veja Status normalizados
status_updated_at string | null Timestamp do evento mais recente
service string | null Categoria do serviço informada pela transportadora
package_description string | null Nome ou título do produto postal, quando informado; pode diferir da categoria em service
origin, destination objeto | null country, state, city, name
estimated_delivery_date string | null Obsoleto: primeiro dia da janela de entrega, YYYY-MM-DD; mantido para compatibilidade. Use estimated_delivery
estimated_delivery objeto | null Janela de entrega informada pela transportadora: type (fixed ou range), from_date e to_date, ambos YYYY-MM-DD
delivered_at string | null Momento da entrega
recipient objeto | null name, signed_by
events array Histórico, do mais antigo para o mais recente

Quando estimated_delivery.type é range, apresente o intervalo entre from_date e to_date. A data antiga estimated_delivery_date contém apenas o primeiro dia e não indica uma data firme de entrega. Quando type é fixed, as duas datas coincidem. Todos os campos de previsão podem ser null quando a transportadora não informa uma estimativa.

Por exemplo, uma previsão entre 26 de setembro e 7 de outubro aparece assim:

{
  "estimated_delivery": {
    "type": "range",
    "from_date": "2026-09-26",
    "to_date": "2026-10-07"
  }
}

Campos de evento:

Campo Tipo Descrição
timestamp string RFC 3339 em UTC (Z)
status string Status normalizado do evento
description string Descrição legível do evento, que pode ser ajustada a partir dos dados da transportadora; não use como identificador estável
location objeto | null country, state, city, facility; pode incluir street, number, neighborhood, complement e postal_code quando a transportadora informa o endereço da unidade do evento
destination objeto | null Destino informado para o evento pela transportadora, no mesmo formato de location; opcional quando ausente no payload de origem
courier_status_code string | null Código bruto da transportadora. Instável
courier_status_label string | null Rótulo bruto da transportadora. Instável
detail, comment string | null Informações complementares

Descrições e informações complementares podem mudar quando corrigimos a interpretação dos dados da transportadora. Use status para decisões sobre a situação do objeto.

Todos os timestamps são UTC. Objetos ausentes vêm como null, nunca como objetos vazios; strings vazias também viram null. Durante a atualização dos serviços, destination pode estar ausente em respostas da versão anterior. Os campos adicionais de endereço em location são omitidos quando a unidade do evento não fornece um logradouro ou o campo correspondente está vazio.

Atribuição no plano Básico

Respostas normalizadas de usuários no plano Básico começam com um evento sintético um segundo anterior ao primeiro evento real:

{
  "timestamp": "2026-02-24T18:51:28Z",
  "status": "unknown",
  "description": "Rastreio fornecido por PacoteVicio.dev",
  "location": null,
  "destination": null,
  "courier_status_code": null,
  "courier_status_label": null,
  "detail": null,
  "comment": null
}

Esse evento não veio da transportadora e não altera status nem status_updated_at, que continuam representando o evento real mais recente. Ele também aparece quando créditos extras financiam a chamada de um usuário Básico. Planos pagos e respostas /raw não recebem a atribuição.

Atribuição obrigatória: é proibido remover, ocultar, alterar ou substituir esse evento ao exibir ou redistribuir dados de rastreamento obtidos com o plano Básico. O descumprimento pode resultar na suspensão ou no encerramento da conta e de suas chaves de API.

Código sem informação

Nas rotas normalizadas, se a transportadora não encontra o código, a resposta é 404 tracking_not_found — e é cobrada, porque a consulta foi feita. Nas rotas /raw, a transportadora pode informar a ausência no próprio payload; veja abaixo.

Resposta crua (/raw)

As rotas /raw devolvem o payload exato da transportadora, sem normalização. Use quando você já processa o formato original — por exemplo, ao migrar de uma integração direta.

Três avisos:

  1. Sem garantia de compatibilidade. Transportadoras mudam esses payloads sem avisar, e nós repassamos a mudança.
  2. O formato varia por transportadora. Confira o header X-Courier antes de interpretar o corpo.
  3. O payload bruto pode conter um erro da transportadora. Nesse caso a resposta pode ser 200 com o erro no formato original, sem o envelope da PacoteVício. Por exemplo, Correios pode responder {"erro":true,"mensagem":"..."} quando não encontra o código. A consulta continua cobrada. Erros gerados pelo gateway, como chave inválida ou limite atingido, usam o envelope de Códigos de erro.
curl https://api.pacotevicio.dev/v1/track/correios/BR123456789BR/raw \
  -H "X-API-Key: pv1_..."
{
  "codObjeto": "BR123456789BR",
  "tipoPostal": { "sigla": "BR", "descricao": "ETIQUETA FIS REGIST URG", "categoria": "REGISTRADO CONVENCIONAL", "tipo": "N" },
  "dtPrevista": "",
  "eventos": [
    {
      "codigo": "CO",
      "tipo": "01",
      "dtHrCriado": { "date": "2026-07-15 10:54:00.000000", "timezone_type": 3, "timezone": "America/Sao_Paulo" },
      "descricao": "Objeto coletado",
      "unidade": { "codSro": "01327970", "tipo": "Unidade de Distribuição", "endereco": { "cidade": "Sao Paulo", "uf": "SP" } },
      "descricaoFrontEnd": "Objeto coletado",
      "finalizador": "N"
    }
  ],
  "situacao": "T"
}

O exemplo acima é ilustrativo e parcial: o payload real dos Correios traz vários outros campos, e outras transportadoras têm estruturas completamente diferentes.

Detecção automática

Sem courier na rota, a transportadora é identificada pelo formato do código. Se nenhuma transportadora suportada corresponder, a resposta é 422 courier_not_detected, que não é cobrada — nenhuma consulta foi feita.

Alguns formatos são ambíguos entre transportadoras. Quando isso acontece, consultamos as candidatas em sequência, o que aumenta o tempo de resposta. Se você já sabe a transportadora, force-a na rota: é mais rápido e determinístico.