Documentação da API
A API pública é REST + JSON. Autenticação por header X-API-Key.
1. Como obter uma API key
- Acesse o painel em /auth e faça login.
- Vá em Lojas → Nova loja.
- Copie a API key e o webhook secret. Ambos são exibidos apenas uma vez.
2. Criar / atualizar pedido
POST /api/public/orders — upsert por external_order_id.
curl -X POST https://SEU_DOMINIO/api/public/orders \
-H "X-API-Key: sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"external_order_id": "PED-123",
"customer": {
"name": "Maria Silva",
"email": "maria@ex.com",
"phone": "+5511999999999"
},
"tracking_code": "BR123456789BR",
"carrier": "correios",
"status": "posted",
"meta": { "peso": 1.2 }
}'Status aceitos: pending, posted, in_transit, out_for_delivery, delivered, exception, returned, cancelled.
3. Atualizar status de um pedido
PATCH /api/public/orders/:external_order_id
curl -X PATCH https://SEU_DOMINIO/api/public/orders/PED-123 \
-H "X-API-Key: sk_live_..." \
-H "Content-Type: application/json" \
-d '{ "status": "delivered" }'Ao mudar de status, o sistema (1) grava um evento na timeline, (2) dispara notificações para os canais com template ativo, e (3) envia webhook assinado para a URL configurada da loja.
4. Consultar pedido
curl https://SEU_DOMINIO/api/public/orders/PED-123 \ -H "X-API-Key: sk_live_..."
5. Webhooks de saída
Quando o status muda, enviamos um POST para o webhook_url configurado da loja. O corpo é assinado com HMAC-SHA256 do body usando o webhook_secret, no header X-Signature.
POST https://sua-loja.com/hooks/rastreia
Content-Type: application/json
X-Signature: <hex>
X-Webhook-Event: order.status_changed
{
"event": "order.status_changed",
"order_id": "PED-123",
"status": "delivered",
"previous_status": "out_for_delivery",
"tracking_code": "BR123",
"carrier": "correios",
"occurred_at": "2026-07-04T12:34:56.000Z"
}Verificação em Node/TS:
import { createHmac, timingSafeEqual } from "crypto";
function verify(secret: string, rawBody: string, signature: string) {
const expected = createHmac("sha256", secret).update(rawBody).digest("hex");
const a = Buffer.from(signature);
const b = Buffer.from(expected);
return a.length === b.length && timingSafeEqual(a, b);
}Tentamos entrega 3 vezes com backoff (0s / 800ms / 2.4s). Retorne HTTP 2xx para confirmar.
6. Exemplo Node/TS pronto para colar
// Envie o pedido a partir da sua loja em TanStack Start:
export async function notifyRastreia(order: {
externalId: string; email: string; name: string;
status: string; tracking?: string; carrier?: string;
}) {
const res = await fetch("https://SEU_DOMINIO/api/public/orders", {
method: "POST",
headers: {
"X-API-Key": process.env.RASTREIA_API_KEY!,
"Content-Type": "application/json",
},
body: JSON.stringify({
external_order_id: order.externalId,
customer: { name: order.name, email: order.email },
tracking_code: order.tracking,
carrier: order.carrier,
status: order.status,
}),
});
if (!res.ok) throw new Error(`Rastreia: ${res.status}`);
return res.json();
}7. Erros
- 401 — API key ausente ou inválida.
- 404 — Pedido não encontrado (GET/PATCH).
- 422 — Validação falhou (veja
issuesna resposta). - 500 — Erro interno.