No transporte rodoviário de cargas, o valor do frete tem um piso mínimo definido pela ANTT (Agência Nacional de Transportes Terrestres). Contratar ou oferecer frete abaixo desse piso pode gerar autuação, e calcular o valor na mão, com tabelas e coeficientes que mudam a cada normativa, é trabalhoso e sujeito a erro.
Neste tutorial você vai aprender a calcular o piso mínimo de frete ANTT com PHP usando a API Calcula Frete ANTT da APIBrasil, que já aplica a normativa vigente e devolve os coeficientes usados no cálculo.
Como o piso mínimo é calculado
A política de pisos mínimos usa dois coeficientes, que variam conforme o tipo de carga e o número de eixos:
- CCD (coeficiente de custo de deslocamento), em R$ por km rodado.
- CC (coeficiente de custo de carga e descarga), um valor fixo por viagem.
De forma simplificada, piso = distância × CCD + CC. A API faz esse cálculo com os valores da normativa em vigor na data de referência e devolve o resultado e os coeficientes aplicados, para você conferir e registrar.
O que a API Calcula Frete ANTT oferece
A API fica na categoria Serviços Digitais e custa R$ 0,05 por consulta em produção, conforme o catálogo. Todos os endpoints usam a mesma rota, e o campo tipo define a operação:
tipo | O que faz |
|---|---|
calcula-frete | Calcula o piso mínimo para uma operação |
opcoes-calculo | Lista os valores aceitos nos parâmetros |
modelos-carga | Lista os tipos de carga |
normativa-atual | Informa a normativa vigente |
versoes-normativas | Lista as versões de normativas |
Pré-requisitos
- PHP 8.0 ou mais novo com a extensão cURL.
- Bearer Token da APIBrasil, em Credenciais no painel. Veja os primeiros passos.
Passo 1: descubra os valores aceitos
Antes de calcular, consulte as opções válidas para tipo de carga e composição veicular. Isso evita chamadas com parâmetros errados, que continuariam sendo cobradas:
POST https://gateway.apibrasil.io/api/v2/consulta/frete-antt/credits
{ "tipo": "opcoes-calculo", "dataReferencia": "2026-09-26", "homolog": true }
Guarde essa lista no seu sistema e use-a para montar os campos de seleção da tela.
Passo 2: o corpo do cálculo
{
"tipo": "calcula-frete",
"tipoCarga": "carga_geral",
"eixos": 6,
"distanciaKm": 100,
"composicaoVeicular": "cavalo_trucado",
"altoDesempenho": false,
"retornoVazio": false,
"dataReferencia": "2026-09-26",
"homolog": true
}
| Campo | Descrição |
|---|---|
tipoCarga | Tipo de carga, como carga_geral |
eixos | Número de eixos carregados do veículo |
distanciaKm | Distância da viagem em km |
composicaoVeicular | Composição do veículo, como cavalo_trucado |
altoDesempenho | Se a operação é de alto desempenho |
retornoVazio | Se o veículo volta vazio |
dataReferencia | Data usada para escolher a normativa vigente |
Passo 3: o cliente em PHP
Crie o arquivo frete.php:
<?php
const URL = 'https://gateway.apibrasil.io/api/v2/consulta/frete-antt/credits';
function apibrasil(array $corpo): array
{
$corpo['homolog'] = getenv('APIBRASIL_HOMOLOG') !== 'false';
$ch = curl_init(URL);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($corpo),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 120,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer ' . getenv('APIBRASIL_TOKEN'),
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status === 402) {
throw new RuntimeException('Saldo insuficiente na APIBrasil');
}
$json = json_decode((string) $body, true);
if ($status >= 400 || !empty($json['error'])) {
throw new RuntimeException($json['message'] ?? "HTTP $status");
}
return $json['data'];
}
$op = getopt('', ['km:', 'eixos:', 'carga:', 'proposta:']);
$r = apibrasil([
'tipo' => 'calcula-frete',
'tipoCarga' => $op['carga'] ?? 'carga_geral',
'eixos' => (int) ($op['eixos'] ?? 6),
'distanciaKm' => (float) ($op['km'] ?? 100),
'composicaoVeicular' => 'cavalo_trucado',
'altoDesempenho' => false,
'retornoVazio' => false,
'dataReferencia' => date('Y-m-d'),
]);
$piso = $r['pisoMinimo']['bruto'];
$proposta = (float) ($op['proposta'] ?? 0);
echo 'Normativa ........ ' . $r['versaoNormativa'] . PHP_EOL;
echo 'CCD aplicado ..... ' . $r['ccdAplicado']['formatado'] . ' ' . $r['ccdAplicado']['unidade'] . PHP_EOL;
echo 'CC aplicado ...... ' . $r['ccAplicado']['formatado'] . PHP_EOL;
echo 'Piso mínimo ...... ' . $r['pisoMinimo']['formatado'] . PHP_EOL;
if ($proposta > 0) {
echo 'Frete proposto ... R$ ' . number_format($proposta, 2, ',', '.') . PHP_EOL;
echo $proposta >= $piso
? "✔ Acima do piso ANTT\n"
: '✖ Abaixo do piso ANTT: ajuste para ao menos ' . $r['pisoMinimo']['formatado'] . PHP_EOL;
}
Um detalhe útil desta API: os valores vêm em dois formatos, bruto (número, para cálculo) e formatado (texto, para exibir). Use sempre o bruto nas comparações.

Passo 4: rode o cálculo
export APIBRASIL_TOKEN="seu_token_aqui"
php frete.php --km=100 --eixos=6 --carga=carga_geral --proposta=650

Juntando com a distância entre CEPs
Na maioria dos sistemas, o usuário informa CEP de origem e CEP de destino, não a quilometragem. Combine esta API com a API Calcula Distância CEP: primeiro obtenha a distância de carro entre os CEPs e depois use o resultado no distanciaKm.
Boas práticas
- Registre a normativa: salve
versaoNormativa,documentoBasee os coeficientes junto com o frete contratado. Em uma fiscalização, você mostra exatamente como o piso foi calculado. - Use a data da contratação em
dataReferencia, não a data de hoje, quando estiver recalculando fretes antigos. - Valide na interface: impeça o envio de propostas abaixo do piso antes mesmo de salvar.
Perguntas frequentes
A API atualiza quando sai uma nova normativa?
A API tem endpoints para consultar a normativa atual e as versões disponíveis, e a resposta do cálculo informa qual normativa foi aplicada e o período de vigência. Confira esses campos no seu fluxo.
Este cálculo substitui a análise jurídica do contrato?
Não. A API calcula o piso conforme os parâmetros informados. Enquadramento da operação e cláusulas contratuais continuam sendo responsabilidade da sua equipe.
Próximos passos
Veja também como rastrear encomendas dos Correios com Python e boas práticas para integrar a APIBrasil em produção.
![]()









