{"openapi":"3.1.0","info":{"title":"PrismaData — Rotas","version":"1.0.0","termsOfService":"https://prismadata.io/terms","contact":{"name":"PrismaData Support Team","url":"https://prismadata.io/contact","email":"suporte.api@prismadata.io"},"license":{"name":"Proprietary","url":"https://api.prismadata.io/license"},"description":"Calculo de rotas entre pontos (simples e batch)"},"servers":[{"url":"https://api.prismadata.io/v1","description":"Ambiente de Produção"}],"security":[{"X-Apikey":[]},{"api_key":[]},{"BearerAuth":[]}],"tags":[{"name":"Rotas","description":"Calculo de rotas entre pontos (simples e batch)"}],"paths":{"/routing/route":{"get":{"tags":["Rotas"],"summary":"Rota entre pontos com distância e tempo","description":"Calcula rota entre pontos com campos derivados (Fase 1).","operationId":"calcular_rota_route_get","parameters":[{"name":"points","in":"query","required":true,"schema":{"type":"array","items":{"type":"string"},"minItems":2,"description":"Pontos no formato 'lat,lon' (minimo 2)","title":"Points"},"description":"Pontos no formato 'lat,lon' (minimo 2)"},{"name":"profile","in":"query","required":false,"schema":{"enum":["car","foot","bike"],"type":"string","description":"Perfil de roteamento","default":"car","title":"Profile"},"description":"Perfil de roteamento"},{"name":"piso_geodesico_m","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":0,"description":"Piso de validade do INDICE_DE_DESVIO. Nao afeta o calculo, so decide INDICE_DE_DESVIO_CONFIAVEL e o STATUS. Default 500m.","default":500,"title":"Piso Geodesico M"},"description":"Piso de validade do INDICE_DE_DESVIO. Nao afeta o calculo, so decide INDICE_DE_DESVIO_CONFIAVEL e o STATUS. Default 500m."},{"name":"sentido","in":"query","required":false,"schema":{"enum":["ida","volta","ambos"],"type":"string","description":"ida (default): origem->destino. volta: destino->origem. ambos: retorna os dois sentidos como lista.","default":"ida","title":"Sentido"},"description":"ida (default): origem->destino. volta: destino->origem. ambos: retorna os dois sentidos como lista."}],"responses":{"200":{"description":"Operacao realizada com sucesso","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"RouteResponseSchema","description":"Schema de resposta de rota (Fase 1 — campos derivados inclusos).","properties":{"prismadata__routing_route__geometria":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Geometria em WKT (LINESTRING). Null quando STATUS=SEM_ROTA.","title":"Prismadata  Routing Route  Geometria"},"prismadata__routing_route__distancia_m":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Distancia total pela malha em metros. Null se SEM_ROTA.","title":"Prismadata  Routing Route  Distancia M"},"prismadata__routing_route__subida_m":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Subida total em metros.","title":"Prismadata  Routing Route  Subida M"},"prismadata__routing_route__descida_m":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Descida total em metros.","title":"Prismadata  Routing Route  Descida M"},"prismadata__routing_route__tempo_s":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Tempo estimado em segundos. Sem tráfego em tempo real.","title":"Prismadata  Routing Route  Tempo S"},"prismadata__routing_route__distancia_geodesica_m":{"description":"Haversine entre coordenadas cruas (linha reta, WGS84).","title":"Prismadata  Routing Route  Distancia Geodesica M","type":"number"},"prismadata__routing_route__indice_de_desvio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"distancia_m / distancia_geodesica_m. Sem clamp. Valores <1 indicam ruído de snap dominante. Null se SEM_ROTA.","title":"Prismadata  Routing Route  Indice De Desvio"},"prismadata__routing_route__indice_de_desvio_confiavel":{"description":"True se distancia_geodesica_m >= piso_geodesico_m.","title":"Prismadata  Routing Route  Indice De Desvio Confiavel","type":"boolean"},"prismadata__routing_route__piso_geodesico_m":{"description":"Piso efetivo usado (eco do parametro do request, default 500).","title":"Prismadata  Routing Route  Piso Geodesico M","type":"integer"},"prismadata__routing_route__velocidade_media_rota_kmh":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"distancia_m/tempo_s. Proxy de hierarquia viária, NAO de tráfego.","title":"Prismadata  Routing Route  Velocidade Media Rota Kmh"},"prismadata__routing_route__velocidade_media_geodesica_kmh":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"distancia_geodesica_m/tempo_s. Útil pra comparar redes.","title":"Prismadata  Routing Route  Velocidade Media Geodesica Kmh"},"prismadata__routing_route__snap_origem_m":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Distância entre coord crua de origem e sua projeção na malha.","title":"Prismadata  Routing Route  Snap Origem M"},"prismadata__routing_route__snap_destino_m":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Idem para o destino.","title":"Prismadata  Routing Route  Snap Destino M"},"prismadata__routing_route__sentido":{"description":"origem_destino | destino_origem.","title":"Prismadata  Routing Route  Sentido","type":"string"},"prismadata__routing_route__status":{"description":"OK | SEM_ROTA | ABAIXO_DO_PISO.","title":"Prismadata  Routing Route  Status","type":"string"},"prismadata__routing_route__versao_malha_viaria":{"description":"Versão do grafo (formato AAAAMMDD-<sha8>).","title":"Prismadata  Routing Route  Versao Malha Viaria","type":"string"},"prismadata__routing_route__data_calculo":{"description":"Timestamp UTC ISO 8601 do cálculo.","title":"Prismadata  Routing Route  Data Calculo","type":"string"},"prismadata__routing_route__origem_cache":{"description":"True se o item veio do cache interno.","title":"Prismadata  Routing Route  Origem Cache","type":"boolean"}},"required":["prismadata__routing_route__geometria","prismadata__routing_route__distancia_m","prismadata__routing_route__subida_m","prismadata__routing_route__descida_m","prismadata__routing_route__tempo_s","prismadata__routing_route__distancia_geodesica_m","prismadata__routing_route__indice_de_desvio","prismadata__routing_route__indice_de_desvio_confiavel","prismadata__routing_route__piso_geodesico_m","prismadata__routing_route__velocidade_media_rota_kmh","prismadata__routing_route__velocidade_media_geodesica_kmh","prismadata__routing_route__snap_origem_m","prismadata__routing_route__snap_destino_m","prismadata__routing_route__sentido","prismadata__routing_route__status","prismadata__routing_route__versao_malha_viaria","prismadata__routing_route__data_calculo","prismadata__routing_route__origem_cache"]},"example":{"prismadata__routing_route__geometria":"LINESTRING (-43.9378 -19.9191, -43.94 -19.93, -43.9477 -19.9498)","prismadata__routing_route__distancia_m":1500.5,"prismadata__routing_route__subida_m":50.0,"prismadata__routing_route__descida_m":30.0,"prismadata__routing_route__tempo_s":180.0,"prismadata__routing_route__distancia_geodesica_m":1123.4,"prismadata__routing_route__indice_de_desvio":1.336,"prismadata__routing_route__indice_de_desvio_confiavel":true,"prismadata__routing_route__piso_geodesico_m":500,"prismadata__routing_route__velocidade_media_rota_kmh":30.01,"prismadata__routing_route__velocidade_media_geodesica_kmh":22.47,"prismadata__routing_route__snap_origem_m":12.4,"prismadata__routing_route__snap_destino_m":8.7,"prismadata__routing_route__sentido":"origem_destino","prismadata__routing_route__status":"OK","prismadata__routing_route__versao_malha_viaria":"20260322-9110d1b2","prismadata__routing_route__data_calculo":"2026-08-04T14:32:11+00:00","prismadata__routing_route__origem_cache":false}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"403":{"description":"Forbidden - Roles nao permitidos (header X-Roles invalido)","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"422":{"description":"Validation Error - Parametros invalidos","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"$ref":"#/components/responses/RateLimitExceeded"}},"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.prismadata.io/v1/routing/route?points=valor\" \\\n  -H \"X-Apikey: ak_xxxxxxxxxxxxxxxx\""},{"lang":"Python","source":"import httpx\n\nresp = httpx.get(\n    \"https://api.prismadata.io/v1/routing/route\",\n    params={\"points\": 'valor'},\n    headers={\"X-Apikey\": \"ak_xxxxxxxxxxxxxxxx\"},\n)\ndados = resp.json()"},{"lang":"Python SDK","source":"from prismadata import Client\n\nclient = Client(api_key=\"ak_xxxxxxxxxxxxxxxx\")\nresult = client.route(\n    points=[(-23.55, -46.63), (-22.90, -43.17)],\n    profile=\"car\",\n)\n# Campos principais (18 escalares no total)\nprint(result[\"prismadata__routing_route__distancia_m\"])           # rota real (malha viária)\nprint(result[\"prismadata__routing_route__distancia_geodesica_m\"]) # haversine (linha reta)\nprint(result[\"prismadata__routing_route__indice_de_desvio\"])      # razao rota/geodesica\nprint(result[\"prismadata__routing_route__snap_origem_m\"])         # deslocamento do ponto para a via\nprint(result[\"prismadata__routing_route__geometria\"])             # WKT LineString\n\n# Params opcionais (v0.14):\n# - direction='forward' | 'reverse' | 'both' (default: forward server-side)\n# - geodesic_floor_m: piso para calibrar indice_de_desvio_confiavel\nclient.route(\n    points=[(-23.55, -46.63), (-22.90, -43.17)],\n    direction=\"both\",\n    geodesic_floor_m=500,\n)"},{"lang":"R SDK","source":"library(prismadata)\n\nclient <- prismadata_client(api_key = \"ak_xxxxxxxxxxxxxxxx\")\npoints <- list(\n  c(-23.5505, -46.6333),\n  c(-23.5615, -46.6559)\n)\n\nresult <- client$route(points = points, profile = \"car\")\nprint(result)"},{"lang":"TypeScript SDK","source":"import { PrismaDataClient } from \"prismadata\";\n\nconst client = new PrismaDataClient({ apiKey: \"ak_xxxxxxxxxxxxxxxx\" });\nconst result = await client.route(\n  [[-23.55, -46.63], [-22.90, -43.17]],\n  { profile: \"car\" },\n);\nconsole.log(result);"}]}},"/routing/batch/route":{"post":{"tags":["Rotas"],"summary":"Rotas em lote","description":"Calcula multiplas rotas em batch.","operationId":"calcular_rotas_batch_batch_route_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRouteRequest"}}},"required":true},"responses":{"200":{"description":"Operacao realizada com sucesso","content":{"application/json":{"schema":{"properties":{"TOTAL":{"type":"integer","title":"Total","description":"Total de rotas solicitadas"},"SUCESSOS":{"type":"integer","title":"Sucessos","description":"Quantidade de rotas calculadas com sucesso"},"FALHAS":{"type":"integer","title":"Falhas","description":"Quantidade de rotas que falharam"},"RESULTADOS":{"items":{"$ref":"#/components/schemas/BatchRouteResultItem"},"type":"array","title":"Resultados","description":"Lista de resultados"}},"additionalProperties":true,"type":"object","required":["TOTAL","SUCESSOS","FALHAS","RESULTADOS"],"title":"BatchRouteResponseSchema","description":"Schema de resposta batch de rotas."},"example":{"TOTAL":2,"SUCESSOS":2,"FALHAS":0,"RESULTADOS":[{"prismadata__routing_route__sucesso":true,"prismadata__routing_route__dados":{"prismadata__routing_route__geometria":"LINESTRING (-43.9378 -19.9191, -43.9477 -19.9498)","prismadata__routing_route__distancia_m":1500.5,"prismadata__routing_route__subida_m":50.0,"prismadata__routing_route__descida_m":30.0,"prismadata__routing_route__tempo_s":180.0}},{"prismadata__routing_route__sucesso":true,"prismadata__routing_route__dados":{"prismadata__routing_route__geometria":"LINESTRING (-43.95 -19.92, -43.96 -19.95)","prismadata__routing_route__distancia_m":2000.0,"prismadata__routing_route__subida_m":40.0,"prismadata__routing_route__descida_m":25.0,"prismadata__routing_route__tempo_s":240.0}}]}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"403":{"description":"Forbidden - Roles nao permitidos (header X-Roles invalido)","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"422":{"description":"Validation Error - Parametros invalidos","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"$ref":"#/components/responses/RateLimitExceeded"}},"x-codeSamples":[{"lang":"curl","source":"curl -X POST \"https://api.prismadata.io/v1/routing/batch/route\" \\\n  -H \"X-Apikey: ak_xxxxxxxxxxxxxxxx\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"1\": [-23.55, -46.63], \"2\": [-22.90, -43.17]}'"},{"lang":"Python","source":"import httpx\n\nresp = httpx.post(\n    \"https://api.prismadata.io/v1/routing/batch/route\",\n    json={\"1\": [-23.55, -46.63], \"2\": [-22.90, -43.17]},\n    headers={\"X-Apikey\": \"ak_xxxxxxxxxxxxxxxx\"},\n)\ndados = resp.json()"},{"lang":"Python SDK","source":"from prismadata import Client\n\nclient = Client(api_key=\"ak_xxxxxxxxxxxxxxxx\")\nresult = client.route_batch(\n    items=[\n        {\"points\": [[-23.55, -46.63], [-22.90, -43.17]]},\n        {\"points\": [[-19.92, -43.94], [-19.95, -43.95]]},\n    ],\n    profile=\"car\",\n)\nprint(result)"},{"lang":"R SDK","source":"library(prismadata)\n\nclient <- prismadata_client(api_key = \"ak_xxxxxxxxxxxxxxxx\")\nitems <- list(\n  list(points = list(c(-23.5505, -46.6333), c(-23.5615, -46.6559))),\n  list(points = list(c(-22.9068, -43.1729), c(-22.9110, -43.2094)))\n)\n\nresults <- client$route_batch(items = items, profile = \"car\")\nprint(results)"},{"lang":"TypeScript SDK","source":"import { PrismaDataClient } from \"prismadata\";\n\nconst client = new PrismaDataClient({ apiKey: \"ak_xxxxxxxxxxxxxxxx\" });\nconst result = await client.routeBatch(\n  [\n    { points: [[-23.55, -46.63], [-22.90, -43.17]] },\n    { points: [[-19.92, -43.94], [-19.95, -43.95]] },\n  ],\n  { profile: \"car\" },\n);\nconsole.log(result);"}]}},"/routing/route/matrix":{"post":{"tags":["Rotas"],"summary":"Matriz de distâncias e tempos 1-N","description":"Matriz 1->N publica (Fase 2): uma origem, ate 1024 destinos.\n\nTodos os campos derivados da Fase 1 vem por item. Cache por par\n(origem, destino, profile, sentido, versao_malha) com TTL 12h.","operationId":"calcular_matriz_route_matrix_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrizRequest"}}},"required":true},"responses":{"200":{"description":"Operacao realizada com sucesso","content":{"application/json":{"schema":{"properties":{"rotas":{"items":{"$ref":"#/components/schemas/RouteMatrixItemSchema"},"type":"array","title":"Rotas","description":"Um item por destino, na mesma ordem do request."}},"additionalProperties":true,"type":"object","required":["rotas"],"title":"RouteMatrixResponseSchema","description":"Schema de resposta da matriz 1->N publica (Fase 2)."},"example":{"rotas":[{"ID":"cnpj-12345678000199","prismadata__routing_route__geometria":"LINESTRING (-43.9378 -19.9191, -43.94 -19.93, -43.9477 -19.9498)","prismadata__routing_route__distancia_m":1500.5,"prismadata__routing_route__subida_m":50.0,"prismadata__routing_route__descida_m":30.0,"prismadata__routing_route__tempo_s":180.0,"prismadata__routing_route__distancia_geodesica_m":1123.4,"prismadata__routing_route__indice_de_desvio":1.336,"prismadata__routing_route__indice_de_desvio_confiavel":true,"prismadata__routing_route__piso_geodesico_m":500,"prismadata__routing_route__velocidade_media_rota_kmh":30.01,"prismadata__routing_route__velocidade_media_geodesica_kmh":22.47,"prismadata__routing_route__snap_origem_m":12.4,"prismadata__routing_route__snap_destino_m":8.7,"prismadata__routing_route__sentido":"origem_destino","prismadata__routing_route__status":"OK","prismadata__routing_route__versao_malha_viaria":"20260322-9110d1b2","prismadata__routing_route__data_calculo":"2026-08-04T14:32:11+00:00","prismadata__routing_route__origem_cache":false},{"ID":"cnpj-22345678000199","prismadata__routing_route__geometria":"LINESTRING (-43.9378 -19.9191, -43.94 -19.93, -43.9477 -19.9498)","prismadata__routing_route__distancia_m":2100.0,"prismadata__routing_route__subida_m":50.0,"prismadata__routing_route__descida_m":30.0,"prismadata__routing_route__tempo_s":250.0,"prismadata__routing_route__distancia_geodesica_m":1123.4,"prismadata__routing_route__indice_de_desvio":1.42,"prismadata__routing_route__indice_de_desvio_confiavel":true,"prismadata__routing_route__piso_geodesico_m":500,"prismadata__routing_route__velocidade_media_rota_kmh":30.01,"prismadata__routing_route__velocidade_media_geodesica_kmh":22.47,"prismadata__routing_route__snap_origem_m":12.4,"prismadata__routing_route__snap_destino_m":8.7,"prismadata__routing_route__sentido":"origem_destino","prismadata__routing_route__status":"OK","prismadata__routing_route__versao_malha_viaria":"20260322-9110d1b2","prismadata__routing_route__data_calculo":"2026-08-04T14:32:11+00:00","prismadata__routing_route__origem_cache":false}]}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"403":{"description":"Forbidden - Roles nao permitidos (header X-Roles invalido)","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"422":{"description":"Validation Error - Parametros invalidos","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"$ref":"#/components/responses/RateLimitExceeded"}},"x-codeSamples":[{"lang":"curl","source":"curl -X POST \"https://api.prismadata.io/v1/routing/route/matrix\" \\\n  -H \"X-Apikey: ak_xxxxxxxxxxxxxxxx\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ ... }'"},{"lang":"Python","source":"import httpx\n\nresp = httpx.post(\n    \"https://api.prismadata.io/v1/routing/route/matrix\",\n    json={...},\n    headers={\"X-Apikey\": \"ak_xxxxxxxxxxxxxxxx\"},\n)\ndados = resp.json()"}]}}},"components":{"securitySchemes":{"X-Apikey":{"type":"apiKey","in":"header","name":"X-Apikey","description":"Token de acesso via header."},"api_key":{"type":"apiKey","in":"query","name":"api_key","description":"Token de acesso via query parameter."},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Token JWT obtido via POST /auth/token"}},"headers":{"X-RateLimit-Limit":{"description":"Número máximo de requisições permitidas por minuto para o usuário.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Número de requisições restantes na janela de rate limit atual.","schema":{"type":"integer","example":57}},"X-RateLimit-Reset":{"description":"Unix timestamp (segundos) indicando quando a janela de rate limit será reiniciada.","schema":{"type":"integer","example":1738281600}}},"responses":{"RateLimitExceeded":{"description":"Too Many Requests - Rate limit ou quota excedidos.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"text/plain":{"schema":{"type":"string"},"examples":{"rate_limit":{"summary":"Rate limit excedido","value":"rate limit exceeded"},"quota":{"summary":"Quota excedida","value":"limit exceeded: 1000 requests used, limit is 1000"}}}}}},"schemas":{"BatchRouteItem":{"properties":{"points":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","minItems":2,"title":"Points","description":"Lista de pontos [[lat, lon], ...]"}},"type":"object","required":["points"],"title":"BatchRouteItem","description":"Item individual de rota para batch."},"BatchRouteRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BatchRouteItem"},"type":"array","maxItems":16,"minItems":1,"title":"Items","description":"Lista de rotas a calcular"},"profile":{"type":"string","enum":["car","foot","bike"],"title":"Profile","description":"Perfil de roteamento","default":"car"},"piso_geodesico_m":{"type":"integer","maximum":5000.0,"minimum":0.0,"title":"Piso Geodesico M","default":500},"sentido":{"type":"string","enum":["ida","volta","ambos"],"title":"Sentido","default":"ida"}},"type":"object","required":["items"],"title":"BatchRouteRequest","description":"Requisicao de batch de rotas."},"BatchRouteResultItem":{"properties":{"prismadata__routing_route__sucesso":{"type":"boolean","title":"Prismadata  Routing Route  Sucesso","description":"Se o calculo foi bem sucedido"},"prismadata__routing_route__dados":{"anyOf":[{"$ref":"#/components/schemas/RouteResponseSchema"},{"type":"null"}],"description":"Dados da rota (presente quando sucesso=true)"},"prismadata__routing_route__erro":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prismadata  Routing Route  Erro","description":"Mensagem de erro (presente quando sucesso=false)"}},"type":"object","required":["prismadata__routing_route__sucesso"],"title":"BatchRouteResultItem","description":"Item individual de resultado batch de rota."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MatrizDestino":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Id opcional ecoado no item de resposta"},"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat"},"lng":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lng"}},"type":"object","required":["lat","lng"],"title":"MatrizDestino","description":"Destino da matriz, com id opcional ecoado na resposta."},"MatrizOrigem":{"properties":{"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat"},"lng":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lng"}},"type":"object","required":["lat","lng"],"title":"MatrizOrigem","description":"Ponto de origem unico da matriz 1->N."},"MatrizRequest":{"properties":{"origem":{"$ref":"#/components/schemas/MatrizOrigem"},"destinos":{"items":{"$ref":"#/components/schemas/MatrizDestino"},"type":"array","maxItems":1024,"minItems":1,"title":"Destinos"},"profile":{"type":"string","enum":["car","foot","bike"],"title":"Profile","default":"car"},"piso_geodesico_m":{"type":"integer","maximum":5000.0,"minimum":0.0,"title":"Piso Geodesico M","default":500},"sentido":{"type":"string","enum":["ida","volta"],"title":"Sentido","description":"ambos nao suportado na matriz (dobraria a cardinalidade)","default":"ida"}},"type":"object","required":["origem","destinos"],"title":"MatrizRequest","description":"Requisicao da matriz 1->N publica (Fase 2)."},"RouteMatrixItemSchema":{"properties":{"prismadata__routing_route__id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prismadata  Routing Route  Id","description":"Eco do id enviado no destino, se fornecido."},"dados":{"$ref":"#/components/schemas/RouteResponseSchema","description":"Campos derivados da Fase 1."}},"type":"object","required":["dados"],"title":"RouteMatrixItemSchema","description":"Item da matriz — reusa os campos da Fase 1 mais o ID opcional."},"RouteResponseSchema":{"properties":{"prismadata__routing_route__geometria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prismadata  Routing Route  Geometria","description":"Geometria em WKT (LINESTRING). Null quando STATUS=SEM_ROTA."},"prismadata__routing_route__distancia_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prismadata  Routing Route  Distancia M","description":"Distancia total pela malha em metros. Null se SEM_ROTA."},"prismadata__routing_route__subida_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prismadata  Routing Route  Subida M","description":"Subida total em metros."},"prismadata__routing_route__descida_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prismadata  Routing Route  Descida M","description":"Descida total em metros."},"prismadata__routing_route__tempo_s":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prismadata  Routing Route  Tempo S","description":"Tempo estimado em segundos. Sem tráfego em tempo real."},"prismadata__routing_route__distancia_geodesica_m":{"type":"number","title":"Prismadata  Routing Route  Distancia Geodesica M","description":"Haversine entre coordenadas cruas (linha reta, WGS84)."},"prismadata__routing_route__indice_de_desvio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prismadata  Routing Route  Indice De Desvio","description":"distancia_m / distancia_geodesica_m. Sem clamp. Valores <1 indicam ruído de snap dominante. Null se SEM_ROTA."},"prismadata__routing_route__indice_de_desvio_confiavel":{"type":"boolean","title":"Prismadata  Routing Route  Indice De Desvio Confiavel","description":"True se distancia_geodesica_m >= piso_geodesico_m."},"prismadata__routing_route__piso_geodesico_m":{"type":"integer","title":"Prismadata  Routing Route  Piso Geodesico M","description":"Piso efetivo usado (eco do parametro do request, default 500)."},"prismadata__routing_route__velocidade_media_rota_kmh":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prismadata  Routing Route  Velocidade Media Rota Kmh","description":"distancia_m/tempo_s. Proxy de hierarquia viária, NAO de tráfego."},"prismadata__routing_route__velocidade_media_geodesica_kmh":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prismadata  Routing Route  Velocidade Media Geodesica Kmh","description":"distancia_geodesica_m/tempo_s. Útil pra comparar redes."},"prismadata__routing_route__snap_origem_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prismadata  Routing Route  Snap Origem M","description":"Distância entre coord crua de origem e sua projeção na malha."},"prismadata__routing_route__snap_destino_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prismadata  Routing Route  Snap Destino M","description":"Idem para o destino."},"prismadata__routing_route__sentido":{"type":"string","title":"Prismadata  Routing Route  Sentido","description":"origem_destino | destino_origem."},"prismadata__routing_route__status":{"type":"string","title":"Prismadata  Routing Route  Status","description":"OK | SEM_ROTA | ABAIXO_DO_PISO."},"prismadata__routing_route__versao_malha_viaria":{"type":"string","title":"Prismadata  Routing Route  Versao Malha Viaria","description":"Versão do grafo (formato AAAAMMDD-<sha8>)."},"prismadata__routing_route__data_calculo":{"type":"string","title":"Prismadata  Routing Route  Data Calculo","description":"Timestamp UTC ISO 8601 do cálculo."},"prismadata__routing_route__origem_cache":{"type":"boolean","title":"Prismadata  Routing Route  Origem Cache","description":"True se o item veio do cache interno."}},"type":"object","required":["prismadata__routing_route__geometria","prismadata__routing_route__distancia_m","prismadata__routing_route__subida_m","prismadata__routing_route__descida_m","prismadata__routing_route__tempo_s","prismadata__routing_route__distancia_geodesica_m","prismadata__routing_route__indice_de_desvio","prismadata__routing_route__indice_de_desvio_confiavel","prismadata__routing_route__piso_geodesico_m","prismadata__routing_route__velocidade_media_rota_kmh","prismadata__routing_route__velocidade_media_geodesica_kmh","prismadata__routing_route__snap_origem_m","prismadata__routing_route__snap_destino_m","prismadata__routing_route__sentido","prismadata__routing_route__status","prismadata__routing_route__versao_malha_viaria","prismadata__routing_route__data_calculo","prismadata__routing_route__origem_cache"],"title":"RouteResponseSchema","description":"Schema de resposta de rota (Fase 1 — campos derivados inclusos)."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
