Harbor Quartz

Desenvolvedores

Documentação da API

API REST em JSON para criar rastreios, registrar pedidos e receber eventos por webhook. Base URL:

https://api.meurastreiio.com/v1

Introdução

Todas as rotas em /v1 exigem uma API key. Corpo e resposta são sempre application/json, datas em ISO 8601 (UTC) e valores monetários em centavos.

Contrato estável: /v1/trackings, /v1/orders e /v1/webhooks. Mudanças incompatíveis serão publicadas como nova versão.

Autenticação

Gere uma chave em Painel → Desenvolvedor → API keys. A chave é exibida uma única vez e começa com mr_live_. Envie no header Authorization:

Exemplobash
curl https://api.meurastreiio.com/v1/me \
  -H "Authorization: Bearer mr_live_SUA_CHAVE"

Cada chave possui escopos: trackings:read, trackings:write, orders:read, orders:write, webhooks:manage. Uma chamada fora do escopo retorna 403 forbidden.

GET/v1/me
Retorna a organização, o prefixo da chave, seus escopos e os limites do plano (rateLimitPerMin, batchLimit).

Rastreios

POST/v1/trackingsescopo: trackings:write

Cria um rastreio. Dois modos: gerar o código (omita trackingCode — a plataforma emite o código, monta a linha do tempo e cobra o valor por rastreio do seu plano) ou acompanhar um código existente da transportadora (informe trackingCode). Em ambos, a plataforma dispara notificações/webhooks a cada mudança.

  • trackingCode string
    Opcional. 8 a 30 caracteres alfanuméricos (normalizado para maiúsculas). Omita para a plataforma gerar o código e devolvê-lo na resposta.
  • durationDays int 1–20
    Prazo do rastreio gerado (padrão 10 dias). Ignorado quando trackingCode é informado.
  • carrier enum
    `correios` (padrão), `jadlog`, `loggi`, `total_express`, `azul_cargo`, `other`.
  • orderId uuid
    ID de um pedido já criado em /v1/orders.
  • externalOrderId string ≤60
    Seu identificador do pedido (ex.: número na loja).
  • customerName string ≤120
    Nome do destinatário (o primeiro nome aparece na página pública).
  • customerEmail email
    Recebe as notificações automáticas, se ativadas.
  • customerPhone string
    Somente dígitos com DDI opcional, 10–14 dígitos (ex.: 5511999998888).
  • metadata object
    Chave/valor livre, devolvido nas respostas e webhooks.
curl -X POST https://api.meurastreiio.com/v1/trackings \
  -H "Authorization: Bearer mr_live_SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "externalOrderId": "PED-1042",
    "durationDays": 10,
    "customerName": "Maria Silva",
    "customerEmail": "maria@exemplo.com",
    "metadata": { "canal": "loja-virtual" }
  }'
201 Createdjson
{
  "id": "5b1c…",
  "trackingCode": "AA123456789BR",
  "carrier": "correios",
  "status": "pending",
  "statusDescription": null,
  "orderId": null,
  "customer": { "name": "Maria Silva", "email": "maria@exemplo.com", "phone": null },
  "postedAt": null,
  "deliveredAt": null,
  "lastEventAt": null,
  "metadata": { "canal": "loja-virtual" },
  "createdAt": "2026-09-18T20:00:00.000Z",
  "updatedAt": "2026-09-18T20:00:00.000Z"
}
POST/v1/trackings/batchescopo: trackings:write

Cadastra vários códigos de uma vez. Corpo: { "trackings": [ …mesmos campos do POST /v1/trackings ] } (1 a 1000 itens, limitado pelo batchLimit do seu plano — excedeu, retorna 403).

Resposta: { "results": [ { "trackingCode", "ok": true, "id" } | { "trackingCode", "ok": false, "error" } ] } — itens com erro não interrompem o lote.

GET/v1/trackingsescopo: trackings:read

Lista paginada. Query: page (≥1), limit (1–100, padrão 20), status, carrier, from/to (ISO, filtra por createdAt).

curl "https://api.meurastreiio.com/v1/trackings?status=in_transit&limit=50" \
  -H "Authorization: Bearer mr_live_SUA_CHAVE"
GET/v1/trackings/:idescopo: trackings:read

Detalhe com histórico. Aceita o id interno ou o próprio código de rastreio. Inclui events[] com status, description, location, occurredAt.

Status possíveis: pending, posted, in_transit, out_for_delivery, delivered, exception, returned, cancelled, not_found.

DELETE/v1/trackings/:idescopo: trackings:write
Cancela o rastreio (status cancelled) e interrompe as consultas à transportadora. Retorna { "ok": true }.

Pedidos

Pedidos agrupam dados do cliente e permitem criar o rastreio junto, numa única chamada.

POST/v1/ordersescopo: orders:write
  • externalId string ≤60
    Seu ID do pedido.
  • customerName / customerEmail / customerPhone string
    Dados do comprador.
  • customerDocument string ≤20
    CPF/CNPJ (opcional).
  • totalCents int
    Total do pedido em centavos.
  • source string ≤40
    Origem (ex.: shopify, nuvemshop).
  • shippingAddress object
    Endereço livre (chave/valor).
  • items object[]
    Itens do pedido (livre).
  • trackingCode + carrier string
    Se informados, o rastreio é criado e vinculado ao pedido.
curl -X POST https://api.meurastreiio.com/v1/orders \
  -H "Authorization: Bearer mr_live_SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "externalId": "PED-1042",
    "customerName": "Maria Silva",
    "customerEmail": "maria@exemplo.com",
    "totalCents": 18990,
    "source": "nuvemshop",
    "trackingCode": "AA123456789BR",
    "carrier": "correios"
  }'
GET/v1/ordersescopo: orders:read
Lista paginada (page, limit), mais recentes primeiro.

Webhooks

Receba um POST na sua URL (obrigatoriamente https://) sempre que um evento ocorrer. Eventos disponíveis:

  • tracking.created — rastreio cadastrado
  • tracking.updated — novo evento da transportadora / mudança de status
  • tracking.delivered — entrega confirmada
  • tracking.exception — ocorrência (extravio, endereço incorreto, recusa…)
  • order.created — pedido criado
POST/v1/webhooksescopo: webhooks:manage

Corpo: { "name"?: string, "url": "https://…", "events": ["tracking.updated", …] }. A resposta traz o secret (whsec_…) uma única vez — guarde-o para validar assinaturas.

curl -X POST https://api.meurastreiio.com/v1/webhooks \
  -H "Authorization: Bearer mr_live_SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://minhaloja.com.br/hooks/hq", "events": ["tracking.updated", "tracking.delivered"] }'
GET/v1/webhooksescopo: webhooks:manage
Lista os endpoints (id, url, events, status).
PATCH/v1/webhooks/:idescopo: webhooks:manage
Atualiza url, events, name ou status (active | paused).
DELETE/v1/webhooks/:idescopo: webhooks:manage
Remove o endpoint.

Headers da entrega

  • x-hq-event — nome do evento (ex.: tracking.delivered)
  • x-hq-delivery — ID único da entrega (use para idempotência)
  • x-hq-signaturesha256=<hex>, HMAC-SHA256 do corpo bruto usando o secret do endpoint

Validando a assinatura

Node.jsjs
import { createHmac, timingSafeEqual } from "node:crypto";

export function verify(rawBody, signatureHeader, secret) {
  const expected = "sha256=" + createHmac("sha256", secret).update(rawBody).digest("hex");
  const a = Buffer.from(expected), b = Buffer.from(signatureHeader ?? "");
  return a.length === b.length && timingSafeEqual(a, b);
}

Responda 2xx em até alguns segundos. Outras respostas ou timeout geram novas tentativas com intervalo crescente; após falhas repetidas o endpoint pode ser pausado.

Erros

Toda resposta de erro tem o mesmo formato:

{
  "error": {
    "code": "validation_error",
    "message": "Dados inválidos",
    "details": [{ "path": "trackingCode", "message": "código de rastreio inválido" }],
    "requestId": "req-1a2b3c"
  }
}
HTTPcodeQuando
400bad_requestRequisição malformada.
401unauthorizedAPI key ausente ou inválida.
402insufficient_balanceFranquia esgotada e sem créditos.
403forbiddenEscopo insuficiente, recurso não incluso no plano ou lote acima do limite.
404not_foundRecurso inexistente ou de outra organização.
409conflictDuplicidade (ex.: código já cadastrado).
422validation_errorCampos inválidos — veja details[].
429rate_limitedLimite de requisições excedido.
500internal_errorFalha interna — informe o requestId ao suporte.

Rate limit

O limite é por API key e depende do plano (ex.: Gratuito 30 req/min, Starter 120, Pro 600, Scale 3000). O valor vigente vem no header x-ratelimit-plan de cada resposta e em GET /v1/me. Ao exceder, você recebe 429 rate_limited — aguarde e use backoff exponencial.

Endpoints públicos (sem autenticação)

Usados pela página de rastreio e pelo site. Limitados por IP.

GET/public/track?code=…&org=…
Consulta um rastreio pelo código (opcionalmente restrito ao slug da loja). Limite de 60 req/min por IP. Retorna trackingCode, carrier, status, statusDescription, datas e events[].
GET/public/brand?org=… | ?host=…
Branding da página de rastreio (nome, logo, cores, contatos) por slug ou domínio verificado.
GET/public/plans
Planos e pacotes de créditos ativos.

Pronto para integrar?

Crie sua conta, gere uma API key e faça a primeira chamada em minutos.