Documentação · API v3

Da primeira chamada
à sua próxima rota.

Tudo para integrar o cálculo de pedágios ao seu sistema, com exemplos prontos para adaptar.

Uma API. Dois jeitos de informar a rota.

Envie cidades no formato Cidade/UF ou pares de latitude e longitude. A API calcula o trajeto e retorna as praças de pedágio, os custos por categoria de veículo e a geometria da rota.

BASE URLhttps://calcularpedagio.com.br/api
A calculadora pública pode ser usada sem cadastro. A integração via API e o planejador exigem conta, chave válida e um plano ativo: o acesso é liberado automaticamente assim que o pagamento da assinatura é confirmado.

1. Autenticação

Depois de criar sua conta e ativar o plano, acesse Chave de API no painel. Envie a chave no cabeçalho de todas as chamadas:

Headers
Authorization: Bearer SUA_API_KEY
Content-Type: application/json

Também é aceito o cabeçalho api_key: SUA_API_KEY. Se os dois forem enviados, api_key tem prioridade.

Guarde a chave no servidor da sua aplicação. Não a publique em JavaScript entregue ao navegador ou em repositórios. Gerar uma nova chave invalida a anterior.

2. Faça sua primeira requisição

Substitua SUA_API_KEY pela sua chave. O exemplo consulta São Paulo → Campinas. Node.js usa fetch nativo; Python requer requests; C++ requer libcurl.

const resposta = await fetch(
  "https://calcularpedagio.com.br/api/pontos/v3",
  {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: "Bearer SUA_API_KEY"
    },
    body: JSON.stringify({
      pontos: ["São Paulo/SP", "Campinas/SP"]
    })
  }
);
const dados = await resposta.json();
if (!resposta.ok) throw new Error(dados.error);
console.log(dados);
POST /api/pontos/v3 · JSON · autenticação Bearer

Busca de endereços, bairros e CEP

GET/geocode/v1?q=texto

Converte o que o usuário digita em pontos prontos para a consulta de rota: cidade, rua, número, bairro, rodovia ou CEP. Serve para montar um campo de autocompletar. Base de dados OpenStreetMap do Brasil, lista de municípios do IBGE e CEPs dos Correios, tudo hospedado por nós, sem Google. Não consome usos; limite de 120 buscas por minuto por chave.

ParâmetroObrigatórioDescrição
qSimTexto digitado, 2 a 120 caracteres. Aceita CEP com ou sem hífen.
lat, lngNãoPosição de referência (centro do mapa ou GPS) para desempatar ruas com o mesmo nome. Recomendado.
zoomNão3 a 16, alcance do viés: 5 = país inteiro, 12 = cidade. Padrão 9.
limiteNão1 a 15 resultados. Padrão 8.
cURL
curl "https://calcularpedagio.com.br/api/geocode/v1?q=avenida+7+de+setembro+leme&lat=-22.18&lng=-47.30" \
  -H "Authorization: Bearer SUA_API_KEY"
200 · application/json
{
  "status": "OK",
  "consulta": "avenida 7 de setembro leme",
  "resultados": [
    {
      "label": "Avenida 7 de Setembro, Centro, Leme/SP",
      "descricao": "Rua · CEP 13610-000",
      "tipo": "street",
      "lat": -22.1809, "lng": -47.3841,
      "cidade": "Leme", "uf": "SP",
      "ponto": "Avenida 7 de Setembro, Centro, Leme/[email protected],-47.3841"
    }
  ]
}

Mostre label e descricao ao usuário e envie o campo ponto dentro de pontos nos endpoints de rota. Ele já vem no formato aceito: Cidade/UF para municípios e Rótulo@lat,lng para endereços. tipo pode ser city, street, house, district, locality, postcode ou other. Para CEP, a resposta traz a rua e o bairro já resolvidos.

API de Pedágios por Endereço

POST/pontos/v3

Informe de 2 a 100 pontos, na ordem do trajeto. A primeira é a origem; a última, o destino; as intermediárias são paradas. Cada ponto é um município no formato Cidade/UF ou um endereço no formato Rótulo@latitude,longitude, como devolvido pela busca de endereços. Os dois formatos podem ser misturados na mesma lista.

Corpo JSON
{
  "pontos": ["São Paulo/SP", "Jundiaí/SP", "Avenida 7 de Setembro, Centro, Leme/[email protected],-47.3841"]
}
CampoTipoComo preencher
pontosstring[] · obrigatórioLista de 2 a 100 pontos: Cidade/UF (município do IBGE) ou Rótulo@lat,lng (endereço, bairro ou CEP resolvido pela busca). O rótulo é livre e volta em links.calculadora; a rota usa a coordenada.

API de Pedágios por Coordenadas

POST/coordenadas/v3

Informe de 2 a 100 pares na ordem [latitude, longitude], em graus decimais e dentro do Brasil.

Corpo JSON
{
  "pontos": [
    [-29.5008, -51.9484],
    [-29.2562, -51.5341]
  ]
}
A entrada usa [latitude, longitude]. A geometria GeoJSON retornada em polyline.coordinates usa [longitude, latitude]. Respeite essa diferença ao desenhar a rota no mapa.

Múltiplos trajetos

Use o mesmo corpo dos endpoints anteriores para comparar as alternativas disponíveis.

POST/pontos/multiplosTrajetos/v3
POST/coordenadas/multiplosTrajetos/v3
Campo em dadosSignificado
rotaMaisRapidaMenor duração entre as rotas encontradas.
rotaMaisBarataMenor custo de pedágios em dinheiro para auto2eixos. Não inclui combustível. Em caso de empate, prioriza a menor duração.
rotaAlternativaOutra opção, quando existir. Pode ser null.
quantidadeRotasNúmero de rotas disponíveis. Não há garantia de três opções.

A rota mais rápida e a mais barata podem ser a mesma. Para comparar caminhões, use os totais da categoria em cada opção retornada.

Veículo, ida e volta e ordem otimizada

Os endpoints /pontos/v3, /coordenadas/v3 (e as versões v1) aceitam três campos opcionais junto com pontos. Sem eles, a resposta é a mesma de sempre.

Corpo JSON
{
  "pontos": ["São Paulo/SP", "Ribeirão Preto/SP", "Campinas/SP", "Curitiba/PR"],
  "veiculo": { "tipo": "caminhao", "eixos": 5 },
  "retorno": true,
  "otimizar": true
}
CampoValoresO que devolve
veiculotipo: carro (2 a 4 eixos), moto, onibus (2 ou mais), caminhao (2 a 9, obrigatório), motorhome (2 a 4). eixos é opcional exceto para caminhão. Também aceita a forma curta "caminhao-5".dados.veiculo com custoTotalDinheiro, custoTotalTag, categoria e pracas, e em cada praça custoVeiculo.dinheiro, custoVeiculo.tag e custoVeiculo.isento. Caminhão e ônibus com mais de 2 eixos pagam o valor por eixo multiplicado pelos eixos.
retornotrueCalcula também a volta, com os pontos na ordem inversa e o sentido de cobrança de cada praça. A ida fica na raiz, a volta em retorno (mesma estrutura) e a soma em total (totais por categoria, veiculo, distância, duração e frete.total). Consome uma única faixa de usos, considerando a distância e os pedágios somados da ida e da volta. Não disponível em multiplosTrajetos.
data"AAAA-MM-DD" ou "AAAA-MM-DDTHH:MM" (hora de Brasília)Data da viagem. Aos sábados, domingos e feriados nacionais as praças com tarifa diferenciada (Rio-Santos, Via Lagos, Estrada do Coco, Rota dos Coqueiros, PE-024) usam a tarifa de fim de semana. A resposta traz viagem (dia da semana, feriado, período) e cada praça informa periodo e temTarifaFimDeSemana. Sem data, vale a tarifa normal.
combustivel{ "precoLitro": 6.19, "kmPorLitro": 3.5 }Litros e custo de combustível do trecho em combustivel; com retorno, a soma fica em total.combustivel.
mostrar{ "balancas": true, "postos": true }Balanças rodoviárias e postos de combustível a até 400 m e 300 m da rota, em balancas e postos: nome, marca, operador, coordenadas, distância da rota e posicaoKm desde a origem. Dados do OpenStreetMap (licença ODbL). Limite de 200 balanças e 300 postos por trecho.
otimizartrue ou { "destinoFixo": false }Reordena as paradas intermediárias pelo trajeto mais curto. A origem é sempre o primeiro ponto; com true o último ponto continua sendo a chegada, com destinoFixo: false a viagem termina na parada que fechar o menor percurso. A resposta traz ordemOtimizada (índices dos pontos enviados, na nova ordem) e pontosRota já reordenado. Precisa de 3 ou mais pontos.

Toda resposta de rota traz também links.googleMaps (a rota nas coordenadas calculadas) e, quando os pontos foram enviados como Cidade/UF, links.calculadora com a mesma consulta aberta na calculadora do site.

Os campos podem ser combinados entre si e com frete. Em multiplosTrajetos, veiculo e otimizar funcionam e a "rota mais barata" passa a ser escolhida pelo custo do veículo informado.

Pedágios sobre uma rota calculada fora

POST/polyline/v3

Já tem a rota do Google Maps, HERE, Mapbox ou do seu próprio roteador? Envie só a geometria e receba as praças e os custos, sem novo roteamento. Segue as faixas por distância e pedágios e os limites por chamada descritos em Consumo e limites.

Corpo JSON
{
  "polyline": "hkzlCr}h{GfDzB~F`D...",
  "veiculo": { "tipo": "caminhao", "eixos": 5 },
  "data": "2026-09-19"
}
CampoTipoComo preencher
polylineobrigatórioUma string codificada no formato Google (precisão 5 ou 6, detectada automaticamente), um GeoJSON LineString ou uma lista [[lat, lng], ...]. Até 50.000 pontos, todos no Brasil.
ordemopcional"lnglat" quando a lista vier como [longitude, latitude]. Padrão "latlng". Não se aplica à string codificada nem ao GeoJSON.
veiculo, data, frete, combustivel, mostraropcionaisMesmo comportamento dos endpoints de rota.

Resposta: dados.pedagiosRota, totais por categoria, pracasNaoCobradas, distanciaMetros (comprimento da geometria enviada) e pontos. Não há polyline nem duracaoSegundos, pois a rota é sua. Quanto mais fiel a geometria (sem simplificação agressiva), melhor o casamento com as praças.

Imagem da rota

POST/imagem/v3

Devolve um mapa esquemático em SVG (image/svg+xml) com os limites dos estados, a linha da rota, as praças com o valor cobrado, origem, paradas e destino, e um rodapé com distância, tempo e total de pedágios. Serve para cotações, e-mails e PDFs sem depender de serviço de mapas. Consome usos como uma consulta de rota.

Corpo JSON
{
  "pontos": ["São Paulo/SP", "Curitiba/PR"],
  "veiculo": "caminhao-5",
  "largura": 900,
  "altura": 600,
  "titulo": "Cotação 1234"
}
CampoTipoComo preencher
pontosobrigatórioCidades no formato Cidade/UF ou pares [latitude, longitude], como nos endpoints de rota.
veiculo, data, otimizaropcionaisMesmo comportamento dos endpoints de rota; o valor das praças e o total seguem o veículo (padrão: carro).
largura, alturaopcionaisPixels, de 300×200 a 2000×2000. Padrão 900×600.
tituloopcionalTexto do rodapé. Padrão: origem → destino.
O SVG abre em qualquer navegador e pode ser convertido para PNG ou embutido em HTML e PDF. Limites dos estados: malha do IBGE.

Tabela de frete (piso mínimo ANTT)

Calcula o piso mínimo do transporte rodoviário de cargas pela metodologia da Resolução ANTT nº 5.867/2020: piso = distância (km) × CCD + CC, com os coeficientes da tabela vigente na data informada. Informe a distância ou os pontos da rota.

POST/frete/v1
CampoObrigatórioDescrição
distanciaKmUm dos doisDistância em km. Não consome usos.
pontosUm dos doisLista de Cidade/UF ou coordenadas: a distância vem da rota mais rápida e a chamada consome usos como uma consulta de rota. A resposta traz rota com distância, duração e pontosRota.
eixosSim2 a 9.
tipoCargaSimgranel_solido, granel_liquido, frigorificada, conteinerizada, carga_geral, neogranel, perigosa_granel_solido, perigosa_granel_liquido, perigosa_frigorificada, perigosa_conteinerizada, perigosa_carga_geral, granel_pressurizada.
tabelaNãoA (padrão) cavalo e carreta do contratado; B somente unidade de tração; C e D alto desempenho.
retornoVazioNãotrue acrescenta o percentual vigente sobre o custo de deslocamento quando não há carga de retorno.
dataNãoAAAA-MM-DD para usar a tabela válida naquela data. Vazio = vigente hoje.
cURL
curl -X POST https://calcularpedagio.com.br/api/frete/v1 \
  -H "Authorization: Bearer SUA_API_KEY" -H "Content-Type: application/json" \
  -d '{"pontos":["São Paulo/SP","Curitiba/PR"],"eixos":5,"tipoCarga":"carga_geral","tabela":"A","retornoVazio":true}'

Resposta: pisoMinimo, custoDeslocamento, custoCargaDescarga, coeficientes.ccd, coeficientes.cc, retornoVazio.valor, total e vigencia (início e resolução). Combinações cuja tabela ainda não foi carregada respondem 503 com pendente: true. GET /api/frete/catalogo lista tipos de carga, tabelas e vigências.

Frete junto com a rota

Em qualquer endpoint de rota (/pontos/*, /coordenadas/*, inclusive múltiplos trajetos), envie o objeto opcional frete e a resposta traz o campo frete com o piso calculado sobre a distância daquela rota (em múltiplos trajetos, um por rota). Não consome usos adicionais.

Corpo JSON
{
  "pontos": ["São Paulo/SP", "Curitiba/PR"],
  "frete": { "eixos": 5, "tipoCarga": "carga_geral", "tabela": "A", "retornoVazio": false }
}

Se a combinação ainda não tiver coeficiente, frete vem como { "pendente": true, "erro": "..." } e a rota é devolvida normalmente. Parâmetros inválidos em frete respondem 400.

Campos novos nas respostas de rota: pontosRota (coordenadas de saída, paradas e chegada), superficie (tipo de piso da rota pela tag surface do OpenStreetMap: pavimentadoMetros asfalto, concreto e calçamento; naoPavimentadoMetros terra, cascalho e areia; desconhecidoMetros trechos sem informação; percentualPavimentado calculado só sobre o trecho conhecido; fonte "OSM" com dadosDe, ou "pendente" enquanto o índice é atualizado e "indisponivel" em /polyline/v3, que não roteia) e, em cada praça, tipo e concessionaria.

3. Entenda a resposta

Exemplo estrutural reduzido e ilustrativo da v3. Os valores abaixo não representam uma cotação; as categorias e praças foram abreviadas para facilitar a leitura.

200 · application/json
{
  "status": "OK",
  "dados": {
    "pais": "Brasil",
    "moeda": "BRL",
    "pedagiosRota": [],
    "custoTotalPedagiosDinheiro": { "auto2eixos": 0 },
    "custoTotalPedagiosTag": { "auto2eixos": 0 },
    "pracasNaoCobradas": []
  },
  "usuario": "null",
  "polyline": {
    "type": "LineString",
    "coordinates": [[-51.9484, -29.5008], [-51.5341, -29.2562]]
  },
  "distancia": "35KM",
  "duracaoSegundos": 2400
}
CampoUso na sua aplicação
dados.pedagiosRotaPraças cobradas, em ordem de passagem. Incluem localidade, rodovia, estado, tarifas e informação de sentido.
custosDinheiro / custoTagTarifas por categoria dentro de cada praça. Trate valores de isenção e converta números conforme necessário. Onde há desconto para pagamento automático, custoTag já vem com ele aplicado e descontoTag informa o percentual e se a regra foi confirmada no contrato da concessionária (hoje 5% nas concessões federais licitadas desde 2021 e no free flow da Motiva RioSP).
custoTotalPedagiosDinheiro / custoTotalPedagiosTagTotais por categoria em reais (BRL), com precisão de centavos. Uma categoria retorna null quando falta tarifa em alguma praça; zero indica custo conhecido igual a zero. Não trate null como isenção.
tipo = freeflow-dinamicoFree flow por trecho e horário (hoje a Via Dutra entre o km 204 e o km 231, na Região Metropolitana de São Paulo). Aparece em pedagiosRota só quando a rota usa a pista expressa; quem fica na marginal não paga. O objeto freeflow traz o pórtico de entrada e de saída, o tipo de dia, a hora usada e horaAssumida: sem data com hora, a API assume dia útil às 10h. Envie "data": "AAAA-MM-DDTHH:MM" para o valor exato. Caminhões: o valor por eixo é uma aproximação da tabela da concessionária (até 3 eixos 2x, 4 ou mais 4x o automóvel).
cabineSó em praças de bloqueio (Rodoanel, Imigrantes, Castello Branco): nome da alça ou pista onde fica a cabine pela qual a rota passou. Esses bloqueios só são cobrados quando a rota passa pela cabine, e não pela simples proximidade.
pracasNaoCobradasPraças encontradas sem cobrança nesse trajeto, com o motivo.
sentido / sentidoCobradoO sentido pode ser ambos, unico ou presumido. O último indica informação de direção incompleta na base.
distanciaTexto em quilômetros, arredondado para cima, como 35KM.
duracaoSegundosDuração estimada da viagem, em segundos.
polylineGeometria GeoJSON LineString, não uma string codificada.
atualizado / ultimaAlteracaoData de atualização disponível para a praça.

Categorias de veículos

Na v3, as chaves são moto2eixos, auto2eixos, auto3eixos, auto4eixos, valorPorEixoCaminhao, onibus2Eixos, motorHome2eixos, motorHome3eixos e motorHome4eixos. Para caminhões, multiplique valorPorEixoCaminhao pela quantidade de eixos cobrados. Observe a letra E maiúscula em onibus2Eixos.

Para ida e volta, consulte também os pontos na ordem inversa. Não duplique simplesmente o total: o sentido de cobrança e a rota de retorno podem ser diferentes. Tarifas de TAG e descontos dependem das condições aplicáveis.

Consumo e limites

Cada chamada de cálculo consome 1 uso. Acima de 15 pedágios ou 1.000 km: 5 usos; acima de 20 pedágios ou 1.500 km: 10 usos; acima de 40 pedágios ou 2.000 km: 50 usos. Vale somente a maior faixa atingida. Máximo de 50 pedágios e 3.000 km por chamada; acima disso, a chamada é recusada sem consumo. Ida e volta somam distância e passagens por pedágios; nas alternativas, valem os maiores valores entre as rotas.

A quantidade de pontos não altera o consumo: são aceitos de 2 a 100 pontos nos endpoints da API. A regra vale para consultas de rota, imagem, polyline e frete por rota. Busca de endereços, catálogo de frete e frete somente por distância continuam sem consumo. O limite de distância também se aplica ao frete por distância.

Confira X-Usage-Units (usos desta chamada), X-RateLimit-Limit (cota) e X-RateLimit-Remaining (saldo após a chamada). Acima de 50 pedágios ou 3.000 km: HTTP 400, sem consumo. Saldo pago insuficiente: HTTP 429; sem plano ativo e sem cortesia suficiente: HTTP 402. Falhas não descontam usos. O histórico anterior é preservado.

Erros e soluções

Verifique o status HTTP e o campo error antes de usar a resposta.

HTTPO que fazer
400Revise o corpo JSON, a quantidade de pontos, o formato Cidade/UF ou Rótulo@lat,lng, ou as coordenadas. Texto solto como "avenida 7 de" é recusado: resolva antes com a busca de endereços.
401Envie sua chave no cabeçalho Authorization ou api_key.
402Verifique a ativação e o pagamento do plano no painel.
403A chave informada não foi encontrada. Confira a chave atual no painel.
429Cota mensal esgotada. Consulte seu consumo e converse com o suporte sobre o plano.
500Erro interno. Se persistir, envie ao suporte o endpoint, horário e status.
502Serviço de rotas indisponível. Tente novamente após um intervalo.
504Tempo limite excedido. Aguarde e tente novamente.

Use timeout no cliente e tentativas limitadas para falhas temporárias. Não repita indefinidamente chamadas com erro de autenticação ou cota. Se sua conexão cair após o processamento, uma nova chamada pode consumir outro uso.

Webhooks

Cadastre uma URL sua em Webhook (menu do painel) para receber, por HTTP POST, as chamadas recentes e o uso da sua conta em tempo real, um resumo diário do histórico de chamadas e um aviso quando o plano estiver vencendo. Não é preciso ficar consultando a API para saber o que aconteceu: nós avisamos sua aplicação.

Cada evento é uma tentativa única, sem fila e sem retentativa automática: se sua URL estiver fora do ar, aquele disparo se perde. Consulte o histórico de entregas na aba Webhook do painel e mantenha a rota sempre disponível. O tempo limite de cada entrega é de 8 segundos.

Cabeçalhos da requisição

CabeçalhoConteúdo
Content-Typeapplication/json
X-Webhook-EventNome do evento, igual ao campo evento do corpo.
X-Webhook-SignatureHMAC-SHA256 em hexadecimal do corpo bruto (string, antes do parse), calculado com a chave secreta mostrada na aba Webhook do painel.

Verificando a assinatura (Node.js)

Node.js
const crypto = require('crypto');

function assinaturaValida(corpoBruto, assinaturaRecebida, chaveSecreta) {
  const esperada = crypto.createHmac('sha256', chaveSecreta).update(corpoBruto).digest('hex');
  return crypto.timingSafeEqual(Buffer.from(esperada), Buffer.from(assinaturaRecebida));
}

// corpoBruto deve ser a string original do corpo (ex.: req.rawBody), não o objeto já convertido.

O webhook aceita uma URL HTTPS pública, sem credenciais na URL. Endereços internos e redirecionamentos são bloqueados. Em uso, usadoNoMes inclui usos de cortesia; usadoDoPlanoNoMes conta só usos pagos, restante informa a cota paga restante e saldoTotalRestante soma a cota paga e os usos de cortesia.

Eventos

EventoQuando dispara
chamada.criadaA cada chamada feita com sua chave, na API ou no planejador. Traz o resultado da chamada e a foto do uso atual.
historico.diarioUma vez por dia, com o total de chamadas, erros e usos consumidos nas últimas 24 horas.
plano.vencimentoQuando faltarem 7, 3 ou 1 dia para o vencimento cadastrado, e no próprio dia do vencimento.
testeDisparado manualmente pelo botão "Enviar disparo de teste" na aba Webhook.
chamada.criada
{
  "evento": "chamada.criada",
  "enviadoEm": "2026-09-13T14:32:10.000Z",
  "dados": {
    "endpoint": "/pontos/v3",
    "source": "api",
    "statusCode": 200,
    "durationMs": 480,
    "units": 1,
    "pontos": 3,
    "resumo": "São Paulo/SP → Campinas/SP",
    "uso": {
      "plano": "Plano 3.000",
      "limiteMensal": 3000,
      "usadoNoMes": 812,
      "usadoDoPlanoNoMes": 812,
      "restante": 2188,
      "saldoTotalRestante": 2188,
      "creditosGratuitosRestantes": 0
    }
  }
}
historico.diario
{
  "evento": "historico.diario",
  "enviadoEm": "2026-09-13T06:00:04.000Z",
  "dados": { "periodo": "ultimas24h", "chamadas": 214, "erros": 3, "usosConsumidos": 198 }
}
plano.vencimento
{
  "evento": "plano.vencimento",
  "enviadoEm": "2026-09-13T06:00:04.000Z",
  "dados": { "plano": "Plano 3.000", "vencimento": "2026-09-20", "diasRestantes": 7 }
}

Marque ou desmarque cada evento na aba Webhook do painel. Gerar uma nova chave secreta invalida a assinatura calculada com a anterior.

Compatibilidade com a v1

As rotas POST /pontos/v1 e POST /coordenadas/v1 continuam disponíveis com o mesmo corpo de entrada. A v1 retorna dados.totalPedagiosRota, com chaves como auto e moto, além de distanciaMetros. Na v3, use os totais de dinheiro e TAG separados e a chave auto2eixos.

Para novas integrações, use a v3. As coordenadas individuais das praças, km e campo interno de direção são removidos das respostas públicas v3; a geometria da rota continua disponível.

Precisa de ajuda com a integração?

Envie o endpoint utilizado, um exemplo do corpo sem dados sensíveis e o erro retornado. Não compartilhe sua chave de API.

Importe os dois arquivos no Postman (Import → File), selecione o ambiente "API Pedágios · produção" e preencha a variável apiKey. A coleção traz 18 requisições prontas, incluindo a busca de endereços e os formatos Cidade/UF e Rótulo@lat,lng.