Documentação da API
Guia de integração da API vitaRoute
Início rápido
A API vitaRoute é baseada em REST e trabalha com JSON. Todas as requisições devem ser enviadas via HTTPS.
- Crie uma conta gratuita
- Gere uma chave API no Painel
- Envie sua primeira requisição de otimização
Autenticação
Todas as requisições API requerem autenticação via o cabeçalho X-Api-Key.
⚠️ Nota de segurança
Não inclua suas chaves API no código-fonte. Use variáveis de ambiente.
Endpoints
/api/optimization/optimizeOtimização avançada de rotas. As rotas mais eficientes são calculadas avaliando 20+ parâmetros com o algoritmo proprietário RL da vitaRoute.
/api/route/calculateCálculo básico de rotas. Plano de rota simples baseado em clusters.
/api/route/cluster-stopsAgrupa paradas existentes de acordo com a capacidade do veículo.
Esquema de requisição
| Campo | Tipo | Descrição |
|---|---|---|
facilityLat | float | Coordenada de latitude da instalação/depósito |
facilityLng | float | Coordenada de longitude da instalação/depósito |
totalCapacity | int | Capacidade máxima por veículo (padrão: 14) |
vehicleCount | int | Sempre 0 — a quantidade de veículos é determinada automaticamente |
maxWalking | int? | Distância máxima a pé (metros, padrão: 500) |
maxDuration | int? | Duração máxima da rota (minutos, padrão: 90) |
maxClusterDiameterKm | float | Diâmetro geográfico máximo das paradas no mesmo cluster (km, padrão: 25) |
minSavingsKm | float | Economia mínima de distância necessária para mesclar uma parada (km, padrão: 0,3) |
maxDetourFactor | float | Taxa máxima de desvio ao adicionar uma parada a uma rota existente (padrão: 0,6) |
minDistrictPassengers | int | Número mínimo de passageiros para criar uma rota específica de distrito (padrão: 8) |
tripDirection | string | Direção da viagem: 'to_facility' (para o depósito) ou 'from_facility' (do depósito) |
arrivalTimeAtDepot | string? | Horário de chegada dos veículos ao depósito (ISO 8601 UTC). Se fornecido, a velocidade é calculada com base no perfil de tráfego; caso contrário, 28 km/h fixo é usado. |
useDistanceMatrix | boolean | Usar a API Distance Matrix do Google Maps para distâncias de estrada precisas (padrão: false) |
nodes | NodeInput[] | Lista de pessoal/localizações a otimizar |
NodeInput
| Campo | Tipo | Descrição |
|---|---|---|
id | string | Identificador único de pessoal/localização |
name | string | Nome do pessoal |
latitude | float | Coordenada de latitude |
longitude | float | Coordenada de longitude |
district | string? | Nome do distrito (opcional, para regras de distrito) |
Esquema de resposta
{
"routes": [
{
"routeId": "uuid",
"routeName": "GEBZE 1",
"totalDuration": 45,
"totalDistance": 28500,
"nodeCount": 14,
"totalLoad": 14,
"stops": [
{
"stopIndex": 0,
"latitude": 40.8962,
"longitude": 29.1882,
"nodes": [
{ "id": "1", "name": "Ali Yilmaz" }
]
}
],
"routeCenter": {
"latitude": 40.9,
"longitude": 29.2
}
}
]
}Limites de taxa
| Plan | Req./mês | Nós máx. | Simultâneo |
|---|---|---|---|
| Free | 50 | 1 | 1 |
| Starter | 1,000 | 100 | 5 |
| Growth | 5,000 | 500 | 20 |
| Enterprise | Ilimitado | Ilimitado | Personalizado |
Quando o limite de taxa é excedido, uma resposta 429 Too Many Requests é retornada. O cabeçalho Retry-After especifica o tempo de espera.
Códigos de erro
Bad Request
JSON inválido ou campo obrigatório ausente
Unauthorized
Chave API ausente ou inválida
Forbidden
O limite do seu plano foi excedido
Too Many Requests
Limite de taxa excedido
Internal Server Error
Erro do servidor, entre em contato com o suporte
Exemplos de código
curl
curl -X POST https://api.vitaroute.ai/api/optimization/optimize \
-H "Content-Type: application/json" \
-H "X-Api-Key: vtr_live_your_key_here" \
-d '{
"facilityLat": 40.9139,
"facilityLng": 29.1167,
"totalCapacity": 16,
"vehicleCount": 0,
"maxWalking": 500,
"maxDuration": 90,
"maxClusterDiameterKm": 25,
"minSavingsKm": 0.3,
"maxDetourFactor": 0.6,
"minDistrictPassengers": 8,
"tripDirection": "to_facility",
"arrivalTimeAtDepot": "2025-01-15T05:00:00Z",
"useDistanceMatrix": false,
"nodes": [
{ "id": "1", "name": "Ali Yilmaz", "latitude": 40.8962, "longitude": 29.1882, "district": "Kadikoy" },
{ "id": "2", "name": "Ayse Demir", "latitude": 40.9278, "longitude": 29.3125, "district": "Gebze" }
]
}'python
import requests
response = requests.post(
"https://api.vitaroute.ai/api/optimization/optimize",
headers={
"Content-Type": "application/json",
"X-Api-Key": "vtr_live_your_key_here"
},
json={
"facilityLat": 40.9139,
"facilityLng": 29.1167,
"totalCapacity": 16,
"vehicleCount": 0,
"maxWalking": 500,
"maxDuration": 90,
"maxClusterDiameterKm": 25,
"minSavingsKm": 0.3,
"maxDetourFactor": 0.6,
"minDistrictPassengers": 8,
"tripDirection": "to_facility",
"arrivalTimeAtDepot": "2025-01-15T05:00:00Z",
"useDistanceMatrix": False,
"nodes": [
{"id": "1", "name": "Ali Yilmaz", "latitude": 40.8962, "longitude": 29.1882}
]
}
)
data = response.json()
for route in data["routes"]:
print(f"{route['routeName']}: {route['nodeCount']} stops, {route['totalDuration']} min")javascript
const response = await fetch(
"https://api.vitaroute.ai/api/optimization/optimize",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Api-Key": "vtr_live_your_key_here",
},
body: JSON.stringify({
facilityLat: 40.9139,
facilityLng: 29.1167,
totalCapacity: 16,
vehicleCount: 0,
maxWalking: 500,
maxDuration: 90,
maxClusterDiameterKm: 25,
minSavingsKm: 0.3,
maxDetourFactor: 0.6,
minDistrictPassengers: 8,
tripDirection: "to_facility",
arrivalTimeAtDepot: "2025-01-15T05:00:00Z",
useDistanceMatrix: false,
nodes: [
{ id: "1", name: "Ali Yilmaz", latitude: 40.8962, longitude: 29.1882 },
],
}),
}
);
const { routes } = await response.json();
routes.forEach(route => {
console.log(`${route.routeName}: ${route.nodeCount} stops`);
});C#
using System.Net.Http.Json;
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-Api-Key", "vtr_live_your_key_here");
var payload = new {
facilityLat = 40.9139,
facilityLng = 29.1167,
totalCapacity = 16,
vehicleCount = 0,
maxWalking = 500,
maxDuration = 90,
maxClusterDiameterKm = 25,
minSavingsKm = 0.3,
maxDetourFactor = 0.6,
minDistrictPassengers = 8,
tripDirection = "to_facility",
arrivalTimeAtDepot = "2025-01-15T05:00:00Z",
useDistanceMatrix = false,
nodes = new[] {
new { id = "1", name = "Ali Yilmaz", latitude = 40.8962, longitude = 29.1882 }
}
};
var response = await client.PostAsJsonAsync(
"https://api.vitaroute.ai/api/optimization/optimize",
payload
);
var result = await response.Content.ReadFromJsonAsync<RouteResponse>();API de integração (integração ERP)
Uma API concebida para gerir o vitaRoute de ponta a ponta a partir da sua própria interface (por exemplo, um sistema ERP). Crie e atualize registos de projetos, turnos e passageiros, leia planos de rota finalizados e grave de volta as suas edições, tudo sem tocar na interface do extranet.
Usa a mesma autenticação (X-Api-Key); todos os endpoints estão em https://api.vitaroute.ai/api/integration.
Todos os pedidos PUT (atualização) são PARCIAIS — apenas os campos enviados no corpo mudam; os campos omitidos mantêm o valor atual.
Ao atualizar um plano, NÃO envie a geometria da rota (savedPolyline) nem a distância/duração (savedStats) — o vitaRoute calcula-os a partir da ordem das paragens via Google Directions, para que o mapa mostre sempre um percurso real e válido.
Projetos
Crie, liste, atualize e elimine projetos. Um ERP deve guardar aqui o id do projeto vitaRoute correspondente ao seu próprio registo de cliente.
/api/integration/projectsLista todos os projetos da chave API.
/api/integration/projectsCria um novo projeto (localização, modelo de otimização, informação de viagens).
/api/integration/projects/{projectId}Atualiza parcialmente um projeto — apenas os campos fornecidos mudam.
/api/integration/projects/{projectId}Elimina permanentemente um projeto e todos os seus dados (passageiros, turnos, execuções, planos). Irreversível.
| Campo | Tipo | Descrição |
|---|---|---|
name | string | Nome do projeto |
facilityLat | float | Latitude da instalação |
facilityLng | float | Longitude da instalação |
description | string? | Descrição (opcional) |
countryCode | string? | Código do país, p. ex. "TR" (opcional) |
icon | string? | Chave do ícone da instalação (opcional) |
optimizationModel | string | "personnel" (transporte de pessoal) | "school" (transporte escolar) |
passengerMode | string | "fixed" (viagens fixas) | "shift" (por turnos) — apenas relevante no modelo personnel |
trips | Trip[] | Lista de viagens (hora+direção). Pelo menos uma é obrigatória no modo fixed; ignorada no modo shift. |
Turnos
CRUD completo para registos de turno que definem horários de entrada/saída em projetos baseados em turnos.
/api/integration/shifts?projectId=Lista todos os turnos de um projeto.
/api/integration/shiftsAdiciona um novo turno (é necessário pelo menos hora de entrada ou saída).
/api/integration/shifts/{shiftId}Atualiza parcialmente um turno.
/api/integration/shifts/{shiftId}Elimina um turno.
| Campo | Tipo | Descrição |
|---|---|---|
projectId | string | Id do projeto ao qual adicionar o turno |
name | string | Nome do turno, p. ex. "Manhã" |
entryTime | string? | Hora de entrada, "HH:mm" (opcional) |
exitTime | string? | Hora de saída, "HH:mm" (opcional) |
nextDayExit | boolean | true = saída no dia seguinte (apenas relevante se exitTime for indicado) |
Passageiros
CRUD completo para registos de passageiros/alunos/colaboradores. O campo employee_no é uma chave natural opcional para o seu ERP corresponder registos pelo seu próprio número de matrícula/aluno.
/api/integration/passengers?projectId=Lista todos os passageiros de um projeto.
/api/integration/passengersAdiciona um novo passageiro (nome e localização obrigatórios).
/api/integration/passengers/{nodeId}Atualiza parcialmente um passageiro.
/api/integration/passengers/{nodeId}Elimina um passageiro.
| Campo | Tipo | Descrição |
|---|---|---|
projectId | string | Id do projeto ao qual adicionar o passageiro |
name | string | Nome do passageiro |
latitude | float | Latitude |
longitude | float | Longitude |
employeeNo | string? | Número de matrícula/aluno — chave natural para corresponder aos seus próprios registos (opcional) |
department | string? | Departamento (opcional) |
gender | string? | "male" | "female" (opcional) |
specialNeeds | boolean | Necessidades especiais (padrão: false) |
address | string? | Texto do endereço (opcional) |
city | string? | Cidade (opcional) |
district | string? | Distrito (opcional) |
Transferência de plano
Leia planos de rota finalizados filtrados por projeto/data/turno/direção; grave de volta a ordem de paragens e a atribuição de passageiros que editou.
/api/integration/plan?projectId=&dateFrom=&dateTo=&shiftName=&direction=Devolve o(s) plano(s) de rota finalizados que correspondem aos filtros de projeto/intervalo de datas/turno/direção — incluindo rotas, paragens, passageiros, distância e duração — na íntegra.
/api/integration/plan/{runId}Substitui os dados de rota/paragem/passageiro de uma execução pelas edições feitas no lado do ERP. A geometria da rota é recalculada pelo vitaRoute.
result[] — Route
| Campo | Tipo | Descrição |
|---|---|---|
routeName | string? | Nome da rota, p. ex. "Rota 1" |
color | string? | Cor de exibição no mapa, hex (opcional) |
stops | Stop[] | Paragens, POR ORDEM DA ROTA |
stops[] — Stop
| Campo | Tipo | Descrição |
|---|---|---|
lat | float | Latitude da paragem |
lng | float | Longitude da paragem |
stopName | string? | Nome da paragem (opcional) |
passengers | Passenger[] | Passageiros atribuídos a esta paragem |
passengers[] — Passenger
| Campo | Tipo | Descrição |
|---|---|---|
id | string | Id de passageiro existente (deve corresponder exatamente ao da resposta GET) — OBRIGATÓRIO |
name | string? | Nome do passageiro (apenas visualização) |
Exemplos da API de integração
GET /projects
curl https://api.vitaroute.ai/api/integration/projects \ -H "X-Api-Key: vtr_live_your_key_here"
POST /passengers
curl -X POST https://api.vitaroute.ai/api/integration/passengers \
-H "Content-Type: application/json" \
-H "X-Api-Key: vtr_live_your_key_here" \
-d '{
"projectId": "b3f1c2a4-...",
"name": "Ali Yilmaz",
"latitude": 40.8962,
"longitude": 29.1882,
"employeeNo": "EMP-00123"
}'GET /plan
curl "https://api.vitaroute.ai/api/integration/plan?projectId=b3f1c2a4-...&shiftName=Sabah&direction=to_facility" \ -H "X-Api-Key: vtr_live_your_key_here"
PUT /plan/{runId}
curl -X PUT https://api.vitaroute.ai/api/integration/plan/9e7d0f21-... \
-H "Content-Type: application/json" \
-H "X-Api-Key: vtr_live_your_key_here" \
-d '{
"result": [
{
"routeName": "Hat 1",
"color": "#1E40AF",
"stops": [
{
"lat": 40.8962, "lng": 29.1882, "stopName": "Kadikoy Iskele",
"passengers": [{ "id": "3f9a...", "name": "Ali Yilmaz" }]
}
]
}
]
}'
# Not: savedPolyline / savedStats göndermezsiniz — vitaRoute rota
# geometrisini durak sırasından kendisi hesaplar.