{"name":"PontoFato","description":"Endereços com latitude e longitude, empresas no CEP e vizinhança por distância. Resultados prontos para pessoas e agentes de IA.","build":"cf26a8c4","base_url":"https://staging.pontofato.com","docs":{"llms":"https://staging.pontofato.com/llms.txt","llms_full":"https://staging.pontofato.com/llms-full.txt","openapi":"https://staging.pontofato.com/openapi.json","mcp":"https://staging.pontofato.com/mcp","pricing":"https://staging.pontofato.com/api/pricing","billing":"https://staging.pontofato.com/api/billing","human_ui":"https://staging.pontofato.com/","data_indexes":[{"id":"cep","produto":"https://pontofato.com","caminho":"/enderecos","title":"CEPs e endereços","description":"Encontre endereços por lugar, com coordenadas e referência de 2022. Não certifica CEP vigente.","hierarchy":"UF → município → bairro/localidade → rua → endereços","url":"https://api.pontofato.com/enderecos/","formats":{"html":"https://api.pontofato.com/enderecos/","json":"https://api.pontofato.com/enderecos/index.json","md":"https://api.pontofato.com/enderecos/index.md","okf":"https://api.pontofato.com/enderecos/index.okf.md"},"llms":"https://api.pontofato.com/enderecos/llms.txt","openapi":"https://api.pontofato.com/enderecos/openapi.json","mcp":"https://api.pontofato.com/enderecos/mcp","okf":"https://api.pontofato.com/enderecos/okf/index.md","access":"public-read-only","pagination":{"max_items":20,"next":"links.proximo"},"updates":"manual"},{"id":"editais","produto":"https://editalmd.com","caminho":"/licitacoes","title":"Editais e compras públicas","description":"Encontre compras públicas por lugar e período. Consulte documentos e opções de leitura no EditalMD.","hierarchy":"Modalidade → UF → ano → mês → dia → município → compras","url":"https://api.editalmd.com/licitacoes/","formats":{"html":"https://api.editalmd.com/licitacoes/","json":"https://api.editalmd.com/licitacoes/index.json","md":"https://api.editalmd.com/licitacoes/index.md","okf":"https://api.editalmd.com/licitacoes/index.okf.md"},"llms":"https://api.editalmd.com/licitacoes/llms.txt","openapi":"https://api.editalmd.com/licitacoes/openapi.json","mcp":"https://api.editalmd.com/licitacoes/mcp","okf":"https://api.editalmd.com/licitacoes/okf/index.md","access":"public-read-only","pagination":{"max_items":20,"next":"links.proximo"},"updates":"manual"}]},"conventions":{"format":"JSON em `/api/*`, exceto a foto privada WebP em `/api/account/avatar`.","cors":"`Access-Control-Allow-Origin: *` nas rotas de agente.","x402":"Contato agente: HTTP 402 + X-PAYMENT.","parity":"Mexeu na UI/API → apidocs + skill + MCP no mesmo PR."},"auth":{"none":"Público.","token":"Token de operador `METRICS_TOKEN` em `Authorization: Bearer` (métricas).","credito":"Token de crédito em `Authorization: Bearer cred_…` (ou header `X-Credito`). Não é conta: é portador de saldo.","session":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},"endpoints":[{"method":"GET","path":"/api/auth/bootstrap","auth":"none","grupo":"Conta","summary":"Prepara o navegador para entrar na conta global.","desc":"Define cookie HttpOnly restrito ao host. CSRF vinculado à sessão atual. Sem CORS.","retorno":{"csrf":{"tipo":"string","desc":"X-CSRF-Token"},"context":{"tipo":"string","desc":"Opaque view context, also in X-MM-Context; not a credential / contexto opaco da vista, não é credencial."}},"erros":{"400":"invalid_request","403":"invalid_origin / invalid_csrf","503":"auth_unavailable: a sessão anterior é preservada / the previous session is preserved"},"returns":"{ csrf, context }","url":"https://staging.pontofato.com/api/auth/bootstrap","auth_detail":"Público."},{"method":"GET","path":"/api/account/profile","auth":"session","grupo":"Conta","exemplo":"await fetch(\"$ORIGIN/api/account/profile\", {credentials: \"same-origin\"}).then(r => r.json());","exemploLinguagem":"js","summary":"Consulta seu perfil global.","desc":"Lê preferências atuais da conta. Altere-as na página da conta; produtos não mantêm perfil autoritativo separado.","retorno":{"_texto":"{profile:{name,locale,timeZone,theme,revision}}"},"erros":{"401":"invalid_session","503":"auth_unavailable"},"returns":"{profile:{name,locale,timeZone,theme,revision}}","url":"https://staging.pontofato.com/api/account/profile","auth_detail":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},{"method":"GET","path":"/api/account/avatar","auth":"session","grupo":"Conta","exemplo":"await fetch(\"$ORIGIN/api/account/avatar\", {credentials: \"same-origin\"}).then(r => {if (!r.ok) throw new Error(\"HTTP \" + r.status); return r.blob();});","exemploLinguagem":"js","summary":"Consulta sua foto de perfil global.","desc":"WebP privado de até 64 KiB, sem cache. Altere-o na conta. Não aceita ID de usuário ou URL de objeto.","retorno":{"_texto":"image/webp; Cache-Control: no-store"},"erros":{"401":"invalid_session","404":"not_found: no photo / sem foto","503":"auth_unavailable"},"returns":"image/webp; Cache-Control: no-store","url":"https://staging.pontofato.com/api/account/avatar","auth_detail":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},{"method":"GET","path":"/api/me","auth":"session","grupo":"Conta","exemplo":"await fetch(\"$ORIGIN/api/me\", {credentials: \"same-origin\"}).then(r => r.json());","exemploLinguagem":"js","summary":"Lê a conta global atual neste produto.","retorno":{"_texto":"{user:{identityId,sessionId,productId,audience,authTime,methods,mfaState}}"},"erros":{"401":"invalid_session","503":"auth_unavailable"},"returns":"{user:{identityId,sessionId,productId,audience,authTime,methods,mfaState}}","url":"https://staging.pontofato.com/api/me","auth_detail":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},{"method":"POST","path":"/api/auth/logout","auth":"session","grupo":"Conta","exemplo":"// Execute no console da página do produto / Run in the product page console.\n(async () => {\n  const origin = \"$ORIGIN\";\n  const {csrf} = await fetch(origin + \"/api/auth/bootstrap\").then(r => r.json());\n  const r = await fetch(origin + \"/api/auth/logout\", {\n    method: \"POST\", credentials: \"same-origin\",\n    headers: {\"Content-Type\": \"application/json\", \"X-CSRF-Token\": csrf},\n    body: JSON.stringify({})\n  });\n  if (!r.ok) throw new Error(\"Auth HTTP \" + r.status);\n  return r.json();\n})();","exemploLinguagem":"js","summary":"Revoga esta sessão do produto.","desc":"Exige bootstrap/CSRF deste navegador e sessão. As sessões de outros produtos permanecem ativas.","retorno":{"ok":{"tipo":"bool","desc":"true"}},"erros":{"400":"invalid_request","403":"invalid_origin / invalid_csrf","503":"auth_unavailable: a sessão anterior é preservada / the previous session is preserved"},"returns":"{ ok }","url":"https://staging.pontofato.com/api/auth/logout","auth_detail":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},{"method":"GET","path":"/api/account/keys","auth":"session","grupo":"Conta","summary":"Lista suas chaves de API neste produto.","desc":"Nunca devolve a chave: nome, 4 últimos caracteres, organização, criação, último uso (por hora) e se ainda vale.","retorno":{"keys":{"tipo":"object[]","desc":"`id`, `name`, `organizationId`, `last4`, `createdAt`, `lastUsedAt`, `revokedAt`, `active` (false quando revogada ou parada por troca de senha / encerrar todos os acessos)."}},"erros":{"401":"invalid_session","503":"auth_unavailable"},"exemplo":"await fetch(\"$ORIGIN/api/account/keys\", {credentials: \"same-origin\"}).then(r => r.json());","exemploLinguagem":"js","returns":"{ keys }","url":"https://staging.pontofato.com/api/account/keys","auth_detail":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},{"method":"POST","path":"/api/account/keys/create","auth":"session","grupo":"Conta","summary":"Cria uma chave de API para agentes e scripts.","desc":"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.","corpo":{"name":{"tipo":"string","obrigatorio":true,"desc":"Até 60 caracteres."},"organizationId":{"tipo":"string","nulo":true,"obrigatorio":true,"desc":"`null` para chave da conta."}},"body":{"name":"agent","organizationId":null},"retorno":{"key":{"tipo":"object","desc":"`id`, `name`, `organizationId`, `last4`, `createdAt`."},"secret":{"tipo":"string","desc":"`mmk_…`, mostrada uma vez."}},"erros":{"400":"invalid_key_name / invalid_organization","401":"invalid_session / reauth_required","403":"invalid_origin / invalid_csrf / organization_forbidden / organization_mfa_required","409":"key_limit_reached","503":"auth_unavailable"},"exemplo":"(async () => {\n  const {csrf} = await fetch(\"$ORIGIN/api/auth/bootstrap\").then(r => r.json());\n  const r = await fetch(\"$ORIGIN/api/account/keys/create\", {method: \"POST\", credentials: \"same-origin\",\n    headers: {\"Content-Type\": \"application/json\", \"X-CSRF-Token\": csrf},\n    body: JSON.stringify({name: \"agent\", organizationId: null})});\n  return r.json();\n})();","exemploLinguagem":"js","returns":"{ key, secret }","url":"https://staging.pontofato.com/api/account/keys/create","auth_detail":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},{"method":"POST","path":"/api/account/keys/revoke","auth":"session","grupo":"Conta","summary":"Revoga uma das suas chaves de API.","desc":"Para a chave na hora. Repetir não faz mal.","corpo":{"id":{"tipo":"string","obrigatorio":true,"desc":"O `id` da chave."}},"body":{"id":"…"},"retorno":{"ok":{"tipo":"bool","desc":"true"}},"erros":{"400":"invalid_key_id","401":"invalid_session","403":"invalid_origin / invalid_csrf","404":"key_not_found","503":"auth_unavailable"},"exemplo":"(async () => {\n  const {csrf} = await fetch(\"$ORIGIN/api/auth/bootstrap\").then(r => r.json());\n  const r = await fetch(\"$ORIGIN/api/account/keys/revoke\", {method: \"POST\", credentials: \"same-origin\",\n    headers: {\"Content-Type\": \"application/json\", \"X-CSRF-Token\": csrf},\n    body: JSON.stringify({id: \"…\"})});\n  return r.json();\n})();","exemploLinguagem":"js","returns":"{ ok }","url":"https://staging.pontofato.com/api/account/keys/revoke","auth_detail":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},{"method":"GET","path":"/okf/:arquivo","auth":"none","summary":"Bundle OKF (Open Knowledge Format v0.1): markdown com frontmatter para o agente ler o produto inteiro sem parsear HTML.","grupo":"Descoberta","params":{"arquivo":{"desc":"`index.md`, `sobre.md`, `api.md` ou `faq.md`.","exemplo":"index.md"}},"retorno":{"_texto":"`text/markdown`. Comece por `/okf/index.md`, que lista o bundle."},"erros":{"404":"Arquivo fora do bundle."},"exemplo":"curl -s $ORIGIN/okf/index.md","returns":"`text/markdown`. Comece por `/okf/index.md`, que lista o bundle.","url":"https://staging.pontofato.com/okf/:arquivo","auth_detail":"Público."},{"method":"GET","path":"/.well-known/:arquivo","auth":"none","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).","grupo":"Descoberta","params":{"arquivo":{"desc":"`api-catalog`, `security.txt`, `x402`, `agent-card.json`, `mcp-registry-auth` ou `apis.json`.","exemplo":"api-catalog"}},"retorno":{"_texto":"`application/linkset+json` no api-catalog; `application/json` no x402, no agent-card.json e no apis.json; `text/plain` nos outros dois."},"erros":{"404":"Nome fora dos seis publicados."},"exemplo":"curl -s $ORIGIN/.well-known/api-catalog","returns":"`application/linkset+json` no api-catalog; `application/json` no x402, no agent-card.json e no apis.json; `text/plain` nos outros dois.","url":"https://staging.pontofato.com/.well-known/:arquivo","auth_detail":"Público."},{"method":"GET","path":"/apis.json","auth":"none","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`.","grupo":"Descoberta","retorno":{"_texto":"`application/json` no formato APIs.json 0.19: `apis[]` com `baseURL`, `humanURL` e `properties[]`."},"exemplo":"curl -s $ORIGIN/apis.json","returns":"`application/json` no formato APIs.json 0.19: `apis[]` com `baseURL`, `humanURL` e `properties[]`.","url":"https://staging.pontofato.com/apis.json","auth_detail":"Público."},{"method":"GET","path":"/agent.json","auth":"none","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`.","grupo":"Descoberta","retorno":{"_texto":"`application/json`: `name`, `provider`, `protocol` (`mcp`), `interfaces[]` e `skills[]`."},"exemplo":"curl -s $ORIGIN/agent.json","returns":"`application/json`: `name`, `provider`, `protocol` (`mcp`), `interfaces[]` e `skills[]`.","url":"https://staging.pontofato.com/agent.json","auth_detail":"Público."},{"method":"GET","path":"/okf/:tipo/:id.md","auth":"none","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.","grupo":"Descoberta","params":{"tipo":{"desc":"Um de: `cep`.","exemplo":"cep"},"id":{"desc":"O id do registro, como a API o aceita.","exemplo":"01310100"}},"retorno":{"_texto":"`text/markdown` com frontmatter OKF; `resource` aponta o JSON equivalente. Sem `.md` responde 301 para o canônico."},"erros":{"404":"Id fora da base, em markdown."},"exemplo":"curl -s $ORIGIN/okf/cep/01310100.md","returns":"`text/markdown` com frontmatter OKF; `resource` aponta o JSON equivalente. Sem `.md` responde 301 para o canônico.","url":"https://staging.pontofato.com/okf/:tipo/:id.md","auth_detail":"Público."},{"method":"GET","path":"/api/","auth":"none","summary":"Índice auto-descrito: cada rota, o que cobra e como plugar o MCP.","grupo":"Descoberta","retorno":{"name":{"tipo":"string","desc":"Nome do produto."},"description":{"tipo":"string","desc":"O que o produto faz."},"build":{"tipo":"string","desc":"Commit publicado."},"base_url":{"tipo":"string","desc":"Origem em que esta API está servindo."},"docs":{"tipo":"object","desc":"Links para llms.txt, OpenAPI, MCP e a UI."},"endpoints":{"tipo":"object[]","desc":"Catálogo de endpoints."},"mcp_tools":{"tipo":"string[]","desc":"Tools do MCP."}},"returns":"{ name, description, build, base_url, docs, endpoints, mcp_tools }","url":"https://staging.pontofato.com/api/","auth_detail":"Público."},{"method":"GET","path":"/api/health","auth":"none","grupo":"Descoberta","summary":"Disponibilidade do serviço e cobertura por UF.","retorno":"Saude","erros":{"503":"Cobertura indisponível."},"exemplo":"curl -s $ORIGIN/api/health","returns":"{ ok, origem, cobertura{ufs,completa}, pontos, build }","url":"https://staging.pontofato.com/api/health","auth_detail":"Público."},{"method":"POST","path":"/mcp","auth":"none","summary":"MCP Streamable HTTP — as tools deste catálogo, despachadas neste mesmo Worker.","grupo":"Descoberta","retorno":{"_texto":"JSON-RPC 2.0 (`initialize`, `tools/list`, `tools/call`)."},"exemplo":"curl -s -XPOST $ORIGIN/mcp -H 'content-type: application/json' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}'","returns":"JSON-RPC 2.0 (`initialize`, `tools/list`, `tools/call`).","url":"https://staging.pontofato.com/mcp","auth_detail":"Público."},{"method":"GET","path":"/api/cep/:cep","auth":"none","summary":"Endereços de um CEP, com latitude e longitude.","grupo":"Lugar","params":{"cep":{"desc":"8 dígitos, com ou sem hífen.","exemplo":"70040010"}},"retorno":"Cep","erros":{"400":"CEP inválido (tamanho ou `00000000`).","404":"CEP bem-formado fora da base; `cobertura` diz quais UFs já existem.","503":"Consulta temporariamente indisponível."},"exemplo":"curl -s $ORIGIN/api/cep/70040010","returns":"{ 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 }","url":"https://staging.pontofato.com/api/cep/:cep","auth_detail":"Público."},{"method":"GET","path":"/api/cep/:cep/unidades","auth":"none","summary":"Unidades de um CEP, com complemento, tipo e identificador — paginado.","grupo":"Lugar","desc":"O lookup do CEP agrupa por logradouro+número. Esta rota devolve cada unidade (apartamento, loja). Sem `logradouro`/`numero`, pagina o CEP inteiro.","params":{"cep":{"desc":"8 dígitos, com ou sem hífen.","exemplo":"71940000"}},"query":{"logradouro":{"tipo":"string","desc":"Logradouro exatamente como no lookup (tipo + nome)."},"numero":{"tipo":"string","desc":"Número do edifício no resultado."},"limit":{"tipo":"int","desc":"Itens por página, teto 50.","padrao":50},"offset":{"tipo":"int","desc":"Deslocamento 0-based.","padrao":0}},"retorno":"Unidades","erros":{"400":"CEP inválido.","404":"CEP fora da malha, ou o logradouro+número não existe nele."},"exemplo":"curl -s '$ORIGIN/api/cep/71940000/unidades?logradouro=RUA%20BURITI&numero=6'","returns":"{ 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 }","url":"https://staging.pontofato.com/api/cep/:cep/unidades","auth_detail":"Público."},{"method":"GET","path":"/api/proximo","auth":"none","summary":"Endereço mais perto de um par lat/lon. Sem default para (0,0).","grupo":"Lugar","desc":"Ausente ou vazio NÃO vira zero. `(0,0)` é o golfo da Guiné e só entra se a pessoa mandou.","query":{"lat":{"tipo":"number","desc":"Latitude WGS84, −90 a 90.","obrigatorio":true,"exemplo":"-15.7897"},"lon":{"tipo":"number","desc":"Longitude WGS84, −180 a 180.","obrigatorio":true,"exemplo":"-47.8793"}},"retorno":"Proximo","erros":{"400":"`lat` ou `lon` ausentes ou fora da faixa.","404":"Nada na cobertura perto do ponto."},"exemplo":"curl -s '$ORIGIN/api/proximo?lat=-15.7897&lon=-47.8793'","returns":"{ logradouro, bairro, cidade, uf, cep, lat, lon, numero, complemento, ibge, especie, especie_label, setor, estabelecimento, nv_geo, nv_geo_label, id_cnefe, distancia_m }","url":"https://staging.pontofato.com/api/proximo","auth_detail":"Público."},{"method":"GET","path":"/api/buscar","auth":"none","summary":"Busca textual de logradouro, com UF e cidade opcionais.","grupo":"Lugar","query":{"q":{"tipo":"string","desc":"Termo com 3+ caracteres.","obrigatorio":true,"exemplo":"paulista"},"uf":{"tipo":"string","desc":"Restringe a uma UF.","exemplo":"SP"},"cidade":{"tipo":"string","desc":"Trecho do município."}},"retorno":"PaginaPonto","erros":{"400":"Termo curto demais."},"exemplo":"curl -s '$ORIGIN/api/buscar?q=paulista&uf=SP'","returns":"{ 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 }","url":"https://staging.pontofato.com/api/buscar","auth_detail":"Público."},{"method":"GET","path":"/api/empresas","auth":"none","summary":"Empresas registradas neste CEP, até 50 por página.","grupo":"Lugar","query":{"cep":{"tipo":"string","desc":"8 dígitos, com ou sem hífen.","obrigatorio":true,"exemplo":"01310100"},"page":{"tipo":"int","desc":"Página 0-based da origem CNPJ (50 por página).","padrao":0}},"retorno":"Empresas","erros":{"400":"CEP inválido.","503":"API de CNPJ indisponível."},"exemplo":"curl -s '$ORIGIN/api/empresas?cep=01310100'","returns":"{ items[{cnpj,cnpjFormatted,razaoSocial,nomeFantasia,situacao,uf,municipio,bairro,cnae}], total, hasMore, page }","url":"https://staging.pontofato.com/api/empresas","auth_detail":"Público."},{"method":"GET","path":"/api/raio","auth":"none","summary":"CEPs a N metros de um ponto, com distância e quantidade de endereços dentro do raio.","grupo":"Lugar","query":{"cep":{"tipo":"string","desc":"Centro = média dos pontos deste CEP. Alternativa a lat/lon.","exemplo":"01310100"},"lat":{"tipo":"number","desc":"Latitude do centro, se não vier `cep`."},"lon":{"tipo":"number","desc":"Longitude do centro, se não vier `cep`."},"raio":{"tipo":"int","desc":"Raio em metros, 1 a 2000.","padrao":500,"exemplo":800}},"retorno":"Raio","erros":{"400":"Sem centro (`cep` ou `lat`+`lon`), CEP inválido, coordenada inválida ou raio fora de 1–2000.","404":"CEP fora da malha, ou nenhum endereço no raio; `cobertura` diz quais UFs existem.","503":"Consulta temporariamente indisponível."},"exemplo":"curl -s '$ORIGIN/api/raio?cep=01310100&raio=800'","returns":"{ centro, raio_m, total_pontos, ceps[{cep,cep8,uf,pontos,distancia_m,lat,lon}], truncado, fonte, _links }","url":"https://staging.pontofato.com/api/raio","auth_detail":"Público."},{"method":"GET","path":"/api/vizinhanca","auth":"credito","desc":"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.","summary":"Empresas ativas, abertas e baixadas num raio em metros, por CNAE, com as aberturas mais recentes e a distância de cada uma.","grupo":"Lugar","query":{"cep":{"tipo":"string","desc":"Centro = média dos pontos deste CEP. Alternativa a lat/lon.","exemplo":"01310100"},"lat":{"tipo":"number","desc":"Latitude do centro, se não vier `cep`."},"lon":{"tipo":"number","desc":"Longitude do centro, se não vier `cep`."},"raio":{"tipo":"int","desc":"Raio em metros, 1 a 2000.","padrao":500,"exemplo":800},"cnae":{"tipo":"string","desc":"Prefixo de CNAE: divisão (2 dígitos), classe (5) ou subclasse (7).","exemplo":"56"},"desde":{"tipo":"string","desc":"Data ISO para “abriu/baixou desde”. Padrão: 90 dias antes da data da base (`base.dump_date`).","exemplo":"2026-02-01"}},"retorno":"Vizinhanca","erros":{"400":"Centro ausente, CEP/coordenada/raio inválidos, `cnae` fora de 2/5/7 dígitos ou `desde` fora de 1900–hoje.","402":"Somente com cobrança ativa e franquia esgotada: use a cotação x402 (`accepts[]`) ou crédito pré-pago (`Authorization: Bearer cred_…`).","404":"CEP fora da malha ou nenhum ponto no raio.","503":"Consulta temporariamente indisponível."},"exemplo":"curl -s '$ORIGIN/api/vizinhanca?cep=01310100&raio=800&cnae=56'","returns":"{ 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 }","url":"https://staging.pontofato.com/api/vizinhanca","auth_detail":"Token de crédito em `Authorization: Bearer cred_…` (ou header `X-Credito`). Não é conta: é portador de saldo."},{"method":"GET","path":"/api/local","auth":"none","summary":"Cidade/UF aproximadas de quem chama. Sem cache.","grupo":"Geo","retorno":"Local","returns":"{ cidade, uf, pais, cep }","url":"https://staging.pontofato.com/api/local","auth_detail":"Público."},{"method":"POST","path":"/api/contact","auth":"none","summary":"Contato: humano com Turnstile (grátis) ou agente com x402 $0.10.","grupo":"Contato","corpo":{"name":{"tipo":"string","desc":"Nome (alias `nome`).","obrigatorio":true},"email":{"tipo":"string","desc":"E-mail de resposta.","obrigatorio":true},"message":{"tipo":"string","desc":"Mensagem (alias `mensagem`).","obrigatorio":true},"form_ts":{"tipo":"int","desc":"Epoch ms de quando o formulário abriu (2 s–12 h). Só o caminho humano exige."},"tipo":{"tipo":"string","desc":"Proposta: `patrocinio`, `parceria` ou `anuncio`. Liga os campos abaixo."},"empresa":{"tipo":"string","desc":"Quem propõe, quando é empresa."},"site":{"tipo":"string","desc":"Site de quem propõe."},"orcamento":{"tipo":"string","desc":"`ate_100`, `100_500`, `500_2000`, `2000_mais` ou `a_combinar`."},"espaco":{"tipo":"string[]","desc":"Ids de placement de `GET /api/partners`, até 6."},"duracao":{"tipo":"string","desc":"Dias de exposição: `30`, `90` ou `365`."},"pagamento":{"tipo":"string","desc":"`usdc`, `deposito` ou `a_combinar`."}},"retorno":{"ok":{"tipo":"bool","desc":"Sempre `true` quando a mensagem foi aceita."},"path":{"tipo":"string","desc":"Caminho: humano com captcha ou agente pago."}},"erros":{"400":"Validação.","402":"Agente: pague $0.10 e repita com X-PAYMENT.","403":"Turnstile inválido."},"exemplo":"curl -s -XPOST $ORIGIN/api/contact -H 'content-type: application/json' -d '{\"name\":\"Agent\",\"email\":\"a@example.com\",\"message\":\"hello from agent path\"}'","returns":"{ ok, path }","url":"https://staging.pontofato.com/api/contact","auth_detail":"Público."},{"method":"POST","path":"/api/erro-cliente","auth":"none","summary":"Relato de erro do navegador, enviado pela própria interface. Agente não precisa chamar.","grupo":"Operação","desc":"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.","corpo":{"code":{"tipo":"string","desc":"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).","obrigatorio":true},"phase":{"tipo":"string","desc":"Fase em que quebrou, minúsculas: `global`, `promessa`, `script`, `carregar_lista`…","obrigatorio":true},"path":{"tipo":"string","desc":"Caminho da página aberta, sem query."},"message":{"tipo":"string","desc":"Mensagem do erro, até 2000 caracteres."},"stack":{"tipo":"string","desc":"Stack trace, até 12000 caracteres."},"source":{"tipo":"string","desc":"Script de origem; só o caminho é guardado."},"line":{"tipo":"int","desc":"Linha no script de origem."},"column":{"tipo":"int","desc":"Coluna no script de origem."},"visivel":{"tipo":"bool","desc":"Se a aba estava visível quando quebrou."}},"body":{"code":"UI-APP-001","phase":"carregar_lista","path":"/","message":"lista 500"},"retorno":{"_texto":"204 sem corpo, sempre — relato inválido, repetido ou acima do teto também recebe 204."},"exemplo":"curl -s -XPOST $ORIGIN/api/erro-cliente -H 'content-type: application/json' -d '{\"code\":\"UI-APP-001\",\"phase\":\"carregar_lista\",\"path\":\"/\",\"message\":\"lista 500\"}'","returns":"204 sem corpo, sempre — relato inválido, repetido ou acima do teto também recebe 204.","url":"https://staging.pontofato.com/api/erro-cliente","auth_detail":"Público."},{"method":"POST","path":"/api/pagamento/aberto","auth":"none","statusOk":202,"summary":"A interface relata que exibiu uma cobrança. Agentes não devem chamar.","grupo":"Operação","desc":"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.","headers":{"Origin":{"tipo":"string","desc":"A origem da página, idêntica à desta rota.","obrigatorio":true},"Sec-Fetch-Site":{"tipo":"string","desc":"`same-origin`, definido pelo navegador.","obrigatorio":true},"X-MM-Payment-View":{"tipo":"string","desc":"`1`, definido pelo componente comum.","obrigatorio":true}},"retorno":{"_texto":"202 sem corpo se aceito; 204 se ignorado. Sempre no-store."},"returns":"202 sem corpo se aceito; 204 se ignorado. Sempre no-store.","url":"https://staging.pontofato.com/api/pagamento/aberto","auth_detail":"Público."},{"method":"GET","path":"/api/vitrine","auth":"none","grupo":"Números públicos","summary":"Os números públicos do produto: tráfego, agentes, uso e confiabilidade, sem dinheiro.","desc":"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.","retorno":{"v":{"tipo":"int","desc":"Versão do contrato (1)."},"produto":{"tipo":"string","desc":"Id do produto."},"publicado":{"tipo":"bool","desc":"`false` antes da primeira publicação do coletor; aí só estas cinco chaves vêm."},"atualizado_em":{"tipo":"string","desc":"Quando o coletor publicou (ISO 8601).","nulo":true},"stale":{"tipo":"bool","desc":"`true` quando a projeção tem mais de 26 h."},"nome":{"tipo":"string","desc":"Nome do produto.","opcional":true},"desde":{"tipo":"string","desc":"Dia a partir do qual a série vale.","nulo":true,"opcional":true},"fuso":{"tipo":"string","desc":"Fuso dos dias (`UTC`).","opcional":true},"hoje":{"tipo":"object","desc":"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.","opcional":true},"dias":{"tipo":"object[]","desc":"Até 31 dias, o mais antigo primeiro: `dia`, `paginas`, `api`, `api_ia`, `maquina`, `visitantes`, `uso`.","opcional":true},"janelas":{"tipo":"object","desc":"Somas de 7 e 30 dias (`d7`, `d30`).","opcional":true},"visitantes":{"tipo":"object","desc":"Visitantes únicos na borda em 7 dias.","opcional":true},"pessoas":{"tipo":"object","desc":"GA4 quando há: usuários, sessões, países, aparelhos e quem chegou de IA.","nulo":true,"opcional":true},"agentes":{"tipo":"object","desc":"Os agentes de IA e os bots que mais leem, 7 dias.","opcional":true},"superficies":{"tipo":"object","desc":"Leituras de OKF, llms, well-known, OpenAPI e MCP em 7 dias.","opcional":true},"mcp":{"tipo":"object","desc":"Chamadas MCP em 7 dias.","opcional":true},"uso":{"tipo":"object","desc":"Uso real do produto por recurso: rótulo, hoje, 7 e 30 dias.","opcional":true},"contas":{"tipo":"object","desc":"Usuários e convidados.","nulo":true,"opcional":true},"confiabilidade":{"tipo":"object","desc":"Percentual de pedidos sem 5xx em 7 dias e o build no ar.","opcional":true},"catalogo":{"tipo":"object","desc":"Tamanho do acervo, quando o produto tem um.","nulo":true,"opcional":true},"apoio":{"tipo":"object","desc":"Impressões e cliques por patrocinador, quando houver.","opcional":true}},"exemplo":"curl -s $ORIGIN/api/vitrine","returns":"{ v, produto, publicado, atualizado_em, stale, nome?, desde?, fuso?, hoje?, dias?, janelas?, visitantes?, pessoas?, agentes?, superficies?, mcp?, uso?, contas?, confiabilidade?, catalogo?, apoio? }","url":"https://staging.pontofato.com/api/vitrine","auth_detail":"Público."},{"method":"GET","path":"/api/vitrine/operador","auth":"none","grupo":"Números públicos","summary":"O documento completo do produto no painel do operador — só com o token do operador.","headers":{"Authorization":{"tipo":"string","desc":"`Bearer <METRICS_TOKEN>` — a classe operador.","obrigatorio":true}},"retorno":{"produto":{"tipo":"string","desc":"Id do produto."},"atualizado_em":{"tipo":"string","desc":"Quando o coletor publicou.","nulo":true},"operador":{"tipo":"object","desc":"O documento completo do coletor, com o que a projeção pública não carrega.","nulo":true}},"erros":{"401":"Sem token, token errado ou token de outra classe.","503":"Worker sem `METRICS_TOKEN` ou sem o control plane."},"exemplo":"curl -s $ORIGIN/api/vitrine/operador -H \"Authorization: Bearer $METRICS_TOKEN\"","returns":"{ produto, atualizado_em, operador }","url":"https://staging.pontofato.com/api/vitrine/operador","auth_detail":"Público."},{"method":"GET","path":"/api/vitrine/painel","auth":"none","grupo":"Números públicos","summary":"O painel da casa inteira, na forma que o gm lê — só com o token do operador.","headers":{"Authorization":{"tipo":"string","desc":"`Bearer <METRICS_TOKEN>` — a classe operador.","obrigatorio":true}},"retorno":{"apps":{"tipo":"object[]","desc":"Um documento do operador por produto, em ordem de id."},"updated":{"tipo":"string","desc":"Quando o coletor fechou a rodada.","opcional":true},"totals":{"tipo":"object","desc":"Os totais da casa.","opcional":true}},"erros":{"401":"Sem token, token errado ou token de outra classe.","503":"Worker sem `METRICS_TOKEN` ou sem o control plane."},"exemplo":"curl -s $ORIGIN/api/vitrine/painel -H \"Authorization: Bearer $METRICS_TOKEN\"","returns":"{ apps, updated?, totals? }","url":"https://staging.pontofato.com/api/vitrine/painel","auth_detail":"Público."},{"method":"GET","path":"/api/vitrine/cursores","auth":"none","grupo":"Números públicos","summary":"O cursor de erro resolvido por produto (`borda`, `cli`) — só com o token do operador.","headers":{"Authorization":{"tipo":"string","desc":"`Bearer <METRICS_TOKEN>` — a classe operador.","obrigatorio":true}},"retorno":{"_texto":"JSON: `{ [produto]: { borda?: ISO, cli?: ISO } }`; vazio é `{}`."},"erros":{"401":"Sem token, token errado ou token de outra classe.","503":"Worker sem `METRICS_TOKEN` ou sem o control plane."},"exemplo":"curl -s $ORIGIN/api/vitrine/cursores -H \"Authorization: Bearer $METRICS_TOKEN\"","returns":"JSON: `{ [produto]: { borda?: ISO, cli?: ISO } }`; vazio é `{}`.","url":"https://staging.pontofato.com/api/vitrine/cursores","auth_detail":"Público."},{"method":"GET","path":"/api/partners","auth":"none","grupo":"Parceria","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.","desc":"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.","retorno":{"status":{"tipo":"string","desc":"`sob_consulta`: informação e proposta, sem ativação nem cobrança."},"produto":{"tipo":"string","desc":"Nome do produto."},"idioma":{"tipo":"string","desc":"Idioma dos textos (o do produto)."},"titulo":{"tipo":"string","desc":"Título da oferta."},"descricao":{"tipo":"string","desc":"Uma frase sobre a oferta."},"publico":{"tipo":"string","desc":"Quem usa o produto — o público que o patrocinador alcança."},"modalidades":{"tipo":"object[]","desc":"`{ id, nome }`: patrocinio, parceria, anuncio."},"placements":{"tipo":"object[]","desc":"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":{"tipo":"object","desc":"O pacote da casa: rodapé e menção para agentes nos dez produtos, com desconto."},"parcerias":{"tipo":"string[]","desc":"Ideias de parceria que o produto aceita discutir."},"current_sponsors":{"tipo":"object[]","desc":"Patrocinadores em vigor: `id`, `nome`, `url`, `frase`, `espacos`, `ate`."},"stats":{"tipo":"object","desc":"Recorte dos números públicos (`hoje`, `janelas`, `agentes`, `confiabilidade`) e o `link` para `/api/vitrine`; `publicado: false` antes da primeira publicação."},"payment":{"tipo":"object","desc":"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":{"tipo":"object","desc":"`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":{"tipo":"object","desc":"Rótulo do espaço, setores recusados, pagamento adiantado, prazos."},"_links":{"tipo":"object","desc":"`self`, `stats`, `page` (`null` até a página existir), `contact`, `casa` (o mesmo caminho nos dez produtos)."}},"exemplo":"curl -s $ORIGIN/api/partners","returns":"{ status, produto, idioma, titulo, descricao, publico, modalidades, placements, house_bundle, parcerias, current_sponsors, stats, payment, contact, politica, _links }","url":"https://staging.pontofato.com/api/partners","auth_detail":"Público."},{"method":"POST","path":"/api/visit","auth":"none","summary":"Ping da interface que soma a visita do dia. Agente não precisa chamar.","grupo":"Operação","desc":"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`.","corpo":{"p":{"tipo":"string","desc":"Caminho da página visitada."},"smoke":{"tipo":"bool","desc":"`true` marca a chamada como teste e ela não entra na conta."}},"body":{"p":"/"},"retorno":{"ok":{"tipo":"bool","desc":"Sempre `true`."},"counted":{"tipo":"bool","desc":"Se a visita entrou na conta do dia."},"reason":{"tipo":"string","desc":"Por que não contou, quando `counted` é `false`.","opcional":true}},"exemplo":"curl -s -XPOST $ORIGIN/api/visit -H 'content-type: application/json' -d '{\"p\":\"/\",\"smoke\":true}'","returns":"{ ok, counted, reason? }","url":"https://staging.pontofato.com/api/visit","auth_detail":"Público."},{"method":"GET","path":"/api/metrics","auth":"none","summary":"Métricas dos últimos 7 dias para o painel do operador; com o token, inclui os pagamentos.","grupo":"Operação","desc":"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.","headers":{"Authorization":{"tipo":"string","desc":"`Bearer <METRICS_TOKEN>` para incluir o bloco financeiro; token errado é 401.","obrigatorio":false}},"retorno":"Metricas","erros":{"401":"Token de operador errado.","503":"Worker sem METRICS_TOKEN configurado."},"exemplo":"curl -s $ORIGIN/api/metrics -H \"Authorization: Bearer $METRICS_TOKEN\"","returns":"{ app, today, today_visits, today_contacts?, days, usage, accounts, financeiro?, payments? }","url":"https://staging.pontofato.com/api/metrics","auth_detail":"Público."},{"method":"POST","path":"/api/credito","auth":"none","summary":"Recarrega crédito pré-pago: paga uma vez com x402 e recebe o token que desconta em qualquer API da casa.","grupo":"Crédito","query":{"usd":{"tipo":"int","desc":"Pacote: 1, 5, 10 ou 25 dólares.","obrigatorio":true}},"retorno":{"token":{"tipo":"string","desc":"Token portador do saldo (`cred_…`). Mostrado UMA vez — não há como recuperá-lo."},"saldo_usd":{"tipo":"string","desc":"Saldo creditado."},"guarde":{"tipo":"string","desc":"Aviso de que o token é o portador do crédito."},"usar":{"tipo":"string","desc":"Como apresentar o token nas rotas pagas."},"saldo_em":{"tipo":"string","desc":"Onde consultar saldo e extrato."}},"erros":{"400":"Pacote fora da lista (1, 5, 10 ou 25).","402":"Sem pagamento — o corpo traz `accepts[]` do x402."},"exemplo":"curl -s -XPOST '$ORIGIN/api/credito?usd=10'","returns":"{ token, saldo_usd, guarde, usar, saldo_em }","url":"https://staging.pontofato.com/api/credito","auth_detail":"Público."},{"method":"GET","path":"/api/credito","auth":"credito","summary":"Saldo e extrato do crédito — as últimas movimentações, sem devolver o token.","grupo":"Crédito","retorno":{"saldo_micros":{"tipo":"int","desc":"Saldo em micro-dólares (1e-6 USD)."},"saldo_usd":{"tipo":"string","desc":"Saldo formatado."},"criado_em":{"tipo":"string","desc":"Quando o crédito foi aberto."},"movimentos":{"tipo":"object[]","desc":"Entradas e saídas recentes, com produto e recurso."}},"erros":{"401":"Sem token ou token desconhecido."},"exemplo":"curl -s $ORIGIN/api/credito -H 'Authorization: Bearer cred_…'","returns":"{ saldo_micros, saldo_usd, criado_em, movimentos }","url":"https://staging.pontofato.com/api/credito","auth_detail":"Token de crédito em `Authorization: Bearer cred_…` (ou header `X-Credito`). Não é conta: é portador de saldo."},{"path":"/api/acesso","auth":"none","grupo":"API access","retorno":"ApiAccess","method":"GET","summary":"Discover the monthly data package or inspect a private purchase.","headers":{"X-API-Pass":{"tipo":"string","desc":"Private pass: api_<32 random hex>_<64 random hex>. Save before buying."}},"erros":{"400":"Invalid pass.","404":"Unknown purchase or wrong owner.","503":"Purchases disabled."},"exemplo":"curl -s $ORIGIN/api/acesso","returns":"{ 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? }","url":"https://staging.pontofato.com/api/acesso","auth_detail":"Público."},{"path":"/api/acesso","auth":"none","grupo":"API access","retorno":"ApiAccess","method":"POST","summary":"Buy 1000 basic data reads for US$1, valid for 30 days.","desc":"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.","headers":{"X-API-Pass":{"tipo":"string","desc":"Private pass: api_<32 random hex>_<64 random hex>. Save before buying.","obrigatorio":true},"X-Credito":{"tipo":"string","desc":"Existing prepaid credit token; alternative to x402."},"Authorization":{"tipo":"string","desc":"Bearer cred_… alternative to X-Credito."},"X-PAYMENT":{"tipo":"string","desc":"Signed x402 authorization from the 402 quote, maximum 16 KiB."},"PAYMENT-SIGNATURE":{"tipo":"string","desc":"Alternative name for X-PAYMENT."},"X-API-Transaction":{"tipo":"string","desc":"Confirmed Base transaction hash for reconciliation with the original pass and signed payment. Never creates another charge."}},"erros":{"400":"Missing or invalid pass/payment.","401":"Invalid prepaid credit.","402":"Payment required: x402 accepts[] and prepaid-credit instructions.","409":"Payment pending; retain the same pass and do not pay again.","429":"Purchase attempt limit; respect Retry-After.","503":"Payment unavailable or pending reconciliation."},"exemplo":"curl -s -X POST \"$ORIGIN/api/acesso\" -H \"X-API-Pass: $API_PASS\"","returns":"{ 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? }","url":"https://staging.pontofato.com/api/acesso","auth_detail":"Público."},{"method":"GET","path":"/api/pricing","auth":"none","grupo":"Descoberta","summary":"Preços vigentes e franquias gratuitas.","retorno":{"product":{"tipo":"string","desc":"Product name."},"quota":{"tipo":"PaymentQuota","desc":"Public allowances and current list prices; not personal usage."},"pricing":{"tipo":"string","desc":"Absolute URL of the current price list."},"billing":{"tipo":"string","desc":"Absolute URL of payment discovery or the existing billing summary."},"api_index":{"tipo":"string","desc":"Absolute URL of the API catalog."}},"erros":{"405":"Use GET ou HEAD."},"exemplo":"curl -s $ORIGIN/api/pricing","returns":"{ product, quota{free,paid,how_to_pay,live,free_now?,trial?}, pricing, billing, api_index }","url":"https://staging.pontofato.com/api/pricing","auth_detail":"Público."},{"method":"GET","path":"/api/billing","auth":"none","grupo":"Descoberta","summary":"Descoberta pública de pagamento e crédito pré-pago.","retorno":{"product":{"tipo":"string","desc":"Product name."},"quota":{"tipo":"PaymentQuota","desc":"Public allowances and current list prices; not personal usage."},"pricing":{"tipo":"string","desc":"Absolute URL of the current price list."},"billing":{"tipo":"string","desc":"Absolute URL of payment discovery or the existing billing summary."},"api_index":{"tipo":"string","desc":"Absolute URL of the API catalog."},"payment":{"tipo":"PaymentX402","desc":"Public x402 configuration; pay_to=null means not configured."},"credit":{"tipo":"PaymentCredit","desc":"Prepaid credit entry point. Never contains a balance or token."}},"erros":{"405":"Use GET ou HEAD."},"exemplo":"curl -s $ORIGIN/api/billing","returns":"{ 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} }","url":"https://staging.pontofato.com/api/billing","auth_detail":"Público."}],"quota":{"free":[{"o_que":"lookup de CEP, próximo, busca, raio e empresas","limite":"sem cota no v1","janela":null},{"o_que":"vizinhança por raio","limite":"cobrança desativada; limites de capacidade continuam valendo","janela":null}],"paid":[{"o_que":"1,000 basic reads across /empresas, /enderecos and /licitacoes, valid for 30 days; availability and purchase: GET/POST /api/acesso; no automatic renewal","price_usd":1},{"o_que":"contato de agente","price_usd":0.1}],"how_to_pay":"Rota paga → **402** com `accepts[]` (x402) e `credito` (pré-pago, `POST /api/credito?usd=10`, vale em todos os produtos). Pague e repita com `X-PAYMENT`, ou mande `Authorization: Bearer cred_…`.","live":"https://staging.pontofato.com/api/","free_now":["vizinhanca"]},"mcp":{"endpoint":"https://staging.pontofato.com/mcp","transport":"streamable-http","tools":14},"mcp_tools":["api_index","health","cep","proximo","buscar","unidades","empresas","raio","vizinhanca","contact","api_access","api_access_buy","pricing","billing"],"quickstart":["curl -s https://staging.pontofato.com/api/health","curl -s https://staging.pontofato.com/api/cep/70040010","curl -s 'https://staging.pontofato.com/api/proximo?lat=-15.7897&lon=-47.8793'","curl -s 'https://staging.pontofato.com/api/raio?cep=01310100&raio=800'","curl -s 'https://staging.pontofato.com/api/vizinhanca?cep=01310100&raio=800&cnae=56'"]}