{"openapi":"3.1.0","info":{"title":"PrismaData — PrismaData Entorno","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":"Dossie agregado do microterritorio: habitacao (CNEFE), renda por faixa, concorrencia CNPJ, composicao favelas/ACI. MVP progressivo — blocos nao plugados vem como `null` no OUTPUT."},"servers":[{"url":"https://api.prismadata.io/v1","description":"Ambiente de Produção"}],"security":[{"X-Apikey":[]},{"api_key":[]},{"BearerAuth":[]}],"tags":[{"name":"PrismaData Entorno","description":"Dossie agregado do microterritorio: habitacao (CNEFE), renda por faixa, concorrencia CNPJ, composicao favelas/ACI. MVP progressivo — blocos nao plugados vem como `null` no OUTPUT."}],"paths":{"/location/entorno/agregado/raw":{"post":{"tags":["PrismaData Entorno"],"summary":"Estudo de entorno de um ponto (formato aninhado)","description":"Dossie agregado do microterritorio (aninhado).","operationId":"entorno_agregado_raw_entorno_agregado_raw_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntornoAgregadoRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Entorno Agregado Raw Entorno Agregado Raw Post"},"example":{"prismadata__entorno__ancora":{"latitude":-19.9386,"longitude":-43.9372,"origem":"coordenada"},"prismadata__entorno__habitacao":{"total_enderecos":393,"total_domicilios_residenciais":570,"total_apartamentos":0,"total_casas":329},"prismadata__entorno__renda_pessoal":{"total_pessoas":1846,"faixas":[{"faixa":"A","renda_min":20000.0,"renda_max":null,"pessoas":30,"frac":0.0163},{"faixa":"B","renda_min":10000.0,"renda_max":20000.0,"pessoas":75,"frac":0.0406}]},"prismadata__entorno__concorrencia":{"total":121,"por_1000_domicilios":212.2807,"por_cnae":[{"cnae":"4771702","quantidade":37},{"cnae":"4711301","quantidade":27}]},"prismadata__entorno__execucao":{"versao_contrato":"1.16","origem_dados":"sandbox"}}}},"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","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"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"}}},"429":{"$ref":"#/components/responses/RateLimitExceeded"}},"x-codeSamples":[{"lang":"curl","source":"curl -X POST \"https://api.prismadata.io/v1/location/entorno/agregado/raw\" \\\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/location/entorno/agregado/raw\",\n    json={...},\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# Dossie aninhado para exploracao (listas ricas)\ndossie = client.entorno_raw(\n    endereco=\"Rua Washington 660, Belo Horizonte\",\n    buffer={\"raio_m\": 500},\n    detalhe_concorrencia=\"cruzado\",\n    descricoes=True,\n)\nprint(list(dossie.keys()))\nprint(client.entorno_provenance(dossie))  # \"prod\" | \"sandbox\""}]}},"/location/entorno/agregado":{"post":{"tags":["PrismaData Entorno"],"summary":"Estudo de entorno de um ponto (formato plano)","description":"Dossiê em formato plano (canônico).\n\nEstudo de entorno com o mesmo conteúdo do `/agregado/raw`, com os\nblocos achatados em campos escalares (uma linha por requisição).\nBlocos ausentes viram `<bloco>_disponivel=false`.","operationId":"entorno_agregado_entorno_agregado_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntornoAgregadoRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Entorno Agregado Entorno Agregado Post"},"example":{"prismadata__entorno__ancora_latitude":-19.9386,"prismadata__entorno__ancora_longitude":-43.9372,"prismadata__entorno__ancora_origem":"coordenada","prismadata__entorno__modalidade":"isocrona","prismadata__entorno__isocrona_profile":"foot","prismadata__entorno__isocrona_minutos":15,"prismadata__entorno__habitacao_disponivel":true,"prismadata__entorno__habitacao_total_domicilios_residenciais":570,"prismadata__entorno__habitacao_total_apartamentos":0,"prismadata__entorno__habitacao_total_casas":329,"prismadata__entorno__renda_disponivel":true,"prismadata__entorno__renda_pessoal_total_pessoas":1846,"prismadata__entorno__renda_pessoal_faixa_a_pessoas":30,"prismadata__entorno__renda_pessoal_faixa_a_frac":0.016251,"prismadata__entorno__renda_pessoal_faixa_b_pessoas":75,"prismadata__entorno__renda_pessoal_faixa_b_frac":0.040628,"prismadata__entorno__concorrencia_disponivel":true,"prismadata__entorno__concorrencia_total":121,"prismadata__entorno__concorrencia_redes":55,"prismadata__entorno__concorrencia_independentes":66,"prismadata__entorno__concorrencia_por_1000_domicilios":212.2807,"prismadata__entorno__concorrencia_indice_vs_municipio":5.5522,"prismadata__entorno__versao_contrato":"1.16","prismadata__entorno__origem_dados":"sandbox"}}},"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","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"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"}}},"429":{"$ref":"#/components/responses/RateLimitExceeded"}},"x-codeSamples":[{"lang":"curl","source":"curl -X POST \"https://api.prismadata.io/v1/location/entorno/agregado\" \\\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/location/entorno/agregado\",\n    json={...},\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# Dict com chaves escalares (prefixo prismadata__entorno__ ja stripado)\n# v1.14: toda resposta traz origem_dados (\"prod\" | \"sandbox\")\nr = client.entorno(\n    endereco=\"Rua Washington 660, Belo Horizonte\",\n    isocrona={\"profile\": \"foot\", \"metros\": 500, \"sentido\": \"SAINDO\"},\n    flags={\"favelas\": True, \"aci\": True},\n    filtros_cnpj={\"cnae_prefix\": [\"4771\"]},\n)\nprint(r[\"origem_dados\"], r[\"concorrencia_total\"])\n# ou: client.entorno_provenance(r)  -> \"prod\" | \"sandbox\" | None\n# Para 1 linha de DataFrame: pd.DataFrame([r])\n\n# v1.15: bloco huff (particao cativos/disputados/perdidos)\n# Requer ancora=cnpj + filtros_cnpj com cnae_prefix ou segmento\nresp = client.entorno(\n    ancora={\"cnpj\": \"14169897001915\"},   # Drogaria Wanessa (BH)\n    buffer={\"raio_m\": 500},\n    filtros_cnpj={\"cnae_prefix\": [\"4771\"]},\n    huff=True,\n)\ntotal = resp[\"huff_dom_cativos\"] + resp[\"huff_dom_disputados\"] + resp[\"huff_dom_perdidos\"]\nassert total == resp[\"huff_n_unidades_origens\"]      # invariante\nprint(resp[\"huff_share_esperado\"], resp[\"huff_frac_cativos\"])"}]}},"/location/entorno/agregado/batch":{"post":{"tags":["PrismaData Entorno"],"summary":"Estudo de entorno em lote","description":"Lote de estudos em formato plano (até 100 por requisição).\n\nEntrada: `{id_cliente: <requisição>}`. Saída: objeto indexado pelas\nmesmas chaves enviadas; cada item traz `SUCESSO`, `EXCEPTION`,\n`OUTPUT` (dossiê plano) e `STATS`. A falha de um item não derruba o\nlote: o item volta com `SUCESSO=false` e o motivo em `EXCEPTION`.","operationId":"entorno_agregado_batch_entorno_agregado_batch_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Entorno Agregado Batch Entorno Agregado Batch Post"},"example":{"prismadata__entorno__loja_1":{"SUCESSO":true,"EXCEPTION":"","OUTPUT":{"modalidade":"isocrona","habitacao_total_domicilios_residenciais":570,"renda_pessoal_total_pessoas":1846,"concorrencia_total":121,"origem_dados":"sandbox"},"STATS":{"latencia_ms_total":402}},"prismadata__entorno__loja_2":{"SUCESSO":false,"EXCEPTION":"informe exatamente um entre (ancora + isocrona), (ancora + buffer) e wkt","OUTPUT":{"sucesso":false,"erro":"informe exatamente um entre (ancora + isocrona), (ancora + buffer) e wkt"},"STATS":{}}}}},"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","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"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"}}},"429":{"$ref":"#/components/responses/RateLimitExceeded"}},"x-codeSamples":[{"lang":"curl","source":"curl -X POST \"https://api.prismadata.io/v1/location/entorno/agregado/batch\" \\\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/location/entorno/agregado/batch\",\n    json={...},\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# Ate 100 estudos por chamada; falhas viram linha com sucesso=False\n# Cada linha tem coluna origem_dados (v1.14)\ndf = client.entorno_batch({\n    \"sion\":     {\"endereco\": \"Rua Washington 660, BH\", \"buffer\": {\"raio_m\": 500}},\n    \"paulista\": {\"endereco\": \"Av Paulista 1578, SP\",   \"buffer\": {\"raio_m\": 500}},\n})\nprint(df[df.sucesso][[\"id_cliente\", \"origem_dados\", \"concorrencia_total\"]])"}]}}},"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":{"Ancora":{"properties":{"latitude":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Longitude"},"endereco":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Endereco","description":"Endereco livre. Mutuamente exclusivo com `latitude`/`longitude` e `cnpj`. Ex: 'Rua Washington 660, Sion, Belo Horizonte, MG'."},"cnpj":{"anyOf":[{"type":"string","maxLength":18},{"type":"null"}],"title":"Cnpj","description":"v0.9. CNPJ do PDV (14 digitos; aceita mascara XX.XXX.XXX/XXXX-XX). Mutuamente exclusivo com coord e endereco. Resolvido na base de CNPJs geocodificados. CNPJ invalido (digitos verificadores errados) -> 422 imediato. Nao encontrado / sem geolocalizacao / qualidade abaixo do limiar -> 422 explicativo."}},"additionalProperties":false,"type":"object","title":"Ancora","description":"Ponto ancora do estudo. Tres formas mutuamente exclusivas\n(2+ ativas -> 422):\n\n- `latitude` + `longitude`: coordenada direta.\n- `endereco`: string livre resolvida por geocodificacao.\n- `cnpj` (v0.9): 14 digitos, com ou sem mascara. Resolvido na base\n  de CNPJs geocodificados para coordenada + atributos\n  do estabelecimento. Validacao de digitos verificadores acontece\n  no schema (invalido -> 422 imediato).\n\nEm qualquer forma, a lat/lng derivada eh populada in-place como se\ntivesse sido enviada. O eco em `parametros_efetivos.ancora` mostra\na coordenada resolvida; metadados de qualidade e (se cnpj) atributos\ndo PDV vao em `OUTPUT.ancora`."},"Buffer":{"properties":{"raio_m":{"type":"integer","maximum":20000.0,"minimum":100.0,"title":"Raio M","description":"Raio em metros (100 m a 20 km)."}},"additionalProperties":false,"type":"object","required":["raio_m"],"title":"Buffer","description":"Area circular por raio geodesico em metros a partir da ancora.\n\nUsada quando o cliente NAO quer uma isocrona (que depende da\nmalha viaria) e sim um estudo puramente geometrico — atendimento de raio,\ndelivery de curto alcance, etc. Aproxima o circulo com um poligono\nde 64 vertices (erro de area ~0.1%, aceitavel para o uso do programa)."},"DistanciaConcorrentes":{"properties":{"top_n":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"Top N","default":5},"metodo":{"type":"string","enum":["geodesica","rota"],"title":"Metodo","default":"geodesica"},"profile":{"anyOf":[{"type":"string","enum":["foot","car","bike"]},{"type":"null"}],"title":"Profile"},"incluir_geometria":{"type":"boolean","title":"Incluir Geometria","default":false}},"additionalProperties":false,"type":"object","title":"DistanciaConcorrentes","description":"v0.8/C: pedido de top_n concorrentes mais proximos da ancora.\n\nSo valido em modalidades com ancora (buffer/isocrona). `wkt_direto`\n+ `distancia_concorrentes` -> 422. `metodo=\"rota\"` exige `profile`.\n\n- `top_n`: 1..20 (guardrail). Universo: CNPJs que passam nos\n  filtros do estudo (mesmos `filtros_cnpj`).\n- `metodo`: `geodesica` (linha reta) ou `rota` (distancia real\n  via malha viaria).\n- `profile`: `foot|car|bike`. Obrigatorio se `metodo=rota`.\n- `incluir_geometria`: quando true, cada item ganha\n  `geometria_wkt` (LineString WGS84) — util pra desenhar rota\n  no mapa. So faz sentido com `metodo=rota`; com geodesica,\n  omitido."},"EntornoAgregadoRequest":{"properties":{"ancora":{"anyOf":[{"$ref":"#/components/schemas/Ancora"},{"type":"null"}]},"qualidade_minima_geocoder":{"type":"string","enum":["MUITO_ALTA","ALTA","MEDIA","BAIXA","MUITO_BAIXA"],"title":"Qualidade Minima Geocoder","description":"Limite minimo de qualidade do geocode quando `ancora.endereco` for usado. Ordem: MUITO_ALTA > ALTA > MEDIA > BAIXA > MUITO_BAIXA. Default MEDIA. Rejeita CENTROIDE_MUNICIPIO/NAO_GEOCODIFICADO.","default":"MEDIA"},"isocrona":{"anyOf":[{"$ref":"#/components/schemas/Isocrona"},{"type":"null"}]},"buffer":{"anyOf":[{"$ref":"#/components/schemas/Buffer"},{"type":"null"}]},"wkt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wkt"},"filtros_cnpj":{"$ref":"#/components/schemas/FiltrosCnpj"},"faixas_renda_mensal":{"additionalProperties":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array"},"type":"object","title":"Faixas Renda Mensal","description":"Faixas nao-sobrepostas de renda pessoal mensal. Cada valor eh `[min, max]`; null = infinito. Rotulos usados como sufixo em colunas do flat (sanitizados: lower, sem acento, `[a-z0-9]`)."},"flags":{"$ref":"#/components/schemas/Flags"},"incluir_geometria":{"type":"boolean","title":"Incluir Geometria","description":"So tem efeito no /raw. Quando true, `OUTPUT.geometria_estudo.wkt` carrega o WKT da area de estudo alem dos metadados de origem/parametros. No flat, ignorado com aviso em execucao.","default":false},"detalhe_concorrencia":{"type":"string","enum":["resumo","cruzado"],"title":"Detalhe Concorrencia","description":"So tem efeito no /raw. `resumo` (default): por_cnae, por_porte, redes_vs_independentes. `cruzado`: adiciona agregado fino (cnae x porte x matriz_filial). No flat, ignorado com aviso.","default":"resumo"},"incluir_indicadores":{"type":"boolean","title":"Incluir Indicadores","description":"v0.8/A3+A4. Anexa `concorrencia.indicadores` com maturidade (idade_mediana_anos, frac_ate_2_anos), formalizacao (frac_mei, capital_social_mediano) e mortalidade (baixadas_24m, taxa_mortalidade_24m). Custo: 2 queries agregadas extras.","default":false},"incluir_dados_pdv":{"type":"boolean","title":"Incluir Dados Pdv","description":"v0.9/B1. So valido com `ancora.cnpj` (com outra origem -> 422). Anexa `ancora.pdv` com atributos do estabelecimento (razao_social, cnae, porte, situacao, ...) + colunas flat pdv_*. Cobra evento CNPJ no billing.","default":false},"excluir_mesma_raiz":{"type":"boolean","title":"Excluir Mesma Raiz","description":"v0.9/C. So aplicavel com `ancora.cnpj`. Quando true (default), a autoexclusao expande para todas as filiais da mesma empresa (mesmos 8 primeiros digitos). false -> exclui apenas o CNPJ exato do ancora.","default":true},"granularidade":{"type":"string","enum":["por_setor","agregado"],"title":"Granularidade","default":"agregado"},"descricoes":{"type":"boolean","title":"Descricoes","description":"So tem efeito no /raw. Quando true, anexa `concorrencia.descricoes: {cnae_codigo: descricao}`. Custo extra de latencia (~10-50ms).","default":false}},"additionalProperties":false,"type":"object","title":"EntornoAgregadoRequest","description":"Body do POST /entorno/agregado (flat) e /entorno/agregado/raw.\n\nRegra (violação -> 422): exatamente um entre\n`(ancora + isocrona)`, `(ancora + buffer)`, `wkt`. Dentro de\n`ancora`, tambem exatamente um entre `(latitude+longitude)` e\n`endereco`.\n\nPilares core (`habitacao`, `renda_pessoal`, `concorrencia`) sao\nsempre executados. Camadas opt-in vao em `flags` (favelas, aci).\n\n`detalhe_concorrencia` e `incluir_geometria` afetam apenas o /raw\n(o flat ignora com aviso em `execucao.avisos`)."},"FiltrosCnpj":{"properties":{"cnae_prefix":{"items":{"type":"string"},"type":"array","title":"Cnae Prefix"},"situacao_cadastral":{"items":{"type":"string"},"type":"array","title":"Situacao Cadastral","description":"F1 (v0.9.4): default `['ATIVA']` — evitar contar histórico de empresas baixadas nas agregações. Cliente pode passar lista vazia explicitamente para incluir tudo, ou ['ATIVA', 'BAIXADA', ...] para filtrar."},"qualidade_geo_min":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qualidade Geo Min"},"matriz_filial":{"items":{"type":"string"},"type":"array","title":"Matriz Filial"},"porte":{"items":{"type":"string"},"type":"array","title":"Porte"},"capital_social_min":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Capital Social Min"},"natureza_juridica":{"items":{"type":"string"},"type":"array","title":"Natureza Juridica"},"data_abertura_desde":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Data Abertura Desde"},"opcao_mei":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Opcao Mei"},"incluir_cnae_secundario":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Incluir Cnae Secundario","description":"v0.8/A5. Se true, `cnae_prefix`/`segmento` matcham tambem em `cnaes_secundarios` (alem do principal). Sem dupla contagem: 1 CNPJ = 1 row. Default None (=false); opt-in."},"segmento":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Segmento","description":"v0.8/B2. 1+ segmentos da taxonomia de segmentos PrismaData (agrupamentos de CNAEs por ramo de atividade). Resolvido internamente para lista de `cnae_prefix`. MUTEX com `cnae_prefix` — se ambos vierem, 422. Auditoria: `parametros_efetivos.filtros_cnpj` ecoa `segmento` (lista canonica) e `versao_taxonomia`. Com >=2 segmentos, `/raw` traz `concorrencia.por_segmento`."}},"additionalProperties":false,"type":"object","title":"FiltrosCnpj","description":"Filtros aplicados aos CNPJs contados no bloco de concorrencia.\n\n`porte` aceita canônico (MICRO/PEQUENA/DEMAIS/NAO_INFORMADO) e aliases\ntributários (ME→MICRO, EPP→PEQUENA) — normalização interna."},"Flags":{"properties":{"favelas":{"type":"boolean","title":"Favelas","default":false},"aci":{"type":"boolean","title":"Aci","default":false},"distancia_concorrentes":{"anyOf":[{"$ref":"#/components/schemas/DistanciaConcorrentes"},{"type":"null"}]},"huff":{"anyOf":[{"type":"boolean"},{"$ref":"#/components/schemas/HuffParams"},{"type":"null"}],"title":"Huff"}},"additionalProperties":false,"type":"object","title":"Flags","description":"Flags de camadas de composicao opt-in (v0.7+).\n\nBlocos core (`habitacao`, `renda_pessoal`, `concorrencia`) foram\nconsolidados como sempre-ativos no contrato v1 e nao aparecem em\nflags — nao ha caso de uso para desliga-los.\n\nCamadas de composicao (`favelas`, `aci`) continuam opt-in — cada\nflag ativa dispara um evento de cobranca adicional.\n\nv0.8/C adiciona `distancia_concorrentes` (opt-in via sub-objeto\nou None) para retornar top_n CNPJs mais proximos da ancora.\n\nv1.15 adiciona `huff` (opt-in via `true` ou sub-objeto). `true`\né normalizado para `HuffParams()` com defaults; `false` vira `None`."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HuffParams":{"properties":{"origens":{"type":"string","enum":["auto","setores","enderecos"],"title":"Origens","default":"auto"},"metodo_distancia":{"type":"string","enum":["geodesica","rota"],"title":"Metodo Distancia","default":"geodesica"},"lambda":{"anyOf":[{"type":"string","enum":["conveniencia","padrao","destino"]},{"type":"null"}],"title":"Lambda","description":"Preset. `null` = `padrao` (2.0). Valores efetivos: conveniencia=2.5, padrao=2.0, destino=1.5. Número livre não é aceito — 422."},"epsilon_disputa":{"type":"number","maximum":0.3,"minimum":0.01,"title":"Epsilon Disputa","default":0.1},"max_alternativas":{"type":"integer","maximum":20.0,"minimum":3.0,"title":"Max Alternativas","default":10}},"additionalProperties":false,"type":"object","title":"HuffParams","description":"v1.15: parâmetros do bloco `huff` (partição de demanda).\n\nAtivado por `flags.huff` como `true` (defaults) ou objeto explícito.\nValidações CROSS-FIELD (ancora.cnpj obrigatória, filtro CNAE\nobrigatório, `metodo_distancia=\"rota\"` reservado v2) são validadas\nna requisição completa, com 422 explicativo."},"Isocrona":{"properties":{"profile":{"type":"string","enum":["car","foot","bike"],"title":"Profile","description":"Perfil de roteamento: carro, a pe ou bicicleta.","default":"car"},"minutos":{"anyOf":[{"type":"integer","maximum":120.0,"minimum":1.0},{"type":"null"}],"title":"Minutos","description":"Duracao da isocrona em minutos (modo tempo). Mutuamente exclusivo com `metros`."},"metros":{"anyOf":[{"type":"integer","maximum":50000.0,"minimum":100.0},{"type":"null"}],"title":"Metros","description":"Distancia da isodistancia em metros (modo distancia). Corta o Dijkstra na distancia acumulada da malha viaria (nao euclidiana — para raio euclidiano use `buffer.raio_m`). Mutuamente exclusivo com `minutos`."},"sentido":{"type":"string","enum":["INDO","SAINDO"],"title":"Sentido","description":"`SAINDO`: sai da ancora; `INDO`: chega ate a ancora (fluxo reverso na malha viaria).","default":"SAINDO"}},"additionalProperties":false,"type":"object","title":"Isocrona","description":"Isocrona (limite por tempo) ou isodistancia (limite por distancia)\ncalculada sobre a malha viaria. Exatamente um entre `minutos` e `metros`.\n\nTecnicamente linha de distancia constante e \"isocota\"/isodistancia, nao\nisocrona. Mantemos o nome `isocrona` alinhado com a convencao de mercado,\nque expoe os dois modos sob o mesmo conceito de isocrona."},"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"}}}}
