{"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":"ca65ded8","base_url":"https://pontofato.com","docs":{"llms":"https://pontofato.com/llms.txt","llms_full":"https://pontofato.com/llms-full.txt","openapi":"https://pontofato.com/openapi.json","mcp":"https://pontofato.com/mcp","pricing":"https://pontofato.com/api/pricing","billing":"https://pontofato.com/api/billing","human_ui":"https://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. Cada página HTML abre o app do produto com os dados públicos já renderizados.","hierarchy":"UF → município → bairro/localidade → rua → endereços","url":"https://pontofato.com/enderecos/","formats":{"html":"https://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. Cada página HTML abre o app do produto com os dados públicos já renderizados.","hierarchy":"Modalidade → UF → ano → mês → dia → município → compras","url":"https://editalmd.com/licitacoes/","formats":{"html":"https://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: *` no lookup grátis (CEP, próximo, busca, sugestão, raio e empresas) e nas rotas de agente.","x402":"`GET /api/vizinhanca` além da cota grátis: 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 `X-Credito`). Para saldo recuperado de x402, use a credencial de carteira `mmw_…` em Bearer ou `X-Wallet-Token`, emitida por `/api/auth/wallet/agent/start` e `/api/auth/wallet/agent/token`.","session":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},"endpoints":[{"method":"GET","path":"/enderecos/uf/:uf/cep/:cep/","auth":"none","grupo":"Acervo","summary":"Ficha pública do CEP com a consulta aberta no aplicativo.","params":{"uf":{"desc":"Sigla da unidade da federação, em maiúsculas.","exemplo":"SP"},"cep":{"desc":"CEP com oito dígitos, sem pontuação.","exemplo":"01310100"}},"query":{"depois":{"tipo":"string","desc":"Cursor fornecido pelo link seguinte do acervo. Preserva a navegação paginada."}},"retorno":{"_texto":"HTML público com os dados disponíveis antes do JavaScript. A primeira página abre a consulta do CEP; links com cursor mantêm a página do acervo. JSON e Markdown continuam no índice em api.pontofato.com."},"erros":{"404":"CEP não encontrado no acervo.","503":"Acervo temporariamente indisponível."},"exemplo":"curl -fsS $ORIGIN/enderecos/uf/SP/cep/01310100/","returns":"HTML público com os dados disponíveis antes do JavaScript. A primeira página abre a consulta do CEP; links com cursor mantêm a página do acervo. JSON e Markdown continuam no índice em api.pontofato.com.","url":"https://pontofato.com/enderecos/uf/:uf/cep/:cep/","auth_detail":"Público."},{"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://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://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://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.","desc":"A SDK do produto também retorna profile e administration. administration contém {href} para o dono da plataforma que entrou com passkey, autenticador ou código de recuperação; nos demais casos, null. O servidor deriva esse campo da conta autenticada. authTime é a hora da entrada de uma sessão do navegador; numa chave de API ou num token OAuth, é null.","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://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://pontofato.com/api/auth/logout","auth_detail":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},{"method":"POST","path":"/api/auth/pwa/install","auth":"session","grupo":"App instalado","summary":"Prepara uma instalação pessoal do app.","desc":"Exige entrada recente, Origin exato e CSRF do navegador. Retorna PIN privado assinado e endereço do manifesto sem cache. Até 10 instalações ativas por conta e produto.","corpo":{"path":{"tipo":"string","obrigatorio":true,"desc":"Same-origin task path, up to 1600 characters."},"state":{"tipo":"object","obrigatorio":true,"desc":"Up to 30 allowlisted preference keys and string values."},"manifest":{"tipo":"object","obrigatorio":true,"desc":"Public app name and same-origin icons."}},"retorno":{"_texto":"{pin,path,manifest}"},"exemplo":"(async () => {\n  const {csrf} = await fetch(\"$ORIGIN/api/auth/bootstrap\").then(r => r.json());\n  const manifest = await fetch(document.querySelector('link[rel=\"manifest\"]').href).then(r => r.json());\n  const r = await fetch(\"$ORIGIN/api/auth/pwa/install\", {method: \"POST\", credentials: \"same-origin\",\n    headers: {\"Content-Type\": \"application/json\", \"X-CSRF-Token\": csrf},\n    body: JSON.stringify({path: location.pathname + location.search, state: {}, manifest})});\n  return r.json();\n})();","exemploLinguagem":"js","erros":{"400":"invalid_installation_path / invalid_installation_state / invalid_installation_manifest","401":"invalid_session / reauth_required","409":"installation_not_created","503":"auth_unavailable"},"returns":"{pin,path,manifest}","url":"https://pontofato.com/api/auth/pwa/install","auth_detail":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},{"method":"POST","path":"/api/auth/pwa/restore","auth":"none","grupo":"App instalado","summary":"Restaura um app instalado.","desc":"Exige PIN assinado, Origin exato e CSRF do navegador. Confere host, produto, conta, versão de segurança e revogação da instalação. Mantém a hora da autenticação original. Ações sensíveis continuam exigindo entrada recente.","corpo":{"pin":{"tipo":"string","obrigatorio":true,"desc":"Private signed installation credential."}},"retorno":{"_texto":"{ok:true,state,path,manifest}; HttpOnly session cookies"},"exemplo":"(async () => {\n  const {csrf} = await fetch(\"$ORIGIN/api/auth/bootstrap\").then(r => r.json());\n  const r = await fetch(\"$ORIGIN/api/auth/pwa/restore\", {method: \"POST\", credentials: \"same-origin\",\n    headers: {\"Content-Type\": \"application/json\", \"X-CSRF-Token\": csrf},\n    body: JSON.stringify({pin: \"…\"})});\n  return r.json();\n})();","exemploLinguagem":"js","erros":{"401":"invalid_installation","403":"invalid_origin / invalid_csrf","503":"auth_unavailable"},"returns":"{ok:true,state,path,manifest}; HttpOnly session cookies","url":"https://pontofato.com/api/auth/pwa/restore","auth_detail":"Público."},{"method":"GET","path":"/api/auth/pwa/manifest","auth":"none","grupo":"App instalado","summary":"Consulta o manifesto privado da instalação.","desc":"Exige cookie da instalação e chave do manifesto. Privado e sem cache. A URL inicial guarda o PIN no fragmento.","query":{"key":{"tipo":"string","obrigatorio":true,"desc":"Key in the manifest address that the install or restore call returned."}},"retorno":{"_texto":"application/manifest+json"},"exemplo":"await fetch(\"$ORIGIN/api/auth/pwa/manifest?key=…\", {credentials: \"same-origin\"}).then(r => r.json())","exemploLinguagem":"js","erros":{"401":"invalid_installation"},"returns":"application/manifest+json","url":"https://pontofato.com/api/auth/pwa/manifest","auth_detail":"Público."},{"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://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 feita há até 2 horas; 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://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://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":"/api/account/apps","auth":"session","grupo":"Conta","summary":"Lista os apps conectados à sua conta neste produto.","desc":"Os clientes de MCP em que você entrou com a conta (OAuth), como o claude.ai ou o ChatGPT. Nunca devolve token.","retorno":{"apps":{"tipo":"object[]","desc":"Até 50: `id`, `nome` (o app; o host dele quando ele se identifica por documento de metadados), `criadoEm`, `usadoEm` (por hora, ou null)."}},"erros":{"401":"invalid_session","503":"auth_unavailable"},"exemplo":"await fetch(\"$ORIGIN/api/account/apps\", {credentials: \"same-origin\"}).then(r => r.json());","exemploLinguagem":"js","returns":"{ apps }","url":"https://pontofato.com/api/account/apps","auth_detail":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},{"method":"POST","path":"/api/account/apps/revoke","auth":"session","grupo":"Conta","summary":"Desconecta um app da sua conta.","desc":"Para o acesso do app na hora; ele pede o login de novo. Repetir não faz mal.","corpo":{"id":{"tipo":"string","obrigatorio":true,"desc":"O `id` do app."}},"body":{"id":"…"},"retorno":{"ok":{"tipo":"bool","desc":"true"}},"erros":{"400":"invalid_app_id","401":"invalid_session","403":"invalid_origin / invalid_csrf","404":"app_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/apps/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://pontofato.com/api/account/apps/revoke","auth_detail":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},{"method":"GET","path":"/api/account/callouts","auth":"session","grupo":"Conta","summary":"Lista os avisos que você fechou neste produto.","desc":"As chaves dos avisos que ficam fechados para a sua conta, em todo aparelho, como a explicação de uma área.","retorno":{"callouts":{"tipo":"string[]","desc":"Até 200 chaves, em ordem alfabética."}},"erros":{"401":"invalid_session","403":"product_required","503":"auth_unavailable"},"exemplo":"await fetch(\"$ORIGIN/api/account/callouts\", {credentials: \"same-origin\"}).then(r => r.json());","exemploLinguagem":"js","returns":"{ callouts }","url":"https://pontofato.com/api/account/callouts","auth_detail":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},{"method":"POST","path":"/api/account/callouts/dismiss","auth":"session","grupo":"Conta","summary":"Fecha um aviso de vez.","desc":"O aviso não abre de novo para a sua conta neste produto. Repetir não faz mal.","corpo":{"key":{"tipo":"string","obrigatorio":true,"desc":"A chave do aviso: letras, números e `_.:-`, até 80."}},"body":{"key":"financeiro_expense"},"retorno":{"ok":{"tipo":"bool","desc":"true"}},"erros":{"400":"invalid_callout","401":"invalid_session","403":"invalid_origin / invalid_csrf","409":"too_many_callouts","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/callouts/dismiss\", {method: \"POST\", credentials: \"same-origin\",\n    headers: {\"Content-Type\": \"application/json\", \"X-CSRF-Token\": csrf},\n    body: JSON.stringify({key: \"financeiro_expense\"})});\n  return r.json();\n})();","exemploLinguagem":"js","returns":"{ ok }","url":"https://pontofato.com/api/account/callouts/dismiss","auth_detail":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},{"method":"POST","path":"/api/account/callouts/reopen","auth":"session","grupo":"Conta","summary":"Reabre um aviso fechado.","desc":"Desfaz o fechar: o aviso volta para a sua conta neste produto. O produto guarda aqui também uma escolha de ligar e desligar, como os valores ocultos do Financeiro. Repetir não faz mal.","corpo":{"key":{"tipo":"string","obrigatorio":true,"desc":"A chave do aviso: letras, números e `_.:-`, até 80."}},"body":{"key":"financeiro_expense"},"retorno":{"ok":{"tipo":"bool","desc":"true"}},"erros":{"400":"invalid_callout","401":"invalid_session","403":"invalid_origin / invalid_csrf","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/callouts/reopen\", {method: \"POST\", credentials: \"same-origin\",\n    headers: {\"Content-Type\": \"application/json\", \"X-CSRF-Token\": csrf},\n    body: JSON.stringify({key: \"financeiro_expense\"})});\n  return r.json();\n})();","exemploLinguagem":"js","returns":"{ ok }","url":"https://pontofato.com/api/account/callouts/reopen","auth_detail":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},{"method":"POST","path":"/api/auth/wallet/agent/start","auth":"none","grupo":"Conta","summary":"Começa a credencial de carteira do agente sem conta.","desc":"Sem conta: a carteira prova que é dela assinando a mensagem (EIP-4361). Assinar não paga nem transfere nada. A mensagem diz este produto e vale 5 minutos. Antes de assinar, compare a mensagem com a URL chamada. O domínio da primeira linha deve ser o host dessa URL. O URI deve ser a origem dela. Se um deles for diferente, não assine. Assine com personal_sign e envie a /api/auth/wallet/agent/token.","corpo":{"address":{"tipo":"string","desc":"0x…, a carteira (EOA ou contrato na Base)","obrigatorio":true}},"body":{"address":"0x2c7536E3605D9C16a7a3D7b1898e529396a65c23"},"exemplo":"curl -s -XPOST $ORIGIN/api/auth/wallet/agent/start -H 'content-type: application/json' -d '{\"address\":\"0x2c7536E3605D9C16a7a3D7b1898e529396a65c23\"}'","retorno":{"message":{"tipo":"string","desc":"EIP-4361"},"issuedAt":{"tipo":"number","desc":"segundos / seconds"},"expiresIn":{"tipo":"number","desc":"300"}},"erros":{"400":"invalid_wallet_address","503":"auth_unavailable"},"returns":"{ message, issuedAt, expiresIn }","url":"https://pontofato.com/api/auth/wallet/agent/start","auth_detail":"Público."},{"method":"POST","path":"/api/auth/wallet/agent/token","auth":"none","grupo":"Conta","summary":"Recebe a credencial da carteira (mmw_…) deste produto.","desc":"A assinatura da carteira na mensagem do start, conferida aqui (chave própria) ou na Base (contrato, EIP-1271/6492). A credencial vale 30 dias: envie `Authorization: Bearer mmw_…` às rotas que aceitam a carteira como dona (dono `x402:<endereço>`). Vinculada a carteira a uma conta, o que ela fez aqui passa para a conta quando a pessoa entra.","corpo":{"address":{"tipo":"string","desc":"0x…, a mesma carteira do start / the same wallet as in start","obrigatorio":true},"issuedAt":{"tipo":"number","desc":"o issuedAt do start / start's issuedAt","obrigatorio":true},"signature":{"tipo":"string","desc":"personal_sign (0x…)","obrigatorio":true}},"body":{"address":"0x2c7536E3605D9C16a7a3D7b1898e529396a65c23","issuedAt":1791400000,"signature":"0x…"},"exemplo":"curl -s -XPOST $ORIGIN/api/auth/wallet/agent/token -H 'content-type: application/json' -d '{\"address\":\"0x2c7536E3605D9C16a7a3D7b1898e529396a65c23\",\"issuedAt\":1791400000,\"signature\":\"0x…\"}'","retorno":{"token":{"tipo":"string","desc":"mmw_…"},"owner":{"tipo":"string","desc":"x402:0x…"},"expiresAt":{"tipo":"number","desc":"segundos / seconds"}},"erros":{"400":"invalid_body","401":"invalid_wallet","429":"wallet_limited","503":"wallet_unavailable / auth_unavailable"},"returns":"{ token, owner, expiresAt }","url":"https://pontofato.com/api/auth/wallet/agent/token","auth_detail":"Público."},{"method":"POST","path":"/api/auth/claim/wallets","auth":"session","grupo":"Conta","summary":"Passa para a conta o que as carteiras dela fizeram sem conta.","desc":"A janela de entrar chama depois de toda entrada. Para cada carteira vinculada à conta: os direitos comprados aqui por x402 (dono x402:<endereço>) e o que este produto guarda desse dono. Repetir não move nada.","exemplo":"await MMConta.fetch(new URL(\"$ORIGIN/api/auth/claim/wallets\").pathname, { method: \"POST\", headers: { \"content-type\": \"application/json\" }, body: \"{}\" })","retorno":{"carteiras":{"tipo":"number","desc":"wallets"},"direitos":{"tipo":"number","desc":"rights moved"}},"erros":{"401":"invalid_session","503":"auth_unavailable"},"returns":"{ carteiras, direitos }","url":"https://pontofato.com/api/auth/claim/wallets","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://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://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://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://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://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://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://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://pontofato.com/mcp","auth_detail":"Público."},{"method":"GET","path":"/api/cep/:cep","auth":"none","summary":"O resumo de um CEP: centro (lat/lon), lugar, contagens, Censo e fonte; os pontos com `detalhe=pontos`.","grupo":"Lugar","params":{"cep":{"desc":"8 dígitos, com ou sem hífen.","exemplo":"70040010"}},"query":{"detalhe":{"tipo":"string","desc":"Com `pontos`, devolve todos os pontos do CEP, cada um com o Censo do setor."}},"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","agent_value":{"principal":true,"idioma":"pt","en":{"when":"What addresses, businesses and census data are available for this Brazilian postal code?","result":"The center coordinates, the place, address and registered business totals and census-sector data in one small free response; every address with detalhe=pontos.","replaces":"We join CNEFE addresses, company records and census sectors. Use the prepared result instead of importing and joining those datasets.","free":"Call GET /api/cep/{cep}. Read resumo (center, counts and the census sector of the largest building) and empresas_no_cep. Add detalhe=pontos for every point with its own census sector. No purchase is needed for this lookup.","paid":"For businesses around a point rather than within one postal code, use /api/vizinhanca. Try its allowance first; pay only beyond it.","limits":"Addresses and census data reflect 2022. Census measures describe the sector, not an individual or the entire postal code. Income is not current purchasing power. Missing data is unknown; company counts do not measure foot traffic.","alternative":"You only need a conventional postal address, need current field observations, or already maintain these joins.","start":{"href":"/en/","label":"Look up a postal code"}},"pt":{"when":"Quais endereços, empresas e dados do Censo existem neste CEP?","result":"O centro com coordenadas, o lugar, os totais de endereços e de empresas registradas e o setor censitário em uma resposta gratuita e curta; todos os endereços com detalhe=pontos.","replaces":"Cruzamos endereços do CNEFE, registros de empresas e setores do Censo. Use o resultado pronto sem importar e cruzar essas bases.","free":"Consulte GET /api/cep/{cep}. Leia resumo (centro, contagens e o setor censitário do maior edifício) e empresas_no_cep. Use detalhe=pontos para todos os pontos, cada um com o seu setor. Esta consulta não exige compra.","paid":"Para empresas no entorno de um ponto, além de um único CEP, use /api/vizinhanca. Experimente a franquia; pague só além dela.","limits":"Endereços e Censo retratam 2022. As medidas do Censo descrevem o setor, não uma pessoa nem todo o CEP. Renda não é poder de compra atual. Dado ausente é desconhecido; empresas registradas não medem fluxo de pessoas.","alternative":"Basta um endereço postal convencional, você precisa de observação atual em campo ou já mantém esses cruzamentos.","start":{"href":"/","label":"Consultar CEP"}}},"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,censo,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,logradouro,bairro,cidade,uf,ibge,lat,lon,especies,censo?}, empresas_no_cep?{total,ativas}, fonte, cobertura?{ufs,completa}, _links }","url":"https://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,censo,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://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://pontofato.com/api/proximo","auth_detail":"Público."},{"method":"GET","path":"/api/pontos","auth":"none","summary":"Endereços de uma área do mapa, um por prédio, do centro para fora — para desenhar o mapa em zoom alto.","grupo":"Lugar","desc":"Caixa acima de 0,04° de latitude × 0,08° de longitude (zoom 16 numa tela cheia) é recortada em volta do centro, com `recortada: true`.","query":{"bbox":{"tipo":"string","desc":"oeste,sul,leste,norte em graus decimais (a ordem do GeoJSON).","obrigatorio":true,"exemplo":"-46.6605,-23.5655,-46.6505,-23.5605"},"limit":{"tipo":"int","desc":"1 a 200 (padrão 100).","exemplo":"100"}},"retorno":"PontosDaArea","erros":{"400":"`bbox` fora do formato ou da ordem, ou `limit` fora da faixa."},"exemplo":"curl -s '$ORIGIN/api/pontos?bbox=-46.6605,-23.5655,-46.6505,-23.5605&limit=50'","returns":"{ bbox, recortada, items[{cep,logradouro,numero,complemento,bairro,cidade,uf,lat,lon,ibge,especie,especie_label,tipo_edificacao,tipo_edificacao_codigo,estabelecimento,estabelecimentos,especies,setor,censo,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://pontofato.com/api/pontos","auth_detail":"Público."},{"method":"GET","path":"/api/buscar","auth":"none","summary":"Busca de rua pelo nome (ou pelo bairro) no país, até 20: uma por rua de cada cidade, com o ponto do número quando o termo traz um que existe.","grupo":"Lugar","query":{"q":{"tipo":"string","desc":"Nome da rua, 3 a 200 caracteres; o número e a cidade no termo também valem.","obrigatorio":true,"exemplo":"avenida paulista 1230"},"uf":{"tipo":"string","desc":"Restringe a uma UF.","exemplo":"SP"},"cidade":{"tipo":"string","desc":"Nome ou trecho do município."}},"retorno":"PaginaPonto","erros":{"400":"Termo curto ou longo demais, só com o tipo da rua (termo_generico), UF inválida ou busca ampla demais sem UF ou cidade (busca_ampla)."},"exemplo":"curl -s '$ORIGIN/api/buscar?q=avenida+paulista+1230'","returns":"{ items[{cep,logradouro,numero,complemento,bairro,cidade,uf,lat,lon,ibge,especie,especie_label,tipo_edificacao,tipo_edificacao_codigo,estabelecimento,estabelecimentos,especies,setor,censo,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://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.","429":"Limite de consultas desta rede atingido. Tente novamente em um minuto.","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://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://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'","agent_value":{"idioma":"pt","en":{"when":"Which registered businesses are near this Brazilian location?","result":"Active, newly opened and closed companies within the requested radius, with activity filters and distances.","replaces":"We import the address and company data and join them geographically. Query the neighborhood without downloading and indexing both datasets.","free":"Start with GET /api/vizinhanca within its available allowance. If you only need an address, use the free address lookup.","paid":"Beyond the neighborhood allowance, use credit or the per-call quote. Compare the price for your actual query in /api/pricing.","limits":"CNEFE reflects 2022. Company positions and distances use postal codes. Check base, truncado and lenta. Missing counts are unknown, not zero. A result with lenta:true or missing counts does not consume the allowance or charge credit/x402. This does not measure foot traffic, demand or exact storefront positions.","alternative":"You need only a postal address, require current rooftop accuracy, or already maintain these geographic joins.","start":{"href":"/en/","label":"Explore a location"}},"pt":{"when":"Quais empresas estão registradas perto deste ponto?","result":"Empresas ativas, abertas e baixadas no raio pedido, com filtros de atividade e distâncias.","replaces":"Já importamos os endereços e as empresas e cruzamos a localização. Consulte o entorno sem baixar e indexar as duas bases.","free":"Comece por GET /api/vizinhanca na franquia disponível. Se precisa só de endereço, use a consulta gratuita de endereço.","paid":"Além da franquia de vizinhança, use crédito ou a cotação por chamada. Confira o preço da sua consulta em /api/pricing.","limits":"O CNEFE retrata 2022. Posição e distância das empresas usam CEP. Confira base, truncado e lenta. Contagem ausente é desconhecida, não zero. Resultado com lenta:true ou contagens ausentes não consome franquia nem cobra crédito/x402. O resultado não mede fluxo, demanda nem posição exata da loja.","alternative":"Você precisa só de endereço postal, exige posição exata atual ou já mantém esses cruzamentos geográficos.","start":{"href":"/","label":"Explorar um ponto"}}},"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 }","preco_usd":0.05,"url":"https://pontofato.com/api/vizinhanca","auth_detail":"Token de crédito em `Authorization: Bearer cred_…` (ou `X-Credito`). Para saldo recuperado de x402, use a credencial de carteira `mmw_…` em Bearer ou `X-Wallet-Token`, emitida por `/api/auth/wallet/agent/start` e `/api/auth/wallet/agent/token`."},{"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://pontofato.com/api/local","auth_detail":"Público."},{"method":"POST","path":"/api/contact","auth":"none","summary":"Fale com quem faz o produto — de graça, para pessoa e agente.","grupo":"Contato","desc":"Uma rota para dúvida e para proposta de patrocínio, parceria ou anúncio (`tipo`, com os espaços de `GET /api/partners`). Sem captcha, sem conta, sem pagamento. Uma mensagem a cada 10 segundos por rede: a que chega antes espera a vez e sai — sem erro. A mensagem chega à equipe por e-mail, com o `email` como endereço de resposta. Para voz, envie multipart/form-data: `dados` contém este JSON (até 32 KiB) e `audio` contém um arquivo de áudio WebM, Ogg ou M4A (até 2 MB). O áudio pode substituir message. O navegador grava até dois minutos. O áudio vai como anexo ao e-mail do dono.","corpo":{"name":{"tipo":"string","desc":"Como chamar quem escreve (alias `nome`).","obrigatorio":true},"email":{"tipo":"string","desc":"Para onde responder.","obrigatorio":true},"message":{"tipo":"string","desc":"O que você quer dizer (alias `mensagem`).","obrigatorio":true},"whatsapp":{"tipo":"string","desc":"Número opcional para resposta, com código do país. Ex.: +5561999999999."},"prefer_whatsapp":{"tipo":"bool","desc":"Pede resposta por WhatsApp. Exige whatsapp."},"tipo":{"tipo":"string","desc":"Proposta: `patrocinio`, `parceria`, `anuncio` ou `consultoria`. 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":"Anúncio: `ate_100`, `100_500`, `500_2000`, `2000_mais` ou `a_combinar`. Consultoria, em dólar: `ate_2000`, `2000_5000`, `5000_10000`, `10000_mais` ou `nao_sei`."},"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`."},"projeto":{"tipo":"string","desc":"Consultoria: o tipo de projeto (`llm_privado`, `voz`, `dados_sensiveis`, `gpu`, `integracao` ou `outro`)."},"prazo":{"tipo":"string","desc":"Consultoria: quando começar (`agora`, `1_mes`, `1_3_meses` ou `explorando`)."},"formato":{"tipo":"string","desc":"Consultoria: `projeto` (por escopo), `mensal` ou `assessoria`."},"pais":{"tipo":"string","desc":"Consultoria: o país de quem pede."},"fuso":{"tipo":"string","desc":"Consultoria: o fuso IANA, como `America/New_York`."},"horarios":{"tipo":"string[]","desc":"Consultoria: até 3 horários para a conversa, `AAAA-MM-DDTHH:MM` na hora do fuso."}},"body":{"name":"Agente","email":"agent@example.com","message":"olá, sou um agente"},"retorno":{"ok":{"tipo":"bool","desc":"Sempre `true` quando a mensagem foi aceita."}},"erros":{"400":"Validação: o `code` diz o campo.","503":"O contato não está configurado neste servidor."},"exemplo":"curl -s -XPOST $ORIGIN/api/contact -H 'content-type: application/json' -d '{\"name\":\"Agente\",\"email\":\"agent@example.com\",\"message\":\"olá, sou um agente\"}'","returns":"{ ok }","url":"https://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; número, hash e token no caminho são guardados como `:id`."},"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."},"build":{"tipo":"string","desc":"Build da página que relatou (a `<meta name=\"build\">`), até 64 letras, dígitos, `.`, `_` ou `-`; é ele que data a falha."}},"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://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://pontofato.com/api/pagamento/aberto","auth_detail":"Público."},{"method":"POST","path":"/api/funil","auth":"none","statusOk":202,"summary":"A interface relata os passos da visita (funil de conversão). Agentes não devem chamar.","grupo":"Operação","desc":"Lote da mesma origem, enviado pela própria página: páginas vistas, engajamento, oferta à vista, clique em comprar, janela de pagamento, pagamento enviado ou aceito. Guarda o id aleatório do navegador, o caminho sem query, o host de quem mandou a pessoa e as utm; nunca IP, e-mail ou conta. Não grava banco: uma linha por lote no diário do dia, com teto. Robô declarado e smoke ficam de fora.","headers":{"Origin":{"tipo":"string","desc":"A origem da página, idêntica à desta rota.","obrigatorio":false},"Content-Type":{"tipo":"string","desc":"`application/json` ou `text/plain`.","obrigatorio":true}},"corpo":{"v":{"tipo":"number","desc":"Versão do lote: `1`.","obrigatorio":true},"vid":{"tipo":"string","desc":"Id aleatório deste navegador (UUID v4).","obrigatorio":true},"sid":{"tipo":"string","desc":"Id da sessão (30 min sem atividade encerram).","obrigatorio":true},"sn":{"tipo":"number","desc":"Número da sessão deste navegador.","obrigatorio":true},"pv":{"tipo":"string","desc":"Id da página vista.","obrigatorio":true},"e":{"tipo":"object[]","desc":"Até 40 eventos `{ t, n, p? }` do vocabulário do funil.","obrigatorio":true}},"retorno":{"_texto":"202 sem corpo se guardado; 204 se ignorado. Sempre no-store."},"exemplo":"curl -s -XPOST $ORIGIN/api/funil -H 'content-type: text/plain' -H 'x-mm-smoke: 1' -d '{\"v\":1,\"vid\":\"0f8b9c1e-2a3b-4c5d-8e6f-7a8b9c0d1e2f\",\"sid\":\"s1abcdefgh\",\"sn\":1,\"pv\":\"p1abcdefgh\",\"e\":[{\"t\":0,\"n\":\"pagina\"}]}'","returns":"202 sem corpo se guardado; 204 se ignorado. Sempre no-store.","url":"https://pontofato.com/api/funil","auth_detail":"Público."},{"method":"GET","path":"/api/funil/arquivos","auth":"none","summary":"Operador: os dias do diário do funil guardados neste app, com o tamanho de cada um.","grupo":"Operação","headers":{"Authorization":{"tipo":"string","desc":"`Bearer <METRICS_TOKEN>`.","obrigatorio":true}},"retorno":{"v":{"tipo":"number","desc":"Versão do lote guardado."},"produto":{"tipo":"string","desc":"O produto."},"teto":{"tipo":"object","desc":"`bytesDia` e `dias` guardados."},"dias":{"tipo":"object[]","desc":"`{ dia, bytes }`, do mais velho ao de hoje."}},"erros":{"401":"Unauthorized","503":"Not configured"},"exemplo":"curl -s $ORIGIN/api/funil/arquivos -H \"Authorization: Bearer $METRICS_TOKEN\"","returns":"{ v, produto, teto, dias }","url":"https://pontofato.com/api/funil/arquivos","auth_detail":"Público."},{"method":"GET","path":"/api/funil/arquivo","auth":"none","summary":"Operador: um pedaço de um dia do diário do funil, em NDJSON, a partir de um byte.","grupo":"Operação","desc":"Até 4 MiB por resposta, cortados na última linha inteira. `X-MM-Funil-Proximo` diz de onde pedir o resto; `X-MM-Funil-Tamanho`, o tamanho do dia agora.","headers":{"Authorization":{"tipo":"string","desc":"`Bearer <METRICS_TOKEN>`.","obrigatorio":true}},"query":{"dia":{"tipo":"string","desc":"O dia, `AAAA-MM-DD` (UTC).","obrigatorio":true},"desde":{"tipo":"number","desc":"O byte de onde ler; `0` no começo.","obrigatorio":false}},"retorno":{"_texto":"Linhas JSON, uma por lote guardado."},"erros":{"400":"Invalid parameters","401":"Unauthorized","503":"Not configured"},"exemplo":"curl -s \"$ORIGIN/api/funil/arquivo?dia=2026-09-27&desde=0\" -H \"Authorization: Bearer $METRICS_TOKEN\"","returns":"Linhas JSON, uma por lote guardado.","url":"https://pontofato.com/api/funil/arquivo","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 de tráfego. A audiência informa seu próprio fuso em `pessoas.medicao`.","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":"Navegadores únicos com interação registrada, em 7 dias.","opcional":true},"pessoas":{"tipo":"object","desc":"Medição própria de navegadores confirmados por interação: únicos, sessões e páginas em 7 e 30 dias, recortes e cobertura. `null` indica ausência de medição. Não identifica pessoas verificadas.","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":"Apoios com medição: exposições por 1 s e cliques nativos por página em sessões confirmadas, CTR de 7 dias, dias observados e cobertura. Vazio é ausência de histórico, não CTR zero.","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://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://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://pontofato.com/api/vitrine/painel","auth_detail":"Público."},{"method":"GET","path":"/api/vitrine/cursores","auth":"none","grupo":"Números públicos","summary":"Cursores por produto: `borda`, `borda5xx` (só 5xx) e `cli`. Só com token do operador.","headers":{"Authorization":{"tipo":"string","desc":"`Bearer <METRICS_TOKEN>` — a classe operador.","obrigatorio":true}},"retorno":{"_texto":"JSON: `{ [produto]: { borda?: ISO, borda5xx?: 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, borda5xx?: ISO, cli?: ISO } }`; vazio é `{}`.","url":"https://pontofato.com/api/vitrine/cursores","auth_detail":"Público."},{"method":"GET","path":"/api/partners","auth":"none","grupo":"Parceria","summary":"Anúncios com preço fechado: espaços, duração, público e contratação. Parcerias e campanhas diferentes seguem por negociação.","desc":"Quatro pacotes com preço em USD por semana, contratação avulsa ou assinatura semanal no cartão. Inclui canais reais, patrocinadores e números públicos. Contratação pelo POST /api/partners. Negociações e parcerias usam o contato. Cache de até 1 hora; com pedido vinculado, 1 minuto.","retorno":{"status":{"tipo":"string","desc":"`preco_fechado`: os espaços com preço podem ser contratados; os demais são negociados."},"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":"Canais incluídos nos pacotes: id, nome, onde, formato, medicao e disponivel. Preço mensal legado nulo no catálogo semanal."},"packages":{"tipo":"object[]","desc":"Quatro pacotes: id, nome, assinatura, preco_usd_semana, espacos, canais e períodos permitidos em exposicao[{dias,preco}]."},"house_bundle":{"tipo":"object","desc":"Indisponível no catálogo semanal: `{disponivel:false}`."},"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":"Pagamento compartilhado pelo POST da contratação. Os campos de carteira permanecem para compatibilidade; não envie pagamento manual antes da cotação."},"contact":{"tipo":"object","desc":"`email`, `form_url`, `api_url` (`POST /api/contact`, livre: uma mensagem a cada 10 s por rede), `campos` (os obrigatórios), `campos_proposta` (os opcionais da proposta, com os valores aceitos de cada um), `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, packages, house_bundle, parcerias, current_sponsors, stats, payment, contact, politica, _links }","url":"https://pontofato.com/api/partners","auth_detail":"Público."},{"method":"POST","path":"/api/partners","auth":"none","grupo":"Parceria","summary":"Contrate um pacote semanal de anúncios e envie a arte para revisão.","desc":"O servidor calcula o preço do pacote e das semanas. Avulso: cotação 402 e pagamento compartilhado, sem renovação. modalidade=assinatura: conta autenticada, CSRF da mesma origem, cartão nativo e aceite explícito da renovação semanal. Consulte a oferta atual em BRL em /api/credito/assinaturas/ofertas. Cancele as próximas cobranças na conta. modalidade=recibo consulta apenas o recibo da campanha da própria conta. A cobrança precede a revisão; a exibição começa na publicação. Repetições mantêm id, token e conteúdo. A cotação não grava arte nem reserva espaço. Campanhas diferentes e parcerias gratuitas usam POST /api/contact.","query":[{"nome":"modalidade","tipo":"string","desc":"Omit for one-off payment; assinatura uses native weekly card billing; recibo reads the account's campaign receipt."}],"corpo":{"id":{"tipo":"string","obrigatorio":true,"desc":"Fresh random order id: 32 lowercase hexadecimal characters. Reuse for retries."},"token":{"tipo":"string","obrigatorio":true,"desc":"Private random order capability: 64 lowercase hexadecimal characters. Keep it for recovery."},"espaco":{"tipo":"string[]","desc":"Legacy paid-order retry only. New purchases select a package."},"pacote":{"tipo":"string","obrigatorio":true,"desc":"One of the four package ids in GET /api/partners packages."},"duracao":{"tipo":"int","obrigatorio":true,"desc":"Days from the package exposure list. Weekly subscriptions require 7."},"assinatura":{"tipo":"object","desc":"Only with modalidade=assinatura: the native subscription body with recurso=publicidade:ORDER_ID, simulado, cartao and explicit renewal aceite. The authenticated account must own the campaign."},"pedido":{"tipo":"string","desc":"Only with modalidade=recibo: the campaign id owned by the signed-in account."},"nome":{"tipo":"string","obrigatorio":true,"desc":"Brand or product, up to 80 characters."},"email":{"tipo":"string","obrigatorio":true,"desc":"Contact email."},"url":{"tipo":"string","obrigatorio":true,"desc":"HTTPS destination URL."},"frase":{"tipo":"string","obrigatorio":true,"desc":"Ad copy, up to 100 characters."},"arte":{"tipo":"string","obrigatorio":true,"desc":"Base64 image bytes, without a data URL prefix. PNG, JPEG or WebP, up to 2 MB."},"direitos":{"tipo":"bool","obrigatorio":true,"desc":"true confirms the right to use the image and content."}},"retorno":{"id":{"tipo":"string","desc":"Order id."},"estado":{"tipo":"string","desc":"revisao: paid and awaiting content approval."},"recibo":{"tipo":"string","desc":"Verified payment receipt."}},"erros":{"400":"Invalid order or artwork.","402":"Payment required.","409":"Space occupied or order changed.","503":"Checkout unavailable."},"exemplo":"curl -X POST '$ORIGIN/api/partners' -H 'content-type: application/json' -H 'Idempotency-Key: ORDER_ID' --data-binary @campaign.json","returns":"{ id, estado, recibo }","url":"https://pontofato.com/api/partners","auth_detail":"Público."},{"method":"POST","path":"/api/visit","auth":"none","summary":"O aviso da tela que soma uma visita ao dia. Agentes não precisam chamar.","grupo":"Operação","desc":"A tela manda o aviso no primeiro gesto de quem usa (toque, tecla ou clique), uma vez por página. Teste não conta: `X-MM-Smoke`, User-Agent `mm-smoke` ou `smoke: true` no corpo voltam com `counted: false`. Só o aviso da própria página conta: a chamada de fora de uma página do mesmo site (User-Agent de robô, ou sem `Sec-Fetch-Site: same-origin`) volta com `counted: false` e `reason: \"robo\"`.","corpo":{"p":{"tipo":"string","desc":"O caminho da página visitada."},"smoke":{"tipo":"bool","desc":"`true` marca o pedido como teste, e ele 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://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 — e `compras`, quem pagou nos últimos 30 dias.","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?, compras? }","url":"https://pontofato.com/api/metrics","auth_detail":"Público."},{"method":"GET","path":"/api/credito/x402/saude","auth":"none","exemplo":"curl -s $ORIGIN/api/credito/x402/saude","grupo":"Crédito","summary":"Saúde do verificador x402: pendências, falta de hash e falha ou parada da conciliação.","retorno":{"verificado_em":{"tipo":"string","desc":"Hora da leitura, em UTC."},"ativo":{"tipo":"boolean","desc":"Verificador configurado no processo."},"tarefas":{"tipo":"object[]","desc":"Falhas com id e motivo, sem dados do pagador. Contagem limitada indica +."}},"erros":{"503":"Verificador indisponível neste processo."},"returns":"{ verificado_em, ativo, tarefas }","url":"https://pontofato.com/api/credito/x402/saude","auth_detail":"Público."},{"method":"GET","path":"/api/credito/barrados/saude","auth":"none","exemplo":"curl -s $ORIGIN/api/credito/barrados/saude","grupo":"Crédito","summary":"Quem pagou e foi barrado neste site nas últimas 24 horas: a casa pediu pagamento a quem tinha saldo ou plano, ou cobrou e não entregou.","retorno":{"verificado_em":{"tipo":"string","desc":"Hora da leitura, em UTC."},"ativo":{"tipo":"boolean","desc":"A leitura funcionou."},"total":{"tipo":"int","desc":"Quantas ocorrências diferentes houve."},"tarefas":{"tipo":"object[]","desc":"Até 8 ocorrências, com classe, rota, vezes e última hora, sem dados de quem pagou."}},"returns":"{ verificado_em, ativo, total, tarefas }","url":"https://pontofato.com/api/credito/barrados/saude","auth_detail":"Público."},{"method":"GET","path":"/api/credito/conta","auth":"credito","exemplo":"curl -s $ORIGIN/api/credito/conta -H 'Cookie: <sessão>'","grupo":"Crédito","summary":"O saldo da conta da sessão: a soma das compras dela neste ambiente, em todo produto, sem precisar do código. Com movimentos=1, o extrato da conta.","query":{"movimentos":{"tipo":"string","desc":"`1`: consulta só o extrato paginado da conta, sem saldo."},"de":{"tipo":"string","desc":"Início inclusivo em UTC ISO 8601 com milissegundos. Padrão: 1970-01-01T00:00:00.000Z."},"ate":{"tipo":"string","desc":"Fim exclusivo em UTC ISO 8601 com milissegundos. Padrão: agora. Conserve o valor entre páginas."},"antes":{"tipo":"string","desc":"Cursor `proximo` da página anterior. Só com movimentos=1."},"limite":{"tipo":"int","desc":"1 a 50 movimentos por página; padrão 20. Só com movimentos=1."}},"retorno":{"saldo_micros":{"tipo":"int","desc":"O saldo em milionésimos de dólar."},"saldo_usd":{"tipo":"string","desc":"O saldo em dólar, formatado."},"referencia_usd":{"tipo":"string","desc":"O saldo logo depois da última recarga, somado nas carteiras com saldo: a base do que resta."},"cotacao_brl_por_usd":{"tipo":"number","desc":"A cotação do real que a tela usa para mostrar o saldo."},"movimentos":{"tipo":"object[]","desc":"Só com movimentos=1: id, em, valor_usd, saldo_usd, motivo, produto e recurso, do mais novo."},"proximo":{"tipo":"string","desc":"Só com movimentos=1: cursor da próxima página ou null."}},"erros":{"400":"Período, limite ou cursor inválido.","401":"Sem sessão."},"returns":"{ saldo_micros, saldo_usd, referencia_usd, cotacao_brl_por_usd, movimentos, proximo }","url":"https://pontofato.com/api/credito/conta","auth_detail":"Token de crédito em `Authorization: Bearer cred_…` (ou `X-Credito`). Para saldo recuperado de x402, use a credencial de carteira `mmw_…` em Bearer ou `X-Wallet-Token`, emitida por `/api/auth/wallet/agent/start` e `/api/auth/wallet/agent/token`."},{"method":"POST","path":"/api/credito/conta","auth":"credito","exemplo":"curl -s -XPOST $ORIGIN/api/credito/conta -H 'Authorization: Bearer cred_…' -H 'Cookie: <sessão>'","grupo":"Crédito","summary":"Liga à conta da sessão o crédito comprado sem conta, inclusive em USDC, com o plano de consultas pago por ele. Depois disso, o saldo vale nos produtos do crédito da casa com `X-Credito: conta`, somado ao das outras compras da conta.","retorno":{"ok":{"tipo":"boolean","desc":"A ligação foi conferida."},"ligadas":{"tipo":"int","desc":"Compras ligadas agora. Zero quando a compra já tem conta."},"da_conta":{"tipo":"boolean","desc":"O saldo deste código já vem no saldo da conta."}},"erros":{"401":"Sem sessão ou sem o código de crédito."},"returns":"{ ok, ligadas, da_conta }","url":"https://pontofato.com/api/credito/conta","auth_detail":"Token de crédito em `Authorization: Bearer cred_…` (ou `X-Credito`). Para saldo recuperado de x402, use a credencial de carteira `mmw_…` em Bearer ou `X-Wallet-Token`, emitida por `/api/auth/wallet/agent/start` e `/api/auth/wallet/agent/token`."},{"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","preco_usd_faixa":[0.1,25],"query":{"usd":{"tipo":"number","desc":"Pacote: 0.1, 1, 5, 10 ou 25 dólares.","obrigatorio":true,"enum":[0.1,1,5,10,25]}},"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."},"usar_com_outra_credencial":{"tipo":"string","desc":"O header `X-Credito`, para quando o `Authorization` já leva outra credencial."},"saldo_em":{"tipo":"string","desc":"Onde consultar saldo e extrato."},"onde_gastar":{"tipo":"object","desc":"`precos`: as ações pagas e os preços deste produto (`/api/pricing`); `produtos`: o APIs.json com os outros produtos da casa."}},"erros":{"400":"Pacote fora da lista (0.1, 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, usar_com_outra_credencial, saldo_em, onde_gastar }","url":"https://pontofato.com/api/credito","auth_detail":"Público."},{"method":"GET","path":"/api/credito","auth":"credito","summary":"Saldo e extrato com cred_…; com mmw_…, saldo da carteira e até 20 pagamentos em recuperação.","desc":"Sem token, responde 401 e aponta o manifesto x402 no cabeçalho Link. Com a cobrança configurada, o corpo inclui accepts[] com os mesmos termos da menor recarga por POST. O GET não cobra nem abre crédito.","grupo":"Crédito","query":{"movimentos":{"tipo":"string","desc":"`1`: consulta só o histórico paginado, sem saldo."},"de":{"tipo":"string","desc":"Início inclusivo em UTC ISO 8601 com milissegundos. Padrão: 1970-01-01T00:00:00.000Z."},"ate":{"tipo":"string","desc":"Fim exclusivo em UTC ISO 8601 com milissegundos. Padrão: agora. Conserve o valor entre páginas."},"antes":{"tipo":"string","desc":"Cursor `proximo` da página anterior. Só com movimentos=1."},"limite":{"tipo":"int","desc":"1 a 50 movimentos por página; padrão 20. Só com movimentos=1."}},"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."},"wallet":{"tipo":"string","desc":"Só com mmw_…: endereço autenticado da carteira."},"payments":{"tipo":"object[]","desc":"Só com mmw_…: até 20 pagamentos, com id, produto, rede, tx_hash, micros, estado e criado_ms. creditado indica saldo recuperado."},"proximo":{"tipo":"string|null","desc":"Só com movimentos=1: cursor da próxima página ou null; movimentos inclui id, em, valor_usd, saldo_usd, motivo, produto e recurso."},"onde_gastar":{"tipo":"object","desc":"`precos`: as ações pagas e os preços deste produto; `produtos`: o APIs.json com os outros produtos da casa."}},"erros":{"400":"Período, limite ou cursor inválido.","401":"Sem token ou token desconhecido."},"exemplo":"curl -s $ORIGIN/api/credito -H 'Authorization: Bearer cred_…'","returns":"{ saldo_micros, saldo_usd, criado_em, movimentos, wallet, payments, proximo, onde_gastar }","url":"https://pontofato.com/api/credito","auth_detail":"Token de crédito em `Authorization: Bearer cred_…` (ou `X-Credito`). Para saldo recuperado de x402, use a credencial de carteira `mmw_…` em Bearer ou `X-Wallet-Token`, emitida por `/api/auth/wallet/agent/start` e `/api/auth/wallet/agent/token`."},{"method":"GET","path":"/api/credito/pix","auth":"none","summary":"Crédito por Pix: a chave, o câmbio fixo, os pacotes em reais e o que o comprovante aceita.","grupo":"Crédito","retorno":{"chave":{"tipo":"string","desc":"A chave Pix que recebe o pagamento."},"brl_por_usd":{"tipo":"number","desc":"Câmbio fixo usado nos pacotes."},"pacotes":{"tipo":"object[]","desc":"Os pacotes (3, 5, 10 ou 25 dólares), cada um com `brl_centavos` e `copia_e_cola` (o Pix copia e cola do valor, o mesmo texto do QR: o app do banco já vem com o valor)."},"comprovante":{"tipo":"object","desc":"Tipos aceitos (foto ou PDF) e o tamanho máximo, em bytes."},"liberacao":{"tipo":"string","desc":"`manual`: o dono confere o Pix e libera."}},"exemplo":"curl -s $ORIGIN/api/credito/pix","returns":"{ chave, brl_por_usd, pacotes, comprovante, liberacao }","url":"https://pontofato.com/api/credito/pix","auth_detail":"Público."},{"method":"POST","path":"/api/credito/pix","auth":"none","summary":"Pede crédito pago por Pix: multipart com `usd`, `comprovante` (foto ou PDF até 2 MB) e `email`; o resto é opcional.","desc":"O código de crédito sai na resposta e passa a valer quando o dono confere o Pix e libera (manual, em geral no mesmo dia). O `email` é obrigatório: é por ele que o dono fala com a pessoa. Opcionais: `nome`, `pagina` (a página de onde pediu, até 2.000 caracteres) e o que a pessoa comprava quando recebeu o 402 — `recurso` (até 2.000), `descricao` (até 300) e `preco_usd` (decimal, ex. `0.50`); e `navegador_id` (UUID que liga os pedidos do mesmo navegador). Tudo o que chega fica registrado no pedido — o comprovante inclusive —, com a conta logada (conferida pelo cookie da sessão), a rede e o navegador de quem pediu.","grupo":"Crédito","retorno":{"id":{"tipo":"string","desc":"Id do pedido, para acompanhar."},"estado":{"tipo":"string","desc":"`pendente` até a decisão."},"credito":{"tipo":"string","desc":"O token `cred_…`, mostrado UMA vez; vale depois da liberação."},"estado_em":{"tipo":"string","desc":"Onde acompanhar o pedido."}},"erros":{"400":"Pacote fora da lista (3, 5, 10 ou 25), sem comprovante ou sem e-mail válido.","413":"Comprovante acima de 2 MB.","415":"Comprovante que não é foto (JPEG, PNG, WebP) nem PDF.","429":"A rede já mandou os pedidos do dia.","502":"O e-mail ao dono não saiu: o pedido fica registrado como `falhou`; mande de novo.","503":"Fila de conferência cheia, ou Pix indisponível neste app."},"exemplo":"curl -s -XPOST $ORIGIN/api/credito/pix -F usd=5 -F email=voce@empresa.com.br -F comprovante=@pix.pdf","returns":"{ id, estado, credito, estado_em }","url":"https://pontofato.com/api/credito/pix","auth_detail":"Público."},{"method":"GET","path":"/api/credito/pix/:id","auth":"none","summary":"Estado de um pedido de crédito por Pix: `pendente`, `liberado`, `recusado` ou `falhou`.","grupo":"Crédito","params":{"id":{"desc":"Id do pedido (32 hex).","exemplo":"0123456789abcdef0123456789abcdef"}},"retorno":{"estado":{"tipo":"string","desc":"`pendente`, `liberado`, `recusado` ou `falhou` (o e-mail ao dono não saiu; mande de novo)."},"usd":{"tipo":"int","desc":"O pacote pedido."},"decidido_em":{"tipo":"string","desc":"Quando o dono decidiu, ou `null`."}},"erros":{"404":"Pedido desconhecido."},"exemplo":"curl -s $ORIGIN/api/credito/pix/0123456789abcdef0123456789abcdef","returns":"{ estado, usd, decidido_em }","url":"https://pontofato.com/api/credito/pix/:id","auth_detail":"Público."},{"method":"POST","path":"/api/credito/asaas/:id/cancelar","auth":"none","grupo":"Crédito","summary":"Cancela uma cobrança pendente ao fechar o pagamento.","desc":"Exige o bilhete `cancelamento` devolvido na criação. Uma cobrança antiga de crédito aceita seu token em `credito`. Só atua no produto e ambiente de origem. Não estorna pagamentos nem remove o histórico. 202 indica cancelamento em andamento; a vigia retoma falhas externas.","params":{"id":{"desc":"Id da cobrança (32 hex).","exemplo":"0123456789abcdef0123456789abcdef"}},"retorno":{"id":{"tipo":"string","desc":"Id da cobrança."},"estado":{"tipo":"string","desc":"`cancelando`, `vencido` ou o estado final já confirmado."}},"erros":{"404":"Cobrança ou bilhete inválido, produto ou ambiente diferente."},"exemplo":"curl -s -XPOST $ORIGIN/api/credito/asaas/0123456789abcdef0123456789abcdef/cancelar -H 'content-type: application/json' -d '{\"cancelamento\":\"<bilhete>\"}'","returns":"{ id, estado }","url":"https://pontofato.com/api/credito/asaas/:id/cancelar","auth_detail":"Público."},{"method":"GET","path":"/api/credito/asaas","auth":"none","summary":"Pix automático: se está disponível neste app, os pacotes em reais e o saldo que o produto vende.","grupo":"Crédito","retorno":{"disponivel":{"tipo":"boolean","desc":"`false` quando o app não tem o Asaas configurado (use o Pix com comprovante)."},"pacotes":{"tipo":"object[]","desc":"Os pacotes de crédito (3, 5, 10 ou 25 dólares), com `brl_centavos`."},"exatos":{"tipo":"object[]","desc":"Preços declarados pelo app, com `usd` e `brl_centavos`. Só aparecem a partir de R$ 5,00 e até R$ 10.000."},"saldo":{"tipo":"object","desc":"Quando o produto vende saldo em reais: a faixa e se a conta logada pode comprar."},"precisa_documento":{"tipo":"boolean","desc":"Se o CPF ou CNPJ de quem paga ainda é pedido."}},"exemplo":"curl -s $ORIGIN/api/credito/asaas","returns":"{ disponivel, pacotes, exatos, saldo, precisa_documento }","url":"https://pontofato.com/api/credito/asaas","auth_detail":"Público."},{"method":"POST","path":"/api/credito/asaas","auth":"none","summary":"Gera um Pix dinâmico: JSON com `oferta` (`pacote` com `usd`, ou `saldo` com `centavos`) e o pagador.","desc":"O pagamento libera sozinho o que se comprou: o pacote vira o token `cred_…` que já vem na resposta; o saldo cai na organização da conta logada. Na primeira compra vão `documento` (CPF ou CNPJ, que segue para o gateway e não fica guardado aqui) e `nome`; `email`, `pagina` e `navegador_id` são opcionais e ficam registrados. Com `forma: \"cartao_boleto\"`, a cobrança é livre: a resposta traz `pagamento_em`, a página do gateway onde se paga com cartão, boleto ou Pix (vence em três dias). Com `forma: \"cartao\"` e o `cartao` (`titular`, `numero`, `mes`, `ano`, `cvv`, `documento`, `email`, `cep`, `numero_endereco`, `telefone`), a cobrança é paga no cartão no mesmo pedido: 200 com `estado: \"pago\"`, 202 com `conferir` enquanto o emissor analisa, 422 quando o cartão é recusado; o cartão não fica guardado. O `usd` deve ser um valor de `pacotes` ou `exatos` do GET. O servidor define os centavos e recusa valores não declarados.","grupo":"Crédito","retorno":{"id":{"tipo":"string","desc":"Id da cobrança, para acompanhar."},"credito":{"tipo":"string","desc":"No pacote: o token `cred_…`, mostrado UMA vez; vale quando o pagamento cair."},"forma":{"tipo":"string","desc":"`pix` (o padrão), `cartao` ou `cartao_boleto`."},"pix":{"tipo":"object","desc":"`copia_e_cola`, `imagem` (QR em PNG, data URI) e `expira_em`; só na forma `pix`."},"pagamento_em":{"tipo":"string","desc":"Na forma `cartao_boleto`: a página de pagamento do gateway."},"estado":{"tipo":"string","desc":"Na forma `cartao`: `pago`, ou `pendente` com `conferir`."},"estado_em":{"tipo":"string","desc":"Onde acompanhar o pagamento."},"cancelamento":{"tipo":"string","desc":"Bilhete para cancelar a cobrança pendente de Pix ou boleto."}},"erros":{"400":"Crédito fora de `pacotes` e `exatos`, valor fora da faixa, CPF/CNPJ, nome ou e-mail inválido, dado do cartão inválido (`cartao_dados`, com o `campo`), ou o gateway recusou o pagador (`pagador_recusado`, com a razão em `detalhe`).","422":"Cartão recusado (`cartao_recusado`, com o `campo` quando o gateway diz qual); troque em `POST /api/credito/asaas/:id/cartao`.","429":"Limite de 3 tentativas por minuto ou 10 por dia, por conta ou rede, ou limite do cartão.","502":"O gateway não gerou o Pix; tente de novo.","503":"Pix automático indisponível neste app, o gateway ocupado (`asaas_ocupado`, espere `retry_after_s`), ou cobranças demais de quem não entrou esperando pagamento."},"exemplo":"curl -s -XPOST $ORIGIN/api/credito/asaas -H 'content-type: application/json' -d '{\"oferta\":\"pacote\",\"usd\":5,\"documento\":\"000.000.000-00\",\"nome\":\"Ana\"}'","returns":"{ id, credito, forma, pix, pagamento_em, estado, estado_em, cancelamento }","url":"https://pontofato.com/api/credito/asaas","auth_detail":"Público."},{"method":"GET","path":"/api/credito/asaas/:id","auth":"none","summary":"Estado de uma cobrança Pix automática: `pendente`, `pago`, `vencido`, `estornado` ou `falhou`.","grupo":"Crédito","params":{"id":{"desc":"Id da cobrança (32 hex).","exemplo":"0123456789abcdef0123456789abcdef"}},"retorno":{"estado":{"tipo":"string","desc":"`pago` libera o token do pacote ou o saldo; o Pix pago depois do vencimento vale."},"pago_em":{"tipo":"string","desc":"Quando o pagamento foi confirmado, ou `null`."}},"erros":{"404":"Cobrança desconhecida."},"exemplo":"curl -s $ORIGIN/api/credito/asaas/0123456789abcdef0123456789abcdef","returns":"{ estado, pago_em }","url":"https://pontofato.com/api/credito/asaas/:id","auth_detail":"Público."},{"method":"POST","path":"/api/credito/asaas/:id/cartao","auth":"none","summary":"Paga com outro cartão a cobrança de cartão cujo cartão foi recusado: a mesma cobrança, sem cobrar duas vezes.","desc":"JSON com o `cartao` (os mesmos campos do `POST /api/credito/asaas`) e, sem conta, o `navegador_id` que criou a cobrança. Só a cobrança de cartão que espera pagamento, de quem a criou, e até cinco tentativas por cobrança.","grupo":"Crédito","params":{"id":{"desc":"Id da cobrança (32 hex).","exemplo":"0123456789abcdef0123456789abcdef"}},"retorno":{"estado":{"tipo":"string","desc":"`pago`, ou `pendente` com `conferir` enquanto o emissor analisa."},"estado_em":{"tipo":"string","desc":"Onde acompanhar o pagamento."}},"erros":{"400":"Dado do cartão inválido (`cartao_dados`, com o `campo`).","404":"Cobrança desconhecida, de outra pessoa ou que não é de cartão.","409":"A cobrança já venceu ou foi encerrada; comece o pagamento de novo.","422":"Cartão recusado (`cartao_recusado`).","429":"Passou das tentativas de cartão desta cobrança ou do dia."},"exemplo":"curl -s -XPOST $ORIGIN/api/credito/asaas/0123456789abcdef0123456789abcdef/cartao -H 'content-type: application/json' -d '{\"cartao\":{…}}'","returns":"{ estado, estado_em }","url":"https://pontofato.com/api/credito/asaas/:id/cartao","auth_detail":"Público."},{"method":"GET","path":"/api/credito/asaas/saude","auth":"none","summary":"A saúde do Pix e das assinaturas ativas deste app: falhas com motivo, para o painel.","grupo":"Crédito","retorno":{"ativo":{"tipo":"boolean","desc":"`false` quando o Asaas e as assinaturas estão desligados."},"tarefas":{"tipo":"object[]","desc":"Cada problema: `id`, `falhando` e `motivo`. Inclui Pix e, quando ativas, recuperação, fila e orçamento das assinaturas. Não consulta o provedor."}},"exemplo":"curl -s $ORIGIN/api/credito/asaas/saude","returns":"{ ativo, tarefas }","url":"https://pontofato.com/api/credito/asaas/saude","auth_detail":"Público."},{"method":"GET","path":"/api/consulta/cadastro/:cnpj","auth":"none","grupo":"Consulta de CNPJ, sanções e endereço","summary":"Ficha cadastral gratuita: nome, situação, atividade e endereço.","desc":"Não consome franquia nem saldo. Não revela contatos ou sócios e não executa análise adicional. Mantém o limite de proteção da origem. Para sanções, situação fiscal e CNIA ao vivo, peça explicitamente /api/consulta/cnpj/:cnpj.","params":{"cnpj":{"desc":"CNPJ com ou sem pontuação.","exemplo":"66300125000145"}},"retorno":"ConsultaCadastro","erros":{"400":"CNPJ ou CEP inválido.","404":"Registro não encontrado.","429":"Limite de proteção da origem. Aguarde o Retry-After, sem cobrança.","503":"Fonte indisponível. Tente novamente, sem cobrança."},"exemplo":"curl -s '$ORIGIN/api/consulta/cadastro/66300125000145'","returns":"{ consulta, escopo, cnpj, empresa }","url":"https://pontofato.com/api/consulta/cadastro/:cnpj","auth_detail":"Público."},{"method":"GET","path":"/api/consulta/endereco/:cep","auth":"none","grupo":"Consulta de CNPJ, sanções e endereço","summary":"Endereços e empresas de um CEP, sem consumir franquia nem saldo.","desc":"Até 20 endereços e 20 empresas. pontos_total informa o total; escopo=cadastro. Sem uso nem _links. Mantém o limite de proteção da origem.","params":{"cep":{"desc":"CEP com ou sem hífen.","exemplo":"71915000"}},"retorno":"ConsultaEndereco","erros":{"400":"CNPJ ou CEP inválido.","404":"Registro não encontrado.","429":"Limite de proteção da origem. Aguarde o Retry-After, sem cobrança.","503":"Fonte indisponível. Tente novamente, sem cobrança."},"exemplo":"curl -s '$ORIGIN/api/consulta/endereco/71915000'","returns":"{ consulta, escopo, cep, endereco, pontos, pontos_total, empresas{itens,mais}, fonte }","url":"https://pontofato.com/api/consulta/endereco/:cep","auth_detail":"Público."},{"method":"GET","path":"/api/consulta/cep/:cep","auth":"none","grupo":"Consulta de CNPJ, sanções e endereço","summary":"Consulta um endereço pelo CEP, grátis: os endereços com coordenada (CNEFE/IBGE) e as empresas registradas nele.","desc":"O nome antigo de `GET /api/consulta/endereco/:cep`, com o mesmo resultado: não consome franquia nem saldo. Devolve até 20 endereços e até 20 empresas; o total de endereços vem em `pontos_total`.","params":{"cep":{"desc":"CEP com ou sem hífen.","exemplo":"01310100"}},"retorno":"ConsultaEndereco","erros":{"400":"CNPJ ou CEP inválido.","404":"Registro não encontrado.","429":"Limite de proteção da origem. Aguarde o Retry-After, sem cobrança.","503":"Fonte indisponível. Tente novamente, sem cobrança."},"exemplo":"curl -s '$ORIGIN/api/consulta/cep/01310100'","returns":"{ consulta, escopo, cep, endereco, pontos, pontos_total, empresas{itens,mais}, fonte }","url":"https://pontofato.com/api/consulta/cep/:cep","auth_detail":"Público."},{"method":"GET","path":"/api/consulta/sugerir","auth":"none","grupo":"Consulta de CNPJ, sanções e endereço","summary":"Sugere empresas por CNPJ, nome, sócio, telefone ou e-mail, sem seletor.","desc":"Até 8 empresas, ordenadas por correspondência. Não consome consultas nem revela contatos. Incompleto indica que uma das fontes não respondeu.","query":{"q":{"tipo":"string","obrigatorio":true,"desc":"Nome com 3 a 120 caracteres, CNPJ, telefone com DDD ou e-mail completo.","exemplo":"wrp consultoria"}},"retorno":{"ok":{"tipo":"bool","desc":"Verdadeiro quando ao menos uma fonte respondeu."},"incompleto":{"tipo":"bool","desc":"Verdadeiro quando alguma fonte de sugestão falhou."},"results":{"tipo":"object[]","desc":"Até 8 empresas sem repetição: cnpj, label e correspondencia. A busca textual pode incluir razaoSocial, municipio, bairro, uf, situacao, situacaoEspecial e perto. Sem contatos ou nomes pessoais."}},"erros":{"400":"Termo incompleto ou inválido.","429":"Limite da origem.","503":"Busca indisponível."},"exemplo":"curl -s '$ORIGIN/api/consulta/sugerir?q=wrp%20consultoria'","returns":"{ ok, incompleto, results }","url":"https://pontofato.com/api/consulta/sugerir","auth_detail":"Público."},{"method":"GET","path":"/api/consulta","auth":"none","grupo":"Consulta de CNPJ, sanções e endereço","summary":"O serviço de consulta de CNPJ e endereço: a franquia grátis de hoje, o pacote avulso, os três planos e o seu saldo.","desc":"Sem credencial mostra a franquia e as ofertas. Com conta, crédito (`X-Credito`) ou carteira x402 (`X-Wallet-Token`), mostra também o saldo compartilhado entre Radar CNPJ, PontoFato e EditalMD. A credencial da carteira é emitida separadamente em cada portal.","query":{"lingua":{"tipo":"string","desc":"Língua das mensagens: `pt` ou `en` (padrão: a do navegador, senão inglês).","valores":["pt","en"]}},"headers":{"X-Wallet-Token":{"tipo":"string","obrigatorio":false,"desc":"Credencial mmw_… deste portal, obtida pela assinatura da carteira em /api/auth/wallet/agent/start e /api/auth/wallet/agent/token. Autoriza o uso do saldo da carteira x402."}},"retorno":"ConsultaServico","erros":{"401":"Credencial apresentada e recusada.","503":"Serviço de conta ou de saldo fora do ar."},"exemplo":"curl -s '$ORIGIN/api/consulta?lingua=pt'","returns":"{ servico, nome, descricao, gratis{por_dia,restantes_hoje,renova_em?}, ofertas[{id,tipo,nome,consultas,dias,renovacao_automatica,preco_usd,preco_brl,disponivel,compra}], lote, saldo{dono,consultas,planos}, como_comprar, _links }","url":"https://pontofato.com/api/consulta","auth_detail":"Público."},{"method":"GET","path":"/api/consulta/cnpj/:cnpj","auth":"none","grupo":"Consulta de CNPJ, sanções e endereço","summary":"Consulta adicional de CNPJ: registros públicos preparados e opção de exigir conferência do CNIA durante o pedido.","desc":"Use cnia_atual=true para exigir consultar a fonte do CNIA neste pedido. Se falhar, retorna 503 sem cobrança e sem recorrer ao resultado anterior. Sem essa exigência, pode vir o CNIA guardado; confira conferidoEm. As outras bases conservam suas datas. A consulta usa a franquia diária disponível e depois o saldo ou a cotação por chamada. CNPJ ausente, fonte indisponível ou limite da origem não são cobrados. Os dados pessoais ficam mascarados. As sanções são agregadas pela raiz do CNPJ.","params":{"cnpj":{"desc":"CNPJ com ou sem pontuação (14 caracteres).","exemplo":"00000000000191"}},"query":{"lingua":{"tipo":"string","desc":"Língua das mensagens: `pt` ou `en` (padrão: a do navegador, senão inglês).","valores":["pt","en"]},"temas":{"tipo":"string","desc":"Temas separados por vírgula (até 240 caracteres): dados, contagens, socios, sancoes, fiscal, divida, obras, trabalho, ibama, contratos, pep, vendas, campanhas, prefeituras, sicaf, aeronaves, fundos, rntrc, bndes, registros; todos. Sem o parâmetro, mantém a ficha completa. O cadastro básico sempre vem; sócios só com socios. contagens acrescenta ao cadastro o objeto contagens, só com os números da ficha: socios, pep, sancoes, fiscal, socioambiental, governo e registros. Campos não solicitados são omitidos; null significa fonte não conferida. SICAF, aeronaves e RNTRC recortam registros por órgão; registros inclui todos os órgãos. Não muda preço, limites nem máscara de dados pessoais.","exemplo":"sicaf,contratos,bndes"},"cnia_atual":{"tipo":"bool","desc":"true exige consultar o CNIA durante este pedido. Se a fonte falhar, retorna 503 sem cobrar e sem usar o registro anterior. Padrão false. Com temas, inclua sancoes.","padrao":false}},"headers":{"Idempotency-Key":{"tipo":"string","obrigatorio":false,"desc":"Chave da tentativa (até 80 caracteres). A mesma empresa, no mesmo dia de Brasília e com o mesmo titular, não desconta o saldo de novo, com ou sem esta chave."},"X-Wallet-Token":{"tipo":"string","obrigatorio":false,"desc":"Credencial mmw_… deste portal, obtida pela assinatura da carteira em /api/auth/wallet/agent/start e /api/auth/wallet/agent/token. Autoriza o uso do saldo da carteira x402."}},"retorno":"ConsultaCnpj","erros":{"400":"CNPJ inválido, temas_invalidos ou cnia_atual_invalido (nada é cobrado).","401":"Credencial apresentada e recusada: sessão encerrada ou chave de API inválida.","402":"Franquia grátis do dia e saldo esgotados: `error` (`franquia_esgotada` ou `saldo_esgotado`), `message`, `gratis` (com `renova_em`) e `ofertas[]` com a URL de compra, na forma de `GET /api/consulta`. No portal que vende a chamada avulsa, também `accepts` (x402) e `por_chamada` (`preco_usd`, `como`): repita a chamada com a prova x402 ou com `Authorization: Bearer cred_…`, sem conta nem pacote; só se cobra o que a origem entregou.","404":"Não existe na base (a consulta não é cobrada).","429":"Consultas demais neste minuto; respeite o Retry-After (a consulta não é cobrada).","503":"Fonte dos dados ou serviço de saldo fora do ar; cnia_indisponivel quando o CNIA exigido não respondeu. A consulta não é cobrada."},"exemplo":"curl -s '$ORIGIN/api/consulta/cnpj/00000000000191?lingua=pt'","returns":"{ consulta, temas?, cnpj, empresa, sancoes?{total,vigentes,porCadastro,itens,mais,conferidoEm,cadastros}, cnia?{situacao,registros,conferidoEm,cnpjs,certidoes?,link}, dividaAtiva?{inscricoes,valor,valorCorresponsavel,ajuizadas,maisAntiga,porNatureza,porSituacao,maiores,mais,referencia,conferidoEm,fonte}, parcelamentos?{quantidade,saldo,itens,referencia,conferidoEm,fonte}, regimeTributario?{atual,anos,referencia,conferidoEm,fonte}, beneficiosFiscais?{itens,mais,importacao,referencia,conferidoEm,fonte}, obras?{quantidade,ativas,anteriores,destinacoes,itens,mais,referencia,conferidoEm,fonte}, devedorContumaz?{consta,itens,lista,referencia,conferidoEm,fonte}, ambiental?{autos,embargos}, trabalhoEscravo?{consta,itens,referencia,conferidoEm,fonte}, governo?{quantidade,valor,ultimos12Meses,orgaos,itens,mais,referencia,conferidoEm,fonte}, pagamentos?{valor,quantidade,desde,ultimo,orgaos,referencia,fonte}, notasFederais?{valor,notas,desde,ate,compradores,anos,referencia,fonte}, contratosFederais?{quantidade,valor,desde,orgaos,itens,mais,referencia,fonte}, campanhas?{quantidade,valor,anos,partidos,itens,mais,referencia,fonte}, municipiosSp?{pago,empenhado,municipios,desde,anos,orgaos,elementos,modalidades,referencia,fonte}, pep?{quantidade,pessoas,referencia,conferidoEm,fonte}, registros?{itens,fontes}, bndes?{contratos,ativos,valorContratado,valorDesembolsado,itens,mais,referencia,fonte}, fundos?{proprio,fundos,patrimonio,papeis,itens,mais,referencia,fonte}, ponto?{lat,lon,precisao,logradouro,numero,bairro,cidade,uf,cep,fonte}, uso{via,restantes?,preco_usd?,repetido?,saldo_usd?}, _links }","preco_usd":0.01,"url":"https://pontofato.com/api/consulta/cnpj/:cnpj","auth_detail":"Público."},{"method":"POST","path":"/api/consulta/planos/:oferta","auth":"none","grupo":"Consulta de CNPJ, sanções e endereço","summary":"Compra o pacote avulso ou um dos três planos, com crédito ou x402, inclusive sem conta.","desc":"Sem pagamento, retorna 402 com o preço em dólar e reais. O corpo usa x402 v1; PAYMENT-REQUIRED usa v2. Com conta ou crédito, o saldo fica com esse titular. Sem identificação, fica com a carteira confirmada pelo pagamento x402. Para usar esse saldo, assine o desafio da carteira e obtenha a credencial mmw_… nas URLs wallet_start e wallet_token da resposta. O pagamento não concede login nem acesso à conta vinculada. Plano soma 30 dias e a quota; pacote vale 90 dias. Sem renovação automática.","params":{"oferta":{"desc":"A oferta: `pacote`, `basico`, `profissional` ou `empresa`.","exemplo":"basico"}},"query":{"lingua":{"tipo":"string","desc":"Língua das mensagens: `pt` ou `en` (padrão: a do navegador, senão inglês).","valores":["pt","en"]},"compra":{"tipo":"string","desc":"Marca desta compra (8 a 64 caracteres `A-Za-z0-9_-`): no crédito, repetir com a mesma marca não cobra de novo. No x402, não assine outro pagamento para repetir a mesma compra."}},"headers":{"X-Credito":{"tipo":"string","obrigatorio":false,"desc":"Token do crédito pré-pago (`cred_…`) que paga a compra."},"X-Api-Key":{"tipo":"string","obrigatorio":false,"desc":"Chave de API da conta (`mmk_…`): o plano fica com a conta."},"X-PAYMENT":{"tipo":"string","obrigatorio":false,"desc":"Pagamento x402 assinado, a partir da cotação do 402."},"PAYMENT-SIGNATURE":{"tipo":"string","obrigatorio":false,"desc":"Pagamento x402 v2. Use apenas um header de pagamento."},"X-Wallet-Token":{"tipo":"string","obrigatorio":false,"desc":"Credencial mmw_… deste portal, obtida pela assinatura da carteira em /api/auth/wallet/agent/start e /api/auth/wallet/agent/token. Autoriza o uso do saldo da carteira x402."}},"retorno":"ConsultaCompra","erros":{"400":"Pagamento malformado, versão desconhecida ou oferta diferente da cotada.","401":"Credencial apresentada e recusada. Sem credencial, a compra segue pelo x402.","402":"Pagamento necessário: o preço, o crédito e o x402.","404":"Oferta desconhecida.","409":"Cobrança desligada nesta oferta: nada foi cobrado nem criado.","503":"Oferta sem preço configurado ou pagamento fora do ar."},"exemplo":"curl -s -X POST '$ORIGIN/api/consulta/planos/basico?compra=minha-compra-01' -H \"X-Credito: $CREDITO\"","returns":"{ comprado, nome, consultas, valido_ate, saldo, via, cobranca, recibo, message, _links }","url":"https://pontofato.com/api/consulta/planos/:oferta","auth_detail":"Público."},{"auth":"credito","method":"GET","path":"/api/x402/cnpj/:cnpj","grupo":"Consulta de CNPJ, sanções e endereço","summary":"Consulta de CNPJ paga por chamada, sem conta: a ficha da Receita, as sanções, a situação fiscal e o endereço no mapa.","desc":"A mesma ficha de `GET /api/consulta/cnpj/:cnpj`, para agentes: sem conta, sem franquia e sem pacote. O pedido sem pagamento recebe o 402; o pago recebe a ficha na mesma resposta, com o pagamento em `uso`. A consulta que falha ou não acha a empresa não é cobrada.","params":{"cnpj":{"desc":"CNPJ com ou sem pontuação (14 caracteres).","exemplo":"00000000000191"}},"query":{"temas":{"tipo":"string","desc":"Temas separados por vírgula (até 240 caracteres): dados, contagens, socios, sancoes, fiscal, divida, obras, trabalho, ibama, contratos, pep, vendas, campanhas, prefeituras, sicaf, aeronaves, fundos, rntrc, bndes, registros; todos. Sem o parâmetro, mantém a ficha completa. O cadastro básico sempre vem; sócios só com socios. contagens acrescenta ao cadastro o objeto contagens, só com os números da ficha: socios, pep, sancoes, fiscal, socioambiental, governo e registros. Campos não solicitados são omitidos; null significa fonte não conferida. SICAF, aeronaves e RNTRC recortam registros por órgão; registros inclui todos os órgãos. Não muda preço, limites nem máscara de dados pessoais.","exemplo":"sicaf,contratos,bndes"},"cnia_atual":{"tipo":"bool","desc":"true exige consultar o CNIA durante este pedido. Se a fonte falhar, retorna 503 sem cobrar e sem usar o registro anterior. Padrão false. Com temas, inclua sancoes.","padrao":false}},"retorno":"ConsultaCnpj","exemploRetorno":{"consulta":"cnpj","cnpj":"00.000.000/0001-91","empresa":{"cnpj":"00000000000191","cnpjFormatted":"00.000.000/0001-91","razaoSocial":"BANCO DO BRASIL SA","nomeFantasia":"DIRECAO GERAL","matrizFilial":{"codigo":1,"label":"Matriz"},"situacao":{"codigo":2,"label":"Ativa","data":"2005-11-03T00:00:00.000Z","motivo":"SEM MOTIVO"},"dataInicio":"1966-08-01T00:00:00.000Z","naturezaJuridica":{"codigo":2038,"descricao":"Sociedade de Economia Mista"},"capitalSocial":120000000000,"porte":{"codigo":5,"label":"Demais"},"cnae":{"codigo":6422100,"descricao":"Bancos múltiplos, com carteira comercial"},"endereco":{"tipoLogradouro":"QUADRA","logradouro":"SAUN QUADRA 5 BLOCO B TORRE I, II, III","numero":"SN","bairro":"ASA NORTE","cep":"70040912","municipio":"BRASILIA","uf":"DF"}},"sancoes":{"total":0,"vigentes":0,"itens":[],"mais":false},"dividaAtiva":{"inscricoes":384,"valor":509755673.88,"ajuizadas":147,"maisAntiga":"1993-08-01","referencia":"2026-09","conferidoEm":"2026-10-22","fonte":"PGFN — dados abertos da dívida ativa da União"},"governo":{"quantidade":3419,"valor":4532067534.33,"referencia":"2026-10-23","conferidoEm":"2026-10-24","fonte":"PNCP — Portal Nacional de Contratações Públicas"}},"erros":{"400":"CNPJ inválido (nada é cobrado).","401":"Chave recusada (`invalid_api_key`), token OAuth recusado (`invalid_token`), crédito recusado (`credito_invalido`), crédito de teste fora do dev (`credito_simulado`) ou recuperação sem autenticação da carteira (`wallet_proof_required`). A primeira compra x402 não exige conta.","402":"Sem pagamento: `accepts` (x402, USDC na Base) com o preço desta chamada, no mínimo US$ 0,01; `credito.preco_desta_chamada`, o preço menor com o crédito pré-pago; e `pacotes` (as recargas de crédito e quantas chamadas cada uma paga). Com o crédito sem saldo, `saldo_insuficiente`.","404":"Não existe na base (a consulta não é cobrada).","409":"Pagamento em processamento, pedido diferente do original ou valor já recuperado no saldo. Não assine outra autorização para repetir a compra.","410":"O prazo de 24 horas para recuperar a resposta acabou. O registro financeiro permanece; repetir a prova não cobra outra vez.","429":"Consultas demais neste minuto; respeite o Retry-After (a consulta não é cobrada).","503":"Fonte dos dados ou serviço de saldo fora do ar; cnia_indisponivel se a conferência exigida falhar. A consulta não é cobrada."},"exemplo":"curl -s -i '$ORIGIN/api/x402/cnpj/00000000000191'","headers":{"authorization":{"tipo":"string","obrigatorio":false,"desc":"`Bearer mmk_…` (chave de API) ou `Bearer mmo_…` (OAuth): a chamada paga usa o saldo da conta, sem outro cabeçalho. Sem conta, `Bearer cred_…` usa o crédito comprado em `POST /api/credito`."},"x-api-key":{"tipo":"string","obrigatorio":false,"desc":"A chave de API `mmk_…` deste produto. Identifica a conta e autoriza usar o saldo na chamada paga."},"payment-signature":{"tipo":"string","obrigatorio":false,"desc":"A prova x402 assinada (base64): `PAYMENT-SIGNATURE` (v2) ou `X-PAYMENT` (v1)."},"x-wallet-token":{"tipo":"string","obrigatorio":false,"desc":"Para recuperar uma resposta x402 por até 24 horas, repita o mesmo pedido e a mesma prova. Envie aqui a credencial `mmw_…` da carteira pagadora, emitida por `/api/auth/wallet/agent/start` e `/api/auth/wallet/agent/token`. Não há nova cobrança."}},"returns":"{ consulta, temas?, cnpj, empresa, sancoes?{total,vigentes,porCadastro,itens,mais,conferidoEm,cadastros}, cnia?{situacao,registros,conferidoEm,cnpjs,certidoes?,link}, dividaAtiva?{inscricoes,valor,valorCorresponsavel,ajuizadas,maisAntiga,porNatureza,porSituacao,maiores,mais,referencia,conferidoEm,fonte}, parcelamentos?{quantidade,saldo,itens,referencia,conferidoEm,fonte}, regimeTributario?{atual,anos,referencia,conferidoEm,fonte}, beneficiosFiscais?{itens,mais,importacao,referencia,conferidoEm,fonte}, obras?{quantidade,ativas,anteriores,destinacoes,itens,mais,referencia,conferidoEm,fonte}, devedorContumaz?{consta,itens,lista,referencia,conferidoEm,fonte}, ambiental?{autos,embargos}, trabalhoEscravo?{consta,itens,referencia,conferidoEm,fonte}, governo?{quantidade,valor,ultimos12Meses,orgaos,itens,mais,referencia,conferidoEm,fonte}, pagamentos?{valor,quantidade,desde,ultimo,orgaos,referencia,fonte}, notasFederais?{valor,notas,desde,ate,compradores,anos,referencia,fonte}, contratosFederais?{quantidade,valor,desde,orgaos,itens,mais,referencia,fonte}, campanhas?{quantidade,valor,anos,partidos,itens,mais,referencia,fonte}, municipiosSp?{pago,empenhado,municipios,desde,anos,orgaos,elementos,modalidades,referencia,fonte}, pep?{quantidade,pessoas,referencia,conferidoEm,fonte}, registros?{itens,fontes}, bndes?{contratos,ativos,valorContratado,valorDesembolsado,itens,mais,referencia,fonte}, fundos?{proprio,fundos,patrimonio,papeis,itens,mais,referencia,fonte}, ponto?{lat,lon,precisao,logradouro,numero,bairro,cidade,uf,cep,fonte}, uso{via,restantes?,preco_usd?,repetido?,saldo_usd?}, _links }","preco_usd":0.01,"url":"https://pontofato.com/api/x402/cnpj/:cnpj","auth_detail":"Token de crédito em `Authorization: Bearer cred_…` (ou `X-Credito`). Para saldo recuperado de x402, use a credencial de carteira `mmw_…` em Bearer ou `X-Wallet-Token`, emitida por `/api/auth/wallet/agent/start` e `/api/auth/wallet/agent/token`."},{"method":"POST","path":"/api/realtime/ticket","auth":"session","summary":"Cria um bilhete curto do canal ao vivo da tela: o estado da assinatura e do pagamento chega sem recarregar.","grupo":"Conta","desc":"A tela do PontoFato chama com a sessão da conta. Integração de servidor usa as rotas HTTP. O bilhete é opaco, vale pouco tempo e não dá mais acesso que o dono atual.","corpo":{},"body":{},"retorno":{"ticket":{"tipo":"string","desc":"Credencial opaca e curta do WebSocket do PontoFato."},"expires_in":{"tipo":"int","desc":"Segundos até o bilhete sem uso vencer."},"namespace":{"tipo":"string","desc":"Namespace Socket.IO do PontoFato."},"path":{"tipo":"string","desc":"Caminho do transporte WebSocket, na mesma origem."},"routes":{"tipo":"object[]","desc":"Rotas ao vivo autorizadas para este dono."}},"erros":{"401":"A sessão da conta terminou.","403":"O pedido não veio da origem da tela do PontoFato.","429":"A entrada no canal ao vivo está cheia agora.","503":"O transporte ao vivo está fora do ar."},"exemplo":"await fetch(\"$ORIGIN/api/realtime/ticket\",{method:\"POST\",headers:{\"content-type\":\"application/json\",\"x-mm-realtime\":\"1\",\"x-csrf-token\":csrf},body:\"{}\"}).then(r=>r.json());","exemploLinguagem":"js","returns":"{ ticket, expires_in, namespace, path, routes }","url":"https://pontofato.com/api/realtime/ticket","auth_detail":"Sessão global em cookie HttpOnly do produto; escritas exigem Origin exato e X-CSRF-Token."},{"method":"GET","path":"/api/sugerir","auth":"none","grupo":"Lugar","summary":"Sugestões de CEP parcial ou nome de rua, com bairro e cidade.","desc":"Até oito lugares. CEP aceita prefixo de 3 a 8 dígitos, com hífen opcional após o quinto. Rua usa UF e cidade opcionais. Um endereço representa cada CEP; a consulta completa traz os demais. Referência CNEFE 2022, sem certificar CEP postal vigente.","query":{"q":{"tipo":"string","desc":"CEP parcial ou rua, de 3 a 160 caracteres.","obrigatorio":true,"exemplo":"71915"},"uf":{"tipo":"string","desc":"Sigla da UF para restringir a busca por rua."},"cidade":{"tipo":"string","desc":"Município para restringir a busca por rua."}},"retorno":"SugestoesDeLugares","erros":{"400":"Termo curto, longo ou prefixo de CEP inválido.","503":"Sugestões indisponíveis."},"exemplo":"curl -s '$ORIGIN/api/sugerir?q=71915'","returns":"{ items[{tipo,cep8,cep,logradouro,bairro,cidade,uf}], incompleto }","url":"https://pontofato.com/api/sugerir","auth_detail":"Público."},{"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,prepaid_credit,instructions,generate_pass,client,guide,workflow,evaluation}, enabled?, id?, status?, granted_credits?, expires_at?, receipt?, via?, message? }","url":"https://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$0.10, valid for 30 days.","preco_usd":0.1,"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. With prepaid credit, you can skip this purchase: send X-Credito (or Authorization: Bearer cred_…) on the data read, and after the free allowance the origin buys these packages from the credit, one at a time.","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,prepaid_credit,instructions,generate_pass,client,guide,workflow,evaluation}, enabled?, id?, status?, granted_credits?, expires_at?, receipt?, via?, message? }","url":"https://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?,charged_now?,trial?}, pricing, billing, api_index }","url":"https://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?,charged_now?,trial?}, pricing, billing, api_index, payment{provider,mode,network,chain_id,pay_to,homolog,dev,dev_gate,alternavel,gratis?,cobrados?,facilitator,asset,asset_address,faucet,wallets}, credit{url,header} }","url":"https://pontofato.com/api/billing","auth_detail":"Público."}],"quota":{"free":[{"o_que":"análise adicional e integração medida (`GET /api/consulta/cnpj/:cnpj`); a pesquisa, a ficha básica em `/cadastro/:cnpj` e o CEP em `/endereco/:cep` são grátis e não consomem esta franquia","limite":"10 por dia, por conta (sem conta, por rede), somadas nos portais; depois, o saldo do plano ou do pacote (válido em todos os portais)","janela":null},{"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":"10 chamadas por dia, por conta (sem conta, por rede)","janela":null}],"paid":[{"o_que":"consulta de um CNPJ (`GET /api/consulta/cnpj/:cnpj`), paga na própria chamada por x402 ou crédito pré-pago, sem conta nem pacote, depois da franquia; este é o preço do x402, e o crédito pré-pago paga US$ 0.0046","price_usd":0.01},{"o_que":"consulta de CNPJ e endereço, Pacote avulso: 200 consultas por 90 dias, sem renovação automática (`POST /api/consulta/planos/pacote`)","price_usd":0.91},{"o_que":"consulta de CNPJ e endereço, Básico: 1000 consultas por 30 dias, sem renovação automática (`POST /api/consulta/planos/basico`)","price_usd":3.62},{"o_que":"consulta de CNPJ e endereço, Profissional: 5000 consultas por 30 dias, sem renovação automática (`POST /api/consulta/planos/profissional`)","price_usd":10.9},{"o_que":"consulta de CNPJ e endereço, Empresa: 20000 consultas por 30 dias, sem renovação automática (`POST /api/consulta/planos/empresa`)","price_usd":36.35},{"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":0.1},{"o_que":"vizinhança por raio, além da cota","price_usd":0.05},{"o_que":"GET /api/x402/cnpj/:cnpj — Consulta de CNPJ paga por chamada, sem conta: a ficha da Receita, as sanções, a situação fiscal e o endereço no mapa.","price_usd":0.01}],"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 `PAYMENT-SIGNATURE` (v2) ou `X-PAYMENT` (v1), ou mande `Authorization: Bearer cred_…`.","live":"https://pontofato.com/api/"},"mcp":{"endpoint":"https://pontofato.com/mcp","transport":"streamable-http","tools":15},"mcp_tools":["api_index","health","cep","proximo","buscar","unidades","empresas","raio","vizinhanca","contact","sugerir","api_access","api_access_buy","pricing","get_api_x402_cnpj_by_cnpj"],"quickstart":["curl -s https://pontofato.com/api/health","curl -s https://pontofato.com/api/cep/70040010","curl -s 'https://pontofato.com/api/proximo?lat=-15.7897&lon=-47.8793'","curl -s 'https://pontofato.com/api/raio?cep=01310100&raio=800'","curl -s 'https://pontofato.com/api/vizinhanca?cep=01310100&raio=800&cnae=56'"]}