IAEsta documentação também existe 100% adaptada para modelos de IA: /api-de-bi.md

Documentação

API de BI

Leve pedidos, romaneios, fretes, documentos fiscais e checkouts do Meu Rastreio para o seu BI com uma API somente leitura, paginada, com token, IPs liberados e limites de uso, e exportação diária em Parquet.

Base URLhttps://painel.meurastreio.app/api/bi/v1
Solicitar acesso

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.
Um token vale para uma filial. Empresa com várias filiais recebe um token por filial, e cada pedido aparece só na filial de origem, mesmo que tenha sido transferido.

Ativação

A API de BI é ativada pela equipe do Meu Rastreio. O caminho é:

  1. 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.
  2. A equipe instala a extensão na filial, libera os recursos e os IPs e gera o token.
  3. Você recebe o token (ele é mostrado uma única vez) e já pode fazer a primeira chamada.
Sem IP liberado, a API recusa todas as chamadas. O BI precisa sair por IP fixo (servidor, gateway ou proxy da empresa); conexões de casa ou de rede móvel mudam de IP.

Autenticação

Envie o token no cabeçalho Authorization, no formato Bearer. O cabeçalho x-api-token também é aceito.

cabeçalho
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.

requisição
curl -s "https://painel.meurastreio.app/api/bi/v1" \
  -H "Authorization: Bearer mrbi_SEU_TOKEN"
resposta 200
{
  "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.

requisição
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"
resposta 200 (resumida)
{
  "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.

caminhorecursomódulo do plano
/ordersPedidos
Pedidos da filial, com status, prazos, valores, frete, cliente, destino e notas fiscais.
—
/order-movementsMovimentações dos pedidos
Cada evento de status do pedido (coleta, rota, entrega, ocorrência), com localização e comprovante.
—
/shipmentsRomaneios
Romaneios da filial, com motorista, veículo, distância, KM, frete e a sequência dos pedidos.
—
/shipment-movementsMovimentações dos romaneios
Eventos do romaneio registrados pelo motorista ou pela operação.
—
/shipment-closingsFechamentos
Fechamentos de frete dos romaneios.
Fechamento de frete
/carrier-invoicesFaturas de frete
Faturas das transportadoras, com conferência, divergências e os CT-e cobrados.
Fechamento de frete
/nfsesNFS-e
Notas fiscais de serviço da filial.
NFS-e
/ctesCT-e
Conhecimentos de transporte da filial, com valores, origem, destino e eventos.
Documentos fiscais
/mdfesMDF-e
Manifestos da filial, com carga, UFs e o romaneio ligado.
Documentos fiscais
/ciotsCIOT
Operações de transporte declaradas, com frete, rotas, pedágios e histórico.
CIOT
/checkoutsCheckouts
Cobranças geradas para pedidos (PIX, cartão), com pagamento e taxas.
Checkouts
Pedidos /orders
campotipodescrição
idintegerIdentificador do pedido.
external_referencestringUUID público do pedido.
order_numberstringNúmero do pedido.
parent_order_numberstringNúmero do pedido pai (pedidos desmembrados).
shopobjectLoja: id e name.
service_statusstringStatus de atendimento.
finished_statusstringSituação de prazo da entrega.
expedition_statusstringSituação de prazo da expedição.
delivery_statusstringSituação de prazo da entrega pela filial.
is_canceledbooleanPedido cancelado.
has_occurrencebooleanTeve ocorrência.
has_sinisterbooleanTeve sinistro.
has_reversebooleanTeve logística reversa.
has_missing_itemsbooleanTeve falta de itens.
freight_typestringTipo de frete.
need_to_be_collectedbooleanPrecisa de coleta.
total_weightnumberPeso total.
total_pricenumberValor total.
total_price_currencystringMoeda do valor total.
total_volumesintegerVolumes.
total_freightnumberFrete do pedido.
total_freight_currencystringMoeda do frete.
total_freight_by_systemnumberFrete calculado pelo sistema.
total_freight_by_carriernumberFrete cobrado pela transportadora.
total_freight_paidnumberFrete pago.
total_freight_manualnumberFrete informado manualmente.
sold_atdatetimeData da venda.
requested_delivery_datedatetimeData de entrega pedida.
collected_atdatetimeColeta.
in_transfer_atdatetimeEntrada em transferência.
in_route_atdatetimeSaída para rota.
expedited_atdatetimeExpedição concluída.
expedition_atdatetimeData de expedição.
finished_atdatetimeFinalização (entrega ou devolução).
deadline_daysintegerPrazo em dias.
deadline_atdatetimePrazo de entrega.
expedition_deadline_atdatetimePrazo de expedição.
delivery_deadline_atdatetimePrazo de entrega da filial.
is_within_cutoff_timebooleanEntrou dentro do horário de corte.
observationstringObservação.
current_subsidiary_idintegerFilial onde o pedido está agora (transferências). O pedido sempre pertence à filial de origem.
customerobjectCliente: id, name, cpf_cnpj.
destinationobjectDestino: city, state, zipcode, ibge, neighborhood.
carrierobjectTransportadora: id e name.
routeobjectRota: id e name.
invoicesarrayNotas fiscais: type, number, serie, key, value, currency, issued_at.
created_atdatetimeQuando o registro foi criado.
updated_atdatetimeÚltima alteração. É o campo usado na paginação e no incremental.
Movimentações dos pedidos /order-movements
campotipodescrição
idintegerIdentificador da movimentação.
order_idintegerPedido (id em orders).
order_numberstringNúmero do pedido.
order_external_referencestringUUID público do pedido.
codeintegerCódigo do evento.
descriptionstringDescrição do evento.
sub_descriptionstringDetalhe do evento.
is_partialbooleanEntrega parcial.
observationstringObservação.
file_urlstringComprovante (foto ou arquivo).
latitudenumberLatitude.
longitudenumberLongitude.
temperaturenumberTemperatura registrada.
datedatetimeQuando o evento aconteceu.
user_idintegerUsuário que registrou.
shipment_order_idintegerVínculo do pedido com o romaneio.
created_atdatetimeQuando o registro foi criado.
updated_atdatetimeÚltima alteração. É o campo usado na paginação e no incremental.
Romaneios /shipments
campotipodescrição
idintegerIdentificador do romaneio.
external_referencestringReferência externa.
trip_numberintegerNúmero da viagem.
datedatetimeData do romaneio.
statusstringStatus do romaneio.
driverobjectMotorista: id e name.
driver_supportobjectAjudante: id e name.
vehicleobjectVeículo: id e plate.
distance_in_metersintegerDistância planejada.
duration_in_secondsintegerDuração planejada.
start_kmintegerKM inicial.
end_kmintegerKM final.
total_ordersintegerPedidos no romaneio.
total_successintegerEntregues.
total_errorsintegerCom problema.
predicted_freightnumberFrete previsto.
predicted_freight_currencystringMoeda do frete previsto.
paid_freightnumberFrete pago.
paid_freight_currencystringMoeda do frete pago.
paid_freight_atdatetimePagamento do frete.
shipment_closing_idintegerFechamento (id em shipment-closings).
transfered_to_idintegerRomaneio para onde foi transferido.
started_atdatetimeInício.
finished_atdatetimeFim.
observationstringObservação.
ordersarrayPedidos do romaneio: order_id, sequence, type, status, arrived_at, departed_at, delivery_prevision, predicted_freight, manual_freight.
created_atdatetimeQuando o registro foi criado.
updated_atdatetimeÚltima alteração. É o campo usado na paginação e no incremental.
Movimentações dos romaneios /shipment-movements
campotipodescrição
idintegerIdentificador da movimentação.
shipment_idintegerRomaneio (id em shipments).
descriptionstringDescrição do evento.
observationstringObservação.
file_urlstringArquivo anexado.
latitudenumberLatitude.
longitudenumberLongitude.
user_idintegerUsuário que registrou.
created_atdatetimeQuando o registro foi criado.
updated_atdatetimeÚltima alteração. É o campo usado na paginação e no incremental.
Fechamentos /shipment-closings
campotipodescrição
idintegerIdentificador do fechamento.
external_referencestringReferência externa.
namestringNome do fechamento.
statusstringStatus.
total_shipmentsintegerRomaneios no fechamento.
total_expensesintegerDespesas.
total_discountsintegerDescontos.
total_amountnumberValor total.
currencystringMoeda.
paid_atdatetimePagamento.
paid_by_user_idintegerQuem pagou.
canceled_atdatetimeCancelamento.
cancellation_reasonstringMotivo do cancelamento.
shipment_idsarrayRomaneios do fechamento (ids em shipments).
nfse_idsarrayNFS-e do fechamento (ids em nfses).
created_atdatetimeQuando o registro foi criado.
updated_atdatetimeÚltima alteração. É o campo usado na paginação e no incremental.
Faturas de frete /carrier-invoices
campotipodescrição
idintegerIdentificador da fatura.
external_referencestringReferência externa.
carrier_idintegerTransportadora.
statusstringStatus da conferência.
numberstringNúmero da fatura.
seriestringSérie.
document_typestringTipo do documento.
carrier_cnpjstringCNPJ da transportadora.
carrier_namestringNome da transportadora.
issued_atdatetimeEmissão.
due_atdatetimeVencimento.
total_valuenumberValor da fatura.
currencystringMoeda.
discount_deadline_atdatetimePrazo do desconto.
discount_valuenumberValor do desconto.
icms_valuenumberICMS.
iss_valuenumberISS.
conferred_atdatetimeConferência.
has_divergencebooleanTem divergência.
items_total_valuenumberSoma dos itens.
expected_valuenumberValor esperado.
cte_valuenumberValor dos CT-e.
divergence_valuenumberDivergência.
cte_divergence_valuenumberDivergência contra os CT-e.
divergent_items_countintegerItens divergentes.
unmatched_items_countintegerItens sem correspondência.
reviewed_atdatetimeRevisão.
itemsarrayItens: id, cte_number, cte_serie, cte_issued_at, charged_value, currency, sender_cnpj, recipient_cnpj, issuer_cnpj, is_return.
created_atdatetimeQuando o registro foi criado.
updated_atdatetimeÚltima alteração. É o campo usado na paginação e no incremental.
NFS-e /nfses
campotipodescrição
idintegerIdentificador da NFS-e.
numberstringNúmero.
originstringOrigem.
city_hallstringPrefeitura.
verification_codestringCódigo de verificação.
issued_atdatetimeEmissão.
competencedatetimeCompetência.
statusstringStatus.
services_valuenumberValor dos serviços.
iss_valuenumberISS.
iss_withheldstringISS retido.
iss_ratestringAlíquota.
service_codestringCódigo do serviço.
tax_basenumberBase de cálculo.
net_valuenumberValor líquido.
descriptionstringDiscriminação.
service_locationstringLocal da prestação.
providerobjectPrestador: cnpj e name.
takerobjectTomador: cnpj e name.
shipment_closing_idintegerFechamento ligado (id em shipment-closings).
created_atdatetimeQuando o registro foi criado.
updated_atdatetimeÚltima alteração. É o campo usado na paginação e no incremental.
CT-e /ctes
campotipodescrição
idintegerIdentificador do documento no Meu Rastreio.
external_referencestringReferência externa do documento.
statusstringStatus do documento no Meu Rastreio.
emission_typestringTipo de emissão (normal ou contingência).
serieintegerSérie.
numberintegerNúmero.
access_keystringChave de acesso de 44 posições.
protocolstringProtocolo de autorização na SEFAZ.
c_statintegerCódigo de retorno da SEFAZ.
status_reasonstringMotivo devolvido pela SEFAZ.
issued_atdatetimeEmissão.
authorized_atdatetimeAutorização.
canceled_atdatetimeCancelamento.
xml_urlstringLink do XML.
pdf_urlstringLink do PDF, quando houver.
eventsarrayEventos do documento: type, sequence, status, justification, protocol, c_stat, status_reason, registered_at, xml_url, pdf_url.
environmentstringAmbiente (produção ou homologação).
originstringOrigem: emitido no Meu Rastreio, importado ou baixado da SEFAZ.
emitter_cnpjstringCNPJ do emitente.
emitter_namestringNome do emitente.
cfopstringCFOP.
takerstringTomador do serviço.
origin_citystringCidade de origem.
origin_statestringUF de origem.
origin_ibgestringIBGE de origem.
destination_citystringCidade de destino.
destination_statestringUF de destino.
destination_ibgestringIBGE de destino.
total_service_valuenumberValor da prestação.
receivable_valuenumberValor a receber.
cargo_valuenumberValor da carga.
icms_valuenumberICMS.
total_taxes_valuenumberTributos.
created_atdatetimeQuando o registro foi criado.
updated_atdatetimeÚltima alteração. É o campo usado na paginação e no incremental.
MDF-e /mdfes
campotipodescrição
idintegerIdentificador do documento no Meu Rastreio.
external_referencestringReferência externa do documento.
statusstringStatus do documento no Meu Rastreio.
emission_typestringTipo de emissão (normal ou contingência).
serieintegerSérie.
numberintegerNúmero.
access_keystringChave de acesso de 44 posições.
protocolstringProtocolo de autorização na SEFAZ.
c_statintegerCódigo de retorno da SEFAZ.
status_reasonstringMotivo devolvido pela SEFAZ.
issued_atdatetimeEmissão.
authorized_atdatetimeAutorização.
canceled_atdatetimeCancelamento.
xml_urlstringLink do XML.
pdf_urlstringLink do PDF, quando houver.
eventsarrayEventos do documento: type, sequence, status, justification, protocol, c_stat, status_reason, registered_at, xml_url, pdf_url.
environmentstringAmbiente (produção ou homologação).
originstringOrigem: emitido no Meu Rastreio, importado ou baixado da SEFAZ.
emitter_cnpjstringCNPJ do emitente.
emitter_namestringNome do emitente.
closed_atdatetimeEncerramento.
origin_statestringUF de origem.
destination_statestringUF de destino.
trip_start_atdatetimeInício da viagem.
cargo_valuenumberValor da carga.
cargo_unitstringUnidade da carga.
cargo_quantitynumberQuantidade da carga.
shipment_idintegerRomaneio ligado (id em shipments).
created_atdatetimeQuando o registro foi criado.
updated_atdatetimeÚltima alteração. É o campo usado na paginação e no incremental.
CIOT /ciots
campotipodescrição
idintegerIdentificador do CIOT.
external_referencestringReferência externa.
statusstringStatus.
status_reasonstringMotivo do status.
environmentstringAmbiente.
operation_typestringTipo de operação.
ciotstringNúmero do CIOT formatado.
numberstringNúmero.
verification_codestringCódigo de verificação.
transporter_cpf_cnpjstringCPF/CNPJ do transportador.
trip_start_atdatetimeInício da viagem.
trip_end_atdatetimeFim da viagem.
declared_atdatetimeDeclaração.
canceled_atdatetimeCancelamento.
cancel_reasonstringMotivo do cancelamento.
closed_atdatetimeEncerramento.
freight_valuenumberValor do frete.
providerstringProvedor que emitiu.
distance_kmnumberDistância em km.
mdfe_idintegerMDF-e ligado (id em mdfes).
routesarrayRotas: id, name, toll_value, map_url, selected e tolls (name, concessionaire, highway, state, city, value).
shipment_external_referencesarrayReferências externas dos romaneios.
mdfe_external_referencestringReferência externa do MDF-e.
historyarrayHistórico: type, source, user, integration, route_name, route_mode, at.
created_atdatetimeQuando o registro foi criado.
updated_atdatetimeÚltima alteração. É o campo usado na paginação e no incremental.
Checkouts /checkouts
campotipodescrição
idintegerIdentificador do checkout.
external_referencestringReferência externa.
statusstringStatus.
payment_methodstringMeio de pagamento.
providerstringProvedor de pagamento.
amount_in_centsintegerValor em centavos.
fees_in_centsintegerTaxas em centavos.
currencystringMoeda.
installmentsintegerParcelas.
transaction_idstringTransação no provedor.
nsustringNSU.
authorization_codestringCódigo de autorização.
card_last4stringFinal do cartão.
return_codestringCódigo de retorno.
return_messagestringMensagem de retorno.
paid_atdatetimePagamento.
expires_atdatetimeExpiração.
created_by_user_idintegerQuem gerou.
order_idsarrayPedidos cobrados (ids em orders).
created_atdatetimeQuando o registro foi criado.
updated_atdatetimeÚltima alteração. É o campo usado na paginação e no incremental.
Datas saem em ISO 8601, em UTC (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âmetroobrigatóriocomo usar
updated_fromsim, sem cursorIní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_tonãoFim da janela, com fuso. Padrão: agora. Até 31 dias depois de updated_from.
per_pagenãoRegistros por página, de 1 a 200. Padrão: 100.
cursornãoO 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:

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"
  1. Chame com updated_from, updated_to e per_page.
  2. Grave os registros de data.
  3. Enquanto has_more for true, chame de novo só com cursor e per_page.
  4. Quando has_more for false, a janela acabou.
Por que cursor e não número de página? Porque os dados mudam enquanto você lê. Com página numerada, um pedido alterado no meio da leitura muda de posição e faz a página seguinte pular ou repetir registros. O cursor continua exatamente depois do último registro que você recebeu, e cada página custa o mesmo para o sistema, seja a primeira ou a milésima.

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:

  1. Guarde, por recurso, o fim da última janela lida com sucesso.
  2. Na próxima execução, use esse valor como updated_from e o horário atual como updated_to.
  3. Grave com upsert usando id como chave: o mesmo registro pode voltar em janelas seguintes sempre que for alterado.
  4. Leia um recurso de cada vez: o token aceita uma requisição por vez.
pseudocódigo
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.

limitepadrãocomo funciona
Requisições simultâneas1Só uma requisição por token roda de cada vez. A segunda recebe 429 na hora.
Por minuto20 (rajada de 10)Até 10 seguidas; depois, uma nova a cada 3 segundos.
Por dia2.000Zera à meia-noite no fuso da empresa.
Registros por página100 (padrão), até 200Parâmetro per_page.
Janela de consultaaté 31 diasEntre updated_from e updated_to.
Tempo de consulta10 segundosConsulta mais longa responde 503 QUERY_TIMEOUT: diminua a janela ou o per_page.
Bloqueio por insistência15 minutos50 respostas 429 em 5 minutos bloqueiam o token.
Token inválido1 hora20 tokens inválidos do mesmo IP em 10 minutos bloqueiam o IP.

Toda resposta aceita traz o quanto ainda resta:

cabeçalhosignificado
RateLimit-LimitRequisições por minuto do token.
RateLimit-RemainingQuantas ainda cabem agora sem esperar.
X-RateLimit-Daily-LimitCota diária.
X-RateLimit-Daily-RemainingQuanto resta da cota hoje.
Retry-AfterSó no 429: segundos a esperar antes de tentar de novo.

Passou do limite, a resposta é 429 e diz quanto esperar:

resposta 429
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
}
Respeite o 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=200 para 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.

statuscodequando acontece
401INVALID_TOKENToken ausente, inválido, revogado ou trocado.
403IP_NOT_ALLOWEDO IP de origem não está na lista liberada da instalação.
403IP_BLOCKEDIP bloqueado por 1 hora após muitos tokens inválidos.
403EXTENSION_INACTIVEA instalação da API de BI está desativada.
403PLAN_EXPIREDEmpresa ou filial desativada.
403PLAN_WITHOUT_EXTENSIONSO plano não inclui extensões.
403RESOURCE_DISABLEDO recurso não foi liberado nesta instalação.
403RESOURCE_NOT_IN_PLANO plano não inclui o módulo do recurso.
404RESOURCE_NOT_FOUNDCaminho de recurso que não existe.
405METHOD_NOT_ALLOWEDA API só aceita GET.
422UPDATED_FROM_REQUIREDFaltou updated_from (sem cursor).
422INVALID_DATEData fora do ISO 8601 com fuso. O campo vem em field.
422INVALID_WINDOWupdated_to anterior a updated_from.
422WINDOW_TOO_LARGEJanela maior que o máximo, que vem em max.
422INVALID_PER_PAGEper_page fora de 1 até o máximo, que vem em max.
422INVALID_CURSORCursor alterado ou de outra consulta.
429RATE_LIMITEDLimite atingido. limit diz qual (concurrency, minute, day, penalty) e retry_after, quanto esperar.
503QUERY_TIMEOUTA consulta passou de 10 segundos.
503SERVICE_UNAVAILABLEInstabilidade 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-After e 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 APIcoluna 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/falsoBOOLEAN
textoSTRING
objeto ou lista (customer, invoices, orders…)STRING com o JSON
Python (pandas)
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())
DuckDB
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.

  1. Peça no formulário de acesso ou ao suporte, informando desde quando precisa do histórico.
  2. 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.
  3. 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 pornome do arquivopasta no FTP
mêsorders_2026-03.parquethistorico/2026-03/
semana (ISO)orders_2026-W10.parquethistorico/2026-W10/
diaorders_2026-03-05.parquethistorico/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.

Python
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"])
JavaScript (Node 18+)
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.

Recursos *
Exportação diária em Parquet
Carga histórica em Parquet

Suporte

Ativação, novos recursos, mudança de IP, troca de token ou ajuste de limites: [email protected]. Para contratar: [email protected].