Visão geral
A API de BI entrega os dados de uma filial para ferramentas como Power BI, Looker, Metabase, planilhas, ETLs e data lakes. Ela é somente leitura: todas as rotas são GET e nada que você chame altera a operação.
- Cada recurso (pedidos, romaneios, CT-e…) é uma lista paginada por data de alteração.
- Você busca o que mudou num intervalo de tempo e grava no seu banco. Na próxima execução, busca só o que mudou depois.
- Os limites de uso protegem a operação: o BI nunca deixa o sistema lento para quem está trabalhando nele.
- Opcionalmente, o Meu Rastreio envia todo dia um arquivo Parquet por recurso, por FTP ou e-mail.
Ativação
A API de BI é ativada pela equipe do Meu Rastreio. O caminho é:
- Preencha o formulário de solicitação com a filial, os recursos que o BI precisa e os IPs fixos de onde as chamadas vão sair. Ele abre um chamado direto para a nossa equipe.
- A equipe instala a extensão na filial, libera os recursos e os IPs e gera o token.
- Você recebe o token (ele é mostrado uma única vez) e já pode fazer a primeira chamada.
Autenticação
Envie o token no cabeçalho Authorization, no formato Bearer. O cabeçalho x-api-token também é aceito.
Authorization: Bearer mrbi_6b3f0c2e-...-9d1a_4f7c...e21b- O token tem o formato
mrbi_<identificador da instalação>_<segredo>. Guarde-o como senha: em cofre de segredos, nunca no código nem em planilha compartilhada. - Gerar um token novo invalida o anterior na hora. Revogar faz todas as chamadas responderem 401.
- Além do token, o IP de origem precisa estar na lista liberada (IP único ou faixa CIDR, IPv4 ou IPv6). Token certo com IP fora da lista responde 403
IP_NOT_ALLOWED. - Só HTTPS. Nunca envie o token na URL.
- Muitos tokens inválidos seguidos do mesmo IP (20 em 10 minutos) bloqueiam esse IP por 1 hora.
Primeira chamada
A raiz da API confirma que o token funciona e mostra o que está liberado para ele: recursos, limites e quanto resta da cota do dia.
curl -s "https://painel.meurastreio.app/api/bi/v1" \
-H "Authorization: Bearer mrbi_SEU_TOKEN"{
"subsidiary_id": 12,
"time_zone": "America/Sao_Paulo",
"resources": ["orders", "order-movements", "shipments"],
"limits": {
"max_concurrency": 1,
"burst": 10,
"per_minute": 20,
"per_day": 2000,
"max_per_page": 200,
"max_window_days": 31
},
"remaining_today": 1987
}Depois, peça um recurso. Exemplo: pedidos alterados no dia 3 de novembro, no horário de Brasília.
curl -s "https://painel.meurastreio.app/api/bi/v1/orders?updated_from=2026-11-03T00:00:00-03:00&updated_to=2026-11-04T00:00:00-03:00&per_page=100" \
-H "Authorization: Bearer mrbi_SEU_TOKEN"{
"data": [
{
"id": 481203,
"external_reference": "6f1c2a7e-1d1b-4d55-9a1e-2b7f0c9d4e11",
"order_number": "PV-102938",
"service_status": "FINISHED",
"is_canceled": false,
"total_price": 1849.9,
"total_price_currency": "BRL",
"total_freight": 42.5,
"sold_at": "2026-11-02T13:10:00.000Z",
"deadline_at": "2026-11-04T02:59:59.999Z",
"finished_at": "2026-11-03T17:42:11.000Z",
"customer": { "id": 9921, "name": "Mercado Bom Preço", "cpf_cnpj": "12345678000190" },
"destination": { "city": "Serra", "state": "ES", "zipcode": "29160000", "ibge": "3205002", "neighborhood": "Centro" },
"carrier": null,
"route": { "id": 14, "name": "Serra Norte" },
"invoices": [{ "type": "NFE", "number": 58812, "serie": 1, "key": "3226...", "value": 1849.9, "currency": "BRL", "issued_at": "2026-11-02T13:00:00.000Z" }],
"created_at": "2026-11-02T13:10:04.000Z",
"updated_at": "2026-11-03T17:42:12.000Z"
}
],
"pagination": {
"per_page": 100,
"has_more": true,
"next_cursor": "eyJmIjoiMjAyNi0xMS0wM1QwMzowMDowMC4wMDBaIi..."
},
"window": {
"updated_from": "2026-11-03T03:00:00.000Z",
"updated_to": "2026-11-04T03:00:00.000Z"
}
}Recursos e campos
Cada recurso é liberado individualmente na instalação. Os que dependem de um módulo também exigem esse módulo no plano da empresa. Abra cada um para ver todos os campos.
| caminho | recurso | módulo do plano |
|---|---|---|
/orders | Pedidos Pedidos da filial, com status, prazos, valores, frete, cliente, destino e notas fiscais. | — |
/order-movements | Movimentações dos pedidos Cada evento de status do pedido (coleta, rota, entrega, ocorrência), com localização e comprovante. | — |
/shipments | Romaneios Romaneios da filial, com motorista, veículo, distância, KM, frete e a sequência dos pedidos. | — |
/shipment-movements | Movimentações dos romaneios Eventos do romaneio registrados pelo motorista ou pela operação. | — |
/shipment-closings | Fechamentos Fechamentos de frete dos romaneios. | Fechamento de frete |
/carrier-invoices | Faturas de frete Faturas das transportadoras, com conferência, divergências e os CT-e cobrados. | Fechamento de frete |
/nfses | NFS-e Notas fiscais de serviço da filial. | NFS-e |
/ctes | CT-e Conhecimentos de transporte da filial, com valores, origem, destino e eventos. | Documentos fiscais |
/mdfes | MDF-e Manifestos da filial, com carga, UFs e o romaneio ligado. | Documentos fiscais |
/ciots | CIOT Operações de transporte declaradas, com frete, rotas, pedágios e histórico. | CIOT |
/checkouts | Checkouts Cobranças geradas para pedidos (PIX, cartão), com pagamento e taxas. | Checkouts |
Pedidos /orders
| campo | tipo | descrição |
|---|---|---|
id | integer | Identificador do pedido. |
external_reference | string | UUID público do pedido. |
order_number | string | Número do pedido. |
parent_order_number | string | Número do pedido pai (pedidos desmembrados). |
shop | object | Loja: id e name. |
service_status | string | Status de atendimento. |
finished_status | string | Situação de prazo da entrega. |
expedition_status | string | Situação de prazo da expedição. |
delivery_status | string | Situação de prazo da entrega pela filial. |
is_canceled | boolean | Pedido cancelado. |
has_occurrence | boolean | Teve ocorrência. |
has_sinister | boolean | Teve sinistro. |
has_reverse | boolean | Teve logística reversa. |
has_missing_items | boolean | Teve falta de itens. |
freight_type | string | Tipo de frete. |
need_to_be_collected | boolean | Precisa de coleta. |
total_weight | number | Peso total. |
total_price | number | Valor total. |
total_price_currency | string | Moeda do valor total. |
total_volumes | integer | Volumes. |
total_freight | number | Frete do pedido. |
total_freight_currency | string | Moeda do frete. |
total_freight_by_system | number | Frete calculado pelo sistema. |
total_freight_by_carrier | number | Frete cobrado pela transportadora. |
total_freight_paid | number | Frete pago. |
total_freight_manual | number | Frete informado manualmente. |
sold_at | datetime | Data da venda. |
requested_delivery_date | datetime | Data de entrega pedida. |
collected_at | datetime | Coleta. |
in_transfer_at | datetime | Entrada em transferência. |
in_route_at | datetime | Saída para rota. |
expedited_at | datetime | Expedição concluída. |
expedition_at | datetime | Data de expedição. |
finished_at | datetime | Finalização (entrega ou devolução). |
deadline_days | integer | Prazo em dias. |
deadline_at | datetime | Prazo de entrega. |
expedition_deadline_at | datetime | Prazo de expedição. |
delivery_deadline_at | datetime | Prazo de entrega da filial. |
is_within_cutoff_time | boolean | Entrou dentro do horário de corte. |
observation | string | Observação. |
current_subsidiary_id | integer | Filial onde o pedido está agora (transferências). O pedido sempre pertence à filial de origem. |
customer | object | Cliente: id, name, cpf_cnpj. |
destination | object | Destino: city, state, zipcode, ibge, neighborhood. |
carrier | object | Transportadora: id e name. |
route | object | Rota: id e name. |
invoices | array | Notas fiscais: type, number, serie, key, value, currency, issued_at. |
created_at | datetime | Quando o registro foi criado. |
updated_at | datetime | Última alteração. É o campo usado na paginação e no incremental. |
Movimentações dos pedidos /order-movements
| campo | tipo | descrição |
|---|---|---|
id | integer | Identificador da movimentação. |
order_id | integer | Pedido (id em orders). |
order_number | string | Número do pedido. |
order_external_reference | string | UUID público do pedido. |
code | integer | Código do evento. |
description | string | Descrição do evento. |
sub_description | string | Detalhe do evento. |
is_partial | boolean | Entrega parcial. |
observation | string | Observação. |
file_url | string | Comprovante (foto ou arquivo). |
latitude | number | Latitude. |
longitude | number | Longitude. |
temperature | number | Temperatura registrada. |
date | datetime | Quando o evento aconteceu. |
user_id | integer | Usuário que registrou. |
shipment_order_id | integer | Vínculo do pedido com o romaneio. |
created_at | datetime | Quando o registro foi criado. |
updated_at | datetime | Última alteração. É o campo usado na paginação e no incremental. |
Romaneios /shipments
| campo | tipo | descrição |
|---|---|---|
id | integer | Identificador do romaneio. |
external_reference | string | Referência externa. |
trip_number | integer | Número da viagem. |
date | datetime | Data do romaneio. |
status | string | Status do romaneio. |
driver | object | Motorista: id e name. |
driver_support | object | Ajudante: id e name. |
vehicle | object | Veículo: id e plate. |
distance_in_meters | integer | Distância planejada. |
duration_in_seconds | integer | Duração planejada. |
start_km | integer | KM inicial. |
end_km | integer | KM final. |
total_orders | integer | Pedidos no romaneio. |
total_success | integer | Entregues. |
total_errors | integer | Com problema. |
predicted_freight | number | Frete previsto. |
predicted_freight_currency | string | Moeda do frete previsto. |
paid_freight | number | Frete pago. |
paid_freight_currency | string | Moeda do frete pago. |
paid_freight_at | datetime | Pagamento do frete. |
shipment_closing_id | integer | Fechamento (id em shipment-closings). |
transfered_to_id | integer | Romaneio para onde foi transferido. |
started_at | datetime | Início. |
finished_at | datetime | Fim. |
observation | string | Observação. |
orders | array | Pedidos do romaneio: order_id, sequence, type, status, arrived_at, departed_at, delivery_prevision, predicted_freight, manual_freight. |
created_at | datetime | Quando o registro foi criado. |
updated_at | datetime | Última alteração. É o campo usado na paginação e no incremental. |
Movimentações dos romaneios /shipment-movements
| campo | tipo | descrição |
|---|---|---|
id | integer | Identificador da movimentação. |
shipment_id | integer | Romaneio (id em shipments). |
description | string | Descrição do evento. |
observation | string | Observação. |
file_url | string | Arquivo anexado. |
latitude | number | Latitude. |
longitude | number | Longitude. |
user_id | integer | Usuário que registrou. |
created_at | datetime | Quando o registro foi criado. |
updated_at | datetime | Última alteração. É o campo usado na paginação e no incremental. |
Fechamentos /shipment-closings
| campo | tipo | descrição |
|---|---|---|
id | integer | Identificador do fechamento. |
external_reference | string | Referência externa. |
name | string | Nome do fechamento. |
status | string | Status. |
total_shipments | integer | Romaneios no fechamento. |
total_expenses | integer | Despesas. |
total_discounts | integer | Descontos. |
total_amount | number | Valor total. |
currency | string | Moeda. |
paid_at | datetime | Pagamento. |
paid_by_user_id | integer | Quem pagou. |
canceled_at | datetime | Cancelamento. |
cancellation_reason | string | Motivo do cancelamento. |
shipment_ids | array | Romaneios do fechamento (ids em shipments). |
nfse_ids | array | NFS-e do fechamento (ids em nfses). |
created_at | datetime | Quando o registro foi criado. |
updated_at | datetime | Última alteração. É o campo usado na paginação e no incremental. |
Faturas de frete /carrier-invoices
| campo | tipo | descrição |
|---|---|---|
id | integer | Identificador da fatura. |
external_reference | string | Referência externa. |
carrier_id | integer | Transportadora. |
status | string | Status da conferência. |
number | string | Número da fatura. |
serie | string | Série. |
document_type | string | Tipo do documento. |
carrier_cnpj | string | CNPJ da transportadora. |
carrier_name | string | Nome da transportadora. |
issued_at | datetime | Emissão. |
due_at | datetime | Vencimento. |
total_value | number | Valor da fatura. |
currency | string | Moeda. |
discount_deadline_at | datetime | Prazo do desconto. |
discount_value | number | Valor do desconto. |
icms_value | number | ICMS. |
iss_value | number | ISS. |
conferred_at | datetime | Conferência. |
has_divergence | boolean | Tem divergência. |
items_total_value | number | Soma dos itens. |
expected_value | number | Valor esperado. |
cte_value | number | Valor dos CT-e. |
divergence_value | number | Divergência. |
cte_divergence_value | number | Divergência contra os CT-e. |
divergent_items_count | integer | Itens divergentes. |
unmatched_items_count | integer | Itens sem correspondência. |
reviewed_at | datetime | Revisão. |
items | array | Itens: id, cte_number, cte_serie, cte_issued_at, charged_value, currency, sender_cnpj, recipient_cnpj, issuer_cnpj, is_return. |
created_at | datetime | Quando o registro foi criado. |
updated_at | datetime | Última alteração. É o campo usado na paginação e no incremental. |
NFS-e /nfses
| campo | tipo | descrição |
|---|---|---|
id | integer | Identificador da NFS-e. |
number | string | Número. |
origin | string | Origem. |
city_hall | string | Prefeitura. |
verification_code | string | Código de verificação. |
issued_at | datetime | Emissão. |
competence | datetime | Competência. |
status | string | Status. |
services_value | number | Valor dos serviços. |
iss_value | number | ISS. |
iss_withheld | string | ISS retido. |
iss_rate | string | Alíquota. |
service_code | string | Código do serviço. |
tax_base | number | Base de cálculo. |
net_value | number | Valor líquido. |
description | string | Discriminação. |
service_location | string | Local da prestação. |
provider | object | Prestador: cnpj e name. |
taker | object | Tomador: cnpj e name. |
shipment_closing_id | integer | Fechamento ligado (id em shipment-closings). |
created_at | datetime | Quando o registro foi criado. |
updated_at | datetime | Última alteração. É o campo usado na paginação e no incremental. |
CT-e /ctes
| campo | tipo | descrição |
|---|---|---|
id | integer | Identificador do documento no Meu Rastreio. |
external_reference | string | Referência externa do documento. |
status | string | Status do documento no Meu Rastreio. |
emission_type | string | Tipo de emissão (normal ou contingência). |
serie | integer | Série. |
number | integer | Número. |
access_key | string | Chave de acesso de 44 posições. |
protocol | string | Protocolo de autorização na SEFAZ. |
c_stat | integer | Código de retorno da SEFAZ. |
status_reason | string | Motivo devolvido pela SEFAZ. |
issued_at | datetime | Emissão. |
authorized_at | datetime | Autorização. |
canceled_at | datetime | Cancelamento. |
xml_url | string | Link do XML. |
pdf_url | string | Link do PDF, quando houver. |
events | array | Eventos do documento: type, sequence, status, justification, protocol, c_stat, status_reason, registered_at, xml_url, pdf_url. |
environment | string | Ambiente (produção ou homologação). |
origin | string | Origem: emitido no Meu Rastreio, importado ou baixado da SEFAZ. |
emitter_cnpj | string | CNPJ do emitente. |
emitter_name | string | Nome do emitente. |
cfop | string | CFOP. |
taker | string | Tomador do serviço. |
origin_city | string | Cidade de origem. |
origin_state | string | UF de origem. |
origin_ibge | string | IBGE de origem. |
destination_city | string | Cidade de destino. |
destination_state | string | UF de destino. |
destination_ibge | string | IBGE de destino. |
total_service_value | number | Valor da prestação. |
receivable_value | number | Valor a receber. |
cargo_value | number | Valor da carga. |
icms_value | number | ICMS. |
total_taxes_value | number | Tributos. |
created_at | datetime | Quando o registro foi criado. |
updated_at | datetime | Última alteração. É o campo usado na paginação e no incremental. |
MDF-e /mdfes
| campo | tipo | descrição |
|---|---|---|
id | integer | Identificador do documento no Meu Rastreio. |
external_reference | string | Referência externa do documento. |
status | string | Status do documento no Meu Rastreio. |
emission_type | string | Tipo de emissão (normal ou contingência). |
serie | integer | Série. |
number | integer | Número. |
access_key | string | Chave de acesso de 44 posições. |
protocol | string | Protocolo de autorização na SEFAZ. |
c_stat | integer | Código de retorno da SEFAZ. |
status_reason | string | Motivo devolvido pela SEFAZ. |
issued_at | datetime | Emissão. |
authorized_at | datetime | Autorização. |
canceled_at | datetime | Cancelamento. |
xml_url | string | Link do XML. |
pdf_url | string | Link do PDF, quando houver. |
events | array | Eventos do documento: type, sequence, status, justification, protocol, c_stat, status_reason, registered_at, xml_url, pdf_url. |
environment | string | Ambiente (produção ou homologação). |
origin | string | Origem: emitido no Meu Rastreio, importado ou baixado da SEFAZ. |
emitter_cnpj | string | CNPJ do emitente. |
emitter_name | string | Nome do emitente. |
closed_at | datetime | Encerramento. |
origin_state | string | UF de origem. |
destination_state | string | UF de destino. |
trip_start_at | datetime | Início da viagem. |
cargo_value | number | Valor da carga. |
cargo_unit | string | Unidade da carga. |
cargo_quantity | number | Quantidade da carga. |
shipment_id | integer | Romaneio ligado (id em shipments). |
created_at | datetime | Quando o registro foi criado. |
updated_at | datetime | Última alteração. É o campo usado na paginação e no incremental. |
CIOT /ciots
| campo | tipo | descrição |
|---|---|---|
id | integer | Identificador do CIOT. |
external_reference | string | Referência externa. |
status | string | Status. |
status_reason | string | Motivo do status. |
environment | string | Ambiente. |
operation_type | string | Tipo de operação. |
ciot | string | Número do CIOT formatado. |
number | string | Número. |
verification_code | string | Código de verificação. |
transporter_cpf_cnpj | string | CPF/CNPJ do transportador. |
trip_start_at | datetime | Início da viagem. |
trip_end_at | datetime | Fim da viagem. |
declared_at | datetime | Declaração. |
canceled_at | datetime | Cancelamento. |
cancel_reason | string | Motivo do cancelamento. |
closed_at | datetime | Encerramento. |
freight_value | number | Valor do frete. |
provider | string | Provedor que emitiu. |
distance_km | number | Distância em km. |
mdfe_id | integer | MDF-e ligado (id em mdfes). |
routes | array | Rotas: id, name, toll_value, map_url, selected e tolls (name, concessionaire, highway, state, city, value). |
shipment_external_references | array | Referências externas dos romaneios. |
mdfe_external_reference | string | Referência externa do MDF-e. |
history | array | Histórico: type, source, user, integration, route_name, route_mode, at. |
created_at | datetime | Quando o registro foi criado. |
updated_at | datetime | Última alteração. É o campo usado na paginação e no incremental. |
Checkouts /checkouts
| campo | tipo | descrição |
|---|---|---|
id | integer | Identificador do checkout. |
external_reference | string | Referência externa. |
status | string | Status. |
payment_method | string | Meio de pagamento. |
provider | string | Provedor de pagamento. |
amount_in_cents | integer | Valor em centavos. |
fees_in_cents | integer | Taxas em centavos. |
currency | string | Moeda. |
installments | integer | Parcelas. |
transaction_id | string | Transação no provedor. |
nsu | string | NSU. |
authorization_code | string | Código de autorização. |
card_last4 | string | Final do cartão. |
return_code | string | Código de retorno. |
return_message | string | Mensagem de retorno. |
paid_at | datetime | Pagamento. |
expires_at | datetime | Expiração. |
created_by_user_id | integer | Quem gerou. |
order_ids | array | Pedidos cobrados (ids em orders). |
created_at | datetime | Quando o registro foi criado. |
updated_at | datetime | Última alteração. É o campo usado na paginação e no incremental. |
2026-11-03T17:42:11.000Z). Campo sem valor vem null. Novos campos podem aparecer com o tempo; o seu BI deve ignorar o que não conhece.Consulta e paginação
Toda lista devolve os registros que mudaram (campo updated_at) dentro de uma janela, do mais antigo para o mais novo.
| parâmetro | obrigatório | como usar |
|---|---|---|
updated_from | sim, sem cursor | Início da janela, em ISO 8601 com fuso: 2026-11-03T00:00:00-03:00 ou 2026-11-03T03:00:00Z. Data sem fuso é recusada. |
updated_to | não | Fim da janela, com fuso. Padrão: agora. Até 31 dias depois de updated_from. |
per_page | não | Registros por página, de 1 a 200. Padrão: 100. |
cursor | não | O next_cursor da página anterior. Com ele, as datas são ignoradas: a janela já vem dentro do cursor. |
A resposta não traz total nem número de página. Ela traz has_more, que diz se há mais registros, e next_cursor, que você devolve para buscar a próxima página:
curl -s "https://painel.meurastreio.app/api/bi/v1/orders?cursor=eyJmIjoiMjAyNi0xMS0wM1QwMzowMDowMC4wMDBaIi...&per_page=100" \
-H "Authorization: Bearer mrbi_SEU_TOKEN"- Chame com
updated_from,updated_toeper_page. - Grave os registros de
data. - Enquanto
has_morefortrue, chame de novo só comcursoreper_page. - Quando
has_moreforfalse, a janela acabou.
Fixe o updated_to no começo da leitura (por exemplo, o horário em que o job começou). Se você deixar em branco, cada consulta nova usa um "agora" diferente.
Sincronização incremental
O jeito recomendado de manter o BI em dia:
- Guarde, por recurso, o fim da última janela lida com sucesso.
- Na próxima execução, use esse valor como
updated_frome o horário atual comoupdated_to. - Grave com upsert usando
idcomo chave: o mesmo registro pode voltar em janelas seguintes sempre que for alterado. - Leia um recurso de cada vez: o token aceita uma requisição por vez.
ultima_execucao = carregar_marca("orders") # ex.: "2026-11-03T10:00:00.000Z"
agora = datetime.now(timezone.utc).isoformat()
for pedido in fetch_all("orders", ultima_execucao, agora):
upsert("pedidos", chave=pedido["id"], valores=pedido)
salvar_marca("orders", agora)Uma execução a cada 15 ou 30 minutos mantém o BI praticamente em tempo real gastando poucas dezenas de requisições por dia.
Restrições de uso
Os limites existem para que a leitura do BI nunca concorra com a operação. Estes são os valores padrão; a equipe do Meu Rastreio pode ajustá-los por instalação, e a raiz da API mostra os valores que valem para o seu token.
| limite | padrão | como funciona |
|---|---|---|
| Requisições simultâneas | 1 | Só uma requisição por token roda de cada vez. A segunda recebe 429 na hora. |
| Por minuto | 20 (rajada de 10) | Até 10 seguidas; depois, uma nova a cada 3 segundos. |
| Por dia | 2.000 | Zera à meia-noite no fuso da empresa. |
| Registros por página | 100 (padrão), até 200 | Parâmetro per_page. |
| Janela de consulta | até 31 dias | Entre updated_from e updated_to. |
| Tempo de consulta | 10 segundos | Consulta mais longa responde 503 QUERY_TIMEOUT: diminua a janela ou o per_page. |
| Bloqueio por insistência | 15 minutos | 50 respostas 429 em 5 minutos bloqueiam o token. |
| Token inválido | 1 hora | 20 tokens inválidos do mesmo IP em 10 minutos bloqueiam o IP. |
Toda resposta aceita traz o quanto ainda resta:
| cabeçalho | significado |
|---|---|
RateLimit-Limit | Requisições por minuto do token. |
RateLimit-Remaining | Quantas ainda cabem agora sem esperar. |
X-RateLimit-Daily-Limit | Cota diária. |
X-RateLimit-Daily-Remaining | Quanto resta da cota hoje. |
Retry-After | Só no 429: segundos a esperar antes de tentar de novo. |
Passou do limite, a resposta é 429 e diz quanto esperar:
HTTP/1.1 429 Too Many Requests
Retry-After: 3
RateLimit-Limit: 20
X-RateLimit-Daily-Limit: 2000
{
"code": "RATE_LIMITED",
"message": "Limite de requisições atingido (minute). Tente de novo em 3 s.",
"limit": "minute",
"retry_after": 3
}Retry-After. Quem continua chamando depois do 429 (50 vezes em 5 minutos) é bloqueado por 15 minutos. Requisições com parâmetro inválido (422) também contam na cota.Boas práticas
- Não paralelize: uma requisição de cada vez, recurso depois de recurso.
- Use
per_page=200para fazer menos chamadas. - Agende o job; não chame a cada clique de um painel.
- Use janelas curtas no incremental (horas, não semanas).
- Para volumes grandes, use a exportação em Parquet.
Erros
O corpo de erro sempre traz code, para o seu código decidir o que fazer, e message, para leitura de pessoas. Alguns erros trazem campos extras, como field, max ou retry_after.
| status | code | quando acontece |
|---|---|---|
| 401 | INVALID_TOKEN | Token ausente, inválido, revogado ou trocado. |
| 403 | IP_NOT_ALLOWED | O IP de origem não está na lista liberada da instalação. |
| 403 | IP_BLOCKED | IP bloqueado por 1 hora após muitos tokens inválidos. |
| 403 | EXTENSION_INACTIVE | A instalação da API de BI está desativada. |
| 403 | PLAN_EXPIRED | Empresa ou filial desativada. |
| 403 | PLAN_WITHOUT_EXTENSIONS | O plano não inclui extensões. |
| 403 | RESOURCE_DISABLED | O recurso não foi liberado nesta instalação. |
| 403 | RESOURCE_NOT_IN_PLAN | O plano não inclui o módulo do recurso. |
| 404 | RESOURCE_NOT_FOUND | Caminho de recurso que não existe. |
| 405 | METHOD_NOT_ALLOWED | A API só aceita GET. |
| 422 | UPDATED_FROM_REQUIRED | Faltou updated_from (sem cursor). |
| 422 | INVALID_DATE | Data fora do ISO 8601 com fuso. O campo vem em field. |
| 422 | INVALID_WINDOW | updated_to anterior a updated_from. |
| 422 | WINDOW_TOO_LARGE | Janela maior que o máximo, que vem em max. |
| 422 | INVALID_PER_PAGE | per_page fora de 1 até o máximo, que vem em max. |
| 422 | INVALID_CURSOR | Cursor alterado ou de outra consulta. |
| 429 | RATE_LIMITED | Limite atingido. limit diz qual (concurrency, minute, day, penalty) e retry_after, quanto esperar. |
| 503 | QUERY_TIMEOUT | A consulta passou de 10 segundos. |
| 503 | SERVICE_UNAVAILABLE | Instabilidade momentânea. Tente de novo em instantes. |
- 401 e 403: pare e avise uma pessoa. Insistir não resolve.
- 422: corrija os parâmetros.
- 429: espere o
Retry-Aftere continue de onde parou. - 503: diminua a janela ou o
per_page(QUERY_TIMEOUT) ou tente de novo depois de alguns segundos (SERVICE_UNAVAILABLE).
Exportação em Parquet
Além da API, a instalação pode enviar todo dia um arquivo Apache Parquet por recurso, com tudo o que mudou no dia anterior. Parquet é um formato colunar, compacto e tipado, que Power BI, Excel (Power Query), pandas, DuckDB, Spark e data lakes leem direto.
- Roda uma vez por dia, no horário combinado, com os registros alterados no dia anterior (fuso da empresa).
- Um arquivo por recurso liberado:
orders_2026-11-03.parquet,shipments_2026-11-03.parquet… Recurso sem alteração no dia não gera arquivo. - FTP: os arquivos vão para a pasta combinada, dentro de uma subpasta do dia (
/bi/2026-11-03/). - E-mail: os arquivos vão anexados, até 25 MB no total. Acima disso o e-mail chega sem anexos, e o recomendado é passar para FTP.
- Não conta no limite de requisições da API.
| dado na API | coluna no Parquet |
|---|---|
| data (updated_at, sold_at…) | TIMESTAMP, em UTC |
| número inteiro (id, total_volumes…) | INT64 |
| número decimal (total_price, total_freight…) | DOUBLE |
| verdadeiro/falso | BOOLEAN |
| texto | STRING |
| objeto ou lista (customer, invoices, orders…) | STRING com o JSON |
import json
import pandas as pd
pedidos = pd.read_parquet("orders_2026-11-03.parquet")
pedidos["customer"] = pedidos["customer"].map(lambda texto: json.loads(texto) if texto else None)
print(pedidos[["id", "order_number", "service_status", "finished_at"]].head())SELECT service_status, count(*) AS pedidos, sum(total_freight) AS frete
FROM read_parquet('exportacao/2026-11-*/orders_*.parquet')
GROUP BY service_status
ORDER BY pedidos DESC;No Power BI, use Obter dados > Pasta apontando para a pasta do FTP sincronizada, e combine os arquivos do mesmo recurso. Como no incremental pela API, trate id como chave: o mesmo registro aparece de novo no arquivo de cada dia em que for alterado.
Carga histórica
A API foi feita para o incremental. Para trazer meses ou anos de histórico na primeira carga, o Meu Rastreio gera os arquivos Parquet do passado e envia pelo mesmo destino da exportação diária. Depois, siga pela API.
- Peça no formulário de acesso ou ao suporte, informando desde quando precisa do histórico.
- Escolha o tamanho de cada arquivo: um por mês, por semana ou por dia. Mês é o mais prático para anos de histórico; dia, para manter o mesmo formato da exportação diária.
- A geração roda em segundo plano, um período de um recurso por vez, sem pesar na operação. Nossa equipe acompanha o progresso e avisa quando terminar.
| arquivo por | nome do arquivo | pasta no FTP |
|---|---|---|
| mês | orders_2026-03.parquet | historico/2026-03/ |
| semana (ISO) | orders_2026-W10.parquet | historico/2026-W10/ |
| dia | orders_2026-03-05.parquet | historico/2026-03-05/ |
- Cada registro entra no período da sua última alteração (
updated_at), como na API. Somando todos os arquivos, nenhum registro se repete; um pedido de 2024 alterado ontem aparece no período de ontem. - A carga vai até o dia anterior. Dali em diante valem a exportação diária e a API.
- Por e-mail, chega um e-mail por arquivo, com o mesmo limite de 25 MB. Para anos de histórico, prefira FTP.
- As colunas e os tipos são os mesmos da exportação diária.
- Para algo pontual, os relatórios em Excel do painel continuam disponíveis: pedidos e romaneios podem ser exportados por período direto no Meu Rastreio.
Exemplos completos
Leitura de um recurso inteiro dentro de uma janela, respeitando o 429.
import time
import requests
BASE_URL = "https://painel.meurastreio.app/api/bi/v1"
TOKEN = "mrbi_SEU_TOKEN"
def fetch_all(resource, updated_from, updated_to):
session = requests.Session()
session.headers["Authorization"] = f"Bearer {TOKEN}"
params = {"updated_from": updated_from, "updated_to": updated_to, "per_page": 200}
while True:
response = session.get(f"{BASE_URL}/{resource}", params=params, timeout=60)
if response.status_code == 429:
time.sleep(int(response.headers.get("Retry-After", "5")))
continue
response.raise_for_status()
body = response.json()
yield from body["data"]
if not body["pagination"]["has_more"]:
return
params = {"cursor": body["pagination"]["next_cursor"], "per_page": 200}
for order in fetch_all("orders", "2026-11-03T00:00:00-03:00", "2026-11-04T00:00:00-03:00"):
print(order["id"], order["updated_at"])const BASE_URL = "https://painel.meurastreio.app/api/bi/v1";
const TOKEN = "mrbi_SEU_TOKEN";
const wait = (seconds) => new Promise((resolve) => setTimeout(resolve, seconds * 1000));
async function* fetchAll(resource, updatedFrom, updatedTo) {
let params = new URLSearchParams({ updated_from: updatedFrom, updated_to: updatedTo, per_page: "200" });
while (true) {
const response = await fetch(`${BASE_URL}/${resource}?${params}`, {
headers: { Authorization: `Bearer ${TOKEN}` },
});
if (response.status === 429) {
await wait(Number(response.headers.get("Retry-After") ?? 5));
continue;
}
if (!response.ok) throw new Error(`${response.status} ${await response.text()}`);
const body = await response.json();
yield* body.data;
if (!body.pagination.has_more) return;
params = new URLSearchParams({ cursor: body.pagination.next_cursor, per_page: "200" });
}
}
for await (const shipment of fetchAll("shipments", "2026-11-01T00:00:00-03:00", "2026-11-04T00:00:00-03:00")) {
console.log(shipment.id, shipment.status);
}Solicitar acesso
Escolha os recursos e informe os IPs. A solicitação abre um chamado para a equipe do Meu Rastreio, que ativa o módulo, libera o acesso e envia o token.
Suporte
Ativação, novos recursos, mudança de IP, troca de token ou ajuste de limites: [email protected]. Para contratar: [email protected].