{"openapi":"3.1.0","info":{"title":"PontoFato","version":"cf26a8c4","description":"Ponto e fato de um lugar no Brasil. Índice: GET /api/."},"servers":[{"url":"https://staging.pontofato.com"}],"components":{"schemas":{"Saude":{"type":"object","properties":{"ok":{"type":"boolean","description":"`true` quando há pelo menos uma UF no disco."},"origem":{"type":"string","description":"`sqlite` ou `indisponivel`."},"cobertura":{"allOf":[{"$ref":"#/components/schemas/Cobertura"}],"description":"UFs presentes."},"pontos":{"type":"integer","description":"Soma de linhas nas UFs montadas."},"build":{"type":"string","description":"Commit publicado neste Worker (`BUILD`)."}},"required":["ok","origem","cobertura","pontos","build"],"description":"Disponibilidade da consulta e cobertura atual."},"Cobertura":{"type":"object","properties":{"ufs":{"type":"array","items":{"type":"string"},"description":"Siglas disponíveis, em ordem."},"completa":{"type":"boolean","description":"`true` só com as 27 UFs."}},"required":["ufs","completa"],"description":"Quais UFs estão disponíveis para consulta."},"Cep":{"type":"object","properties":{"cep":{"type":"string","description":"CEP formatado `NNNNN-NNN`."},"pontos":{"type":"array","items":{"$ref":"#/components/schemas/Ponto"},"description":"Endereços distintos neste CEP (teto na origem)."},"resumo":{"allOf":[{"$ref":"#/components/schemas/Resumo"}],"description":"Unidades, edifícios, espécies, bairro, cidade, UF e centroide."},"fonte":{"type":"string","description":"Identificação e crédito da referência dos endereços."},"cobertura":{"allOf":[{"$ref":"#/components/schemas/Cobertura"}],"description":"UFs disponíveis nesta consulta."},"_links":{"type":"object","description":"`self`, `empresas` e `unidades` absolutos."}},"required":["cep","pontos","resumo","fonte","cobertura","_links"],"description":"Endereços de um CEP, com resumo e cobertura."},"Ponto":{"type":"object","properties":{"cep":{"type":"string","description":"CEP formatado da unidade ou do edifício.","nullable":true},"logradouro":{"type":"string","description":"Tipo + nome do logradouro, já juntados."},"numero":{"type":"string","description":"Número no logradouro.","nullable":true},"complemento":{"type":"string","description":"Complementos do endereço, se houver.","nullable":true},"bairro":{"type":"string","description":"Localidade/bairro no cadastro."},"cidade":{"type":"string","description":"Município IBGE."},"uf":{"type":"string","description":"Sigla da unidade da federação."},"lat":{"type":"number","description":"Latitude WGS84 do ponto.","nullable":true},"lon":{"type":"number","description":"Longitude WGS84 do ponto.","nullable":true},"ibge":{"type":"string","description":"Código IBGE do município.","nullable":true},"especie":{"type":"string","description":"Código da espécie CNEFE (`1`–`8`).","nullable":true},"especie_label":{"type":"string","description":"Rótulo IBGE da espécie.","nullable":true},"tipo_edificacao":{"type":"string","description":"Casa, apartamento, vila — `COD_TIPO_ESPECIE`.","nullable":true},"tipo_edificacao_codigo":{"type":"string","description":"Código `101`–`104`.","nullable":true},"estabelecimento":{"type":"string","description":"Nome do estabelecimento, quando a espécie tem.","nullable":true},"estabelecimentos":{"type":"array","items":{"type":"string"},"description":"Nomes distintos no edifício (amostra).","nullable":true},"especies":{"type":"array","items":{"$ref":"#/components/schemas/EspecieContagem"},"description":"Mistura de espécies neste logradouro+número.","nullable":true},"setor":{"type":"string","description":"Setor censitário.","nullable":true},"distrito":{"type":"string","description":"Código de distrito IBGE.","nullable":true},"subdistrito":{"type":"string","description":"Código de subdistrito IBGE.","nullable":true},"quadra":{"type":"string","description":"Número da quadra no setor.","nullable":true},"face":{"type":"string","description":"Número da face da quadra.","nullable":true},"nv_geo":{"type":"string","description":"Nível de geocodificação (`1`–`6`).","nullable":true},"nv_geo_label":{"type":"string","description":"O que o nível de geo significa.","nullable":true},"finalidade":{"type":"string","description":"Residencial, não residencial, misto ou indeterminado.","nullable":true},"indicador_estab":{"type":"string","description":"Único ou múltiplo estabelecimento no endereço.","nullable":true},"indicador_const":{"type":"string","description":"Único ou múltiplo em construção/reforma.","nullable":true},"id_cnefe":{"type":"string","description":"`COD_UNICO_ENDERECO` da unidade (só no detalhe).","nullable":true},"tipo_logradouro":{"type":"string","description":"Tipo (RUA, AVENIDA…).","nullable":true},"titulo_logradouro":{"type":"string","description":"Título (DOUTOR…), se houver.","nullable":true},"nome_logradouro":{"type":"string","description":"Nome do logradouro sem o tipo.","nullable":true},"modificador":{"type":"string","description":"Modificador do número (SN, KM…).","nullable":true},"unidades":{"type":"integer","description":"Quantas unidades neste logradouro+número (apartamentos, salas)."},"complementos":{"type":"integer","description":"Complementos distintos no edifício.","nullable":true},"_links":{"type":"object","description":"`unidades` absoluto para o detalhe paginado.","nullable":true},"_origem":{"type":"string","description":"UF de referência do resultado."}},"required":["cep","logradouro","numero","complemento","bairro","cidade","uf","lat","lon","ibge","especie","especie_label","tipo_edificacao","tipo_edificacao_codigo","estabelecimento","estabelecimentos","especies","setor","distrito","subdistrito","quadra","face","nv_geo","nv_geo_label","finalidade","indicador_estab","indicador_const","id_cnefe","tipo_logradouro","titulo_logradouro","nome_logradouro","modificador","unidades","complementos","_links","_origem"],"description":"Um endereço com número, coordenadas e características disponíveis."},"EspecieContagem":{"type":"object","properties":{"codigo":{"type":"string","description":"Código IBGE da espécie (`1`–`8`).","nullable":true},"label":{"type":"string","description":"Rótulo: domicílio particular, ensino, saúde…","nullable":true},"n":{"type":"integer","description":"Quantas unidades nesta espécie."}},"required":["codigo","label","n"],"description":"Quantas unidades de uma espécie no recorte."},"Resumo":{"type":"object","properties":{"address_count":{"type":"integer","description":"Unidades no CEP (não é o número de prédios)."},"edificios":{"type":"integer","description":"Logradouro+número distintos no CEP."},"bairro":{"type":"string","description":"Bairro mais frequente na amostra."},"cidade":{"type":"string","description":"Município IBGE."},"uf":{"type":"string","description":"Sigla da unidade da federação."},"ibge":{"type":"string","description":"Código IBGE do município.","nullable":true},"lat":{"type":"number","description":"Latitude média dos edifícios devolvidos.","nullable":true},"lon":{"type":"number","description":"Longitude média dos edifícios devolvidos.","nullable":true},"especies":{"type":"array","items":{"$ref":"#/components/schemas/EspecieContagem"},"description":"Unidades por espécie no CEP inteiro."}},"required":["address_count","edificios","bairro","cidade","uf","ibge","lat","lon","especies"],"description":"Síntese do CEP: quantos pontos, quantos edifícios, onde fica."},"Unidades":{"type":"object","properties":{"cep":{"type":"string","description":"CEP formatado."},"items":{"type":"array","items":{"$ref":"#/components/schemas/Ponto"},"description":"Unidades desta página (complemento, espécie, identificador)."},"total":{"type":"integer","description":"Quantas unidades batem o filtro."},"limit":{"type":"integer","description":"Teto desta página."},"offset":{"type":"integer","description":"Deslocamento pedido."},"hasMore":{"type":"boolean","description":"`true` se ainda há unidade depois desta página."},"cobertura":{"allOf":[{"$ref":"#/components/schemas/Cobertura"}],"description":"UFs disponíveis nesta consulta."},"_links":{"type":"object","description":"`self` desta página e `cep` do lookup."}},"required":["cep","items","total","limit","offset","hasMore","cobertura","_links"],"description":"Unidades de um CEP (ou de um logradouro+número), paginadas."},"Proximo":{"type":"object","properties":{"logradouro":{"type":"string","description":"Logradouro do ponto."},"bairro":{"type":"string","description":"Localidade."},"cidade":{"type":"string","description":"Município."},"uf":{"type":"string","description":"Sigla da unidade da federação."},"cep":{"type":"string","description":"CEP formatado."},"lat":{"type":"number","description":"Latitude."},"lon":{"type":"number","description":"Longitude."},"numero":{"type":"string","description":"Número no logradouro.","nullable":true},"complemento":{"type":"string","description":"Complemento, se houver.","nullable":true},"ibge":{"type":"string","description":"Código IBGE do município.","nullable":true},"especie":{"type":"string","description":"Código da espécie CNEFE.","nullable":true},"especie_label":{"type":"string","description":"Rótulo IBGE da espécie.","nullable":true},"setor":{"type":"string","description":"Setor censitário.","nullable":true},"estabelecimento":{"type":"string","description":"Nome do estabelecimento, se a espécie tiver.","nullable":true},"nv_geo":{"type":"string","description":"Nível de geocodificação.","nullable":true},"nv_geo_label":{"type":"string","description":"O que o nível de geo significa.","nullable":true},"id_cnefe":{"type":"string","description":"`COD_UNICO_ENDERECO`.","nullable":true},"distancia_m":{"type":"integer","description":"Distância aproximada em metros."}},"required":["logradouro","bairro","cidade","uf","cep","lat","lon","numero","complemento","ibge","especie","especie_label","setor","estabelecimento","nv_geo","nv_geo_label","id_cnefe","distancia_m"],"description":"Endereço mais perto do par lat/lon."},"PaginaPonto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Ponto"},"description":"Resultados (teto 50)."},"total":{"type":"integer","description":"Quantos vieram nesta página."}},"required":["items","total"],"description":"Lista paginada de pontos."},"Empresas":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Empresa"},"description":"Cards da origem CNPJ (teto 50 por página)."},"total":{"type":"integer","description":"Tamanho desta página, ou total se a origem mandar."},"hasMore":{"type":"boolean","description":"`true` quando a origem tem mais estabelecimentos além do teto."},"page":{"type":"integer","description":"Página 0-based pedida à origem."}},"required":["items","total","hasMore","page"],"description":"Empresas registradas neste CEP."},"Empresa":{"type":"object","properties":{"cnpj":{"type":"string","description":"14 dígitos, sem máscara."},"cnpjFormatted":{"type":"string","description":"CNPJ com pontuação."},"razaoSocial":{"type":"string","description":"Razão social cadastrada.","nullable":true},"nomeFantasia":{"type":"string","description":"Nome fantasia, se houver.","nullable":true},"situacao":{"type":"object","description":"`codigo` numérico e `label` (Ativa, Inapta, Baixada…).","nullable":true},"uf":{"type":"string","description":"UF do estabelecimento.","nullable":true},"municipio":{"type":"string","description":"Município cadastrado.","nullable":true},"bairro":{"type":"string","description":"Bairro do estabelecimento.","nullable":true},"cnae":{"type":"object","description":"`codigo` e `descricao` da atividade principal.","nullable":true}},"required":["cnpj","cnpjFormatted","razaoSocial","nomeFantasia","situacao","uf","municipio","bairro","cnae"],"description":"Card da busca por CEP na origem CNPJ — não é a ficha completa do Radar."},"Raio":{"type":"object","properties":{"centro":{"type":"object","description":"`lat`, `lon` e, quando o centro veio de CEP, `cep` formatado."},"raio_m":{"type":"integer","description":"Raio usado, em metros."},"total_pontos":{"type":"integer","description":"Endereços dentro do raio, somando os CEPs devolvidos."},"ceps":{"type":"array","items":{"$ref":"#/components/schemas/CepNoRaio"},"description":"Até 300 CEPs, ordenados por distância."},"truncado":{"type":"boolean","description":"`true` se havia mais de 300 CEPs no raio — diminua o raio."},"fonte":{"type":"string","description":"Identificação e crédito da referência dos endereços."},"_links":{"type":"object","description":"`self` e `vizinhanca` com o mesmo centro e raio."}},"required":["centro","raio_m","total_pontos","ceps","truncado","fonte","_links"],"description":"CEPs a N metros de um ponto, do mais perto ao mais longe."},"CepNoRaio":{"type":"object","properties":{"cep":{"type":"string","description":"CEP formatado `NNNNN-NNN`."},"cep8":{"type":"string","description":"CEP com 8 dígitos, pronto para `/api/empresas` e `/api/cep`."},"uf":{"type":"string","description":"UF de referência do resultado."},"pontos":{"type":"integer","description":"Endereços deste CEP dentro do raio."},"distancia_m":{"type":"integer","description":"Distância do centro ao ponto mais perto deste CEP, em metros."},"lat":{"type":"number","description":"Latitude média dos pontos deste CEP no raio."},"lon":{"type":"number","description":"Longitude média dos pontos deste CEP no raio."}},"required":["cep","cep8","uf","pontos","distancia_m","lat","lon"],"description":"Um CEP dentro do raio: quantos endereços dele caem no círculo e a que distância começa."},"Vizinhanca":{"type":"object","properties":{"centro":{"type":"object","description":"`lat`, `lon` e `cep` quando o centro veio de CEP."},"raio_m":{"type":"integer","description":"Raio usado, em metros."},"ceps":{"type":"integer","description":"Quantos CEPs entraram na conta (teto 300)."},"truncado":{"type":"boolean","description":"`true` se o raio tinha mais de 300 CEPs."},"desde":{"type":"string","description":"Data ISO de corte para abertas/baixadas."},"base":{"type":"object","description":"`dump_date`: data de referência dos registros — a janela padrão conta a partir dela."},"cnae":{"type":"string","description":"Prefixo de CNAE aplicado, se houve.","nullable":true},"empresas":{"type":"object","description":"`total`, `ativas`, `abertas_desde`, `baixadas_desde` (nulos quando `lenta`)."},"por_cnae":{"type":"array","items":{"$ref":"#/components/schemas/ContagemCnae"},"description":"As 20 subclasses com mais ativas."},"amostra_abertas":{"type":"array","items":{"$ref":"#/components/schemas/Abertura"},"description":"As 50 aberturas mais recentes, com distância."},"lenta":{"type":"boolean","description":"`true` quando alguma contagem estourou o teto de tempo e veio nula."},"fonte":{"type":"string","description":"Identificação e crédito das referências utilizadas."},"_links":{"type":"object","description":"`self` e `raio` com o mesmo centro."}},"required":["centro","raio_m","ceps","truncado","desde","base","cnae","empresas","por_cnae","amostra_abertas","lenta","fonte","_links"],"description":"Empresas nos CEPs dentro do raio: contagens, atividades e aberturas recentes."},"ContagemCnae":{"type":"object","properties":{"cnae":{"type":"integer","description":"Subclasse CNAE (7 dígitos)."},"descricao":{"type":"string","description":"Descrição oficial da subclasse.","nullable":true},"ativas":{"type":"integer","description":"Estabelecimentos ativos neste CNAE no raio."},"abertas_desde":{"type":"integer","description":"Dos ativos, quantos abriram desde `desde`."}},"required":["cnae","descricao","ativas","abertas_desde"],"description":"Uma classe de CNAE no raio."},"Abertura":{"type":"object","properties":{"cnpj":{"type":"string","description":"14 dígitos."},"cnpjFormatted":{"type":"string","description":"CNPJ com pontuação."},"nome":{"type":"string","description":"Nome fantasia ou, na falta, razão social.","nullable":true},"razaoSocial":{"type":"string","description":"Razão social.","nullable":true},"nomeFantasia":{"type":"string","description":"Nome fantasia cadastrado, quando disponível.","nullable":true},"cnae":{"type":"object","description":"`codigo` e `descricao` da atividade principal.","nullable":true},"dataInicio":{"type":"string","description":"Data de início de atividade, ISO."},"endereco":{"type":"object","description":"`tipoLogradouro`, `logradouro`, `numero`, `bairro`, `cep` formatado."},"distancia_m":{"type":"integer","description":"Distância do centro ao CEP deste estabelecimento.","nullable":true}},"required":["cnpj","cnpjFormatted","nome","razaoSocial","nomeFantasia","cnae","dataInicio","endereco","distancia_m"],"description":"Um estabelecimento aberto desde `desde`, sem contato e sem sócio."},"Local":{"type":"object","properties":{"cidade":{"type":"string","description":"Cidade que a borda atribuiu ao IP.","nullable":true},"uf":{"type":"string","description":"Região/UF da borda.","nullable":true},"pais":{"type":"string","description":"País ISO.","nullable":true},"cep":{"type":"string","description":"CEP aproximado da borda, se houver.","nullable":true}},"required":["cidade","uf","pais","cep"],"description":"Localização aproximada do visitante. Nunca é cacheada."},"Metricas":{"type":"object","properties":{"app":{"type":"string","description":"Nome do produto."},"today":{"type":"string","description":"Dia de referência (UTC, AAAA-MM-DD)."},"today_visits":{"type":"integer","description":"Visitas da interface hoje: pings de `POST /api/visit`, um por página ao primeiro sinal humano."},"today_contacts":{"type":"integer","description":"Mensagens de contato hoje. Só com `METRICS_TOKEN`: contato não sai sem token."},"days":{"type":"array","items":{"type":"object"},"description":"Um registro por dia da janela, com as contagens de cada métrica."},"usage":{"type":"object","description":"`creditos`: movimentos de crédito do PontoFato por dia — chamadas pagas da API, x402 ou crédito, com `produto` filtrando o que é da casa."},"accounts":{"type":"object","description":"Sem contas neste produto: objeto vazio."},"financeiro":{"type":"object","description":"Agregado do dia: `hoje_usd`, `hoje_count`, `rede`. Só com `METRICS_TOKEN`: dinheiro não sai sem token; a série completa é `payments`."},"payments":{"type":"object","description":"Resumo financeiro do x402; só com METRICS_TOKEN."}},"required":["app","today","today_visits","days","usage","accounts"],"description":"Painel de 7 dias do operador. `payments` só aparece com o token e só em Base mainnet."},"ApiAccess":{"type":"object","properties":{"offer":{"allOf":[{"$ref":"#/components/schemas/ApiAccessOffer"}],"description":"Current offer and payment instructions."},"enabled":{"type":"boolean","description":"Present in public discovery; false means no purchases."},"id":{"type":"string","description":"Purchase ID; not a credential."},"status":{"type":"string","description":"paid, unpaid or pending."},"granted_credits":{"type":"integer","description":"Original grant, not remaining usage."},"expires_at":{"type":"string","description":"ISO expiry, 30 days after purchase.","nullable":true},"receipt":{"type":"string","description":"Confirmed payment receipt.","nullable":true},"via":{"type":"string","description":"x402, credito or gated homolog.","nullable":true},"message":{"type":"string","description":"Next action in the requested language."}},"required":["offer"]},"ApiAccessOffer":{"type":"object","properties":{"id":{"type":"string","description":"Package identifier."},"price_usd":{"type":"number","description":"Price in USD."},"credits":{"type":"integer","description":"Basic reads included."},"days":{"type":"integer","description":"Validity after payment, in days."},"auto_renew":{"type":"boolean","description":"False: the client explicitly buys another package."},"unit":{"type":"string","description":"basic_data_read; one page of up to 20 metadata records."},"products":{"type":"array","items":{"type":"string"},"description":"Data indexes sharing the same package."},"purchase":{"type":"string","description":"Absolute purchase URL."},"method":{"type":"string","description":"HTTP method for the explicit package purchase: POST."},"status":{"type":"string","description":"GET with X-API-Pass checks the private purchase status."},"header":{"type":"string","description":"X-API-Pass."},"payment_methods":{"type":"array","items":{"type":"string"},"description":"x402 or prepaid_credit."},"instructions":{"type":"string","description":"Generate and retain the pass before payment."},"generate_pass":{"type":"string","description":"JavaScript example using cryptographic randomness."},"client":{"type":"string","description":"Auditable ES module client; orchestrates purchase and data retry with caller-owned wallet and durable state.","nullable":true},"guide":{"type":"string","description":"Client setup, explicit budget, recovery and data value.","nullable":true},"workflow":{"allOf":[{"$ref":"#/components/schemas/ApiAccessWorkflow"}],"description":"Machine-readable purchase and recovery contract."},"evaluation":{"type":"object","description":"Free evaluation: register URL, X-Agent-Pass header, 1,000 reads per product, 30 days, no renewal. Registration grants independent quotas on the three indexes; preserve the credential.","nullable":true}},"required":["id","price_usd","credits","days","auto_renew","unit","products","purchase","method","status","header","payment_methods","instructions","generate_pass","client","guide","workflow","evaluation"]},"ApiAccessWorkflow":{"type":"object","properties":{"version":{"type":"integer","description":"Workflow version."},"kind":{"type":"string","description":"package_then_retry: buy at purchase, then retry the original data URL."},"purchase_requires_authority":{"type":"boolean","description":"The client needs an explicit spending budget."},"retry_same_pass":{"type":"boolean","description":"Persist the pass and original signed proof before submitting."},"on_unknown_payment":{"type":"string","description":"Query the purchase or reconcile the original proof; never sign again automatically."}},"required":["version","kind","purchase_requires_authority","retry_same_pass","on_unknown_payment"]},"PaymentQuota":{"type":"object","properties":{"free":{"type":"array","items":{"$ref":"#/components/schemas/PaymentFree"},"description":"Free allowances and their windows."},"paid":{"type":"array","items":{"$ref":"#/components/schemas/PaymentPrice"},"description":"List prices in USD. The operation's 402 is the payable quote."},"how_to_pay":{"type":"string","description":"Payment instructions and availability restrictions."},"live":{"type":"string","description":"Authoritative product quota endpoint.","nullable":true},"free_now":{"type":"array","items":{"type":"string"},"description":"SKUs temporarily free despite their list price."},"trial":{"allOf":[{"$ref":"#/components/schemas/PaymentTrial"}],"description":"Registration trial, when offered."}},"required":["free","paid","how_to_pay","live"]},"PaymentFree":{"type":"object","properties":{"o_que":{"type":"string","description":"Operation or allowance."},"limite":{"type":"string","description":"Allowance and eligibility."},"janela":{"type":"string","description":"Reset window, when applicable.","nullable":true}},"required":["o_que","limite","janela"]},"PaymentPrice":{"type":"object","properties":{"o_que":{"type":"string","description":"Operation and billing unit."},"price_usd":{"type":"number","description":"Current list price in USD."}},"required":["o_que","price_usd"]},"PaymentTrial":{"type":"object","properties":{"days":{"type":"integer","description":"Trial duration in days."},"how":{"type":"string","description":"Eligibility and activation steps."}},"required":["days","how"]},"PaymentX402":{"type":"object","properties":{"provider":{"type":"string","description":"Always `x402` — the only billing protocol accepted."},"mode":{"type":"string","description":"Seller mode: `live` charges for real, `dev` lets calls through unpaid."},"network":{"type":"string","description":"USDC network: `base` in production, `base-sepolia` in staging."},"chain_id":{"type":"integer","description":"EVM chain ID of the network above, so the wallet signs on the right chain."},"pay_to":{"type":"string","description":"Address that receives the payment.","nullable":true},"homolog":{"type":"boolean","description":"Staging seam on: the loop can be closed without spending USDC."},"dev":{"type":"boolean","description":"Development mode: the 402 is simulated."},"dev_gate":{"type":"boolean","description":"A homologation credential is configured; this grants no access."},"gratis":{"type":"array","items":{"type":"string"},"description":"Temporarily free SKUs."},"facilitator":{"type":"string","description":"URL of the facilitator that verifies and settles the payment."},"asset":{"type":"string","description":"Accepted currency — always `USDC`."},"asset_address":{"type":"string","description":"USDC contract on the network above."},"faucet":{"type":"string","description":"Test-USDC faucet; only on base-sepolia.","nullable":true},"wallets":{"type":"object","description":"Links to wallets that speak x402 (metamask, coinbase, base_app)."}},"required":["provider","mode","network","chain_id","pay_to","homolog","dev","dev_gate","facilitator","asset","asset_address","faucet","wallets"],"description":"x402 payment configuration in force. Comes from `planPublic` and is the same across the products."},"PaymentCredit":{"type":"object","properties":{"url":{"type":"string","description":"POST to purchase credit; GET with X-Credito to inspect its balance."},"header":{"type":"string","description":"Header for a previously issued credit token: X-Credito."}},"required":["url","header"]}},"securitySchemes":{"globalAccount":{"type":"apiKey","in":"cookie","name":"__Host-mm-auth","description":"Global session in the product's HttpOnly cookie; writes require exact Origin and X-CSRF-Token."},"contaChaveApi":{"type":"http","scheme":"bearer","bearerFormat":"mmk_…","description":"Account API key: `Authorization: Bearer mmk_…` or `X-Api-Key: mmk_…`. Created on the account page (API keys), valid only in the product where it was created; it acts as the account (or the organization that owns it)."}}},"paths":{"/api/auth/bootstrap":{"get":{"operationId":"get_api_auth_bootstrap","summary":"Prepara o navegador para entrar na conta global.","description":"Define cookie HttpOnly restrito ao host. CSRF vinculado à sessão atual. Sem CORS.\nDevolve: { csrf, context }","responses":{"200":{"description":"{ csrf, context }","content":{"application/json":{"schema":{"type":"object","properties":{"csrf":{"type":"string","description":"X-CSRF-Token"},"context":{"type":"string","description":"Opaque view context, also in X-MM-Context; not a credential / contexto opaco da vista, não é credencial."}},"required":["csrf","context"]}}}},"400":{"description":"invalid_request"},"403":{"description":"invalid_origin / invalid_csrf"},"503":{"description":"auth_unavailable: a sessão anterior é preservada / the previous session is preserved"}},"security":[]}},"/api/account/profile":{"get":{"operationId":"get_api_account_profile","summary":"Consulta seu perfil global.","description":"Lê preferências atuais da conta. Altere-as na página da conta; produtos não mantêm perfil autoritativo separado.\nDevolve: {profile:{name,locale,timeZone,theme,revision}}","responses":{"200":{"description":"{profile:{name,locale,timeZone,theme,revision}}"},"401":{"description":"invalid_session"},"503":{"description":"auth_unavailable"}},"security":[{"globalAccount":[]}]}},"/api/account/avatar":{"get":{"operationId":"get_api_account_avatar","summary":"Consulta sua foto de perfil global.","description":"WebP privado de até 64 KiB, sem cache. Altere-o na conta. Não aceita ID de usuário ou URL de objeto.\nDevolve: image/webp; Cache-Control: no-store","responses":{"200":{"description":"image/webp; Cache-Control: no-store","content":{"image/webp":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"invalid_session"},"404":{"description":"not_found: no photo / sem foto"},"503":{"description":"auth_unavailable"}},"security":[{"globalAccount":[]}]}},"/api/me":{"get":{"operationId":"get_api_me","summary":"Lê a conta global atual neste produto.","description":"Devolve: {user:{identityId,sessionId,productId,audience,authTime,methods,mfaState}}","responses":{"200":{"description":"{user:{identityId,sessionId,productId,audience,authTime,methods,mfaState}}"},"401":{"description":"invalid_session"},"503":{"description":"auth_unavailable"}},"security":[{"globalAccount":[]}]}},"/api/auth/logout":{"post":{"operationId":"post_api_auth_logout","summary":"Revoga esta sessão do produto.","description":"Exige bootstrap/CSRF deste navegador e sessão. As sessões de outros produtos permanecem ativas.\nDevolve: { ok }","responses":{"200":{"description":"{ ok }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"true"}},"required":["ok"]}}}},"400":{"description":"invalid_request"},"403":{"description":"invalid_origin / invalid_csrf"},"503":{"description":"auth_unavailable: a sessão anterior é preservada / the previous session is preserved"}},"security":[{"globalAccount":[]}]}},"/api/account/keys":{"get":{"operationId":"get_api_account_keys","summary":"Lista suas chaves de API neste produto.","description":"Nunca devolve a chave: nome, 4 últimos caracteres, organização, criação, último uso (por hora) e se ainda vale.\nDevolve: { keys }","responses":{"200":{"description":"{ keys }","content":{"application/json":{"schema":{"type":"object","properties":{"keys":{"type":"array","items":{"type":"object"},"description":"`id`, `name`, `organizationId`, `last4`, `createdAt`, `lastUsedAt`, `revokedAt`, `active` (false quando revogada ou parada por troca de senha / encerrar todos os acessos)."}},"required":["keys"]}}}},"401":{"description":"invalid_session"},"503":{"description":"auth_unavailable"}},"security":[{"globalAccount":[]}]}},"/api/account/keys/create":{"post":{"operationId":"post_api_account_keys_create","summary":"Cria uma chave de API para agentes e scripts.","description":"Exige entrada nos últimos 5 minutos; a de organização também exige segundo fator na sessão e o papel de dona/administradora com o produto ligado. No máximo 10 chaves vivas por conta e produto. A chave (`secret`) volta UMA vez.\nDevolve: { key, secret }","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Até 60 caracteres."},"organizationId":{"type":"string","description":"`null` para chave da conta."}},"required":["name","organizationId"]},"example":{"name":"agent","organizationId":null}}}},"responses":{"200":{"description":"{ key, secret }","content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"object","description":"`id`, `name`, `organizationId`, `last4`, `createdAt`."},"secret":{"type":"string","description":"`mmk_…`, mostrada uma vez."}},"required":["key","secret"]}}}},"400":{"description":"invalid_key_name / invalid_organization"},"401":{"description":"invalid_session / reauth_required"},"403":{"description":"invalid_origin / invalid_csrf / organization_forbidden / organization_mfa_required"},"409":{"description":"key_limit_reached"},"503":{"description":"auth_unavailable"}},"security":[{"globalAccount":[]}]}},"/api/account/keys/revoke":{"post":{"operationId":"post_api_account_keys_revoke","summary":"Revoga uma das suas chaves de API.","description":"Para a chave na hora. Repetir não faz mal.\nDevolve: { ok }","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"O `id` da chave."}},"required":["id"]},"example":{"id":"…"}}}},"responses":{"200":{"description":"{ ok }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"true"}},"required":["ok"]}}}},"400":{"description":"invalid_key_id"},"401":{"description":"invalid_session"},"403":{"description":"invalid_origin / invalid_csrf"},"404":{"description":"key_not_found"},"503":{"description":"auth_unavailable"}},"security":[{"globalAccount":[]}]}},"/okf/{arquivo}":{"get":{"operationId":"get_okf_by_arquivo","summary":"Bundle OKF (Open Knowledge Format v0.1): markdown com frontmatter para o agente ler o produto inteiro sem parsear HTML.","description":"Devolve: `text/markdown`. Comece por `/okf/index.md`, que lista o bundle.","parameters":[{"name":"arquivo","in":"path","required":true,"schema":{"type":"string"},"description":"`index.md`, `sobre.md`, `api.md` ou `faq.md`.","example":"index.md"}],"responses":{"200":{"description":"`text/markdown`. Comece por `/okf/index.md`, que lista o bundle."},"404":{"description":"Arquivo fora do bundle."}}}},"/.well-known/{arquivo}":{"get":{"operationId":"get_well_known_by_arquivo","summary":"Descoberta de máquina antes da home: `api-catalog` (RFC 9727, linkset com a API e o MCP), `security.txt` (RFC 9116), `x402` (manifesto de pagamento: rede, carteira e rotas que cobram), `agent-card.json` (identidade do agente: ferramentas MCP e portas de descoberta; também em `/agent.json`) e `mcp-registry-auth` (chave do registro oficial de MCP).","description":"Devolve: `application/linkset+json` no api-catalog; `application/json` no x402, no agent-card.json e no apis.json; `text/plain` nos outros dois.","parameters":[{"name":"arquivo","in":"path","required":true,"schema":{"type":"string"},"description":"`api-catalog`, `security.txt`, `x402`, `agent-card.json`, `mcp-registry-auth` ou `apis.json`.","example":"api-catalog"}],"responses":{"200":{"description":"`application/linkset+json` no api-catalog; `application/json` no x402, no agent-card.json e no apis.json; `text/plain` nos outros dois."},"404":{"description":"Nome fora dos seis publicados."}}}},"/apis.json":{"get":{"operationId":"get_apis_json","summary":"APIs.json (apisjson.org, 0.19): o índice que o APIs.io colhe — a API, o MCP, OpenAPI, guia e bundle OKF num arquivo só. Também em `/.well-known/apis.json`.","description":"Devolve: `application/json` no formato APIs.json 0.19: `apis[]` com `baseURL`, `humanURL` e `properties[]`.","responses":{"200":{"description":"`application/json` no formato APIs.json 0.19: `apis[]` com `baseURL`, `humanURL` e `properties[]`."}}}},"/agent.json":{"get":{"operationId":"get_agent_json","summary":"Cartão do agente: identidade, quem opera, documentação, o endpoint MCP e as ferramentas que ele serve. Mesmo documento de `/.well-known/agent-card.json`.","description":"Devolve: `application/json`: `name`, `provider`, `protocol` (`mcp`), `interfaces[]` e `skills[]`.","responses":{"200":{"description":"`application/json`: `name`, `provider`, `protocol` (`mcp`), `interfaces[]` e `skills[]`."}}}},"/okf/{tipo}/{id}.md":{"get":{"operationId":"get_okf_by_tipo_by_id_md","summary":"O mesmo registro que a API responde, em markdown OKF: `cep` (Endereço do CEP — referência 2022). Via de acesso para quem já tem o id, não catálogo.","description":"Devolve: `text/markdown` com frontmatter OKF; `resource` aponta o JSON equivalente. Sem `.md` responde 301 para o canônico.","parameters":[{"name":"tipo","in":"path","required":true,"schema":{"type":"string"},"description":"Um de: `cep`.","example":"cep"},{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"O id do registro, como a API o aceita.","example":"01310100"}],"responses":{"200":{"description":"`text/markdown` com frontmatter OKF; `resource` aponta o JSON equivalente. Sem `.md` responde 301 para o canônico."},"404":{"description":"Id fora da base, em markdown."}}}},"/api/":{"get":{"operationId":"api_index","summary":"Índice auto-descrito: cada rota, o que cobra e como plugar o MCP.","description":"Devolve: { name, description, build, base_url, docs, endpoints, mcp_tools }","responses":{"200":{"description":"{ name, description, build, base_url, docs, endpoints, mcp_tools }","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Nome do produto."},"description":{"type":"string","description":"O que o produto faz."},"build":{"type":"string","description":"Commit publicado."},"base_url":{"type":"string","description":"Origem em que esta API está servindo."},"docs":{"type":"object","description":"Links para llms.txt, OpenAPI, MCP e a UI."},"endpoints":{"type":"array","items":{"type":"object"},"description":"Catálogo de endpoints."},"mcp_tools":{"type":"array","items":{"type":"string"},"description":"Tools do MCP."}},"required":["name","description","build","base_url","docs","endpoints","mcp_tools"]}}}}}}},"/api/health":{"get":{"operationId":"health","summary":"Disponibilidade do serviço e cobertura por UF.","description":"Devolve: { ok, origem, cobertura{ufs,completa}, pontos, build }","responses":{"200":{"description":"{ ok, origem, cobertura{ufs,completa}, pontos, build }","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Saude"}}}},"503":{"description":"Cobertura indisponível."}}}},"/mcp":{"post":{"operationId":"post_mcp","summary":"MCP Streamable HTTP — as tools deste catálogo, despachadas neste mesmo Worker.","description":"Devolve: JSON-RPC 2.0 (`initialize`, `tools/list`, `tools/call`).","responses":{"200":{"description":"JSON-RPC 2.0 (`initialize`, `tools/list`, `tools/call`)."}}}},"/api/cep/{cep}":{"get":{"operationId":"cep","summary":"Endereços de um CEP, com latitude e longitude.","description":"Devolve: { cep, pontos[{cep,logradouro,numero,complemento,bairro,cidade,uf,lat,lon,ibge,especie,especie_label,tipo_edificacao,tipo_edificacao_codigo,estabelecimento,estabelecimentos,especies,setor,distrito,subdistrito,quadra,face,nv_geo,nv_geo_label,finalidade,indicador_estab,indicador_const,id_cnefe,tipo_logradouro,titulo_logradouro,nome_logradouro,modificador,unidades,complementos,_links,_origem}], resumo{address_count,edificios,bairro,cidade,uf,ibge,lat,lon,especies}, fonte, cobertura{ufs,completa}, _links }","parameters":[{"name":"cep","in":"path","required":true,"schema":{"type":"string"},"description":"8 dígitos, com ou sem hífen.","example":"70040010"}],"responses":{"200":{"description":"{ cep, pontos[{cep,logradouro,numero,complemento,bairro,cidade,uf,lat,lon,ibge,especie,especie_label,tipo_edificacao,tipo_edificacao_codigo,estabelecimento,estabelecimentos,especies,setor,distrito,subdistrito,quadra,face,nv_geo,nv_geo_label,finalidade,indicador_estab,indicador_const,id_cnefe,tipo_logradouro,titulo_logradouro,nome_logradouro,modificador,unidades,complementos,_links,_origem}], resumo{address_count,edificios,bairro,cidade,uf,ibge,lat,lon,especies}, fonte, cobertura{ufs,completa}, _links }","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Cep"}}}},"400":{"description":"CEP inválido (tamanho ou `00000000`)."},"404":{"description":"CEP bem-formado fora da base; `cobertura` diz quais UFs já existem."},"503":{"description":"Consulta temporariamente indisponível."}}}},"/api/cep/{cep}/unidades":{"get":{"operationId":"unidades","summary":"Unidades de um CEP, com complemento, tipo e identificador — paginado.","description":"O lookup do CEP agrupa por logradouro+número. Esta rota devolve cada unidade (apartamento, loja). Sem `logradouro`/`numero`, pagina o CEP inteiro.\nDevolve: { cep, items[{cep,logradouro,numero,complemento,bairro,cidade,uf,lat,lon,ibge,especie,especie_label,tipo_edificacao,tipo_edificacao_codigo,estabelecimento,estabelecimentos,especies,setor,distrito,subdistrito,quadra,face,nv_geo,nv_geo_label,finalidade,indicador_estab,indicador_const,id_cnefe,tipo_logradouro,titulo_logradouro,nome_logradouro,modificador,unidades,complementos,_links,_origem}], total, limit, offset, hasMore, cobertura{ufs,completa}, _links }","parameters":[{"name":"cep","in":"path","required":true,"schema":{"type":"string"},"description":"8 dígitos, com ou sem hífen.","example":"71940000"},{"name":"logradouro","in":"query","required":false,"schema":{"type":"string"},"description":"Logradouro exatamente como no lookup (tipo + nome)."},{"name":"numero","in":"query","required":false,"schema":{"type":"string"},"description":"Número do edifício no resultado."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50},"description":"Itens por página, teto 50."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0},"description":"Deslocamento 0-based."}],"responses":{"200":{"description":"{ cep, items[{cep,logradouro,numero,complemento,bairro,cidade,uf,lat,lon,ibge,especie,especie_label,tipo_edificacao,tipo_edificacao_codigo,estabelecimento,estabelecimentos,especies,setor,distrito,subdistrito,quadra,face,nv_geo,nv_geo_label,finalidade,indicador_estab,indicador_const,id_cnefe,tipo_logradouro,titulo_logradouro,nome_logradouro,modificador,unidades,complementos,_links,_origem}], total, limit, offset, hasMore, cobertura{ufs,completa}, _links }","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Unidades"}}}},"400":{"description":"CEP inválido."},"404":{"description":"CEP fora da malha, ou o logradouro+número não existe nele."}}}},"/api/proximo":{"get":{"operationId":"proximo","summary":"Endereço mais perto de um par lat/lon. Sem default para (0,0).","description":"Ausente ou vazio NÃO vira zero. `(0,0)` é o golfo da Guiné e só entra se a pessoa mandou.\nDevolve: { logradouro, bairro, cidade, uf, cep, lat, lon, numero, complemento, ibge, especie, especie_label, setor, estabelecimento, nv_geo, nv_geo_label, id_cnefe, distancia_m }","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number"},"description":"Latitude WGS84, −90 a 90.","example":"-15.7897"},{"name":"lon","in":"query","required":true,"schema":{"type":"number"},"description":"Longitude WGS84, −180 a 180.","example":"-47.8793"}],"responses":{"200":{"description":"{ logradouro, bairro, cidade, uf, cep, lat, lon, numero, complemento, ibge, especie, especie_label, setor, estabelecimento, nv_geo, nv_geo_label, id_cnefe, distancia_m }","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Proximo"}}}},"400":{"description":"`lat` ou `lon` ausentes ou fora da faixa."},"404":{"description":"Nada na cobertura perto do ponto."}}}},"/api/buscar":{"get":{"operationId":"buscar","summary":"Busca textual de logradouro, com UF e cidade opcionais.","description":"Devolve: { items[{cep,logradouro,numero,complemento,bairro,cidade,uf,lat,lon,ibge,especie,especie_label,tipo_edificacao,tipo_edificacao_codigo,estabelecimento,estabelecimentos,especies,setor,distrito,subdistrito,quadra,face,nv_geo,nv_geo_label,finalidade,indicador_estab,indicador_const,id_cnefe,tipo_logradouro,titulo_logradouro,nome_logradouro,modificador,unidades,complementos,_links,_origem}], total }","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"},"description":"Termo com 3+ caracteres.","example":"paulista"},{"name":"uf","in":"query","required":false,"schema":{"type":"string"},"description":"Restringe a uma UF.","example":"SP"},{"name":"cidade","in":"query","required":false,"schema":{"type":"string"},"description":"Trecho do município."}],"responses":{"200":{"description":"{ items[{cep,logradouro,numero,complemento,bairro,cidade,uf,lat,lon,ibge,especie,especie_label,tipo_edificacao,tipo_edificacao_codigo,estabelecimento,estabelecimentos,especies,setor,distrito,subdistrito,quadra,face,nv_geo,nv_geo_label,finalidade,indicador_estab,indicador_const,id_cnefe,tipo_logradouro,titulo_logradouro,nome_logradouro,modificador,unidades,complementos,_links,_origem}], total }","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginaPonto"}}}},"400":{"description":"Termo curto demais."}}}},"/api/empresas":{"get":{"operationId":"empresas","summary":"Empresas registradas neste CEP, até 50 por página.","description":"Devolve: { items[{cnpj,cnpjFormatted,razaoSocial,nomeFantasia,situacao,uf,municipio,bairro,cnae}], total, hasMore, page }","parameters":[{"name":"cep","in":"query","required":true,"schema":{"type":"string"},"description":"8 dígitos, com ou sem hífen.","example":"01310100"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":0},"description":"Página 0-based da origem CNPJ (50 por página)."}],"responses":{"200":{"description":"{ items[{cnpj,cnpjFormatted,razaoSocial,nomeFantasia,situacao,uf,municipio,bairro,cnae}], total, hasMore, page }","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Empresas"}}}},"400":{"description":"CEP inválido."},"503":{"description":"API de CNPJ indisponível."}}}},"/api/raio":{"get":{"operationId":"raio","summary":"CEPs a N metros de um ponto, com distância e quantidade de endereços dentro do raio.","description":"Devolve: { centro, raio_m, total_pontos, ceps[{cep,cep8,uf,pontos,distancia_m,lat,lon}], truncado, fonte, _links }","parameters":[{"name":"cep","in":"query","required":false,"schema":{"type":"string"},"description":"Centro = média dos pontos deste CEP. Alternativa a lat/lon.","example":"01310100"},{"name":"lat","in":"query","required":false,"schema":{"type":"number"},"description":"Latitude do centro, se não vier `cep`."},{"name":"lon","in":"query","required":false,"schema":{"type":"number"},"description":"Longitude do centro, se não vier `cep`."},{"name":"raio","in":"query","required":false,"schema":{"type":"integer","default":500},"description":"Raio em metros, 1 a 2000.","example":800}],"responses":{"200":{"description":"{ centro, raio_m, total_pontos, ceps[{cep,cep8,uf,pontos,distancia_m,lat,lon}], truncado, fonte, _links }","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Raio"}}}},"400":{"description":"Sem centro (`cep` ou `lat`+`lon`), CEP inválido, coordenada inválida ou raio fora de 1–2000."},"404":{"description":"CEP fora da malha, ou nenhum endereço no raio; `cobertura` diz quais UFs existem."},"503":{"description":"Consulta temporariamente indisponível."}}}},"/api/vizinhanca":{"get":{"operationId":"vizinhanca","summary":"Empresas ativas, abertas e baixadas num raio em metros, por CNAE, com as aberturas mais recentes e a distância de cada uma.","description":"Consulte quota.free_now no índice: quando inclui vizinhanca ou *, a operação não cobra nem exige crédito. Com cobrança ativa, a franquia diária vem antes da tarifa por consulta.\nDevolve: { centro, raio_m, ceps, truncado, desde, base, cnae, empresas, por_cnae[{cnae,descricao,ativas,abertas_desde}], amostra_abertas[{cnpj,cnpjFormatted,nome,razaoSocial,nomeFantasia,cnae,dataInicio,endereco,distancia_m}], lenta, fonte, _links }","parameters":[{"name":"cep","in":"query","required":false,"schema":{"type":"string"},"description":"Centro = média dos pontos deste CEP. Alternativa a lat/lon.","example":"01310100"},{"name":"lat","in":"query","required":false,"schema":{"type":"number"},"description":"Latitude do centro, se não vier `cep`."},{"name":"lon","in":"query","required":false,"schema":{"type":"number"},"description":"Longitude do centro, se não vier `cep`."},{"name":"raio","in":"query","required":false,"schema":{"type":"integer","default":500},"description":"Raio em metros, 1 a 2000.","example":800},{"name":"cnae","in":"query","required":false,"schema":{"type":"string"},"description":"Prefixo de CNAE: divisão (2 dígitos), classe (5) ou subclasse (7).","example":"56"},{"name":"desde","in":"query","required":false,"schema":{"type":"string"},"description":"Data ISO para “abriu/baixou desde”. Padrão: 90 dias antes da data da base (`base.dump_date`).","example":"2026-02-01"}],"responses":{"200":{"description":"{ centro, raio_m, ceps, truncado, desde, base, cnae, empresas, por_cnae[{cnae,descricao,ativas,abertas_desde}], amostra_abertas[{cnpj,cnpjFormatted,nome,razaoSocial,nomeFantasia,cnae,dataInicio,endereco,distancia_m}], lenta, fonte, _links }","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Vizinhanca"}}}},"400":{"description":"Centro ausente, CEP/coordenada/raio inválidos, `cnae` fora de 2/5/7 dígitos ou `desde` fora de 1900–hoje."},"402":{"description":"Somente com cobrança ativa e franquia esgotada: use a cotação x402 (`accepts[]`) ou crédito pré-pago (`Authorization: Bearer cred_…`)."},"404":{"description":"CEP fora da malha ou nenhum ponto no raio."},"503":{"description":"Consulta temporariamente indisponível."}}}},"/api/local":{"get":{"operationId":"get_api_local","summary":"Cidade/UF aproximadas de quem chama. Sem cache.","description":"Devolve: { cidade, uf, pais, cep }","responses":{"200":{"description":"{ cidade, uf, pais, cep }","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Local"}}}}}}},"/api/contact":{"post":{"operationId":"contact","summary":"Contato: humano com Turnstile (grátis) ou agente com x402 $0.10.","description":"Devolve: { ok, path }","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Nome (alias `nome`)."},"email":{"type":"string","description":"E-mail de resposta."},"message":{"type":"string","description":"Mensagem (alias `mensagem`)."},"form_ts":{"type":"integer","description":"Epoch ms de quando o formulário abriu (2 s–12 h). Só o caminho humano exige."},"tipo":{"type":"string","description":"Proposta: `patrocinio`, `parceria` ou `anuncio`. Liga os campos abaixo."},"empresa":{"type":"string","description":"Quem propõe, quando é empresa."},"site":{"type":"string","description":"Site de quem propõe."},"orcamento":{"type":"string","description":"`ate_100`, `100_500`, `500_2000`, `2000_mais` ou `a_combinar`."},"espaco":{"type":"array","items":{"type":"string"},"description":"Ids de placement de `GET /api/partners`, até 6."},"duracao":{"type":"string","description":"Dias de exposição: `30`, `90` ou `365`."},"pagamento":{"type":"string","description":"`usdc`, `deposito` ou `a_combinar`."}},"required":["name","email","message"]}}}},"responses":{"200":{"description":"{ ok, path }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"Sempre `true` quando a mensagem foi aceita."},"path":{"type":"string","description":"Caminho: humano com captcha ou agente pago."}},"required":["ok","path"]}}}},"400":{"description":"Validação."},"402":{"description":"Agente: pague $0.10 e repita com X-PAYMENT."},"403":{"description":"Turnstile inválido."}}}},"/api/erro-cliente":{"post":{"operationId":"post_api_erro_cliente","summary":"Relato de erro do navegador, enviado pela própria interface. Agente não precisa chamar.","description":"A interface relata sozinha erro de JS, promessa rejeitada, script/CSS que não carregou e bloqueio de CSP — uma vez por sessão — e o app relata falha tratada por `window.mmErro.relata`. O servidor valida o envelope, redige credencial, e-mail e telefone, junta repetições da mesma falha por minuto e registra um evento operacional; nada é gravado em banco. Não guarda IP, cookie, query nem o User-Agent inteiro. Responde 204 sempre, inclusive para relato inválido.\nDevolve: 204 sem corpo, sempre — relato inválido, repetido ou acima do teto também recebe 204.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Código da falha, `UI-` + letras/dígitos (`UI-JS-001` erro global, `UI-PROMESSA-001`, `UI-RECURSO-001`, `UI-CSP-001`, `UI-APP-001` relato do app)."},"phase":{"type":"string","description":"Fase em que quebrou, minúsculas: `global`, `promessa`, `script`, `carregar_lista`…"},"path":{"type":"string","description":"Caminho da página aberta, sem query."},"message":{"type":"string","description":"Mensagem do erro, até 2000 caracteres."},"stack":{"type":"string","description":"Stack trace, até 12000 caracteres."},"source":{"type":"string","description":"Script de origem; só o caminho é guardado."},"line":{"type":"integer","description":"Linha no script de origem."},"column":{"type":"integer","description":"Coluna no script de origem."},"visivel":{"type":"boolean","description":"Se a aba estava visível quando quebrou."}},"required":["code","phase"]},"example":{"code":"UI-APP-001","phase":"carregar_lista","path":"/","message":"lista 500"}}}},"responses":{"200":{"description":"204 sem corpo, sempre — relato inválido, repetido ou acima do teto também recebe 204."}}}},"/api/pagamento/aberto":{"post":{"operationId":"post_api_pagamento_aberto","summary":"A interface relata que exibiu uma cobrança. Agentes não devem chamar.","description":"Relato sem corpo, da mesma origem, enviado automaticamente quando uma cobrança fica visível. Não inicia pagamento, não concede acesso e não recebe identidade ou credencial. Não grava banco por relato. Conta eventos, não pessoas únicas. O painel privado do operador separa pedidos de pagamento da API e aberturas da interface por dia UTC; os dois números podem se sobrepor.\nDevolve: 202 sem corpo se aceito; 204 se ignorado. Sempre no-store.","parameters":[{"name":"Origin","in":"header","required":true,"schema":{"type":"string"},"description":"A origem da página, idêntica à desta rota."},{"name":"Sec-Fetch-Site","in":"header","required":true,"schema":{"type":"string"},"description":"`same-origin`, definido pelo navegador."},{"name":"X-MM-Payment-View","in":"header","required":true,"schema":{"type":"string"},"description":"`1`, definido pelo componente comum."}],"responses":{"202":{"description":"202 sem corpo se aceito; 204 se ignorado. Sempre no-store."}}}},"/api/vitrine":{"get":{"operationId":"get_api_vitrine","summary":"Os números públicos do produto: tráfego, agentes, uso e confiabilidade, sem dinheiro.","description":"Projeção publicada de hora em hora pelo coletor da casa, arredondada a dois dígitos significativos; `null` é medição ausente, nunca zero. Cache de 15 minutos com ETag (`If-None-Match` → 304). Não há como enviar números por esta rota: a publicação é do coletor, com token próprio.\nDevolve: { v, produto, publicado, atualizado_em, stale, nome?, desde?, fuso?, hoje?, dias?, janelas?, visitantes?, pessoas?, agentes?, superficies?, mcp?, uso?, contas?, confiabilidade?, catalogo?, apoio? }","responses":{"200":{"description":"{ v, produto, publicado, atualizado_em, stale, nome?, desde?, fuso?, hoje?, dias?, janelas?, visitantes?, pessoas?, agentes?, superficies?, mcp?, uso?, contas?, confiabilidade?, catalogo?, apoio? }","content":{"application/json":{"schema":{"type":"object","properties":{"v":{"type":"integer","description":"Versão do contrato (1)."},"produto":{"type":"string","description":"Id do produto."},"publicado":{"type":"boolean","description":"`false` antes da primeira publicação do coletor; aí só estas cinco chaves vêm."},"atualizado_em":{"type":"string","description":"Quando o coletor publicou (ISO 8601).","nullable":true},"stale":{"type":"boolean","description":"`true` quando a projeção tem mais de 26 h."},"nome":{"type":"string","description":"Nome do produto."},"desde":{"type":"string","description":"Dia a partir do qual a série vale.","nullable":true},"fuso":{"type":"string","description":"Fuso dos dias (`UTC`)."},"hoje":{"type":"object","description":"O dia de hoje: páginas por classe (pessoa, IA, bot), chamadas de API por classe, leituras das superfícies de máquina e uso do produto."},"dias":{"type":"array","items":{"type":"object"},"description":"Até 31 dias, o mais antigo primeiro: `dia`, `paginas`, `api`, `api_ia`, `maquina`, `visitantes`, `uso`."},"janelas":{"type":"object","description":"Somas de 7 e 30 dias (`d7`, `d30`)."},"visitantes":{"type":"object","description":"Visitantes únicos na borda em 7 dias."},"pessoas":{"type":"object","description":"GA4 quando há: usuários, sessões, países, aparelhos e quem chegou de IA.","nullable":true},"agentes":{"type":"object","description":"Os agentes de IA e os bots que mais leem, 7 dias."},"superficies":{"type":"object","description":"Leituras de OKF, llms, well-known, OpenAPI e MCP em 7 dias."},"mcp":{"type":"object","description":"Chamadas MCP em 7 dias."},"uso":{"type":"object","description":"Uso real do produto por recurso: rótulo, hoje, 7 e 30 dias."},"contas":{"type":"object","description":"Usuários e convidados.","nullable":true},"confiabilidade":{"type":"object","description":"Percentual de pedidos sem 5xx em 7 dias e o build no ar."},"catalogo":{"type":"object","description":"Tamanho do acervo, quando o produto tem um.","nullable":true},"apoio":{"type":"object","description":"Impressões e cliques por patrocinador, quando houver."}},"required":["v","produto","publicado","atualizado_em","stale"]}}}}}}},"/api/vitrine/operador":{"get":{"operationId":"get_api_vitrine_operador","summary":"O documento completo do produto no painel do operador — só com o token do operador.","description":"Devolve: { produto, atualizado_em, operador }","parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>` — a classe operador."}],"responses":{"200":{"description":"{ produto, atualizado_em, operador }","content":{"application/json":{"schema":{"type":"object","properties":{"produto":{"type":"string","description":"Id do produto."},"atualizado_em":{"type":"string","description":"Quando o coletor publicou.","nullable":true},"operador":{"type":"object","description":"O documento completo do coletor, com o que a projeção pública não carrega.","nullable":true}},"required":["produto","atualizado_em","operador"]}}}},"401":{"description":"Sem token, token errado ou token de outra classe."},"503":{"description":"Worker sem `METRICS_TOKEN` ou sem o control plane."}}}},"/api/vitrine/painel":{"get":{"operationId":"get_api_vitrine_painel","summary":"O painel da casa inteira, na forma que o gm lê — só com o token do operador.","description":"Devolve: { apps, updated?, totals? }","parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>` — a classe operador."}],"responses":{"200":{"description":"{ apps, updated?, totals? }","content":{"application/json":{"schema":{"type":"object","properties":{"apps":{"type":"array","items":{"type":"object"},"description":"Um documento do operador por produto, em ordem de id."},"updated":{"type":"string","description":"Quando o coletor fechou a rodada."},"totals":{"type":"object","description":"Os totais da casa."}},"required":["apps"]}}}},"401":{"description":"Sem token, token errado ou token de outra classe."},"503":{"description":"Worker sem `METRICS_TOKEN` ou sem o control plane."}}}},"/api/vitrine/cursores":{"get":{"operationId":"get_api_vitrine_cursores","summary":"O cursor de erro resolvido por produto (`borda`, `cli`) — só com o token do operador.","description":"Devolve: JSON: `{ [produto]: { borda?: ISO, cli?: ISO } }`; vazio é `{}`.","parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>` — a classe operador."}],"responses":{"200":{"description":"JSON: `{ [produto]: { borda?: ISO, cli?: ISO } }`; vazio é `{}`."},"401":{"description":"Sem token, token errado ou token de outra classe."},"503":{"description":"Worker sem `METRICS_TOKEN` ou sem o control plane."}}}},"/api/partners":{"get":{"operationId":"get_api_partners","summary":"Parceria, patrocínio e anúncio: os espaços do produto com preço sugerido, os números públicos ao lado e como propor.","description":"Informação sob consulta, sem ativação: espaços do catálogo da casa com preço em USD por 30 dias (90 e 365 dias com desconto), patrocinadores em vigor, recorte de `/api/vitrine`, carteira da casa (USDC na Base) e o caminho de contato — depósito, PIX ou fatura são combinados na resposta. Cache de 1 hora.\nDevolve: { status, produto, idioma, titulo, descricao, publico, modalidades, placements, house_bundle, parcerias, current_sponsors, stats, payment, contact, politica, _links }","responses":{"200":{"description":"{ status, produto, idioma, titulo, descricao, publico, modalidades, placements, house_bundle, parcerias, current_sponsors, stats, payment, contact, politica, _links }","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"`sob_consulta`: informação e proposta, sem ativação nem cobrança."},"produto":{"type":"string","description":"Nome do produto."},"idioma":{"type":"string","description":"Idioma dos textos (o do produto)."},"titulo":{"type":"string","description":"Título da oferta."},"descricao":{"type":"string","description":"Uma frase sobre a oferta."},"publico":{"type":"string","description":"Quem usa o produto — o público que o patrocinador alcança."},"modalidades":{"type":"array","items":{"type":"object"},"description":"`{ id, nome }`: patrocinio, parceria, anuncio."},"placements":{"type":"array","items":{"type":"object"},"description":"Os espaços do produto: `id`, `nome`, `onde`, `formato`, `exclusivo`, `medicao`, `price_usd_30d` (sugestão; `null` é sob consulta), `exposure[{ dias, price_usd }]` para 30, 90 e 365 dias, `disponivel`."},"house_bundle":{"type":"object","description":"O pacote da casa: rodapé e menção para agentes nos dez produtos, com desconto."},"parcerias":{"type":"array","items":{"type":"string"},"description":"Ideias de parceria que o produto aceita discutir."},"current_sponsors":{"type":"array","items":{"type":"object"},"description":"Patrocinadores em vigor: `id`, `nome`, `url`, `frase`, `espacos`, `ate`."},"stats":{"type":"object","description":"Recorte dos números públicos (`hoje`, `janelas`, `agentes`, `confiabilidade`) e o `link` para `/api/vitrine`; `publicado: false` antes da primeira publicação."},"payment":{"type":"object","description":"Como pagar: `rede`, `chain_id`, `ativo`, `pay_to`, `eip681` (a carteira da casa, quando declarada), `alternativas` e a `nota` — depósito, PIX ou fatura pela resposta."},"contact":{"type":"object","description":"`email`, `form_url`, `api_url` (`POST /api/contact` onde há handler), `campos` (os obrigatórios), `campos_proposta` (os opcionais da proposta, com os valores aceitos de cada um), `price_agent_usd`, `message_template`, `instructions`."},"politica":{"type":"object","description":"Rótulo do espaço, setores recusados, pagamento adiantado, prazos."},"_links":{"type":"object","description":"`self`, `stats`, `page` (`null` até a página existir), `contact`, `casa` (o mesmo caminho nos dez produtos)."}},"required":["status","produto","idioma","titulo","descricao","publico","modalidades","placements","house_bundle","parcerias","current_sponsors","stats","payment","contact","politica","_links"]}}}}}}},"/api/visit":{"post":{"operationId":"post_api_visit","summary":"Ping da interface que soma a visita do dia. Agente não precisa chamar.","description":"A página manda ao primeiro sinal humano (toque, tecla ou clique), uma vez por página. Smoke não conta: `X-MM-Smoke`, User-Agent `mm-smoke` ou `smoke: true` no corpo voltam `counted: false`.\nDevolve: { ok, counted, reason? }","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"p":{"type":"string","description":"Caminho da página visitada."},"smoke":{"type":"boolean","description":"`true` marca a chamada como teste e ela não entra na conta."}}},"example":{"p":"/"}}}},"responses":{"200":{"description":"{ ok, counted, reason? }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"Sempre `true`."},"counted":{"type":"boolean","description":"Se a visita entrou na conta do dia."},"reason":{"type":"string","description":"Por que não contou, quando `counted` é `false`."}},"required":["ok","counted"]}}}}}}},"/api/metrics":{"get":{"operationId":"get_api_metrics","summary":"Métricas dos últimos 7 dias para o painel do operador; com o token, inclui os pagamentos.","description":"Sem credencial devolve o uso real da API: movimentos de crédito da casa por dia, com `produto` separando o PontoFato dos outros produtos no banco compartilhado. Visitas da interface vêm do `POST /api/visit`, o ping ao primeiro sinal humano, em `today_visits` e em `days[].visits`. Com `METRICS_TOKEN` em Bearer acrescenta `payments` — só x402 liquidado em Base mainnet.\nDevolve: { app, today, today_visits, today_contacts?, days, usage, accounts, financeiro?, payments? }","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>` para incluir o bloco financeiro; token errado é 401."}],"responses":{"200":{"description":"{ app, today, today_visits, today_contacts?, days, usage, accounts, financeiro?, payments? }","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Metricas"}}}},"401":{"description":"Token de operador errado."},"503":{"description":"Worker sem METRICS_TOKEN configurado."}}}},"/api/credito":{"post":{"operationId":"post_api_credito","summary":"Recarrega crédito pré-pago: paga uma vez com x402 e recebe o token que desconta em qualquer API da casa.","description":"Devolve: { token, saldo_usd, guarde, usar, saldo_em }","parameters":[{"name":"usd","in":"query","required":true,"schema":{"type":"integer"},"description":"Pacote: 1, 5, 10 ou 25 dólares."}],"responses":{"200":{"description":"{ token, saldo_usd, guarde, usar, saldo_em }","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","description":"Token portador do saldo (`cred_…`). Mostrado UMA vez — não há como recuperá-lo."},"saldo_usd":{"type":"string","description":"Saldo creditado."},"guarde":{"type":"string","description":"Aviso de que o token é o portador do crédito."},"usar":{"type":"string","description":"Como apresentar o token nas rotas pagas."},"saldo_em":{"type":"string","description":"Onde consultar saldo e extrato."}},"required":["token","saldo_usd","guarde","usar","saldo_em"]}}}},"400":{"description":"Pacote fora da lista (1, 5, 10 ou 25)."},"402":{"description":"Sem pagamento — o corpo traz `accepts[]` do x402."}}},"get":{"operationId":"get_api_credito","summary":"Saldo e extrato do crédito — as últimas movimentações, sem devolver o token.","description":"Devolve: { saldo_micros, saldo_usd, criado_em, movimentos }","responses":{"200":{"description":"{ saldo_micros, saldo_usd, criado_em, movimentos }","content":{"application/json":{"schema":{"type":"object","properties":{"saldo_micros":{"type":"integer","description":"Saldo em micro-dólares (1e-6 USD)."},"saldo_usd":{"type":"string","description":"Saldo formatado."},"criado_em":{"type":"string","description":"Quando o crédito foi aberto."},"movimentos":{"type":"array","items":{"type":"object"},"description":"Entradas e saídas recentes, com produto e recurso."}},"required":["saldo_micros","saldo_usd","criado_em","movimentos"]}}}},"401":{"description":"Sem token ou token desconhecido."}}}},"/api/acesso":{"get":{"operationId":"api_access","summary":"Discover the monthly data package or inspect a private purchase.","description":"Devolve: { offer{id,price_usd,credits,days,auto_renew,unit,products,purchase,method,status,header,payment_methods,instructions,generate_pass,client,guide,workflow,evaluation}, enabled?, id?, status?, granted_credits?, expires_at?, receipt?, via?, message? }","parameters":[{"name":"X-API-Pass","in":"header","required":false,"schema":{"type":"string"},"description":"Private pass: api_<32 random hex>_<64 random hex>. Save before buying."}],"responses":{"200":{"description":"{ offer{id,price_usd,credits,days,auto_renew,unit,products,purchase,method,status,header,payment_methods,instructions,generate_pass,client,guide,workflow,evaluation}, enabled?, id?, status?, granted_credits?, expires_at?, receipt?, via?, message? }","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiAccess"}}}},"400":{"description":"Invalid pass."},"404":{"description":"Unknown purchase or wrong owner."},"503":{"description":"Purchases disabled."}}},"post":{"operationId":"api_access_buy","summary":"Buy 1000 basic data reads for US$1, valid for 30 days.","description":"Same pass in retries recovers the same purchase. No automatic renewal. OCR, AI, documents and delivery keep their own tariffs. Send X-API-Pass on eligible data reads; remaining credits come in X-API-Credits-Remaining.\nDevolve: { offer{id,price_usd,credits,days,auto_renew,unit,products,purchase,method,status,header,payment_methods,instructions,generate_pass,client,guide,workflow,evaluation}, enabled?, id?, status?, granted_credits?, expires_at?, receipt?, via?, message? }","parameters":[{"name":"X-API-Pass","in":"header","required":true,"schema":{"type":"string"},"description":"Private pass: api_<32 random hex>_<64 random hex>. Save before buying."},{"name":"X-Credito","in":"header","required":false,"schema":{"type":"string"},"description":"Existing prepaid credit token; alternative to x402."},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer cred_… alternative to X-Credito."},{"name":"X-PAYMENT","in":"header","required":false,"schema":{"type":"string"},"description":"Signed x402 authorization from the 402 quote, maximum 16 KiB."},{"name":"PAYMENT-SIGNATURE","in":"header","required":false,"schema":{"type":"string"},"description":"Alternative name for X-PAYMENT."},{"name":"X-API-Transaction","in":"header","required":false,"schema":{"type":"string"},"description":"Confirmed Base transaction hash for reconciliation with the original pass and signed payment. Never creates another charge."}],"responses":{"200":{"description":"{ offer{id,price_usd,credits,days,auto_renew,unit,products,purchase,method,status,header,payment_methods,instructions,generate_pass,client,guide,workflow,evaluation}, enabled?, id?, status?, granted_credits?, expires_at?, receipt?, via?, message? }","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiAccess"}}}},"400":{"description":"Missing or invalid pass/payment."},"401":{"description":"Invalid prepaid credit."},"402":{"description":"Payment required: x402 accepts[] and prepaid-credit instructions."},"409":{"description":"Payment pending; retain the same pass and do not pay again."},"429":{"description":"Purchase attempt limit; respect Retry-After."},"503":{"description":"Payment unavailable or pending reconciliation."}}}},"/api/pricing":{"get":{"operationId":"pricing","summary":"Preços vigentes e franquias gratuitas.","description":"Devolve: { product, quota{free,paid,how_to_pay,live,free_now?,trial?}, pricing, billing, api_index }","responses":{"200":{"description":"{ product, quota{free,paid,how_to_pay,live,free_now?,trial?}, pricing, billing, api_index }","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string","description":"Product name."},"quota":{"allOf":[{"$ref":"#/components/schemas/PaymentQuota"}],"description":"Public allowances and current list prices; not personal usage."},"pricing":{"type":"string","description":"Absolute URL of the current price list."},"billing":{"type":"string","description":"Absolute URL of payment discovery or the existing billing summary."},"api_index":{"type":"string","description":"Absolute URL of the API catalog."}},"required":["product","quota","pricing","billing","api_index"]}}}},"405":{"description":"Use GET ou HEAD."}}}},"/api/billing":{"get":{"operationId":"billing","summary":"Descoberta pública de pagamento e crédito pré-pago.","description":"Devolve: { product, quota{free,paid,how_to_pay,live,free_now?,trial?}, pricing, billing, api_index, payment{provider,mode,network,chain_id,pay_to,homolog,dev,dev_gate,gratis?,facilitator,asset,asset_address,faucet,wallets}, credit{url,header} }","responses":{"200":{"description":"{ product, quota{free,paid,how_to_pay,live,free_now?,trial?}, pricing, billing, api_index, payment{provider,mode,network,chain_id,pay_to,homolog,dev,dev_gate,gratis?,facilitator,asset,asset_address,faucet,wallets}, credit{url,header} }","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string","description":"Product name."},"quota":{"allOf":[{"$ref":"#/components/schemas/PaymentQuota"}],"description":"Public allowances and current list prices; not personal usage."},"pricing":{"type":"string","description":"Absolute URL of the current price list."},"billing":{"type":"string","description":"Absolute URL of payment discovery or the existing billing summary."},"api_index":{"type":"string","description":"Absolute URL of the API catalog."},"payment":{"allOf":[{"$ref":"#/components/schemas/PaymentX402"}],"description":"Public x402 configuration; pay_to=null means not configured."},"credit":{"allOf":[{"$ref":"#/components/schemas/PaymentCredit"}],"description":"Prepaid credit entry point. Never contains a balance or token."}},"required":["product","quota","pricing","billing","api_index","payment","credit"]}}}},"405":{"description":"Use GET ou HEAD."}}}}}}