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.

Base URL: https://api.vitaroute.ai
  1. Crie uma conta gratuita
  2. Gere uma chave API no Painel
  3. 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.

X-Api-Key: vtr_live_xxxxxxxxxxxxxxxxxxxx

⚠️ Nota de segurança

Não inclua suas chaves API no código-fonte. Use variáveis de ambiente.

Endpoints

POST/api/optimization/optimize

Otimização avançada de rotas. As rotas mais eficientes são calculadas avaliando 20+ parâmetros com o algoritmo proprietário RL da vitaRoute.

POST/api/route/calculate

Cálculo básico de rotas. Plano de rota simples baseado em clusters.

POST/api/route/cluster-stops

Agrupa paradas existentes de acordo com a capacidade do veículo.

Esquema de requisição

CampoTipoDescrição
facilityLatfloatCoordenada de latitude da instalação/depósito
facilityLngfloatCoordenada de longitude da instalação/depósito
totalCapacityintCapacidade máxima por veículo (padrão: 14)
vehicleCountintSempre 0 — a quantidade de veículos é determinada automaticamente
maxWalkingint?Distância máxima a pé (metros, padrão: 500)
maxDurationint?Duração máxima da rota (minutos, padrão: 90)
maxClusterDiameterKmfloatDiâmetro geográfico máximo das paradas no mesmo cluster (km, padrão: 25)
minSavingsKmfloatEconomia mínima de distância necessária para mesclar uma parada (km, padrão: 0,3)
maxDetourFactorfloatTaxa máxima de desvio ao adicionar uma parada a uma rota existente (padrão: 0,6)
minDistrictPassengersintNúmero mínimo de passageiros para criar uma rota específica de distrito (padrão: 8)
tripDirectionstringDireção da viagem: 'to_facility' (para o depósito) ou 'from_facility' (do depósito)
arrivalTimeAtDepotstring?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.
useDistanceMatrixbooleanUsar a API Distance Matrix do Google Maps para distâncias de estrada precisas (padrão: false)
nodesNodeInput[]Lista de pessoal/localizações a otimizar

NodeInput

CampoTipoDescrição
idstringIdentificador único de pessoal/localização
namestringNome do pessoal
latitudefloatCoordenada de latitude
longitudefloatCoordenada de longitude
districtstring?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

PlanReq./mêsNós máx.Simultâneo
Free5011
Starter1,0001005
Growth5,00050020
EnterpriseIlimitadoIlimitadoPersonalizado

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

400

Bad Request

JSON inválido ou campo obrigatório ausente

401

Unauthorized

Chave API ausente ou inválida

403

Forbidden

O limite do seu plano foi excedido

429

Too Many Requests

Limite de taxa excedido

500

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.

Base URL: https://api.vitaroute.ai/api/integration

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.

GET/api/integration/projects

Lista todos os projetos da chave API.

POST/api/integration/projects

Cria um novo projeto (localização, modelo de otimização, informação de viagens).

PUT/api/integration/projects/{projectId}

Atualiza parcialmente um projeto — apenas os campos fornecidos mudam.

DELETE/api/integration/projects/{projectId}

Elimina permanentemente um projeto e todos os seus dados (passageiros, turnos, execuções, planos). Irreversível.

CampoTipoDescrição
namestringNome do projeto
facilityLatfloatLatitude da instalação
facilityLngfloatLongitude da instalação
descriptionstring?Descrição (opcional)
countryCodestring?Código do país, p. ex. "TR" (opcional)
iconstring?Chave do ícone da instalação (opcional)
optimizationModelstring"personnel" (transporte de pessoal) | "school" (transporte escolar)
passengerModestring"fixed" (viagens fixas) | "shift" (por turnos) — apenas relevante no modelo personnel
tripsTrip[]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.

GET/api/integration/shifts?projectId=

Lista todos os turnos de um projeto.

POST/api/integration/shifts

Adiciona um novo turno (é necessário pelo menos hora de entrada ou saída).

PUT/api/integration/shifts/{shiftId}

Atualiza parcialmente um turno.

DELETE/api/integration/shifts/{shiftId}

Elimina um turno.

CampoTipoDescrição
projectIdstringId do projeto ao qual adicionar o turno
namestringNome do turno, p. ex. "Manhã"
entryTimestring?Hora de entrada, "HH:mm" (opcional)
exitTimestring?Hora de saída, "HH:mm" (opcional)
nextDayExitbooleantrue = 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.

GET/api/integration/passengers?projectId=

Lista todos os passageiros de um projeto.

POST/api/integration/passengers

Adiciona um novo passageiro (nome e localização obrigatórios).

PUT/api/integration/passengers/{nodeId}

Atualiza parcialmente um passageiro.

DELETE/api/integration/passengers/{nodeId}

Elimina um passageiro.

CampoTipoDescrição
projectIdstringId do projeto ao qual adicionar o passageiro
namestringNome do passageiro
latitudefloatLatitude
longitudefloatLongitude
employeeNostring?Número de matrícula/aluno — chave natural para corresponder aos seus próprios registos (opcional)
departmentstring?Departamento (opcional)
genderstring?"male" | "female" (opcional)
specialNeedsbooleanNecessidades especiais (padrão: false)
addressstring?Texto do endereço (opcional)
citystring?Cidade (opcional)
districtstring?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.

GET/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.

PUT/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

CampoTipoDescrição
routeNamestring?Nome da rota, p. ex. "Rota 1"
colorstring?Cor de exibição no mapa, hex (opcional)
stopsStop[]Paragens, POR ORDEM DA ROTA

stops[] — Stop

CampoTipoDescrição
latfloatLatitude da paragem
lngfloatLongitude da paragem
stopNamestring?Nome da paragem (opcional)
passengersPassenger[]Passageiros atribuídos a esta paragem

passengers[] — Passenger

CampoTipoDescrição
idstringId de passageiro existente (deve corresponder exatamente ao da resposta GET) — OBRIGATÓRIO
namestring?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.