i-go API

Guia da API i-go

A API do i-go busca endereços e lugares por nome, calcula rotas e matrizes de tempo e distância de carro, desenha o mapa com a identidade do i-go e planeja turnos com corridas agrupadas, no Brasil inteiro. Os dados vêm do OpenStreetMap, e os motores rodam em servidores próprios.

Este guia explica o que a especificação não cobre: cobertura, limites, erros, receitas prontas e como comparar os resultados com o Google. A lista completa de campos de cada rota está na referência da API.

Endereço da APIhttps://igo-api.dev.brigtec.com.br
Referência interativa/docs/referencia
Especificação OpenAPI 3.1/docs/openapi.yaml · /docs/openapi.json
Coleção do Postman/docs/i-go.postman_collection.json
Este guia em PDF/docs/i-go-api.pdf
Página de exemplo (mapa, busca, rota e modo viagem)/docs/exemplo

Ambiente de testes. Este endereço é o ambiente de desenvolvimento: não há acordo de disponibilidade, e o dado é atualizado sem aviso (a versão em uso vem em toda resposta, em meta.data_version). As rotas que ainda estão sob /v1/experimental/ (estações por nome e agrupamento) podem mudar de formato ou sair.

Primeiros passos

Você precisa de uma credencial (igo_…), entregue por quem administra o i-go. Ela vai no cabeçalho Authorization de toda chamada.

  1. Confira a credencial e a área atendida:
curl -s https://igo-api.dev.brigtec.com.br/v1/coverage \
  -H "Authorization: Bearer $IGO_CHAVE"
  1. Busque um lugar por nome:
curl -s "https://igo-api.dev.brigtec.com.br/v1/search?q=mercado%20central&lat=-7.12&lon=-34.88&limit=3" \
  -H "Authorization: Bearer $IGO_CHAVE"
  1. Calcule uma rota entre dois pontos:
curl -s https://igo-api.dev.brigtec.com.br/v1/route \
  -H "Authorization: Bearer $IGO_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{"points":[{"lat":-7.1195,"lon":-34.8450},{"lat":-7.1469,"lon":-34.7975}],"geometry":"none"}'

Resposta:

{
  "data": { "criterion": "fastest", "duration_s": 1391.4, "distance_m": 9335.3 },
  "meta": {
    "coverage": "br",
    "data_version": "2026-11-04.3",
    "overlay_cycle": "none",
    "degraded": false,
    "attribution": "© OpenStreetMap contributors",
    "request_id": "392ab16a603f282034a604b4"
  }
}

Na referência, o botão Authorize recebe a credencial e cada rota ganha um Try it out que chama a API de verdade. A credencial fica só na aba aberta; ao fechar, é esquecida.

Autenticação

EscopoRotas
coverageGET /v1/coverage
searchGET /v1/search, GET /v1/reverse
routePOST /v1/route
matrixPOST /v1/matrix
poolingPOST /v1/experimental/pooling/plan
nearestPOST /v1/nearest
stationsGET /v1/experimental/stations
tilesGET /v1/tiles/{z}/{x}/{y}, GET /v1/styles/{nome}, GET /v1/fonts/{fonte}/{faixa}, GET /v1/sprites/{arquivo}, GET /v1/highlights

Pedir uma rota fora dos escopos da credencial dá 403 forbidden_scope, com o escopo que faltou no detail. Credencial perdida ou exposta: avise quem a entregou, para que seja revogada e outra emitida.

No navegador. A API responde a páginas de qualquer origem (CORS), com a credencial no cabeçalho, nunca em cookie. Mas o que roda no navegador fica visível para quem abre a página: credencial usada ali deve ter só os escopos de que a tela precisa (em geral tiles e search) e uma quota baixa. Rota, matriz e agrupamento ficam melhor no seu servidor, com outra credencial.

Convenções

Cobertura e dados

Limites e quota

LimiteValor
Requisições por credencial20 por segundo, com rajada de 40
Pontos em /v1/route2 a 25
Matriz (/v1/matrix)até 25 origens × 25 destinos
Busca (q)3 a 120 caracteres; até 10 resultados (limit, padrão 5)
Agrupamentoaté 40 passageiros, 20 veículos, capacidade 8 por veículo
Corpo da requisição256 KiB
Tempo máximo de uma chamada15 segundos

Os limites em vigor também vêm em GET /v1/coverage (data.limits). Ao passar da quota, a resposta é 429 rate_limited com o cabeçalho Retry-After (em segundos): espere e repita. Para comparações em lote, mantenha um ritmo de até 10 chamadas por segundo por credencial. Assim sobra folga para repetições.

Erros

Todo erro segue a RFC 9457 (Content-Type: application/problem+json):

{
  "type": "https://igo-api.dev.brigtec.com.br/erros/out_of_coverage",
  "title": "Ponto fora da área atendida",
  "status": 422,
  "code": "out_of_coverage",
  "detail": "Fora de br.",
  "field": "points[1]",
  "request_id": "1f0c2e9a7b3d4c5e6f708192"
}

Decida pelo campo code: title e detail são texto para pessoas e podem mudar. Quando o problema é um campo, field diz qual (points[1], q…).

codeHTTPO que significaO que fazer
invalid_input400Corpo ou parâmetro inválido: JSON malformado, campo obrigatório ausente, valor fora da faixaCorrija o campo indicado em field; não repita igual
unauthenticated401Credencial ausente, inválida ou revogadaConfira o cabeçalho Authorization: Bearer igo_…
forbidden_scope403A credencial não tem o escopo da rotaPeça o escopo a quem administra o i-go
not_found404Rota inexistente, ou nada encontrado perto do ponto (reverso)Confira o caminho; no reverso, o ponto não tem endereço por perto
limit_exceeded413Pontos, matriz ou corpo acima do limiteDivida a chamada em partes menores
out_of_coverage422Ponto fora da área atendidaConfira a ordem lat/lon e a área em /v1/coverage
no_route422Não há caminho de carro entre os pontos (ilha, área sem rua)Aproxime o ponto de uma rua
rate_limited429Quota da credencial excedidaEspere o Retry-After e repita
unavailable503Motor de rotas ou de busca temporariamente foraRepita depois de alguns segundos, com espera crescente
internal500Erro inesperado do i-goRepita uma vez; persistindo, relate com o request_id

Só vale repetir a mesma chamada em rate_limited, unavailable e internal. Nos outros casos, a resposta seria a mesma.

Receitas

Busca de lugares e endereços por nome

GET /v1/search?q=… procura ruas, bairros, cidades e lugares (comércio, praças, órgãos públicos) dentro da área atendida.

curl -s "https://igo-api.dev.brigtec.com.br/v1/search?q=mercado%20central&lat=-7.12&lon=-34.88&limit=2" \
  -H "Authorization: Bearer $IGO_CHAVE"
{"data":{"results":[
  {"name":"Mercado Central","address":"Rua Francisca Moura, Centro, João Pessoa, Paraíba",
   "address_parts":{"street":"Rua Francisca Moura","neighborhood":"Centro","city":"João Pessoa",
                    "state":"Paraíba","state_code":"PB","country_code":"BR"},
   "kind":"Lugar","match":"place","location":{"lat":-7.1237648,"lon":-34.879850087839245},"straight_line_m":419},
  {"name":"Mercado Central","address":"Rua Doutor Francisco Montenegro, Alagoa Grande, Alagoa Grande, Paraíba",
   "address_parts":{"street":"Rua Doutor Francisco Montenegro","neighborhood":"Alagoa Grande","city":"Alagoa Grande",
                    "state":"Paraíba","state_code":"PB","country_code":"BR"},
   "kind":"Lugar","match":"place","location":{"lat":-7.0352951,"lon":-35.6336183},"straight_line_m":83692}]},
 "meta":{…}}

Endereço de um ponto (reverso)

GET /v1/reverse?lat=…&lon=… devolve o lugar ou o endereço mais próximo do ponto, com os mesmos campos da busca (address_parts inclusive). Sem nada por perto, a resposta é 404 not_found.

curl -s "https://igo-api.dev.brigtec.com.br/v1/reverse?lat=-7.1153&lon=-34.8641" \
  -H "Authorization: Bearer $IGO_CHAVE"
{"data":{"place":{"name":"La Casserolle","address":"Praça Assis Chateaubriand, 48, Jardim 13 de Maio, João Pessoa, Paraíba",
  "address_parts":{"street":"Praça Assis Chateaubriand","house_number":"48","neighborhood":"Jardim 13 de Maio",
                   "city":"João Pessoa","state":"Paraíba","state_code":"PB","country_code":"BR"},
  "kind":"Restaurante","match":"place","location":{"lat":-7.11549495,"lon":-34.863966513730176}}},"meta":{…}}

Rota

POST /v1/route calcula a rota de carro pelos pontos points, na ordem dada (origem, paradas, destino; até 25).

curl -s https://igo-api.dev.brigtec.com.br/v1/route \
  -H "Authorization: Bearer $IGO_CHAVE" -H "Content-Type: application/json" \
  -d '{"points":[{"lat":-7.1195,"lon":-34.8450},{"lat":-7.1469,"lon":-34.7975}],"segment_durations":true}'

Matriz de tempos e distâncias

POST /v1/matrix dá o tempo e a distância de cada origem (sources) para cada destino (destinations), até 25 × 25. A célula [i][j] vai da origem i ao destino j, e null quer dizer sem rota. Vem com o mesmo criterion da rota (fastest).

curl -s https://igo-api.dev.brigtec.com.br/v1/matrix \
  -H "Authorization: Bearer $IGO_CHAVE" -H "Content-Type: application/json" \
  -d '{"sources":[{"lat":-7.1195,"lon":-34.8450}],
       "destinations":[{"lat":-7.1469,"lon":-34.7975},{"lat":-7.0920,"lon":-34.8330}]}'
{"data":{"durations_s":[[1391.4,617.4]],"distances_m":[[9335.3,4758.8]]},"meta":{…}}

Para mais de 25 pontos, divida em blocos de até 25 × 25 e junte as partes. Cada bloco é uma chamada e conta na quota.

Agrupamento de corridas (planejamento de turno)

POST /v1/experimental/pooling/plan distribui os passageiros de um turno entre os veículos, com a ordem e o horário de cada parada.

curl -s https://igo-api.dev.brigtec.com.br/v1/experimental/pooling/plan \
  -H "Authorization: Bearer $IGO_CHAVE" -H "Content-Type: application/json" \
  -d '{"direction":"inbound","common":{"lat":-7.1760,"lon":-34.9040},
       "arrive_by":"2026-10-28T07:00:00-03:00",
       "fleet":{"vehicles":2,"capacity":4,"base":{"lat":-7.1450,"lon":-34.8800}},
       "fare":{"base":5,"per_km":2.5,"per_min":0.4,"charge_from":"base"},
       "requests":[{"id":"p1","location":{"lat":-7.1195,"lon":-34.8450}},
                   {"id":"p2","location":{"lat":-7.1300,"lon":-34.8600}},
                   {"id":"p3","location":{"lat":-7.0920,"lon":-34.8330}}]}'

Resultado resumido: duas viagens (p1 e p2 no veículo 1, p3 no veículo 2), custo total de 181,63 contra 236,38 com cada um no seu carro (savings_pct 23,2). A resposta completa está na referência. Um turno de 40 passageiros leva cerca de 1,3 segundo.

Mapa com a identidade do i-go

O estilo igo (GET /v1/styles/igo) é o mapa do i-go pronto para o MapLibre GL JS (ou qualquer leitor de estilo Mapbox GL versão 8): tiles, rótulos, ícones e os destaques da cidade. As URLs dentro do estilo apontam para esta API e exigem a mesma credencial, então cada pedido do mapa leva o cabeçalho Authorization (transformRequest):

const API = "https://igo-api.dev.brigtec.com.br";
const mapa = new maplibregl.Map({
  container: "mapa",
  style: API + "/v1/styles/igo",
  center: [-34.88, -7.12], zoom: 12,
  transformRequest: (url) => url.startsWith(API + "/v1/")
    ? { url, headers: { Authorization: "Bearer " + CHAVE } } : { url },
});

Para desenhar a rota por cima, peça POST /v1/route (a geometria vem em GeoJSON) e acrescente uma camada de linha:

mapa.on("load", async () => {
  const r = await fetch(API + "/v1/route", { method: "POST",
    headers: { Authorization: "Bearer " + CHAVE, "Content-Type": "application/json" },
    body: JSON.stringify({ points: [origem, destino] }) }).then((x) => x.json());
  mapa.addSource("rota", { type: "geojson", data: r.data.geometry });
  mapa.addLayer({ id: "rota", type: "line", source: "rota",
    layout: { "line-join": "round", "line-cap": "round" },
    paint: { "line-color": "#1c7a9c", "line-width": 6 } });
});

Modo viagem

O modo viagem (acompanhar a pessoa ao longo da rota, com o tempo que falta) é feito no aplicativo, com as rotas que já existem; não há rota própria para ele. A receita, que é a do aplicativo do i-go:

  1. Rota com tempo por trecho. POST /v1/route com "segment_durations": true. Vêm a linha (geometry) e o tempo de cada trecho entre dois pontos dela (segment_durations_s).
  2. Onde a pessoa está na rota. A cada posição do GPS, projete o ponto no segmento mais próximo da linha (não no vértice mais próximo: num trecho reto e longo, o vértice fica longe). Procure só numa janela à frente da última posição, porque a rota que vai e volta passa perto de si mesma.
  3. Quanto falta. O tempo é o resto do trecho atual mais a soma dos trechos seguintes; a distância é o resto da linha.
  4. Saiu da rota. Mais longe da linha que 60 m (ou 1,5 × a precisão do GPS) em três posições seguidas: peça uma rota nova a partir de onde a pessoa está.
  5. Chegou. A 40 m do destino, encerre.
  6. Tela acesa: peça a trava de tela (navigator.wakeLock) enquanto durar a viagem.

As funções dos passos 2 e 3, sem dependência nenhuma, estão em /docs/rota.js (sobreRota e faltaS), as mesmas que o aplicativo do i-go usa e testa. A página de exemplo mostra o modo viagem funcionando.

Não há instrução de manobra ("vire à direita em 200 m") nem voz: a rota traz a linha e os tempos. O tempo é o do modelo de velocidades, sem trânsito ao vivo. Cada recálculo é uma chamada de rota e conta na quota.

Estações de recarga

POST /v1/nearest (estações mais próximas por tempo de rota) e GET /v1/experimental/stations (estações por nome) estão descritas na referência. Elas exigem os escopos nearest e stations, que não vêm nas credenciais de teste de busca e roteamento.

Comparando com o Google

Cada rota do i-go tem uma equivalente no Google Maps Platform. Para que a comparação seja justa, as duas chamadas devem receber a mesma entrada e medir a mesma coisa.

O que se comparai-goGoogle
Busca por nome, com autocompletarGET /v1/searchPlaces API (New): places:autocomplete ou places:searchText
Endereço por textoGET /v1/searchGeocoding API (geocode/json?address=)
Endereço de um pontoGET /v1/reverseGeocoding API (geocode/json?latlng=)
RotaPOST /v1/routeRoutes API directions/v2:computeRoutes
MatrizPOST /v1/matrixRoutes API distanceMatrix/v2:computeRouteMatrix
Agrupamento de turnoPOST /v1/experimental/pooling/planRoute Optimization API (optimizeTours), com outro modelo de entrada

Rota e matriz: mesma entrada, sem trânsito

Exemplo de rota no Google, equivalente à receita acima:

curl -s -X POST https://routes.googleapis.com/directions/v2:computeRoutes \
  -H "Content-Type: application/json" \
  -H "X-Goog-Api-Key: $GOOGLE_CHAVE" \
  -H "X-Goog-FieldMask: routes.duration,routes.distanceMeters" \
  -d '{"origin":{"location":{"latLng":{"latitude":-7.1195,"longitude":-34.8450}}},
       "destination":{"location":{"latLng":{"latitude":-7.1469,"longitude":-34.7975}}},
       "travelMode":"DRIVE","routingPreference":"TRAFFIC_UNAWARE"}'

O que registrar por par de pontos:

Se houver o tempo real de uma viagem feita no trajeto, ele é a melhor referência para os dois.

Busca: uma lista de casos com a resposta certa

Monte uma lista de buscas reais, cada uma com o lugar que deveria aparecer, e rode a lista nos dois. Para cada busca, registre:

Mande o mesmo ponto de referência nos dois: lat/lon no i-go, locationBias no Google. Inclua buscas digitadas pela metade ("interm", "av epit") e com erro de digitação, porque o autocompletar é onde mais se nota diferença.

O que já se sabe antes de começar

Mudanças

Privacidade

Suporte

Ao relatar um problema ou um resultado estranho, envie:

Com isso, a chamada é localizada no registro de uso sem que você precise mandar mais nada.