{"components":{"headers":{"Retry-After":{"description":"Segundos até a credencial poder chamar de novo.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifica a chamada. Pode ser enviado pelo cliente (até 64 caracteres `[A-Za-z0-9._:-]`); sem ele, o i-go gera um. Informe-o ao relatar um problema.","schema":{"type":"string"}}},"responses":{"Limite":{"content":{"application/problem+json":{"example":{"code":"rate_limited","request_id":"7e6d5c4b3a291807f6e5d4c3","status":429,"title":"Limite de requisições excedido","type":"https://igo-api.dev.brigtec.com.br/erros/rate_limited"},"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"`rate_limited`: a credencial passou de 20 requisições por segundo (rajada de 40). Espere o `Retry-After` e repita.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}}},"Problema":{"content":{"application/problem+json":{"examples":{"entradaInvalida":{"summary":"400 — campo inválido","value":{"code":"invalid_input","detail":"lat e lon são obrigatórios","field":"points[0]","request_id":"0b1c2d3e4f5a6b7c8d9e0f1a","status":400,"title":"Entrada inválida","type":"https://igo-api.dev.brigtec.com.br/erros/invalid_input"}},"semCredencial":{"summary":"401 — credencial ausente","value":{"code":"unauthenticated","detail":"Envie Authorization: Bearer \u003ccredencial\u003e.","request_id":"db22493a87d822429df74fb0","status":401,"title":"Credencial ausente","type":"https://igo-api.dev.brigtec.com.br/erros/unauthenticated"}},"semEscopo":{"summary":"403 — credencial sem o escopo do recurso","value":{"code":"forbidden_scope","detail":"escopo necessário: pooling","request_id":"5a0e8c1d2b3f4a5b6c7d8e9f","status":403,"title":"Credencial sem permissão para este recurso","type":"https://igo-api.dev.brigtec.com.br/erros/forbidden_scope"}}},"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Erro (RFC 9457). O campo `code` é o contrato; título e detalhe podem mudar. A lista de códigos está no guia (/docs#erros).","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}}}},"schemas":{"AddressParts":{"description":"O endereço em campos separados, com o que o OpenStreetMap tiver. Campo\nausente quer dizer que o dado não existe no mapa para aquele lugar; nada\né adivinhado. Quando o resultado é a própria rua, bairro ou cidade\n(`match`), o nome dele também vem no campo correspondente.\n","properties":{"city":{"description":"Município","type":"string"},"country_code":{"description":"País (ISO 3166-1 alfa-2)","example":"BR","type":"string"},"house_number":{"description":"Número da casa, como está no mapa (pode ter letra: 12A)","type":"string"},"neighborhood":{"description":"Bairro","type":"string"},"postcode":{"description":"CEP como está no mapa. Em rua longa pode ser o CEP de um trecho, não o da casa","example":"58032-100","type":"string"},"state":{"description":"Estado, por extenso","type":"string"},"state_code":{"description":"Sigla do estado (UF); só para lugares no Brasil","example":"PB","type":"string"},"street":{"description":"Logradouro","type":"string"}},"type":"object"},"Coord":{"properties":{"lat":{"maximum":90,"minimum":-90,"type":"number"},"lon":{"maximum":180,"minimum":-180,"type":"number"}},"required":["lat","lon"],"type":"object"},"CoverageData":{"properties":{"area":{"description":"Geometria GeoJSON (Polygon ou MultiPolygon)","type":"object"},"coverage":{"type":"string"},"data_version":{"type":"string"},"limits":{"properties":{"matrix_max_side":{"type":"integer"},"max_body_bytes":{"type":"integer"},"nearest_max_candidates":{"type":"integer"},"nearest_max_limit":{"type":"integer"},"route_max_points":{"type":"integer"}},"required":["route_max_points","matrix_max_side","nearest_max_limit","nearest_max_candidates","max_body_bytes"],"type":"object"},"profiles":{"items":{"$ref":"#/components/schemas/Profile"},"type":"array"}},"required":["coverage","data_version","profiles","area","limits"],"type":"object"},"Envelope":{"properties":{"data":{},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"],"type":"object"},"Highlights":{"properties":{"features":{"items":{"properties":{"geometry":{"properties":{"coordinates":{"description":"[lon, lat]","items":{"type":"number"},"maxItems":2,"minItems":2,"type":"array"},"type":{"const":"Point","type":"string"}},"type":"object"},"properties":{"properties":{"icon":{"description":"Nome do ícone no sprite basic (ex.: hospital_11)","type":"string"},"kind":{"description":"Categoria legível em português (Hospital, Shopping, Universidade…)","type":"string"},"name":{"type":"string"},"rank":{"description":"Ordem de desenho: menor = mais importante","type":"number"},"zmin":{"description":"Zoom a partir do qual o destaque aparece","maximum":13,"minimum":10,"type":"integer"}},"required":["name","kind","icon","zmin","rank"],"type":"object"},"type":{"const":"Feature","type":"string"}},"required":["type","geometry","properties"],"type":"object"},"type":"array"},"type":{"const":"FeatureCollection","type":"string"}},"required":["type","features"],"type":"object"},"LineString":{"description":"GeoJSON LineString, coordenadas em [lon, lat]","properties":{"coordinates":{"items":{"items":{"type":"number"},"maxItems":2,"minItems":2,"type":"array"},"type":"array"},"type":{"const":"LineString","type":"string"}},"required":["type","coordinates"],"type":"object"},"MatrixData":{"properties":{"criterion":{"description":"Critério da escolha. Hoje sempre \"fastest\": o menor tempo previsto pelo modelo de velocidades do i-go, sem trânsito em tempo real e sem distinguir o horário do dia. A lista é aberta: aceite valores novos.","examples":["fastest"],"type":"string"},"distances_m":{"description":"Linha por origem, coluna por destino, em metros (null = sem rota)","items":{"items":{"type":["number","null"]},"type":"array"},"type":"array"},"durations_s":{"description":"Linha por origem, coluna por destino, em segundos (null = sem rota)","items":{"items":{"type":["number","null"]},"type":"array"},"type":"array"}},"required":["criterion","durations_s","distances_m"],"type":"object"},"MatrixRequest":{"properties":{"destinations":{"items":{"$ref":"#/components/schemas/Coord"},"maxItems":25,"minItems":1,"type":"array"},"profile":{"$ref":"#/components/schemas/Profile"},"sources":{"items":{"$ref":"#/components/schemas/Coord"},"maxItems":25,"minItems":1,"type":"array"}},"required":["sources","destinations"],"type":"object"},"Meta":{"properties":{"attribution":{"description":"Texto de atribuição que deve aparecer junto do mapa ou da rota","type":"string"},"coverage":{"description":"Área atendida (hoje `br`, o Brasil inteiro)","type":"string"},"data_version":{"description":"Versão do dado em serviço: data do retrato do OpenStreetMap e número da geração (ex.: 2026-10-20.2). Guarde-a junto de cada resultado comparado","type":"string"},"degraded":{"description":"true quando a resposta é uma aproximação (ex.: motor de rotas fora e ranking por linha reta)","type":"boolean"},"degraded_reason":{"type":"string"},"overlay_cycle":{"description":"Ciclo do overlay em uso; \"none\" sem overlay","type":"string"},"request_id":{"description":"Identificador da chamada (o mesmo do cabeçalho X-Request-Id)","type":"string"}},"required":["coverage","data_version","overlay_cycle","degraded","attribution","request_id"],"type":"object"},"NearestData":{"properties":{"ranking":{"enum":["route_time","straight_line"],"type":"string"},"results":{"items":{"properties":{"distance_m":{"type":["number","null"]},"duration_s":{"type":["number","null"]},"station":{"$ref":"#/components/schemas/Station"},"straight_line_m":{"type":"number"}},"required":["station","duration_s","distance_m","straight_line_m"],"type":"object"},"type":"array"}},"required":["ranking","results"],"type":"object"},"NearestRequest":{"properties":{"filters":{"properties":{"connectors":{"description":"ex.: Tipo 2, CCS 2, GB/T","items":{"type":"string"},"type":"array"},"min_power_kw":{"minimum":0,"type":"number"},"only_available":{"default":false,"type":"boolean"}},"type":"object"},"limit":{"default":5,"maximum":20,"minimum":1,"type":"integer"},"origin":{"$ref":"#/components/schemas/Coord"},"profile":{"$ref":"#/components/schemas/Profile"}},"required":["origin"],"type":"object"},"Place":{"properties":{"address":{"description":"Endereço numa linha, para exibir","type":"string"},"address_parts":{"$ref":"#/components/schemas/AddressParts"},"kind":{"description":"Categoria legível em português (Bairro, Shopping, Rua…)","type":"string"},"location":{"properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"],"type":"object"},"match":{"description":"O que o resultado é, para saber quão preciso é o ponto: `house_number` (o\nponto é o da casa; o número digitado está no endereço), `street` (o ponto\nfica na rua, não na casa), `place` (comércio, praça, órgão público…),\n`district` (bairro), `city`, `region` (estado) ou `postcode` (área do CEP).\n","enum":["house_number","street","place","district","city","region","postcode"],"type":"string"},"name":{"type":"string"},"straight_line_m":{"description":"Só quando a busca recebe lat/lon","type":"number"}},"required":["name","address","address_parts","kind","match","location"],"type":"object"},"PoolingPlanData":{"properties":{"baseline":{"$ref":"#/components/schemas/PoolingTotals"},"savings_pct":{"type":"number"},"totals":{"$ref":"#/components/schemas/PoolingTotals"},"trips":{"items":{"properties":{"cost":{"type":"number"},"deadhead_distance_m":{"description":"Sem passageiro: base → 1º embarque (ida) ou último desembarque → base (volta)","type":"number"},"deadhead_duration_s":{"type":"number"},"deadhead_geometry":{"$ref":"#/components/schemas/LineString"},"depart_base_at":{"format":"date-time","type":"string"},"distance_m":{"type":"number"},"duration_s":{"type":"number"},"end_at":{"format":"date-time","type":"string"},"geometry":{"$ref":"#/components/schemas/LineString"},"occupancy_pct":{"type":"number"},"return_base_at":{"format":"date-time","type":"string"},"start_at":{"format":"date-time","type":"string"},"stops":{"items":{"properties":{"at":{"format":"date-time","type":"string"},"detour_pct":{"type":"number"},"direct_s":{"type":"number"},"on_board_s":{"type":"number"},"order":{"type":"integer"},"request_id":{"type":"string"}},"required":["request_id","order","at","on_board_s","direct_s","detour_pct"],"type":"object"},"type":"array"},"vehicle":{"type":"integer"}},"required":["vehicle","stops","start_at","end_at","distance_m","duration_s","cost","occupancy_pct"],"type":"object"},"type":"array"},"unserved":{"items":{"properties":{"detail":{"type":"string"},"reason":{"enum":["no_vehicle","no_time","no_route"],"type":"string"},"request_id":{"type":"string"}},"required":["request_id","reason","detail"],"type":"object"},"type":"array"}},"required":["trips","unserved","totals","baseline","savings_pct"],"type":"object"},"PoolingPlanRequest":{"properties":{"arrive_by":{"description":"inbound: hora de chegada ao ponto comum","format":"date-time","type":"string"},"common":{"$ref":"#/components/schemas/Coord"},"depart_at":{"description":"outbound: hora de saída do ponto comum","format":"date-time","type":"string"},"direction":{"enum":["inbound","outbound"],"type":"string"},"fare":{"properties":{"base":{"type":"number"},"charge_from":{"default":"first_pickup","description":"base: o deslocamento vazio entra no custo (exige fleet.base)","enum":["first_pickup","base"],"type":"string"},"per_km":{"type":"number"},"per_min":{"type":"number"}},"required":["base","per_km","per_min"],"type":"object"},"fleet":{"properties":{"base":{"$ref":"#/components/schemas/Coord","description":"De onde os táxis saem (ida) e para onde voltam (volta)"},"capacity":{"maximum":8,"minimum":1,"type":"integer"},"vehicles":{"maximum":20,"minimum":1,"type":"integer"}},"required":["vehicles","capacity"],"type":"object"},"margin_min":{"default":10,"maximum":120,"minimum":0,"type":"number"},"max_detour_pct":{"default":30,"maximum":200,"minimum":0,"type":"number"},"requests":{"items":{"properties":{"id":{"maxLength":64,"type":"string"},"location":{"$ref":"#/components/schemas/Coord"},"ready_at":{"format":"date-time","type":"string"}},"required":["id","location"],"type":"object"},"maxItems":40,"minItems":1,"type":"array"}},"required":["direction","common","fleet","fare","requests"],"type":"object"},"PoolingTotals":{"properties":{"cost":{"type":"number"},"deadhead_distance_m":{"type":"number"},"distance_m":{"type":"number"},"occupancy_pct":{"type":"number"},"passengers":{"type":"integer"},"trips":{"type":"integer"}},"required":["trips","passengers","distance_m","deadhead_distance_m","cost","occupancy_pct"],"type":"object"},"Problem":{"properties":{"code":{"enum":["invalid_input","unauthenticated","forbidden_scope","out_of_coverage","no_route","limit_exceeded","rate_limited","unavailable","not_found","internal"],"type":"string"},"detail":{"type":"string"},"field":{"type":"string"},"request_id":{"type":"string"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"format":"uri","type":"string"}},"required":["type","title","status","code","request_id"],"type":"object"},"Profile":{"default":"car","enum":["car"],"type":"string"},"ReverseData":{"properties":{"place":{"$ref":"#/components/schemas/Place"}},"required":["place"],"type":"object"},"RouteData":{"properties":{"criterion":{"description":"Critério da escolha. Hoje sempre \"fastest\": o menor tempo previsto pelo modelo de velocidades do i-go, sem trânsito em tempo real e sem distinguir o horário do dia. A lista é aberta: aceite valores novos.","examples":["fastest"],"type":"string"},"distance_m":{"description":"Distância total em metros","type":"number"},"duration_s":{"description":"Tempo total de carro em segundos, sem trânsito","type":"number"},"geometry":{"$ref":"#/components/schemas/LineString"},"segment_durations_s":{"description":"Só com segment_durations true. Um tempo, em segundos, para cada trecho entre pontos consecutivos da geometria (tamanho = pontos − 1); a soma é duration_s. Serve para calcular o tempo que falta de qualquer ponto da rota. Ausente se o motor não informou.","items":{"type":"number"},"type":"array"}},"required":["criterion","duration_s","distance_m"],"type":"object"},"RouteRequest":{"properties":{"geometry":{"default":"geojson","description":"`none` devolve só tempo e distância (resposta menor)","enum":["geojson","none"],"type":"string"},"points":{"description":"Origem, paradas e destino, na ordem em que serão percorridos","items":{"$ref":"#/components/schemas/Coord"},"maxItems":25,"minItems":2,"type":"array"},"profile":{"$ref":"#/components/schemas/Profile"},"segment_durations":{"default":false,"description":"Pede o tempo de cada trecho da geometria (segment_durations_s). Exige geometry \"geojson\".","type":"boolean"}},"required":["points"],"type":"object"},"SearchData":{"properties":{"results":{"items":{"$ref":"#/components/schemas/Place"},"type":"array"}},"required":["results"],"type":"object"},"Station":{"properties":{"address":{"type":"string"},"connector_type":{"type":"string"},"connectors":{"items":{"properties":{"index":{"type":"integer"},"observed_at":{"format":"date-time","type":"string"},"status":{"description":"Vocabulário OCPP (Available, Charging, …) ou Unknown","type":"string"}},"required":["index","status"],"type":"object"},"type":"array"},"id":{"type":"string"},"location":{"properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"],"type":"object"},"name":{"type":"string"},"power_kw":{"type":"number"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","name","address","location","power_kw","connector_type","connectors","updated_at"],"type":"object"},"StationsData":{"properties":{"results":{"items":{"properties":{"station":{"$ref":"#/components/schemas/Station"},"straight_line_m":{"type":"number"}},"required":["station"],"type":"object"},"type":"array"}},"required":["results"],"type":"object"}},"securitySchemes":{"credencial":{"description":"Credencial de aplicação (`igo_…`), entregue por quem administra o i-go.\nCada credencial tem escopos (`route`, `matrix`, `search`, `pooling`…): pedir\num recurso fora deles dá `403 forbidden_scope`. Nunca na query string.\n","scheme":"bearer","type":"http"}}},"info":{"contact":{"name":"i-go (Brigtec)","url":"https://igo-api.dev.brigtec.com.br/docs"},"description":"Fonte de verdade do contrato (ADR-0004). Dentro da v1 só entram mudanças\naditivas; o cliente deve ignorar campos e valores de enum que não conhece.\nRotas sob `/v1/experimental/` não têm essa garantia: podem mudar ou sair.\nBusca, reverso e mapa saíram de `/v1/experimental/` para `/v1/` em\n05/11/2026; o endereço antigo segue respondendo igual, com os cabeçalhos\n`Deprecation` e `Link` apontando o novo, até o aviso de remoção.\n\n**Antes de integrar, leia o [guia](/docs)**: cobertura, limites, erros,\nreceitas e como comparar os resultados com o Google.\n\n- **Autenticação:** `Authorization: Bearer igo_…` em toda requisição. Nunca na query string.\n- **Coordenadas:** objeto `{\"lat\", \"lon\"}` na entrada e na saída; geometrias em GeoJSON (ordem `[lon, lat]`).\n- **Unidades:** distância em metros, tempo em segundos, horários em RFC 3339 com fuso.\n- **Resposta:** envelope `{\"data\", \"meta\"}`. Em `meta` vêm a versão do dado (`data_version`) e o `request_id`, que identifica a chamada no suporte.\n- **Erros:** RFC 9457 (`application/problem+json`). Decida pelo campo `code`; título e detalhe podem mudar.\n- **Quota:** 20 requisições por segundo por credencial, com rajada de 40. Acima disso, `429` com `Retry-After`.\n- **Navegador:** a API responde a páginas de qualquer origem (CORS); a credencial vai no cabeçalho, nunca em cookie.\n\nAtribuição obrigatória: \"© OpenStreetMap contributors\" deve ser exibida por\nquem mostrar mapa ou rota (ODbL).\n","license":{"name":"Dados © OpenStreetMap contributors (ODbL 1.0)","url":"https://www.openstreetmap.org/copyright"},"summary":"Busca de endereços, rota, matriz de tempos e agrupamento de corridas sobre dados do OpenStreetMap.","title":"i-go API","version":"1"},"openapi":"3.1.0","paths":{"/v1/coverage":{"get":{"description":"Consulte antes de testar: diz a área atendida (polígono GeoJSON), a\nversão do dado em serviço (`data_version`, data do retrato do\nOpenStreetMap) e os limites de cada rota. Escopo `coverage`.\n","operationId":"coverage","responses":{"200":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"properties":{"data":{"$ref":"#/components/schemas/CoverageData"}}}]}}},"description":"Cobertura"},"429":{"$ref":"#/components/responses/Limite"},"default":{"$ref":"#/components/responses/Problema"}},"summary":"Área atendida, versão do dado e limites vigentes","tags":["Cobertura"]}},"/v1/experimental/pooling/plan":{"post":{"description":"Sem garantia de contrato (ADR-0004). Agrupa os passageiros de um turno em\nveículos, com a ordem e o horário de cada parada. `inbound`: todos vão para o\nponto comum (ex.: a empresa) e chegam até `arrive_by` menos `margin_min`\n(padrão 10). `outbound`: todos saem do ponto comum em `depart_at`. Regras\npara todos a bordo: capacidade, tempo a bordo até (1 + `max_detour_pct`/100)\n× o tempo direto (padrão 30%) e, na ida, a hora de chegada e o `ready_at` de\ncada um. Com `fleet.base`, o táxi (terceirizado) sai da base, busca e leva\n(ida) ou leva e volta à base (volta): o deslocamento vazio entra no horário\n(o táxi não pode sair da base no passado) e, com `fare.charge_from: base`, no\ncusto. Quem não cabe vem em `unserved` com o motivo — o plano nunca atrasa\nninguém em silêncio. O custo é `fare.base` + `fare.per_km` × km +\n`fare.per_min` × minutos por viagem; `baseline` é cada um no seu veículo.\nNenhum dado de pessoa: só identificadores e coordenadas. Escopo `pooling`;\ncusto medido = (passageiros + 1)².\n","operationId":"poolingPlan","requestBody":{"content":{"application/json":{"example":{"arrive_by":"2026-10-28T07:00:00-03:00","common":{"lat":-7.176,"lon":-34.904},"direction":"inbound","fare":{"base":5,"charge_from":"base","per_km":2.5,"per_min":0.4},"fleet":{"base":{"lat":-7.145,"lon":-34.88},"capacity":4,"vehicles":2},"requests":[{"id":"p1","location":{"lat":-7.1195,"lon":-34.845}},{"id":"p2","location":{"lat":-7.13,"lon":-34.86}},{"id":"p3","location":{"lat":-7.092,"lon":-34.833}}]},"schema":{"$ref":"#/components/schemas/PoolingPlanRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"data":{"baseline":{"cost":236.38,"deadhead_distance_m":0,"distance_m":38994,"occupancy_pct":25,"passengers":3,"trips":3},"savings_pct":23.2,"totals":{"cost":181.63,"deadhead_distance_m":20112,"distance_m":29916,"occupancy_pct":38,"passengers":3,"trips":2},"trips":[{"cost":84.87,"deadhead_distance_m":9086,"deadhead_duration_s":1255,"depart_base_at":"2026-10-28T05:56:02-03:00","distance_m":14229,"duration_s":1983,"end_at":"2026-10-28T06:50:00-03:00","occupancy_pct":50,"start_at":"2026-10-28T06:16:57-03:00","stops":[{"at":"2026-10-28T06:16:57-03:00","detour_pct":12,"direct_s":1771,"on_board_s":1983,"order":1,"request_id":"p1"},{"at":"2026-10-28T06:26:44-03:00","detour_pct":0,"direct_s":1396,"on_board_s":1396,"order":2,"request_id":"p2"}],"vehicle":1},{"cost":96.76,"deadhead_distance_m":11026,"deadhead_duration_s":1527,"depart_base_at":"2026-10-28T05:47:33-03:00","distance_m":15687,"duration_s":2220,"end_at":"2026-10-28T06:50:00-03:00","occupancy_pct":25,"start_at":"2026-10-28T06:13:00-03:00","stops":[{"at":"2026-10-28T06:13:00-03:00","detour_pct":0,"direct_s":2220,"on_board_s":2220,"order":1,"request_id":"p3"}],"vehicle":2}],"unserved":[]},"meta":{"attribution":"© OpenStreetMap contributors","coverage":"br","data_version":"2026-11-04.3","degraded":false,"overlay_cycle":"none","request_id":"b5d7e1668a18a5ae77cd93f2"}},"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"properties":{"data":{"$ref":"#/components/schemas/PoolingPlanData"}}}]}}},"description":"Plano do turno","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}}},"429":{"$ref":"#/components/responses/Limite"},"default":{"$ref":"#/components/responses/Problema"}},"summary":"EXPERIMENTAL: planejamento de turno com corridas agrupadas (ADR-0017)","tags":["Agrupamento"]}},"/v1/experimental/stations":{"get":{"description":"Sem garantia de contrato (ADR-0004). Procura no catálogo próprio do i-go\n(ADR-0003), não no OSM: toda palavra digitada tem de começar alguma palavra\ndo nome ou do endereço, sem distinguir acento nem caixa (\"tamb\" acha\n\"Tambaú\"). Só estações dentro da área atendida. Primeiro as que casam no\nnome; com `lat`/`lon`, as mais próximas antes, e cada uma traz a distância\nem linha reta. Escopo `stations`.\n","operationId":"stations","parameters":[{"in":"query","name":"q","required":true,"schema":{"maxLength":120,"minLength":3,"type":"string"}},{"in":"query","name":"lat","schema":{"type":"number"}},{"in":"query","name":"lon","schema":{"type":"number"}},{"in":"query","name":"limit","schema":{"default":5,"maximum":10,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"properties":{"data":{"$ref":"#/components/schemas/StationsData"}}}]}}},"description":"Estações encontradas (lista vazia quando nada casa)"},"429":{"$ref":"#/components/responses/Limite"},"default":{"$ref":"#/components/responses/Problema"}},"summary":"EXPERIMENTAL: busca de estações do catálogo por nome ou endereço","tags":["Recarga"]}},"/v1/fonts/{fonte}/{faixa}":{"get":{"operationId":"font","parameters":[{"description":"Pilha de fontes separada por vírgula (ex.: Noto Sans Regular)","in":"path","name":"fonte","required":true,"schema":{"type":"string"}},{"in":"path","name":"faixa","required":true,"schema":{"pattern":"^[0-9]+-[0-9]+\\.pbf$","type":"string"}}],"responses":{"200":{"content":{"application/x-protobuf":{"schema":{"format":"binary","type":"string"}}},"description":"Glifos (PBF)"},"429":{"$ref":"#/components/responses/Limite"},"default":{"$ref":"#/components/responses/Problema"}},"summary":"Glifos dos rótulos do mapa","tags":["Mapa"]}},"/v1/highlights":{"get":{"description":"Lugares que ajudam a se situar na visão da cidade, antes de o mapa trazer os\npontos de interesse (a partir do zoom 14): universidade, hospital, shopping,\nestádio, rodoviária, parque grande, prefeitura, museu, atração. Calculados na\ngeração do mapa a partir do OpenStreetMap, com uma nota de importância (tipo,\ntamanho da área e se o lugar é notável) e um zoom mínimo; há um limite de\ndensidade para não amontoar. O estilo `igo` já usa esta fonte. Geração sem\ndestaques responde uma coleção vazia. Derivado do OpenStreetMap (ODbL).\n","operationId":"highlights","responses":{"200":{"content":{"application/geo+json":{"schema":{"$ref":"#/components/schemas/Highlights"}}},"description":"GeoJSON FeatureCollection de pontos"},"429":{"$ref":"#/components/responses/Limite"},"default":{"$ref":"#/components/responses/Problema"}},"summary":"Destaques do mapa (referências do zoom 10 ao 13)","tags":["Mapa"]}},"/v1/matrix":{"post":{"description":"Até 25 origens × 25 destinos (625 células) por chamada. A célula\n`[i][j]` é o tempo (ou a distância) da origem `i` ao destino `j`; `null`\nquando não há rota entre os dois. Mesmo motor e mesmo tempo sem trânsito\nde `/v1/route`. Escopo `matrix`; custo medido = origens × destinos.\n","operationId":"matrix","requestBody":{"content":{"application/json":{"example":{"destinations":[{"lat":-7.1469,"lon":-34.7975},{"lat":-7.092,"lon":-34.833}],"sources":[{"lat":-7.1195,"lon":-34.845}]},"schema":{"$ref":"#/components/schemas/MatrixRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"data":{"distances_m":[[9335.3,4758.8]],"durations_s":[[1391.4,617.4]]},"meta":{"attribution":"© OpenStreetMap contributors","coverage":"br","data_version":"2026-11-04.3","degraded":false,"overlay_cycle":"none","request_id":"3111444340afacdd12121d3f"}},"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"properties":{"data":{"$ref":"#/components/schemas/MatrixData"}}}]}}},"description":"Matriz calculada (célula null = sem rota)","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}}},"429":{"$ref":"#/components/responses/Limite"},"default":{"$ref":"#/components/responses/Problema"}},"summary":"Tempos e distâncias de N origens para M destinos","tags":["Roteamento"]}},"/v1/nearest":{"post":{"description":"Pré-seleciona até 100 estações por linha reta e ranqueia por tempo de\nrota. Se o motor estiver fora, responde com `ranking: straight_line` e\n`meta.degraded: true` — nunca disfarça a aproximação.\n","operationId":"nearest","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NearestRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"properties":{"data":{"$ref":"#/components/schemas/NearestData"}}}]}}},"description":"Estações ranqueadas"},"429":{"$ref":"#/components/responses/Limite"},"default":{"$ref":"#/components/responses/Problema"}},"summary":"Estações mais próximas por tempo de rota real (caso 1)","tags":["Recarga"]}},"/v1/reverse":{"get":{"description":"Devolve o lugar ou o endereço mais\npróximo do ponto (o que o Google chama de geocodificação reversa). Quando\nnão há nada perto, `404 not_found`. Escopo `search`; custo medido = 1.\n","operationId":"reverse","parameters":[{"example":-7.1153,"in":"query","name":"lat","required":true,"schema":{"type":"number"}},{"example":-34.8641,"in":"query","name":"lon","required":true,"schema":{"type":"number"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":{"place":{"address":"Praça Assis Chateaubriand, 48, Jardim 13 de Maio, João Pessoa, Paraíba","address_parts":{"city":"João Pessoa","country_code":"BR","house_number":"48","neighborhood":"Jardim 13 de Maio","state":"Paraíba","state_code":"PB","street":"Praça Assis Chateaubriand"},"kind":"Restaurante","location":{"lat":-7.11549495,"lon":-34.863966513730176},"match":"place","name":"La Casserolle"}},"meta":{"attribution":"© OpenStreetMap contributors","coverage":"br","data_version":"2026-10-20.2","degraded":false,"overlay_cycle":"none","request_id":"bb6e66bfa62981ed5ac28750"}},"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"properties":{"data":{"$ref":"#/components/schemas/ReverseData"}}}]}}},"description":"Endereço do ponto","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}}},"429":{"$ref":"#/components/responses/Limite"},"default":{"$ref":"#/components/responses/Problema"}},"summary":"Endereço de um ponto dentro da área atendida","tags":["Busca"]}},"/v1/route":{"post":{"description":"Rota de carro passando pelos pontos na ordem em que vêm (até 25: origem,\nparadas e destino). O tempo é de fluxo livre, sem trânsito ao vivo nem\nhistórico: compare com o Google em `TRAFFIC_UNAWARE`. Escopo `route`;\ncusto medido = pontos − 1.\n","operationId":"route","requestBody":{"content":{"application/json":{"examples":{"comGeometria":{"summary":"Com a linha da rota e o tempo de cada trecho","value":{"points":[{"lat":-7.1195,"lon":-34.845},{"lat":-7.1469,"lon":-34.7975}],"segment_durations":true}},"simples":{"summary":"Dois pontos, só tempo e distância","value":{"geometry":"none","points":[{"lat":-7.1195,"lon":-34.845},{"lat":-7.1469,"lon":-34.7975}]}}},"schema":{"$ref":"#/components/schemas/RouteRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"examples":{"simples":{"summary":"Resposta com geometry none","value":{"data":{"distance_m":9335.3,"duration_s":1391.4},"meta":{"attribution":"© OpenStreetMap contributors","coverage":"br","data_version":"2026-11-04.3","degraded":false,"overlay_cycle":"none","request_id":"392ab16a603f282034a604b4"}}}},"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"properties":{"data":{"$ref":"#/components/schemas/RouteData"}}}]}}},"description":"Rota calculada","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}}},"422":{"content":{"application/problem+json":{"example":{"code":"out_of_coverage","detail":"Fora de br.","field":"points[1]","request_id":"1f0c2e9a7b3d4c5e6f708192","status":422,"title":"Ponto fora da área atendida","type":"https://igo-api.dev.brigtec.com.br/erros/out_of_coverage"},"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"`no_route` (não há caminho de carro entre os pontos) ou `out_of_coverage` (ponto fora da área atendida)"},"429":{"$ref":"#/components/responses/Limite"},"default":{"$ref":"#/components/responses/Problema"}},"summary":"Rota entre dois ou mais pontos, na ordem dada","tags":["Roteamento"]}},"/v1/search":{"get":{"description":"Motor atual: Photon (ADR-0006), que completa a partir da 3ª letra e tolera\nacento e erro de digitação (\"interm\" → \"Intermares\"). Se o motor estiver\nfora, a resposta é o erro `unavailable`. Trocar de motor não muda este formato.\nOs resultados vêm por relevância; com `lat`/`lon`, o que está perto pesa mais\ne cada lugar traz a distância em linha reta. CEP, complemento, ponto de\nreferência no texto são ignorados. Com número da casa, onde o mapa tem o\nnúmero a casa vem antes da rua; onde não tem, vem só a rua.\nEscopo `search`; custo medido = 1.\n","operationId":"search","parameters":[{"description":"Texto digitado: nome de lugar, rua, bairro ou cidade (mínimo 3 letras)","example":"mercado central","in":"query","name":"q","required":true,"schema":{"maxLength":120,"minLength":3,"type":"string"}},{"description":"Latitude de referência (com `lon`): prioriza o que está perto","example":-7.12,"in":"query","name":"lat","schema":{"type":"number"}},{"description":"Longitude de referência (com `lat`)","example":-34.88,"in":"query","name":"lon","schema":{"type":"number"}},{"description":"Quantos resultados no máximo","in":"query","name":"limit","schema":{"default":5,"maximum":10,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":{"results":[{"address":"Rua Francisca Moura, Centro, João Pessoa, Paraíba","address_parts":{"city":"João Pessoa","country_code":"BR","neighborhood":"Centro","state":"Paraíba","state_code":"PB","street":"Rua Francisca Moura"},"kind":"Lugar","location":{"lat":-7.1237648,"lon":-34.879850087839245},"match":"place","name":"Mercado Central","straight_line_m":419},{"address":"Rua Doutor Francisco Montenegro, Alagoa Grande, Alagoa Grande, Paraíba","address_parts":{"city":"Alagoa Grande","country_code":"BR","neighborhood":"Alagoa Grande","state":"Paraíba","state_code":"PB","street":"Rua Doutor Francisco Montenegro"},"kind":"Lugar","location":{"lat":-7.0352951,"lon":-35.6336183},"match":"place","name":"Mercado Central","straight_line_m":83692}]},"meta":{"attribution":"© OpenStreetMap contributors","coverage":"br","data_version":"2026-10-20.2","degraded":false,"overlay_cycle":"none","request_id":"9c62ed035938d863864a8d6c"}},"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"properties":{"data":{"$ref":"#/components/schemas/SearchData"}}}]}}},"description":"Lugares encontrados (lista vazia quando nada casa)","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}}},"429":{"$ref":"#/components/responses/Limite"},"default":{"$ref":"#/components/responses/Problema"}},"summary":"Busca de endereço ou lugar dentro da área atendida","tags":["Busca"]}},"/v1/sprites/{arquivo}":{"get":{"description":"Conjunto de ícones (sprite) referenciado pelo estilo: o índice em JSON e a\nimagem em PNG, em densidade normal e dupla (`@2x`).\n","operationId":"sprite","parameters":[{"in":"path","name":"arquivo","required":true,"schema":{"enum":["basic.json","basic.png","basic@2x.json","basic@2x.png"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}},"image/png":{"schema":{"format":"binary","type":"string"}}},"description":"Índice dos ícones ou imagem"},"429":{"$ref":"#/components/responses/Limite"},"default":{"$ref":"#/components/responses/Problema"}},"summary":"Ícones do mapa (escudos de rodovia e pontos de interesse)","tags":["Mapa"]}},"/v1/styles/{nome}":{"get":{"description":"As URLs de tiles e fontes dentro do estilo apontam para esta API e exigem a\nmesma credencial: o cliente a envia em toda requisição (no MapLibre, por\n`transformRequest`), ou um servidor do próprio cliente faz a ponte.\n","operationId":"style","parameters":[{"description":"`igo`: estilo do i-go (cores do design system VUSE). `basic`: o estilo\nanterior, mantido enquanto houver cliente usando.\n","in":"path","name":"nome","required":true,"schema":{"enum":["igo","basic"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Estilo"},"429":{"$ref":"#/components/responses/Limite"},"default":{"$ref":"#/components/responses/Problema"}},"summary":"Estilo do mapa (MapLibre / Mapbox GL, versão 8)","tags":["Mapa"]}},"/v1/tiles/{z}/{x}/{y}":{"get":{"description":"Tile no esquema OpenMapTiles (Mapbox Vector Tile), da mesma geração do\ngrafo de rota (`data_version`). Escopo `tiles`, com quota própria: uma tela\nde mapa pede dezenas de tiles de uma vez. O sufixo `.mvt` em `y` é aceito.\nAtribuição obrigatória: \"© OpenMapTiles © OpenStreetMap contributors\".\n","operationId":"tile","parameters":[{"in":"path","name":"z","required":true,"schema":{"maximum":22,"minimum":0,"type":"integer"}},{"in":"path","name":"x","required":true,"schema":{"minimum":0,"type":"integer"}},{"in":"path","name":"y","required":true,"schema":{"pattern":"^[0-9]+(\\.mvt)?$","type":"string"}}],"responses":{"200":{"content":{"application/vnd.mapbox-vector-tile":{"schema":{"format":"binary","type":"string"}}},"description":"Tile (com `Content-Encoding gzip` quando o cliente aceita)"},"204":{"description":"Não há tile nesse endereço (fora do mapa ou vazio)"},"429":{"$ref":"#/components/responses/Limite"},"default":{"$ref":"#/components/responses/Problema"}},"summary":"Tile vetorial do mapa de fundo (ADR-0007)","tags":["Mapa"]}}},"security":[{"credencial":[]}],"servers":[{"description":"Ambiente de testes (cobertura br, o Brasil inteiro)","url":"https://igo-api.dev.brigtec.com.br"}],"tags":[{"description":"Endereços e lugares por nome (com autocompletar) e endereço de um ponto. Equivalem à busca de lugares e à geocodificação reversa do Google.","name":"Busca"},{"description":"Rota entre pontos e matriz de tempos e distâncias, de carro e sem trânsito ao vivo. Equivalem ao `computeRoutes` e ao `computeRouteMatrix` do Google.","name":"Roteamento"},{"description":"Planejamento de turno com corridas compartilhadas (roteirização com capacidade, horário e desvio máximo).","name":"Agrupamento"},{"description":"Estações de recarga do catálogo próprio do i-go.","name":"Recarga"},{"description":"Área atendida, versão do dado e limites vigentes.","name":"Cobertura"},{"description":"Tiles vetoriais, estilo, fontes e ícones para desenhar o mapa com MapLibre.","name":"Mapa"}]}