API REST desenvolvida em Python + FastAPI para validação e cálculo automatizado de cotações de frete rodoviário.
A aplicação recebe informações de uma carga, valida os CEPs de origem e destino, calcula automaticamente a rota rodoviária, obtém uma estimativa de pedágios e aplica as regras de cálculo de frete configuradas no projeto.
O projeto foi estruturado para funcionar também como backend de agentes de IA, mantendo as regras de negócio, validações e cálculos centralizados na API.
- Validação dos dados de entrada com Pydantic
- Validação de CEPs
- Consulta de endereços através do ViaCEP
- Cálculo automático da distância rodoviária
- Estimativa da duração da viagem
- Estimativa de pedágios
- Cálculo de frete por quilometragem e número de eixos
- Aplicação de custo de carga e descarga
- Validação de urgência e data limite
- Cálculo do valor final da cotação
- Contrato de resposta com Pydantic
- Documentação automática com Swagger/OpenAPI
- Endpoint de health check
- Testes automatizados com Pytest
- Integrações externas desacopladas em services
- Estrutura preparada para deploy na Vercel
- Arquitetura preparada para integração com agentes de IA
O fluxo principal da aplicação é:
Cliente / Agente
│
▼
POST /cotacao
│
▼
Validação Pydantic
│
▼
Validação dos CEPs
│
▼
ViaCEP
│
▼
Google Routes API
│ │
▼ ▼
Distância Duração
│
└──────► Pedágio estimado
│
▼
Motor de cálculo
│
▼
Tabela de frete
│
▼
Frete base
│
▼
Frete base + Pedágio
│
▼
Cotação final
A responsabilidade de calcular distância, duração e estimativa de pedágio fica no backend.
O consumidor da API não precisa informar manualmente a quilometragem da rota.
- Python 3.12+
- FastAPI
- Pydantic
- Uvicorn
- HTTPX
- python-dotenv
- Pytest
- ViaCEP
- Google Routes API
- Git / GitHub
- Vercel
frete-api/
│
├── api/
│ └── index.py
│
├── app/
│ ├── data/
│ │ └── tabela_frete.json
│ │
│ ├── models/
│ │ ├── cotacao.py
│ │ └── cotacao_response.py
│ │
│ ├── routes/
│ │ └── cotacao.py
│ │
│ ├── services/
│ │ ├── calculo_frete_service.py
│ │ ├── cep_service.py
│ │ ├── cotacao_service.py
│ │ └── rota_service.py
│ │
│ ├── config.py
│ └── main.py
│
├── tests/
│ ├── test_calculo_frete.py
│ ├── test_cotacao_endpoint.py
│ └── test_cotacao_model.py
│
├── .gitignore
├── README.md
└── requirements.txt
O cálculo do frete base utiliza a seguinte regra:
Frete base =
(distância em km × coeficiente por eixo)
+ custo de carga/descarga
Distância: 500 km
Número de eixos: 3
Coeficiente: R$ 5,0977/km
Carga/descarga: R$ 541,86
Cálculo do deslocamento:
500 × 5,0977
= R$ 2.548,85
Adicionando carga e descarga:
R$ 2.548,85 + R$ 541,86
= R$ 3.090,71
A cotação final considera também a estimativa de pedágio:
Cotação final =
Frete base + Pedágio estimado
Os valores de pedágio são obtidos através da Google Routes API.
Esses valores são tratados pela aplicação como estimativas.
Eles não devem ser interpretados como garantia do valor efetivamente cobrado para veículos comerciais, pois tarifas reais podem variar conforme:
- categoria do veículo;
- número de eixos;
- concessionária;
- praça de pedágio;
- rota efetivamente utilizada;
- alterações tarifárias.
Uma integração especializada em pedágios para veículos comerciais poderá substituir essa fonte em versões futuras.
POST /cotacao{
"cep_origem": "30130-010",
"cep_destino": "01001-000",
"peso_total_kg": 15000,
"valor_declarado": 45000,
"quantidade_volumes": 500,
"numero_eixos": 3,
"urgencia": "normal",
"data_limite": null
}A quilometragem não precisa ser informada.
A própria API determina a distância rodoviária entre origem e destino.
{
"origem": {
"cep": "30130-010",
"logradouro": "Praça Sete de Setembro",
"bairro": "Centro",
"cidade": "Belo Horizonte",
"estado": "MG"
},
"destino": {
"cep": "01001-000",
"logradouro": "Praça da Sé",
"bairro": "Sé",
"cidade": "São Paulo",
"estado": "SP"
},
"carga": {
"peso_total_kg": 15000,
"valor_declarado": 45000,
"quantidade_volumes": 500,
"numero_eixos": 3
},
"rota": {
"distancia_km": 583.22,
"duracao_minutos": 461,
"pedagios": {
"valor_estimado": 25.6,
"moeda": "BRL",
"fonte": "Google Routes"
}
},
"calculo_frete": {
"tabela": {
"versao": "2026-07-16",
"fonte": "Tabela ANTT fornecida pela logística",
"vigencia_inicio": "2026-07-16"
},
"quilometragem": 583.22,
"numero_eixos": 3,
"coeficiente_km": 5.0977,
"custo_deslocamento": 2973.08,
"custo_carga_descarga": 541.86,
"valor_total_frete": 3514.94
},
"resumo_cotacao": {
"frete_base": 3514.94,
"pedagio_estimado": 25.6,
"valor_total_cotacao": 3540.54,
"moeda": "BRL"
},
"prazo": {
"urgencia": "normal",
"data_limite": null
},
"status": "Cotação calculada com sucesso"
}git clone https://github.com/Eubastosdev/frete-api.git
cd frete-apipy -3.12 -m venv .venv
.\.venv\Scripts\Activate.ps1python3 -m venv .venv
source .venv/bin/activatepython -m pip install -r requirements.txtCrie um arquivo:
.env
na raiz do projeto.
Adicione:
GOOGLE_MAPS_API_KEY=SUA_CHAVE_AQUIA chave precisa possuir acesso à Google Routes API.
Nunca versione o arquivo
.env, API Keys, tokens ou outras credenciais.
Opcionalmente, utilize um .env.example:
GOOGLE_MAPS_API_KEY=Execute:
python -m uvicorn app.main:app --reloadA API estará disponível em:
http://127.0.0.1:8000
A documentação interativa pode ser acessada em:
http://127.0.0.1:8000/docs
O schema OpenAPI está disponível em:
http://127.0.0.1:8000/openapi.json
Esse schema pode ser utilizado por aplicações e agentes para compreender o contrato da API.
GET /healthResposta esperada:
{
"status": "ok"
}Execute:
python -m pytest -vA suíte atual testa:
- cálculo de frete;
- cálculo de 500 km com veículo de 3 eixos;
- validação de urgência;
- obrigatoriedade de data para cargas urgentes;
- validação de peso;
- validação de número de eixos;
- endpoint completo de cotação;
- cálculo do valor final;
- integração entre rota, frete e pedágio utilizando mocks.
As APIs externas são simuladas nos testes do endpoint.
Isso evita:
- dependência de conexão com a internet;
- consumo desnecessário da Google Routes API;
- instabilidade causada por serviços externos.
Resultado validado durante o desenvolvimento:
7 passed
O projeto possui um entrypoint específico para execução na Vercel:
api/
└── index.py
O arquivo expõe a aplicação FastAPI:
from app.main import appIsso permite manter a implementação principal em:
app/main.py
sem acoplar a lógica da aplicação ao provedor de hospedagem.
Importe o repositório GitHub para a Vercel.
Configure:
Application Preset: FastAPI
Root Directory: ./
Em:
Project Settings
→ Environment Variables
adicione:
GOOGLE_MAPS_API_KEY
com sua chave real da Google Routes API.
A chave deve existir somente como variável de ambiente e nunca dentro do código-fonte.
Após a publicação, valide:
/health
Depois:
/docs
E:
/openapi.json
Por último, realize uma requisição:
POST /cotacaopara validar as integrações externas no ambiente publicado.
O projeto não deve versionar:
.env
.venv/
venv/
__pycache__/
.pytest_cache/
.vscode/
*.pyc
*.log
Credenciais devem ser fornecidas exclusivamente através de variáveis de ambiente.
Responsável pela validação dos CEPs e obtenção dos dados de endereço utilizados pela aplicação.
Responsável por fornecer:
- distância rodoviária;
- duração estimada;
- estimativa de pedágios.
A API foi estruturada para funcionar como uma camada de regras de negócio para agentes de IA.
O agente não precisa executar diretamente:
- validação de CEP;
- cálculo de distância;
- cálculo do frete;
- aplicação dos coeficientes;
- estimativa de pedágios;
- soma da cotação.
O fluxo esperado é:
Usuário
│
▼
Agente de IA
│
▼
Frete API
│
├── valida dados
├── valida CEPs
├── calcula rota
├── estima pedágio
├── calcula frete
└── calcula total
│
▼
Resposta estruturada
│
▼
Agente
│
▼
Usuário
Isso mantém as regras críticas de negócio centralizadas no backend.
- Estrutura inicial em FastAPI
- Validação de dados com Pydantic
- Validação de CEP
- Integração com ViaCEP
- Cálculo automático de distância
- Cálculo de duração
- Integração com Google Routes
- Estimativa de pedágios
- Cálculo de frete por número de eixos
- Cálculo da cotação final
- Response model
- Health check
- Testes automatizados
- Versionamento no GitHub
- Deploy na Vercel
- Integração completa com agente de IA
- Autenticação da API
- Logs estruturados
- Histórico de cotações
- Persistência em banco de dados
- Fonte especializada de pedágios para veículos comerciais
- Atualização automatizada da tabela de frete
- Monitoramento e observabilidade
A Frete API foi desenvolvida para centralizar cálculos e validações relacionados à cotação de frete rodoviário.
O objetivo é permitir que sistemas, aplicações ou agentes de IA enviem apenas os dados essenciais da carga e recebam uma cotação estruturada e reproduzível.
A arquitetura mantém as regras de negócio dentro da API, evitando que consumidores externos precisem reproduzir a lógica de cálculo.