{"openapi":"3.1.0","info":{"title":"PrismaData — Gateway Agregador","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":"Endpoints do API Gateway que agregam múltiplas APIs de localização\nem uma única chamada. Permite consultar informações de favelas, renda,\nfronteiras, presídios, setores censitários e aglomerações comerciais\nsimultaneamente.\n\nO agregador é útil quando você precisa de múltiplas informações sobre uma\nmesma coordenada geográfica, reduzindo o número de requisições necessárias.\n\nAs 4 variantes (single/batch × com/sem geocoder) aceitam o **mesmo conjunto\nde flags de habilitação**. As variantes `/geocoder/*` apenas adicionam uma\netapa prévia de geocodificação a partir de endereço — depois encaminham\npara a mesma lógica de agregação.\n"},"servers":[{"url":"https://api.prismadata.io/v1","description":"Ambiente de Produção"}],"security":[{"X-Apikey":[]},{"api_key":[]},{"BearerAuth":[]}],"tags":[{"name":"Gateway Agregador","description":"Endpoints do API Gateway que agregam múltiplas APIs de localização\nem uma única chamada. Permite consultar informações de favelas, renda,\nfronteiras, presídios, setores censitários e aglomerações comerciais\nsimultaneamente.\n\nO agregador é útil quando você precisa de múltiplas informações sobre uma\nmesma coordenada geográfica, reduzindo o número de requisições necessárias.\n\nAs 4 variantes (single/batch × com/sem geocoder) aceitam o **mesmo conjunto\nde flags de habilitação**. As variantes `/geocoder/*` apenas adicionam uma\netapa prévia de geocodificação a partir de endereço — depois encaminham\npara a mesma lógica de agregação.\n"}],"paths":{"/location/aggregator":{"get":{"tags":["Gateway Agregador"],"summary":"Várias bases de localização em uma chamada","description":"Endpoint que agrega múltiplas APIs de localização em uma única chamada.\n\nHabilite os dados desejados através dos parâmetros booleanos:\n- `slum=true`: retorna informações de favelas\n- `infosc=true`: retorna informações do setor censitário\n- `prison=true`: retorna informações de presídios\n- `border=true`: retorna informações de fronteiras\n- `personal_income_static=true`: retorna renda estática\n- `personal_income_pdf=true`: retorna renda dinâmica (PDF)\n- `commercial_cluster=true`: retorna informações de aglomerações comerciais\n\nA resposta contém apenas os campos dos serviços habilitados.\n","operationId":"aggregator_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","exclusiveMaximum":90,"exclusiveMinimum":-90,"description":"Latitude do ponto de consulta.","title":"Lat"},"description":"Latitude do ponto de consulta.","example":-19.932378368680315},{"name":"lng","in":"query","required":true,"schema":{"type":"number","exclusiveMaximum":180,"exclusiveMinimum":-180,"description":"Longitude do ponto de consulta.","title":"Lng"},"description":"Longitude do ponto de consulta.","example":-43.9351245162891},{"name":"slum","in":"query","required":false,"schema":{"type":"boolean","default":false,"description":"Habilita retorno de informações de favelas.","title":"Slum"},"description":"Habilita retorno de informações de favelas (prismadata__slum__*)."},{"name":"infosc","in":"query","required":false,"schema":{"type":"boolean","default":false,"description":"Habilita retorno de informações do setor censitário.","title":"InfoSC"},"description":"Habilita retorno de informações do setor censitário (prismadata__infosc__*)."},{"name":"prison","in":"query","required":false,"schema":{"type":"boolean","default":false,"description":"Habilita retorno de informações de presídios.","title":"Prison"},"description":"Habilita retorno de informações de presídios (prismadata__prison__*)."},{"name":"border","in":"query","required":false,"schema":{"type":"boolean","default":false,"description":"Habilita retorno de informações de fronteiras.","title":"Border"},"description":"Habilita retorno de informações de fronteiras (prismadata__border__*)."},{"name":"personal_income_static","in":"query","required":false,"schema":{"type":"boolean","default":false,"description":"Habilita retorno de renda estática.","title":"Personal Income Static"},"description":"Habilita retorno de renda estática (prismadata__personal_income_static__*)."},{"name":"personal_income_pdf","in":"query","required":false,"schema":{"type":"boolean","default":false,"description":"Habilita retorno de renda dinâmica (PDF).","title":"Personal Income PDF"},"description":"Habilita retorno de renda dinâmica (prismadata__personal_income_pdf__*)."},{"name":"commercial_cluster","in":"query","required":false,"schema":{"type":"boolean","default":false,"description":"Habilita retorno de informações de aglomerações comerciais.","title":"Commercial Cluster"},"description":"Habilita retorno de informações de aglomerações comerciais (prismadata__commercial_cluster__*)."},{"name":"date_income","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Data para consulta de renda PDF (YYYY-MM-DD). Requer personal_income_pdf=true.","title":"Date Income"},"description":"Data para consulta de renda PDF (YYYY-MM-DD). Requer personal_income_pdf=true.","example":"2025-01-25"},{"name":"gender","in":"query","required":false,"schema":{"anyOf":[{"type":"string","enum":["M","F"]},{"type":"null"}],"description":"Gênero para filtro de renda PDF. Requer personal_income_pdf=true.","title":"Gender"},"description":"Gênero para filtro de renda PDF (M ou F). Requer personal_income_pdf=true.","example":"M"},{"name":"age","in":"query","required":false,"schema":{"anyOf":[{"type":"number","exclusiveMaximum":90,"exclusiveMinimum":15},{"type":"null"}],"description":"Idade para filtro de renda PDF. Requer personal_income_pdf=true.","title":"Age"},"description":"Idade para filtro de renda PDF (15-90). Requer personal_income_pdf=true.","example":50},{"name":"is_responsible","in":"query","required":false,"schema":{"anyOf":[{"type":"string","enum":["true","false","1","0"]},{"type":"null"}],"description":"Indica se é responsável pelo domicílio. Requer personal_income_pdf=true.","title":"Is Responsible"},"description":"Indica se é responsável pelo domicílio. Requer personal_income_pdf=true."},{"name":"income_compared","in":"query","required":false,"schema":{"anyOf":[{"type":"number","exclusiveMinimum":0},{"type":"null"}],"description":"Renda a ser comparada. Requer personal_income_pdf=true.","title":"Income Compared"},"description":"Renda a ser comparada com a renda da região. Requer personal_income_pdf=true.","example":10000}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AggregatorResponse"},"example":{"prismadata__slum__favela_distancia_m":132.96,"prismadata__slum__favela_municipio":"Belo Horizonte","prismadata__infosc__municipio":"Belo Horizonte","prismadata__infosc__situacao":"Urbana","prismadata__personal_income_static__faixa_sm_min":5.0,"prismadata__personal_income_static__faixa_sm_max":10.0,"prismadata__personal_income_static__percentil_br":98,"prismadata__commercial_cluster__aglomeracao_hash":"5e28444d2cee","prismadata__commercial_cluster__nome_aglomeracao":"Rua Bittencourt","prismadata__commercial_cluster__contido":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"}}},"401":{"description":"Unauthorized - Missing or invalid API key (X-Apikey header or api_key query parameter)","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 - Missing privileges to retrieve data","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","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/location/aggregator?lat=-19.932378368680315&lng=-43.9351245162891&date_income=2025-01-25&gender=M&age=50&income_compared=10000\" \\\n  -H \"X-Apikey: ak_xxxxxxxxxxxxxxxx\""},{"lang":"Python","source":"import httpx\n\nresp = httpx.get(\n    \"https://api.prismadata.io/v1/location/aggregator\",\n    params={\"lat\": -19.932378368680315, \"lng\": -43.9351245162891, \"date_income\": '2025-01-25', \"gender\": 'M', \"age\": 50, \"income_compared\": 10000},\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.aggregate(\n    lat=-23.55,\n    lng=-46.63,\n    services=[\"slum\", \"prison\", \"infosc\"],\n)\nprint(result)"},{"lang":"R SDK","source":"library(prismadata)\n\nclient <- prismadata_client(api_key = \"ak_xxxxxxxxxxxxxxxx\")\nresult <- client$aggregate(\n  lat = -23.55,\n  lng = -46.63,\n  services = c(\"slum\", \"prison\", \"border\", \"infosc\")\n)\nprint(result)"},{"lang":"TypeScript SDK","source":"import { PrismaDataClient } from \"prismadata\";\n\nconst client = new PrismaDataClient({ apiKey: \"ak_xxxxxxxxxxxxxxxx\" });\nconst result = await client.aggregate(-23.55, -46.63, {\n  services: [\"slum\", \"prison\", \"infosc\"],\n});\nconsole.log(result);"}]}},"/location/batch/aggregator":{"post":{"tags":["Gateway Agregador"],"summary":"Várias bases de localização em lote","description":"Endpoint batch que agrega múltiplas APIs de localização para vários pontos\nem uma única chamada.\n\nEnvie um JSON com pontos no formato `{\"id\": [lat, lng]}` e habilite os\ndados desejados via query parameters:\n- `slum=true`: retorna informações de favelas\n- `infosc=true`: retorna informações do setor censitário\n- `prison=true`: retorna informações de presídios\n- `border=true`: retorna informações de fronteiras\n- `personal_income_static=true`: retorna renda estática\n- `personal_income_pdf=true`: retorna renda dinâmica (PDF)\n- `commercial_cluster=true`: retorna informações de aglomerações comerciais\n\nQuando `personal_income_pdf=true`, os pontos podem opcionalmente usar o\nformato de dicionário com parâmetros demográficos individuais:\n`{\"id\": {\"lat\": -23.55, \"lng\": -46.63, \"gender\": \"M\", \"age\": 35}}`.\nPontos no formato `[lat, lng]` também são aceitos (sem filtros demográficos).\nOs demais serviços normalizam automaticamente ambos os formatos para coordenadas.\n\nA resposta contém um objeto com os mesmos IDs do request, cada um com os\ncampos prefixados por `prismadata__<categoria>__`.\n","operationId":"batch_aggregator_post","parameters":[{"name":"slum","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de informações de favelas (prismadata__slum__*)."},{"name":"infosc","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de informações do setor censitário (prismadata__infosc__*)."},{"name":"prison","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de informações de presídios (prismadata__prison__*)."},{"name":"border","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de informações de fronteiras (prismadata__border__*)."},{"name":"personal_income_static","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de renda estática (prismadata__personal_income_static__*)."},{"name":"personal_income_pdf","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de renda dinâmica PDF (prismadata__personal_income_pdf__*). Quando habilitado, os pontos podem usar formato de dicionário com parâmetros demográficos individuais (lat, lng, date_income, gender, age, is_responsible, income_compared)."},{"name":"commercial_cluster","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de informações de aglomerações comerciais (prismadata__commercial_cluster__*)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchAggregatorRequest"},"example":{"ponto_1":[-19.932378,-43.935124],"ponto_2":[-22.906847,-43.172897]}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchAggregatorResponse"},"example":{"ponto_1":{"prismadata__slum__favela_distancia_m":132.96,"prismadata__slum__favela_municipio":"Belo Horizonte","prismadata__infosc__municipio":"Belo Horizonte","prismadata__infosc__situacao":"Urbana","prismadata__personal_income_static__faixa_sm_min":5.0,"prismadata__personal_income_static__faixa_sm_max":10.0,"prismadata__personal_income_static__percentil_br":98,"prismadata__commercial_cluster__aglomeracao_hash":"5e28444d2cee","prismadata__commercial_cluster__nome_aglomeracao":"Rua Bittencourt"},"ponto_2":{"prismadata__slum__favela_distancia_m":1042.33,"prismadata__slum__favela_municipio":"Rio de Janeiro","prismadata__infosc__municipio":"Rio de Janeiro","prismadata__infosc__situacao":"Urbana","prismadata__personal_income_pdf__mean":3500.0,"prismadata__personal_income_pdf__median":2800.0,"prismadata__commercial_cluster__aglomeracao_hash":"5ebd0eb4f6b4","prismadata__commercial_cluster__nome_aglomeracao":"Avenida Paulista"}}}},"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"}}},"401":{"description":"Unauthorized - Missing or invalid API key (X-Apikey header or api_key query parameter)","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 - Missing privileges to retrieve data","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","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/location/batch/aggregator\" \\\n  -H \"X-Apikey: ak_xxxxxxxxxxxxxxxx\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"ponto_1\": [-19.932378, -43.935124], \"ponto_2\": [-22.906847, -43.172897]}'"},{"lang":"Python","source":"import httpx\n\nresp = httpx.post(\n    \"https://api.prismadata.io/v1/location/batch/aggregator\",\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.aggregate_batch(\n    points={\n        \"p1\": [-23.55, -46.63],\n        \"p2\": [-22.90, -43.17],\n    },\n    services=[\"slum\", \"prison\", \"infosc\"],\n)\nprint(result)"},{"lang":"R SDK","source":"library(prismadata)\n\nclient <- prismadata_client(api_key = \"ak_xxxxxxxxxxxxxxxx\")\npoints <- list(\n  \"p1\" = c(-23.5505, -46.6333),\n  \"p2\" = c(-22.9068, -43.1729),\n  \"p3\" = c(-15.7942, -47.8822)\n)\n\nresults <- client$aggregate_batch(\n  points = points,\n  services = c(\"slum\", \"prison\", \"border\", \"infosc\")\n)\nprint(results)"},{"lang":"TypeScript SDK","source":"import { PrismaDataClient } from \"prismadata\";\n\nconst client = new PrismaDataClient({ apiKey: \"ak_xxxxxxxxxxxxxxxx\" });\nconst result = await client.aggregateBatch(\n  {\n    p1: [-23.55, -46.63],\n    p2: [-22.90, -43.17],\n  },\n  { services: [\"slum\", \"prison\", \"infosc\"] },\n);\nconsole.log(result);"}]}},"/location/geocoder/aggregator":{"get":{"tags":["Gateway Agregador"],"summary":"Geocodifica e agrega várias bases em uma chamada","description":"Endpoint que primeiro geocodifica um endereço e depois agrega múltiplas APIs\nde localização usando as coordenadas obtidas — equivalente a `/aggregator`\nprecedido de uma etapa de geocodificação.\n\nÚtil quando você tem um endereço (não coordenadas) e precisa de múltiplas\ninformações sobre essa localização.\n\nAceita o **mesmo conjunto de flags de habilitação** que `/aggregator`:\n- `slum=true`: retorna informações de favelas\n- `infosc=true`: retorna informações do setor censitário\n- `prison=true`: retorna informações de presídios\n- `border=true`: retorna informações de fronteiras\n- `personal_income_static=true`: retorna renda estática\n- `personal_income_pdf=true`: retorna renda dinâmica (PDF)\n- `commercial_cluster=true`: retorna informações de aglomerações comerciais\n\nA resposta inclui também os campos `prismadata__geocoder__*` com o resultado\nda geocodificação.\n","operationId":"geocoder_aggregator_get","parameters":[{"name":"endereco_completo","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"description":"Endereço completo a ser geocodificado.","title":"Endereco Completo"},"description":"Endereço completo a ser geocodificado."},{"name":"cep","in":"query","required":false,"schema":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"integer"}],"maxLength":9},{"type":"null"}],"description":"CEP do endereço.","title":"Cep"},"description":"CEP do endereço.","example":"30130-165"},{"name":"numero","in":"query","required":false,"schema":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"integer"}],"maxLength":10},{"type":"null"}],"description":"Número do endereço.","title":"Numero"},"description":"Número do endereço."},{"name":"tipo_logradouro","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"Tipo do logradouro (ex: Rua, Avenida).","title":"Tipo Logradouro"},"description":"Tipo do logradouro (ex: Rua, Avenida)."},{"name":"titulo_logradouro","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"Título do logradouro (ex: Coronel, Professor).","title":"Titulo Logradouro"},"description":"Título do logradouro (ex: Coronel, Professor)."},{"name":"logradouro","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"description":"Nome do logradouro.","title":"Logradouro"},"description":"Nome do logradouro."},{"name":"localidade","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"description":"Localidade (bairro) do endereço.","title":"Localidade"},"description":"Localidade (bairro) do endereço."},{"name":"municipio","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"description":"Município do endereço.","title":"Municipio"},"description":"Município do endereço."},{"name":"estado","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":15},{"type":"null"}],"description":"Estado do endereço.","title":"Estado"},"description":"Estado do endereço."},{"name":"slum","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de informações de favelas (prismadata__slum__*)."},{"name":"infosc","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de informações do setor censitário (prismadata__infosc__*)."},{"name":"prison","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de informações de presídios (prismadata__prison__*)."},{"name":"border","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de informações de fronteiras (prismadata__border__*)."},{"name":"personal_income_static","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de renda estática (prismadata__personal_income_static__*)."},{"name":"personal_income_pdf","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de renda dinâmica (prismadata__personal_income_pdf__*)."},{"name":"commercial_cluster","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de informações de aglomerações comerciais (prismadata__commercial_cluster__*)."},{"name":"date_income","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Data para consulta de renda PDF (YYYY-MM-DD). Requer personal_income_pdf=true.","title":"Date Income"},"description":"Data para consulta de renda PDF (YYYY-MM-DD). Requer personal_income_pdf=true.","example":"2025-01-25"},{"name":"gender","in":"query","required":false,"schema":{"anyOf":[{"type":"string","enum":["M","F"]},{"type":"null"}],"description":"Gênero para filtro de renda PDF. Requer personal_income_pdf=true.","title":"Gender"},"description":"Gênero para filtro de renda PDF (M ou F). Requer personal_income_pdf=true.","example":"M"},{"name":"age","in":"query","required":false,"schema":{"anyOf":[{"type":"number","exclusiveMaximum":90,"exclusiveMinimum":15},{"type":"null"}],"description":"Idade para filtro de renda PDF. Requer personal_income_pdf=true.","title":"Age"},"description":"Idade para filtro de renda PDF (15-90). Requer personal_income_pdf=true.","example":50},{"name":"is_responsible","in":"query","required":false,"schema":{"anyOf":[{"type":"string","enum":["true","false","1","0"]},{"type":"null"}],"description":"Indica se é responsável pelo domicílio. Requer personal_income_pdf=true.","title":"Is Responsible"},"description":"Indica se é responsável pelo domicílio. Requer personal_income_pdf=true."},{"name":"income_compared","in":"query","required":false,"schema":{"anyOf":[{"type":"number","exclusiveMinimum":0},{"type":"null"}],"description":"Renda a ser comparada. Requer personal_income_pdf=true.","title":"Income Compared"},"description":"Renda a ser comparada com a renda da região. Requer personal_income_pdf=true.","example":10000}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeocoderAggregatorResponse"},"example":{"prismadata__geocoder__latitude":-19.93292236328125,"prismadata__geocoder__longitude":-43.935611724853516,"prismadata__geocoder__municipio":"BELO HORIZONTE","prismadata__slum__favela_distancia_m":132.96,"prismadata__infosc__municipio":"Belo Horizonte","prismadata__commercial_cluster__aglomeracao_hash":"5e28444d2cee","prismadata__commercial_cluster__nome_aglomeracao":"Rua Bittencourt"}}},"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"}}},"401":{"description":"Unauthorized - Missing or invalid API key (X-Apikey header or api_key query parameter)","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 - Missing privileges to retrieve data","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","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/location/geocoder/aggregator?cep=30130-165&date_income=2025-01-25&gender=M&age=50&income_compared=10000\" \\\n  -H \"X-Apikey: ak_xxxxxxxxxxxxxxxx\""},{"lang":"Python","source":"import httpx\n\nresp = httpx.get(\n    \"https://api.prismadata.io/v1/location/geocoder/aggregator\",\n    params={\"cep\": '30130-165', \"date_income\": '2025-01-25', \"gender\": 'M', \"age\": 50, \"income_compared\": 10000},\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.geocode_aggregate(\n    full_address=\"Av Paulista 1000, Sao Paulo\",\n    services=[\"slum\", \"prison\", \"infosc\"],\n)\nprint(result)"},{"lang":"R SDK","source":"library(prismadata)\n\nclient <- prismadata_client(api_key = \"ak_xxxxxxxxxxxxxxxx\")\nresult <- client$geocode_aggregate(\n  services = c(\"slum\", \"prison\", \"border\", \"infosc\"),\n  full_address = \"Av Paulista 1000, Sao Paulo, SP\"\n)\nprint(result)"},{"lang":"TypeScript SDK","source":"import { PrismaDataClient } from \"prismadata\";\n\nconst client = new PrismaDataClient({ apiKey: \"ak_xxxxxxxxxxxxxxxx\" });\nconst result = await client.geocodeAggregate({\n  fullAddress: \"Av Paulista 1000, Sao Paulo\",\n  services: [\"slum\", \"prison\", \"infosc\"],\n});\nconsole.log(result);"}]}},"/location/batch/geocoder/aggregator":{"post":{"tags":["Gateway Agregador"],"summary":"Geocodifica e agrega várias bases em lote","description":"Endpoint batch que primeiro geocodifica endereços e depois agrega múltiplas APIs\nde localização usando as coordenadas obtidas — equivalente a `/batch/aggregator`\nprecedido de uma etapa de geocodificação por endereço.\n\nCombina o `/geocoder/aggregator` com processamento em lote, permitindo enviar\naté 1024 endereços de uma vez.\n\nEnvie um JSON com endereços no formato `{\"id\": {\"endereco_completo\": \"...\"}}` e\nhabilite os dados desejados via query parameters — **mesmo conjunto de flags\nde `/batch/aggregator`**:\n- `slum=true`: retorna informações de favelas\n- `infosc=true`: retorna informações do setor censitário\n- `prison=true`: retorna informações de presídios\n- `border=true`: retorna informações de fronteiras\n- `personal_income_static=true`: retorna renda estática\n- `personal_income_pdf=true`: retorna renda dinâmica (PDF)\n- `commercial_cluster=true`: retorna informações de aglomerações comerciais\n\nQuando `personal_income_pdf=true`, os endereços podem opcionalmente incluir\nparâmetros demográficos individuais no objeto\n(`date_income`, `gender`, `age`, `is_responsible`, `income_compared`).\n\nA resposta contém um objeto com os mesmos IDs do request, cada um com campos\n`prismadata__geocoder__*` (resultado da geocodificação) + campos das APIs\nhabilitadas prefixados por `prismadata__<categoria>__`.\n","operationId":"batch_geocoder_aggregator_post","parameters":[{"name":"slum","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de informações de favelas (prismadata__slum__*)."},{"name":"infosc","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de informações do setor censitário (prismadata__infosc__*)."},{"name":"prison","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de informações de presídios (prismadata__prison__*)."},{"name":"border","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de informações de fronteiras (prismadata__border__*)."},{"name":"personal_income_static","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de renda estática (prismadata__personal_income_static__*)."},{"name":"personal_income_pdf","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de renda dinâmica PDF (prismadata__personal_income_pdf__*). Quando habilitado, os endereços podem usar formato de dicionário com parâmetros demográficos individuais (date_income, gender, age, is_responsible, income_compared)."},{"name":"commercial_cluster","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Habilita retorno de informações de aglomerações comerciais (prismadata__commercial_cluster__*)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchGeocoderAggregatorRequest"},"example":{"ponto_1":{"endereco_completo":"Av Paulista 1000, Sao Paulo, SP"},"ponto_2":{"cep":"30130-165","numero":"100","logradouro":"Rua da Bahia"}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchGeocoderAggregatorResponse"},"example":{"ponto_1":{"prismadata__geocoder__latitude":-23.56,"prismadata__geocoder__longitude":-46.65,"prismadata__geocoder__municipio":"SAO PAULO","prismadata__slum__favela_distancia_m":132.96,"prismadata__commercial_cluster__aglomeracao_hash":"5ebd0eb4f6b4","prismadata__commercial_cluster__nome_aglomeracao":"Avenida Paulista"},"ponto_2":{"prismadata__geocoder__latitude":-19.93,"prismadata__geocoder__longitude":-43.93,"prismadata__geocoder__municipio":"BELO HORIZONTE","prismadata__slum__favela_distancia_m":500.12,"prismadata__commercial_cluster__aglomeracao_hash":"5e28444d2cee","prismadata__commercial_cluster__nome_aglomeracao":"Rua Bittencourt"}}}},"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"}}},"401":{"description":"Unauthorized - Missing or invalid API key (X-Apikey header or api_key query parameter)","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 - Missing privileges to retrieve data","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","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/location/batch/geocoder/aggregator\" \\\n  -H \"X-Apikey: ak_xxxxxxxxxxxxxxxx\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"ponto_1\": {\"endereco_completo\": \"Av Paulista 1000, Sao Paulo, SP\"}, \"ponto_2\": {\"cep\": \"30130-165\", \"numero\": \"100\", \"logradouro\": \"Rua da Bahia\"}}'"},{"lang":"Python","source":"import httpx\n\nresp = httpx.post(\n    \"https://api.prismadata.io/v1/location/batch/geocoder/aggregator\",\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.geocode_aggregate_batch(\n    addresses={\n        \"p1\": {\"endereco_completo\": \"Av Paulista 1000, Sao Paulo, SP\"},\n        \"p2\": {\"endereco_completo\": \"Rua da Bahia 100, Belo Horizonte, MG\"},\n    },\n    services=[\"slum\", \"infosc\"],\n)\nprint(result)"},{"lang":"R SDK","source":"library(prismadata)\n\nclient <- prismadata_client(api_key = \"ak_xxxxxxxxxxxxxxxx\")\naddresses <- list(\n  \"p1\" = list(endereco_completo = \"Av Paulista 1000, Sao Paulo, SP\"),\n  \"p2\" = list(endereco_completo = \"Rua da Bahia 100, Belo Horizonte, MG\")\n)\n\nresults <- client$geocode_aggregate_batch(\n  addresses,\n  services = c(\"slum\", \"infosc\")\n)\nprint(results)"},{"lang":"TypeScript SDK","source":"import { PrismaDataClient } from \"prismadata\";\n\nconst client = new PrismaDataClient({ apiKey: \"ak_xxxxxxxxxxxxxxxx\" });\nconst result = await client.geocodeAggregateBatch(\n  {\n    p1: { endereco_completo: \"Av Paulista 1000, Sao Paulo, SP\" },\n    p2: { endereco_completo: \"Rua da Bahia 100, Belo Horizonte, MG\" },\n  },\n  { services: [\"slum\", \"infosc\"] },\n);\nconsole.log(result);"}]}}},"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":{"AggregatorResponse":{"type":"object","description":"Resposta combinada do agregador. Os campos retornados dependem dos flags habilitados:\n\n- **slum=true**: campos `prismadata__slum__*` (favelas, complexos, ilhas)\n- **infosc=true**: campos `prismadata__infosc__*` (setor censitário)\n- **prison=true**: campos `prismadata__prison__*` (presídios)\n- **border=true**: campos `prismadata__border__*` (fronteiras)\n- **personal_income_static=true**: campos `prismadata__personal_income_static__*`\n- **personal_income_pdf=true**: campos `prismadata__personal_income_pdf__*`\n- **commercial_cluster=true**: campos `prismadata__commercial_cluster__*` (aglomerações comerciais)\n\nConsulte a documentação de cada API individual para detalhes dos campos.\n","additionalProperties":true,"title":"AggregatorResponse"},"BatchAggregatorRequest":{"type":"object","description":"Dicionário de pontos para consulta em lote. Cada chave é um identificador\núnico do ponto e o valor pode ser:\n\n- **Array** `[latitude, longitude]` — formato padrão para todos os serviços.\n- **Objeto** `{\"lat\": number, \"lng\": number, ...}` — formato com parâmetros\n  demográficos individuais, usado quando `personal_income_pdf=true`. Campos\n  opcionais: `date_income` (YYYY-MM-DD), `gender` (M/F), `age` (15-90),\n  `is_responsible` (true/false), `income_compared` (> 0).\n\nAmbos os formatos podem coexistir no mesmo request. Serviços que não aceitam\nparâmetros demográficos ignoram os campos extras e usam apenas lat/lng.\n","additionalProperties":true,"example":{"ponto_1":[-19.932378,-43.935124],"ponto_2":{"lat":-22.906847,"lng":-43.172897,"gender":"M","age":35}},"title":"BatchAggregatorRequest"},"BatchAggregatorResponse":{"type":"object","description":"Resposta do batch aggregator. Cada chave corresponde ao ID do ponto\nenviado no request, com os campos das APIs habilitadas prefixados por\n`prismadata__<categoria>__`.\n\n- **slum**: campos `prismadata__slum__*` (favelas)\n- **infosc**: campos `prismadata__infosc__*` (setor censitário)\n- **prison**: campos `prismadata__prison__*` (presídios)\n- **border**: campos `prismadata__border__*` (fronteiras)\n- **personal_income_static**: campos `prismadata__personal_income_static__*` (renda estática)\n- **personal_income_pdf**: campos `prismadata__personal_income_pdf__*` (renda dinâmica)\n- **commercial_cluster**: campos `prismadata__commercial_cluster__*` (aglomerações comerciais)\n","additionalProperties":{"type":"object","additionalProperties":true},"title":"BatchAggregatorResponse"},"BatchGeocoderAggregatorRequest":{"type":"object","description":"Dicionário de endereços para geocodificação e agregação em lote.\nCada chave é um identificador único e o valor é um objeto com\ncampos de endereço.\n\nCampos possíveis: `endereco_completo`, `cep`, `numero`,\n`tipo_logradouro`, `titulo_logradouro`, `logradouro`,\n`localidade`, `municipio`, `estado`. Quando `personal_income_pdf=true`,\ntambém aceita `date_income`, `gender`, `age`, `is_responsible`,\n`income_compared` no mesmo objeto.\n","additionalProperties":{"type":"object","properties":{"endereco_completo":{"type":"string","description":"Endereço completo a ser geocodificado."},"cep":{"type":"string","description":"CEP do endereço."},"numero":{"type":"string","description":"Número do endereço."},"tipo_logradouro":{"type":"string","description":"Tipo do logradouro (ex: Rua, Avenida)."},"titulo_logradouro":{"type":"string","description":"Título do logradouro (ex: Coronel, Professor)."},"logradouro":{"type":"string","description":"Nome do logradouro."},"localidade":{"type":"string","description":"Localidade (bairro) do endereço."},"municipio":{"type":"string","description":"Município do endereço."},"estado":{"type":"string","description":"Estado do endereço."}},"additionalProperties":true},"example":{"ponto_1":{"endereco_completo":"Av Paulista 1000, Sao Paulo, SP"},"ponto_2":{"cep":"30130-165","numero":"100","logradouro":"Rua da Bahia"}},"title":"BatchGeocoderAggregatorRequest"},"BatchGeocoderAggregatorResponse":{"type":"object","description":"Resposta do batch geocoder aggregator. Cada chave corresponde ao ID\ndo endereço enviado no request, com campos `prismadata__geocoder__*`\n(resultado da geocodificação) + campos das APIs habilitadas\nprefixados por `prismadata__<categoria>__` — mesmo conjunto de\n`BatchAggregatorResponse`.\n\n- **geocoder**: campos `prismadata__geocoder__*` (coordenadas, município)\n- **slum**: campos `prismadata__slum__*` (favelas)\n- **infosc**: campos `prismadata__infosc__*` (setor censitário)\n- **prison**: campos `prismadata__prison__*` (presídios)\n- **border**: campos `prismadata__border__*` (fronteiras)\n- **personal_income_static**: campos `prismadata__personal_income_static__*` (renda estática)\n- **personal_income_pdf**: campos `prismadata__personal_income_pdf__*` (renda dinâmica)\n- **commercial_cluster**: campos `prismadata__commercial_cluster__*` (aglomerações comerciais)\n","additionalProperties":{"type":"object","additionalProperties":true},"title":"BatchGeocoderAggregatorResponse"},"GeocoderAggregatorResponse":{"type":"object","description":"Resposta combinada do geocoder + agregador. Inclui:\n\n- Campos `prismadata__geocoder__*` com resultado da geocodificação\n- Campos das APIs habilitadas — mesmo conjunto de `AggregatorResponse`\n  (slum, infosc, prison, border, personal_income_static, personal_income_pdf,\n  commercial_cluster)\n","additionalProperties":true,"title":"GeocoderAggregatorResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"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"}}}}
