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/v1Introduçã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:
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.
/v1/merateLimitPerMin, batchLimit).Rastreios
/v1/trackingsescopo: trackings:writeCria 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.
trackingCodestringOpcional. 8 a 30 caracteres alfanuméricos (normalizado para maiúsculas). Omita para a plataforma gerar o código e devolvê-lo na resposta.durationDaysint 1–20Prazo do rastreio gerado (padrão 10 dias). Ignorado quandotrackingCodeé informado.carrierenum`correios` (padrão), `jadlog`, `loggi`, `total_express`, `azul_cargo`, `other`.orderIduuidID de um pedido já criado em/v1/orders.externalOrderIdstring ≤60Seu identificador do pedido (ex.: número na loja).customerNamestring ≤120Nome do destinatário (o primeiro nome aparece na página pública).customerEmailemailRecebe as notificações automáticas, se ativadas.customerPhonestringSomente dígitos com DDI opcional, 10–14 dígitos (ex.:5511999998888).metadataobjectChave/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" }
}'{
"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"
}/v1/trackings/batchescopo: trackings:writeCadastra 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.
/v1/trackingsescopo: trackings:readLista 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"/v1/trackings/:idescopo: trackings:readDetalhe 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.
/v1/trackings/:idescopo: trackings:writecancelled) e interrompe as consultas à transportadora. Retorna { "ok": true }.Pedidos
Pedidos agrupam dados do cliente e permitem criar o rastreio junto, numa única chamada.
/v1/ordersescopo: orders:writeexternalIdstring ≤60Seu ID do pedido.customerName / customerEmail / customerPhonestringDados do comprador.customerDocumentstring ≤20CPF/CNPJ (opcional).totalCentsintTotal do pedido em centavos.sourcestring ≤40Origem (ex.:shopify,nuvemshop).shippingAddressobjectEndereço livre (chave/valor).itemsobject[]Itens do pedido (livre).trackingCode + carrierstringSe 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"
}'/v1/ordersescopo: orders:readpage, limit), mais recentes primeiro.Webhooks
Receba um POST na sua URL (obrigatoriamente https://) sempre que um evento ocorrer. Eventos disponíveis:
tracking.created— rastreio cadastradotracking.updated— novo evento da transportadora / mudança de statustracking.delivered— entrega confirmadatracking.exception— ocorrência (extravio, endereço incorreto, recusa…)order.created— pedido criado
/v1/webhooksescopo: webhooks:manageCorpo: { "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"] }'/v1/webhooksescopo: webhooks:manageid, url, events, status)./v1/webhooks/:idescopo: webhooks:manageurl, events, name ou status (active | paused)./v1/webhooks/:idescopo: webhooks:manageHeaders da entrega
x-hq-event— nome do evento (ex.:tracking.delivered)x-hq-delivery— ID único da entrega (use para idempotência)x-hq-signature—sha256=<hex>, HMAC-SHA256 do corpo bruto usando osecretdo endpoint
Validando a assinatura
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"
}
}| HTTP | code | Quando |
|---|---|---|
| 400 | bad_request | Requisição malformada. |
| 401 | unauthorized | API key ausente ou inválida. |
| 402 | insufficient_balance | Franquia esgotada e sem créditos. |
| 403 | forbidden | Escopo insuficiente, recurso não incluso no plano ou lote acima do limite. |
| 404 | not_found | Recurso inexistente ou de outra organização. |
| 409 | conflict | Duplicidade (ex.: código já cadastrado). |
| 422 | validation_error | Campos inválidos — veja details[]. |
| 429 | rate_limited | Limite de requisições excedido. |
| 500 | internal_error | Falha 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.
/public/track?code=…&org=…trackingCode, carrier, status, statusDescription, datas e events[]./public/brand?org=… | ?host=…/public/plansPronto para integrar?
Crie sua conta, gere uma API key e faça a primeira chamada em minutos.