{"openapi":"3.1.0","info":{"title":"PrismaData — Isocronas","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 areas de alcance (isocronas simples e batch)"},"servers":[{"url":"https://api.prismadata.io/v1","description":"Ambiente de Produção"}],"security":[{"X-Apikey":[]},{"api_key":[]},{"BearerAuth":[]}],"tags":[{"name":"Isocronas","description":"Calculo de areas de alcance (isocronas simples e batch)"}],"paths":{"/routing/isochrone":{"get":{"tags":["Isocronas"],"summary":"Isócrona ou isodistância a partir de um ponto","description":"Calcula isocrona (por tempo) ou isodistancia (por distancia) a partir de um ponto.","operationId":"calcular_isocrona_isochrone_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","description":"Latitude do ponto central","title":"Lat"},"description":"Latitude do ponto central"},{"name":"lng","in":"query","required":true,"schema":{"type":"number","description":"Longitude do ponto central","title":"Lng"},"description":"Longitude do ponto central"},{"name":"time_limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":7200,"minimum":60},{"type":"null"}],"description":"Limite de TEMPO em segundos (60..7200). Mutuamente exclusivo com `distance_limit`. Se nenhum for informado, aplica default de 600s.","title":"Time Limit"},"description":"Limite de TEMPO em segundos (60..7200). Mutuamente exclusivo com `distance_limit`. Se nenhum for informado, aplica default de 600s."},{"name":"distance_limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50000,"minimum":100},{"type":"null"}],"description":"Limite de DISTANCIA em metros (100..50000). Ativa modo isodistancia — corta o Dijkstra na distancia acumulada da malha viaria (nao euclidiana). Mutuamente exclusivo com `time_limit`.","title":"Distance Limit"},"description":"Limite de DISTANCIA em metros (100..50000). Ativa modo isodistancia — corta o Dijkstra na distancia acumulada da malha viaria (nao euclidiana). Mutuamente exclusivo com `time_limit`."},{"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":"sentido","in":"query","required":false,"schema":{"enum":["INDO","SAINDO"],"type":"string","description":"SAINDO (do ponto) ou INDO (para o ponto)","default":"SAINDO","title":"Sentido"},"description":"SAINDO (do ponto) ou INDO (para o ponto)"},{"name":"condicao_transito","in":"query","required":false,"schema":{"enum":["livre","normal","pico_moderado","pico_pesado"],"type":"string","description":"Nivel de trânsito. Aplica multiplicador ao time_limit antes do motor de roteamento: livre=1.0, normal=0.7 (default), pico_moderado=0.5, pico_pesado=0.3. Só efetivo no modo tempo; ignorado no modo distância. Bloco `CONDICAO_TRANSITO/FATOR_TEMPORAL/LIMITE_TEMPO_S_EFETIVO/MUNICIPIO_IBGE` no output documenta o ajuste aplicado.","default":"normal","title":"Condicao Transito"},"description":"Nivel de trânsito. Aplica multiplicador ao time_limit antes do motor de roteamento: livre=1.0, normal=0.7 (default), pico_moderado=0.5, pico_pesado=0.3. Só efetivo no modo tempo; ignorado no modo distância. Bloco `CONDICAO_TRANSITO/FATOR_TEMPORAL/LIMITE_TEMPO_S_EFETIVO/MUNICIPIO_IBGE` no output documenta o ajuste aplicado."}],"responses":{"200":{"description":"Operacao realizada com sucesso","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"IsochroneResponseSchema","description":"Schema de resposta de isocrona (modo tempo) ou isodistancia (modo distancia).","properties":{"prismadata__routing_isochrone__geometria":{"description":"Geometria em WKT (POLYGON)","title":"Prismadata  Routing Isochrone  Geometria","type":"string"},"prismadata__routing_isochrone__modo":{"description":"Qual dimensao foi limitada: 'tempo' ou 'distancia'.","title":"Prismadata  Routing Isochrone  Modo","type":"string"},"prismadata__routing_isochrone__limite_tempo_s":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Limite de tempo em segundos. Null quando modo='distancia'.","title":"Prismadata  Routing Isochrone  Limite Tempo S"},"prismadata__routing_isochrone__limite_distancia_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Limite de distancia em metros. Null quando modo='tempo'.","title":"Prismadata  Routing Isochrone  Limite Distancia M"},"prismadata__routing_isochrone__perfil":{"description":"Perfil utilizado (car, foot, bike)","title":"Prismadata  Routing Isochrone  Perfil","type":"string"},"prismadata__routing_isochrone__sentido":{"description":"Sentido do movimento (INDO, SAINDO)","title":"Prismadata  Routing Isochrone  Sentido","type":"string"},"prismadata__routing_isochrone__area_m2":{"description":"Area do poligono em metros quadrados","title":"Prismadata  Routing Isochrone  Area M2","type":"number"},"prismadata__routing_isochrone__condicao_transito":{"description":"Nivel de trânsito pedido: livre | normal | pico_moderado | pico_pesado.","title":"Prismadata  Routing Isochrone  Condicao Transito","type":"string"},"prismadata__routing_isochrone__fator_temporal":{"description":"Multiplicador aplicado ao time_limit (1.0=livre, 0.7=normal, 0.5=pico_moderado, 0.3=pico_pesado).","title":"Prismadata  Routing Isochrone  Fator Temporal","type":"number"},"prismadata__routing_isochrone__limite_tempo_s_efetivo":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"time_limit efetivamente enviado ao motor de roteamento (time_limit * fator, mín. 60s).","title":"Prismadata  Routing Isochrone  Limite Tempo S Efetivo"},"prismadata__routing_isochrone__municipio_ibge":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Código IBGE do município identificado (observabilidade; não afeta o fator).","title":"Prismadata  Routing Isochrone  Municipio Ibge"}},"required":["prismadata__routing_isochrone__geometria","prismadata__routing_isochrone__modo","prismadata__routing_isochrone__limite_tempo_s","prismadata__routing_isochrone__limite_distancia_m","prismadata__routing_isochrone__perfil","prismadata__routing_isochrone__sentido","prismadata__routing_isochrone__area_m2","prismadata__routing_isochrone__condicao_transito","prismadata__routing_isochrone__fator_temporal","prismadata__routing_isochrone__limite_tempo_s_efetivo","prismadata__routing_isochrone__municipio_ibge"]},"example":{"prismadata__routing_isochrone__geometria":"POLYGON ((-43.9451043 -19.9496498, -43.94461115 -19.9496419, -43.94442885 -19.9491917, -43.9446328 -19.94891865, -43.945189150000004 -19.948811399999997, -43.945164500000004 -19.94856045, -43.94541065 -19.94774005, -43.946264299999996 -19.9471244, -43.946252900000005 -19.9469946, -43.947168649999995 -19.946969350000003, -43.94784435 -19.946944950000002, -43.948170399999995 -19.94692055, -43.9484147 -19.94660355, -43.94901205 -19.946596, -43.94911175 -19.94653495, -43.9491483 -19.94645745, -43.949202 -19.94647325, -43.9495532 -19.94705915, -43.9494535 -19.9471202, -43.949256649999995 -19.9474569, -43.94910625 -19.9476669, -43.949082950000005 -19.94770545, -43.9488786 -19.94805365, -43.9486399 -19.9484125, -43.9490493 -19.9490143, -43.9492774 -19.949322950000003, -43.9491091 -19.949637250000002, -43.94933965 -19.949893, -43.94933755 -19.95043145, -43.9491304 -19.95082245, -43.9490105 -19.951194450000003, -43.94945225 -19.9518588, -43.9491771 -19.9522937, -43.94897625 -19.9526379, -43.94911385 -19.9527755, -43.9491419 -19.95280355, -43.94933265 -19.9529459, -43.94894265 -19.95314595, -43.94890655 -19.9531764, -43.9488425 -19.953222150000002, -43.948709699999995 -19.953293000000002, -43.948685049999995 -19.95322065, -43.9484217 -19.953190900000003, -43.948363400000005 -19.95307105, -43.9482972 -19.95292135, -43.948255450000005 -19.9528635, -43.9480538 -19.9525668, -43.94752 -19.95277285, -43.9466847 -19.9522477, -43.94632905 -19.9518918, -43.945943150000005 -19.9518414, -43.945677849999996 -19.9518755, -43.945598399999994 -19.95167915, -43.94566365 -19.9513085, -43.9456223 -19.95131655, -43.94577495 -19.9510953, -43.945816300000004 -19.95108725, -43.94555630000001 -19.9507194, -43.94548195 -19.95070785, -43.94540845 -19.950728599999998, -43.9449527 -19.9508106, -43.9448027 -19.9506266, -43.944881800000005 -19.950203549999998, -43.94537495 -19.950211449999998, -43.9457438 -19.9499237, -43.94566065 -19.949542549999997, -43.9451043 -19.9496498))","prismadata__routing_isochrone__modo":"tempo","prismadata__routing_isochrone__limite_tempo_s":600,"prismadata__routing_isochrone__perfil":"car","prismadata__routing_isochrone__sentido":"SAINDO","prismadata__routing_isochrone__area_m2":56580000,"prismadata__routing_isochrone__condicao_transito":"normal","prismadata__routing_isochrone__fator_temporal":0.7,"prismadata__routing_isochrone__limite_tempo_s_efetivo":420,"prismadata__routing_isochrone__municipio_ibge":3106200}}},"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/isochrone?lat=-25.5&lng=-25.5\" \\\n  -H \"X-Apikey: ak_xxxxxxxxxxxxxxxx\""},{"lang":"Python","source":"import httpx\n\nresp = httpx.get(\n    \"https://api.prismadata.io/v1/routing/isochrone\",\n    params={\"lat\": -25.5, \"lng\": -25.5},\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.isochrone(\n    lat=-23.55,\n    lng=-46.63,\n    time_limit=600,\n    profile=\"car\",\n)\n# Campos principais (11 escalares)\nprint(result[\"prismadata__routing_isochrone__area_m2\"])\nprint(result[\"prismadata__routing_isochrone__geometria\"])              # WKT Polygon\nprint(result[\"prismadata__routing_isochrone__limite_tempo_s_efetivo\"]) # ajustado por transito\nprint(result[\"prismadata__routing_isochrone__municipio_ibge\"])\n\n# Modo isodistancia (v0.14) — mutuamente exclusivo com time_limit\nclient.isochrone(lat=-23.55, lng=-46.63, distance_limit=1500, profile=\"foot\")\n\n# Condicao de transito (v0.14) — multiplicador aplicado no servidor\n# 'livre' (1.0x), 'normal' (0.7x, default), 'pico_moderado', 'pico_pesado'\nclient.isochrone(lat=-23.55, lng=-46.63, time_limit=600, traffic=\"pico_pesado\")"},{"lang":"R SDK","source":"library(prismadata)\n\nclient <- prismadata_client(api_key = \"ak_xxxxxxxxxxxxxxxx\")\nresult <- client$isochrone(\n  lat = -23.55,\n  lng = -46.63,\n  time_limit = 600,\n  profile = \"car\",\n  direction = \"outgoing\"\n)\nprint(result)"},{"lang":"TypeScript SDK","source":"import { PrismaDataClient } from \"prismadata\";\n\nconst client = new PrismaDataClient({ apiKey: \"ak_xxxxxxxxxxxxxxxx\" });\nconst result = await client.isochrone(-23.55, -46.63, {\n  timeLimit: 600,\n  profile: \"car\",\n});\nconsole.log(result);"}]}},"/routing/batch/isochrone":{"post":{"tags":["Isocronas"],"summary":"Isócronas em lote","description":"Calcula multiplas isocronas em batch.","operationId":"calcular_isocronas_batch_batch_isochrone_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchIsochroneRequest"}}},"required":true},"responses":{"200":{"description":"Operacao realizada com sucesso","content":{"application/json":{"schema":{"properties":{"TOTAL":{"type":"integer","title":"Total","description":"Total de isocronas solicitadas"},"SUCESSOS":{"type":"integer","title":"Sucessos","description":"Quantidade calculadas com sucesso"},"FALHAS":{"type":"integer","title":"Falhas","description":"Quantidade que falharam"},"RESULTADOS":{"items":{"$ref":"#/components/schemas/BatchIsochroneResultItem"},"type":"array","title":"Resultados","description":"Lista de resultados"}},"additionalProperties":true,"type":"object","required":["TOTAL","SUCESSOS","FALHAS","RESULTADOS"],"title":"BatchIsochroneResponseSchema","description":"Schema de resposta batch de isocronas."},"example":{"TOTAL":2,"SUCESSOS":2,"FALHAS":0,"RESULTADOS":[{"prismadata__routing_isochrone__sucesso":true,"prismadata__routing_isochrone__dados":{"prismadata__routing_isochrone__geometria":"POLYGON ((-43.9378 -19.9191, -43.95 -19.9191, -43.95 -19.94, -43.9378 -19.94, -43.9378 -19.9191))","prismadata__routing_isochrone__modo":"tempo","prismadata__routing_isochrone__limite_tempo_s":600,"prismadata__routing_isochrone__perfil":"car","prismadata__routing_isochrone__sentido":"SAINDO","prismadata__routing_isochrone__area_m2":125000.0,"prismadata__routing_isochrone__condicao_transito":"normal","prismadata__routing_isochrone__fator_temporal":0.7,"prismadata__routing_isochrone__limite_tempo_s_efetivo":420,"prismadata__routing_isochrone__municipio_ibge":3106200}},{"prismadata__routing_isochrone__sucesso":true,"prismadata__routing_isochrone__dados":{"prismadata__routing_isochrone__geometria":"POLYGON ((-43.96 -19.95, -43.98 -19.95, -43.98 -19.97, -43.96 -19.97, -43.96 -19.95))","prismadata__routing_isochrone__modo":"distancia","prismadata__routing_isochrone__limite_distancia_m":1000,"prismadata__routing_isochrone__perfil":"car","prismadata__routing_isochrone__sentido":"SAINDO","prismadata__routing_isochrone__area_m2":80000.0,"prismadata__routing_isochrone__condicao_transito":"livre","prismadata__routing_isochrone__fator_temporal":1.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/isochrone\" \\\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/isochrone\",\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.isochrone_batch(\n    items=[\n        {\"lat\": -23.55, \"lng\": -46.63, \"time_limit\": 600},\n        {\"lat\": -22.90, \"lng\": -43.17, \"time_limit\": 300},\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(lat = -23.5505, lng = -46.6333, time_limit = 600),\n  list(lat = -22.9068, lng = -43.1729, time_limit = 900)\n)\n\nresults <- client$isochrone_batch(\n  items = items,\n  profile = \"car\",\n  direction = \"outgoing\"\n)\nprint(results)"},{"lang":"TypeScript SDK","source":"import { PrismaDataClient } from \"prismadata\";\n\nconst client = new PrismaDataClient({ apiKey: \"ak_xxxxxxxxxxxxxxxx\" });\nconst result = await client.isochroneBatch(\n  [\n    { lat: -23.55, lng: -46.63, time_limit: 600 },\n    { lat: -22.90, lng: -43.17, time_limit: 300 },\n  ],\n  { profile: \"car\" },\n);\nconsole.log(result);"}]}},"/routing/buffer":{"get":{"tags":["Isocronas"],"summary":"Buffer circular geodésico em torno de um ponto","description":"Buffer circular geodesico (distancia euclidiana, sem malha viaria).","operationId":"calcular_buffer_buffer_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90.0,"minimum":-90.0,"description":"Latitude do centro (WGS84).","title":"Lat"},"description":"Latitude do centro (WGS84)."},{"name":"lng","in":"query","required":true,"schema":{"type":"number","maximum":180.0,"minimum":-180.0,"description":"Longitude do centro (WGS84).","title":"Lng"},"description":"Longitude do centro (WGS84)."},{"name":"raio_m","in":"query","required":true,"schema":{"type":"integer","maximum":100000,"minimum":10,"description":"Raio euclidiano em metros (10..100000). Cap em 100 km — acima disso nao e buffer, e analise regional.","title":"Raio M"},"description":"Raio euclidiano em metros (10..100000). Cap em 100 km — acima disso nao e buffer, e analise regional."},{"name":"num_vertices","in":"query","required":false,"schema":{"type":"integer","maximum":256,"minimum":8,"description":"Numero de vertices do poligono aproximando o circulo. 64 = ~99.5% da area real, suficiente pra maioria dos usos.","default":64,"title":"Num Vertices"},"description":"Numero de vertices do poligono aproximando o circulo. 64 = ~99.5% da area real, suficiente pra maioria dos usos."}],"responses":{"200":{"description":"Operacao realizada com sucesso","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"BufferResponseSchema","description":"Schema de resposta de buffer circular.","properties":{"prismadata__routing_isochrone__geometria":{"description":"Poligono WKT do circulo.","title":"Prismadata  Routing Isochrone  Geometria","type":"string"},"prismadata__routing_isochrone__area_m2":{"description":"Area do circulo em m² (WGS84).","title":"Prismadata  Routing Isochrone  Area M2","type":"integer"},"prismadata__routing_isochrone__raio_m":{"description":"Raio ecoado do request (m).","title":"Prismadata  Routing Isochrone  Raio M","type":"integer"},"prismadata__routing_isochrone__num_vertices":{"description":"Numero de vertices do poligono aproximando o circulo.","title":"Prismadata  Routing Isochrone  Num Vertices","type":"integer"},"prismadata__routing_isochrone__centro_lat":{"description":"Latitude do centro.","title":"Prismadata  Routing Isochrone  Centro Lat","type":"number"},"prismadata__routing_isochrone__centro_lng":{"description":"Longitude do centro.","title":"Prismadata  Routing Isochrone  Centro Lng","type":"number"}},"required":["prismadata__routing_isochrone__geometria","prismadata__routing_isochrone__area_m2","prismadata__routing_isochrone__raio_m","prismadata__routing_isochrone__num_vertices","prismadata__routing_isochrone__centro_lat","prismadata__routing_isochrone__centro_lng"]},"example":{"prismadata__routing_isochrone__geometria":"POLYGON ((-43.93293 -19.91910, -43.93336 -19.91869, -43.93400 -19.91853, -43.93464 -19.91869, -43.93507 -19.91910, -43.93464 -19.91951, -43.93400 -19.91967, -43.93336 -19.91951, -43.93293 -19.91910))","prismadata__routing_isochrone__area_m2":785398,"prismadata__routing_isochrone__raio_m":500,"prismadata__routing_isochrone__num_vertices":64,"prismadata__routing_isochrone__centro_lat":-19.9191,"prismadata__routing_isochrone__centro_lng":-43.9378}}},"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/buffer?lat=-25.5&lng=-25.5&raio_m=1\" \\\n  -H \"X-Apikey: ak_xxxxxxxxxxxxxxxx\""},{"lang":"Python","source":"import httpx\n\nresp = httpx.get(\n    \"https://api.prismadata.io/v1/routing/buffer\",\n    params={\"lat\": -25.5, \"lng\": -25.5, \"raio_m\": 1},\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\")\n# Buffer circular geodesico — sem malha viaria, muito mais barato\n# que isochrone. Alcance 10m a 100km.\nr = client.buffer(lat=-23.55, lng=-46.63, radius_m=500)\nprint(r[\"prismadata__routing_isochrone__area_m2\"])\nprint(r[\"prismadata__routing_isochrone__geometria\"])   # WKT polygon\n# Poligono com mais vertices (default 64, faixa 8-256)\nclient.buffer(lat=-23.55, lng=-46.63, radius_m=1000, num_vertices=128)"}]}},"/routing/batch/buffer":{"post":{"tags":["Isocronas"],"summary":"Buffers circulares em lote","description":"Calcula multiplos buffers em batch.","operationId":"calcular_buffers_batch_batch_buffer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchBufferRequest"}}},"required":true},"responses":{"200":{"description":"Operacao realizada com sucesso","content":{"application/json":{"schema":{"properties":{"TOTAL":{"type":"integer","title":"Total","description":"Total de buffers solicitados."},"SUCESSOS":{"type":"integer","title":"Sucessos","description":"Quantidade gerada com sucesso."},"FALHAS":{"type":"integer","title":"Falhas","description":"Quantidade que falhou."},"RESULTADOS":{"items":{"$ref":"#/components/schemas/BatchBufferResultItem"},"type":"array","title":"Resultados","description":"Lista de resultados."}},"additionalProperties":true,"type":"object","required":["TOTAL","SUCESSOS","FALHAS","RESULTADOS"],"title":"BatchBufferResponseSchema","description":"Schema de resposta batch de buffers."},"example":{"TOTAL":2,"SUCESSOS":2,"FALHAS":0,"RESULTADOS":[{"prismadata__routing_isochrone__sucesso":true,"prismadata__routing_isochrone__dados":{"prismadata__routing_isochrone__geometria":"POLYGON ((-43.93293 -19.91910, -43.93336 -19.91869, -43.93400 -19.91853, -43.93464 -19.91869, -43.93507 -19.91910, -43.93464 -19.91951, -43.93400 -19.91967, -43.93336 -19.91951, -43.93293 -19.91910))","prismadata__routing_isochrone__area_m2":785398,"prismadata__routing_isochrone__raio_m":500,"prismadata__routing_isochrone__num_vertices":64,"prismadata__routing_isochrone__centro_lat":-19.9191,"prismadata__routing_isochrone__centro_lng":-43.9378}},{"prismadata__routing_isochrone__sucesso":true,"prismadata__routing_isochrone__dados":{"prismadata__routing_isochrone__geometria":"POLYGON ((-43.93293 -19.91910, -43.93336 -19.91869, -43.93400 -19.91853, -43.93464 -19.91869, -43.93507 -19.91910, -43.93464 -19.91951, -43.93400 -19.91967, -43.93336 -19.91951, -43.93293 -19.91910))","prismadata__routing_isochrone__area_m2":3141592,"prismadata__routing_isochrone__raio_m":1000,"prismadata__routing_isochrone__num_vertices":64,"prismadata__routing_isochrone__centro_lat":-23.5505,"prismadata__routing_isochrone__centro_lng":-46.6333}}]}}},"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/buffer\" \\\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/buffer\",\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\")\nr = client.buffer_batch([\n    {\"lat\": -23.55, \"lng\": -46.63, \"raio_m\": 500},\n    {\"lat\": -22.90, \"lng\": -43.17, \"raio_m\": 800, \"num_vertices\": 32},\n])\nprint(r[\"TOTAL\"], r[\"SUCESSOS\"])"}]}}},"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":{"BatchBufferItem":{"properties":{"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat"},"lng":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lng"},"raio_m":{"type":"integer","maximum":100000.0,"minimum":10.0,"title":"Raio M","description":"Raio em metros (10..100000)."},"num_vertices":{"type":"integer","maximum":256.0,"minimum":8.0,"title":"Num Vertices","description":"Vertices do poligono. 64 = ~99.5% da area real.","default":64}},"type":"object","required":["lat","lng","raio_m"],"title":"BatchBufferItem","description":"Item individual de buffer circular para batch."},"BatchBufferRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BatchBufferItem"},"type":"array","maxItems":16,"minItems":1,"title":"Items","description":"Lista de buffers a calcular"}},"type":"object","required":["items"],"title":"BatchBufferRequest","description":"Requisicao de batch de buffers circulares."},"BatchBufferResultItem":{"properties":{"prismadata__routing_isochrone__sucesso":{"type":"boolean","title":"Prismadata  Routing Isochrone  Sucesso","description":"Se o buffer foi gerado."},"prismadata__routing_isochrone__dados":{"anyOf":[{"$ref":"#/components/schemas/BufferResponseSchema"},{"type":"null"}],"description":"Dados do buffer (presente quando sucesso=true)."},"prismadata__routing_isochrone__erro":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prismadata  Routing Isochrone  Erro","description":"Mensagem de erro (presente quando sucesso=false)."}},"type":"object","required":["prismadata__routing_isochrone__sucesso"],"title":"BatchBufferResultItem","description":"Item individual de resultado batch de buffer."},"BatchIsochroneItem":{"properties":{"lat":{"type":"number","title":"Lat","description":"Latitude do ponto central"},"lng":{"type":"number","title":"Lng","description":"Longitude do ponto central"},"time_limit":{"type":"integer","maximum":7200.0,"minimum":60.0,"title":"Time Limit","description":"Limite de tempo em segundos","default":600},"condicao_transito":{"type":"string","enum":["livre","normal","pico_moderado","pico_pesado"],"title":"Condicao Transito","description":"livre|normal (default)|pico_moderado|pico_pesado (só efetivo no modo tempo).","default":"normal"}},"type":"object","required":["lat","lng"],"title":"BatchIsochroneItem","description":"Item individual de isocrona para batch."},"BatchIsochroneRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BatchIsochroneItem"},"type":"array","maxItems":16,"minItems":1,"title":"Items","description":"Lista de isocronas a calcular"},"profile":{"type":"string","enum":["car","foot","bike"],"title":"Profile","description":"Perfil de roteamento","default":"car"},"sentido":{"type":"string","enum":["INDO","SAINDO"],"title":"Sentido","description":"SAINDO (do ponto) ou INDO (para o ponto)","default":"SAINDO"}},"type":"object","required":["items"],"title":"BatchIsochroneRequest","description":"Requisicao de batch de isocronas."},"BatchIsochroneResultItem":{"properties":{"prismadata__routing_isochrone__sucesso":{"type":"boolean","title":"Prismadata  Routing Isochrone  Sucesso","description":"Se o calculo foi bem sucedido"},"prismadata__routing_isochrone__dados":{"anyOf":[{"$ref":"#/components/schemas/IsochroneResponseSchema"},{"type":"null"}],"description":"Dados da isocrona (presente quando sucesso=true)"},"prismadata__routing_isochrone__erro":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prismadata  Routing Isochrone  Erro","description":"Mensagem de erro (presente quando sucesso=false)"}},"type":"object","required":["prismadata__routing_isochrone__sucesso"],"title":"BatchIsochroneResultItem","description":"Item individual de resultado batch de isocrona."},"BufferResponseSchema":{"properties":{"prismadata__routing_isochrone__geometria":{"type":"string","title":"Prismadata  Routing Isochrone  Geometria","description":"Poligono WKT do circulo."},"prismadata__routing_isochrone__area_m2":{"type":"integer","title":"Prismadata  Routing Isochrone  Area M2","description":"Area do circulo em m² (WGS84)."},"prismadata__routing_isochrone__raio_m":{"type":"integer","title":"Prismadata  Routing Isochrone  Raio M","description":"Raio ecoado do request (m)."},"prismadata__routing_isochrone__num_vertices":{"type":"integer","title":"Prismadata  Routing Isochrone  Num Vertices","description":"Numero de vertices do poligono aproximando o circulo."},"prismadata__routing_isochrone__centro_lat":{"type":"number","title":"Prismadata  Routing Isochrone  Centro Lat","description":"Latitude do centro."},"prismadata__routing_isochrone__centro_lng":{"type":"number","title":"Prismadata  Routing Isochrone  Centro Lng","description":"Longitude do centro."}},"type":"object","required":["prismadata__routing_isochrone__geometria","prismadata__routing_isochrone__area_m2","prismadata__routing_isochrone__raio_m","prismadata__routing_isochrone__num_vertices","prismadata__routing_isochrone__centro_lat","prismadata__routing_isochrone__centro_lng"],"title":"BufferResponseSchema","description":"Schema de resposta de buffer circular."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IsochroneResponseSchema":{"properties":{"prismadata__routing_isochrone__geometria":{"type":"string","title":"Prismadata  Routing Isochrone  Geometria","description":"Geometria em WKT (POLYGON)"},"prismadata__routing_isochrone__modo":{"type":"string","title":"Prismadata  Routing Isochrone  Modo","description":"Qual dimensao foi limitada: 'tempo' ou 'distancia'."},"prismadata__routing_isochrone__limite_tempo_s":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prismadata  Routing Isochrone  Limite Tempo S","description":"Limite de tempo em segundos. Null quando modo='distancia'."},"prismadata__routing_isochrone__limite_distancia_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prismadata  Routing Isochrone  Limite Distancia M","description":"Limite de distancia em metros. Null quando modo='tempo'."},"prismadata__routing_isochrone__perfil":{"type":"string","title":"Prismadata  Routing Isochrone  Perfil","description":"Perfil utilizado (car, foot, bike)"},"prismadata__routing_isochrone__sentido":{"type":"string","title":"Prismadata  Routing Isochrone  Sentido","description":"Sentido do movimento (INDO, SAINDO)"},"prismadata__routing_isochrone__area_m2":{"type":"number","title":"Prismadata  Routing Isochrone  Area M2","description":"Area do poligono em metros quadrados"},"prismadata__routing_isochrone__condicao_transito":{"type":"string","title":"Prismadata  Routing Isochrone  Condicao Transito","description":"Nivel de trânsito pedido: livre | normal | pico_moderado | pico_pesado."},"prismadata__routing_isochrone__fator_temporal":{"type":"number","title":"Prismadata  Routing Isochrone  Fator Temporal","description":"Multiplicador aplicado ao time_limit (1.0=livre, 0.7=normal, 0.5=pico_moderado, 0.3=pico_pesado)."},"prismadata__routing_isochrone__limite_tempo_s_efetivo":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prismadata  Routing Isochrone  Limite Tempo S Efetivo","description":"time_limit efetivamente enviado ao motor de roteamento (time_limit * fator, mín. 60s)."},"prismadata__routing_isochrone__municipio_ibge":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prismadata  Routing Isochrone  Municipio Ibge","description":"Código IBGE do município identificado (observabilidade; não afeta o fator)."}},"type":"object","required":["prismadata__routing_isochrone__geometria","prismadata__routing_isochrone__modo","prismadata__routing_isochrone__limite_tempo_s","prismadata__routing_isochrone__limite_distancia_m","prismadata__routing_isochrone__perfil","prismadata__routing_isochrone__sentido","prismadata__routing_isochrone__area_m2","prismadata__routing_isochrone__condicao_transito","prismadata__routing_isochrone__fator_temporal","prismadata__routing_isochrone__limite_tempo_s_efetivo","prismadata__routing_isochrone__municipio_ibge"],"title":"IsochroneResponseSchema","description":"Schema de resposta de isocrona (modo tempo) ou isodistancia (modo distancia)."},"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"}}}}
