{"openapi":"3.1.0","info":{"title":"Rota Nacional","version":"947a0bf3","description":"API de IA com barreira de privacidade, compatível com a OpenAI e a Anthropic. Índice: GET /api/."},"x-service-info":{"categories":["ai","privacy","llm-gateway"],"docs":{"homepage":"https://ai.exponencialadm.net/","apiReference":"https://ai.exponencialadm.net/developers","llms":"https://ai.exponencialadm.net/llms.txt"}},"servers":[{"url":"https://ai.exponencialadm.net"}],"components":{"securitySchemes":{"tokenDoJob":{"type":"apiKey","in":"query","name":"token","description":"The job token in the 202 URLs of a call paid by x402 without an API key."},"creditoCasa":{"type":"http","scheme":"bearer","bearerFormat":"cred_…","description":"Prepaid credit token in `Authorization: Bearer cred_…` (or the `X-Credito` header). Not an account: it is a bearer of balance."},"x402":{"type":"apiKey","in":"header","name":"X-PAYMENT","description":"x402 payment per call (USDC on Base). Call without it to get the 402 with `accepts`; sign the authorization and repeat with the base64 payment in X-PAYMENT."},"globalAccount":{"type":"apiKey","in":"cookie","name":"__Host-mm-auth","description":"Global session in the product's HttpOnly cookie; writes require exact Origin and X-CSRF-Token."},"contaChaveApi":{"type":"http","scheme":"bearer","bearerFormat":"mmk_…","description":"Account API key: `Authorization: Bearer mmk_…` or `X-Api-Key: mmk_…`. Created on the account page (API keys), valid only in the product where it was created; it acts as the account (or the organization that owns it)."},"carteiraAgente":{"type":"http","scheme":"bearer","bearerFormat":"mmw_…","description":"Wallet credential of an agent without an account (`Authorization: Bearer mmw_…`, 30 days, this product only): POST /api/auth/wallet/agent/start, sign the message with the wallet, POST /api/auth/wallet/agent/token. The owner is `x402:<address>`."}},"schemas":{"PaymentQuota":{"type":"object","properties":{"free":{"type":"array","items":{"$ref":"#/components/schemas/PaymentFree"},"description":"Free allowances and their windows."},"paid":{"type":"array","items":{"$ref":"#/components/schemas/PaymentPrice"},"description":"List prices in USD. The operation's 402 is the payable quote."},"how_to_pay":{"type":"string","description":"Payment instructions and availability restrictions."},"live":{"type":"string","description":"Authoritative product quota endpoint.","nullable":true},"free_now":{"type":"array","items":{"type":"string"},"description":"SKUs temporarily free despite their list price."},"charged_now":{"type":"array","items":{"type":"string"},"description":"SKUs charged at their list price even when free_now has `*`."},"trial":{"allOf":[{"$ref":"#/components/schemas/PaymentTrial"}],"description":"Registration trial, when offered."}},"required":["free","paid","how_to_pay","live"]},"PaymentFree":{"type":"object","properties":{"o_que":{"type":"string","description":"Operation or allowance."},"limite":{"type":"string","description":"Allowance and eligibility."},"janela":{"type":"string","description":"Reset window, when applicable.","nullable":true}},"required":["o_que","limite","janela"]},"PaymentPrice":{"type":"object","properties":{"o_que":{"type":"string","description":"Operation and billing unit."},"price_usd":{"type":"number","description":"Current list price in USD."}},"required":["o_que","price_usd"]},"PaymentTrial":{"type":"object","properties":{"days":{"type":"integer","description":"Trial duration in days."},"how":{"type":"string","description":"Eligibility and activation steps."}},"required":["days","how"]},"PaymentX402":{"type":"object","properties":{"provider":{"type":"string","description":"Always `x402` — the only billing protocol accepted."},"mode":{"type":"string","description":"Seller mode: `live` charges for real, `dev` lets calls through unpaid."},"network":{"type":"string","description":"USDC network: `base` in production, `base-sepolia` in staging."},"chain_id":{"type":"integer","description":"EVM chain ID of the network above, so the wallet signs on the right chain."},"pay_to":{"type":"string","description":"Address that receives the payment.","nullable":true},"homolog":{"type":"boolean","description":"Staging seam on: the loop can be closed without spending USDC."},"dev":{"type":"boolean","description":"Development mode: the 402 is simulated."},"dev_gate":{"type":"boolean","description":"A homologation credential is configured; this grants no access."},"alternavel":{"type":"boolean","description":"Dev only: a request with `X-MM-Pagamento: real` pays for real instead of in test mode."},"gratis":{"type":"array","items":{"type":"string"},"description":"Temporarily free SKUs."},"cobrados":{"type":"array","items":{"type":"string"},"description":"SKUs charged even when `gratis` has `*`."},"facilitator":{"type":"string","description":"URL of the facilitator that verifies and settles the payment."},"asset":{"type":"string","description":"Accepted currency — always `USDC`."},"asset_address":{"type":"string","description":"USDC contract on the network above."},"faucet":{"type":"string","description":"Test-USDC faucet; only on base-sepolia.","nullable":true},"wallets":{"type":"object","description":"Links to wallets that speak x402 (metamask, coinbase, base_app)."}},"required":["provider","mode","network","chain_id","pay_to","homolog","dev","dev_gate","alternavel","facilitator","asset","asset_address","faucet","wallets"],"description":"x402 payment configuration in force. Comes from `planPublic` and is the same across the products."},"PaymentCredit":{"type":"object","properties":{"url":{"type":"string","description":"POST to purchase credit; GET with X-Credito to inspect its balance."},"header":{"type":"string","description":"Header for a previously issued credit token: X-Credito."}},"required":["url","header"]}}},"paths":{"/api/auth/bootstrap":{"get":{"operationId":"get_api_auth_bootstrap","summary":"Prepara o navegador para entrar na conta global.","description":"Define cookie HttpOnly restrito ao host. CSRF vinculado à sessão atual. Sem CORS.\nDevolve: { csrf, context }","security":[],"responses":{"200":{"description":"{ csrf, context }","content":{"application/json":{"schema":{"type":"object","properties":{"csrf":{"type":"string","description":"X-CSRF-Token"},"context":{"type":"string","description":"Opaque view context, also in X-MM-Context; not a credential / contexto opaco da vista, não é credencial."}},"required":["csrf","context"]}}}},"400":{"description":"invalid_request"},"403":{"description":"invalid_origin / invalid_csrf"},"503":{"description":"auth_unavailable: a sessão anterior é preservada / the previous session is preserved"}}}},"/api/account/profile":{"get":{"operationId":"get_api_account_profile","summary":"Consulta seu perfil global.","description":"Lê preferências atuais da conta. Altere-as na página da conta; produtos não mantêm perfil autoritativo separado.\nDevolve: {profile:{name,locale,timeZone,theme,revision}}","security":[{"globalAccount":[]}],"responses":{"200":{"description":"{profile:{name,locale,timeZone,theme,revision}}"},"401":{"description":"invalid_session"},"503":{"description":"auth_unavailable"}}}},"/api/account/avatar":{"get":{"operationId":"get_api_account_avatar","summary":"Consulta sua foto de perfil global.","description":"WebP privado de até 64 KiB, sem cache. Altere-o na conta. Não aceita ID de usuário ou URL de objeto.\nDevolve: image/webp; Cache-Control: no-store","security":[{"globalAccount":[]}],"responses":{"200":{"description":"image/webp; Cache-Control: no-store","content":{"image/webp":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"invalid_session"},"404":{"description":"not_found: no photo / sem foto"},"503":{"description":"auth_unavailable"}}}},"/api/me":{"get":{"operationId":"get_api_me","summary":"Lê a conta global atual neste produto.","description":"A SDK do produto também retorna profile e administration. administration contém {href} para o dono configurado da plataforma; nos demais casos, null. O servidor deriva esse campo da conta autenticada.\nDevolve: {user:{identityId,sessionId,productId,audience,authTime,methods,mfaState}}","security":[{"globalAccount":[]}],"responses":{"200":{"description":"{user:{identityId,sessionId,productId,audience,authTime,methods,mfaState}}"},"401":{"description":"invalid_session"},"503":{"description":"auth_unavailable"}}}},"/api/auth/logout":{"post":{"operationId":"post_api_auth_logout","summary":"Revoga esta sessão do produto.","description":"Exige bootstrap/CSRF deste navegador e sessão. As sessões de outros produtos permanecem ativas.\nDevolve: { ok }","security":[{"globalAccount":[]}],"responses":{"200":{"description":"{ ok }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"true"}},"required":["ok"]}}}},"400":{"description":"invalid_request"},"403":{"description":"invalid_origin / invalid_csrf"},"503":{"description":"auth_unavailable: a sessão anterior é preservada / the previous session is preserved"}}}},"/api/account/keys":{"get":{"operationId":"get_api_account_keys","summary":"Lista suas chaves de API neste produto.","description":"Nunca devolve a chave: nome, 4 últimos caracteres, organização, criação, último uso (por hora) e se ainda vale.\nDevolve: { keys }","security":[{"globalAccount":[]}],"responses":{"200":{"description":"{ keys }","content":{"application/json":{"schema":{"type":"object","properties":{"keys":{"type":"array","items":{"type":"object"},"description":"`id`, `name`, `organizationId`, `last4`, `createdAt`, `lastUsedAt`, `revokedAt`, `active` (false quando revogada ou parada por troca de senha / encerrar todos os acessos)."}},"required":["keys"]}}}},"401":{"description":"invalid_session"},"503":{"description":"auth_unavailable"}}}},"/api/account/keys/create":{"post":{"operationId":"post_api_account_keys_create","summary":"Cria uma chave de API para agentes e scripts.","description":"Exige entrada nos últimos 5 minutos; a de organização também exige segundo fator na sessão e o papel de dona/administradora com o produto ligado. No máximo 10 chaves vivas por conta e produto. A chave (`secret`) volta UMA vez.\nDevolve: { key, secret }","security":[{"globalAccount":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Até 60 caracteres."},"organizationId":{"type":["string","null"],"description":"`null` para chave da conta."}},"required":["name","organizationId"]},"example":{"name":"agent","organizationId":null}}}},"responses":{"200":{"description":"{ key, secret }","content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"object","description":"`id`, `name`, `organizationId`, `last4`, `createdAt`."},"secret":{"type":"string","description":"`mmk_…`, mostrada uma vez."}},"required":["key","secret"]}}}},"400":{"description":"invalid_key_name / invalid_organization"},"401":{"description":"invalid_session / reauth_required"},"403":{"description":"invalid_origin / invalid_csrf / organization_forbidden / organization_mfa_required"},"409":{"description":"key_limit_reached"},"503":{"description":"auth_unavailable"}}}},"/api/account/keys/revoke":{"post":{"operationId":"post_api_account_keys_revoke","summary":"Revoga uma das suas chaves de API.","description":"Para a chave na hora. Repetir não faz mal.\nDevolve: { ok }","security":[{"globalAccount":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"O `id` da chave."}},"required":["id"]},"example":{"id":"…"}}}},"responses":{"200":{"description":"{ ok }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"true"}},"required":["ok"]}}}},"400":{"description":"invalid_key_id"},"401":{"description":"invalid_session"},"403":{"description":"invalid_origin / invalid_csrf"},"404":{"description":"key_not_found"},"503":{"description":"auth_unavailable"}}}},"/api/auth/wallet/agent/start":{"post":{"operationId":"post_api_auth_wallet_agent_start","summary":"Começa a credencial de carteira do agente sem conta.","description":"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. Assine com personal_sign e envie a /api/auth/wallet/agent/token.\nDevolve: { message, issuedAt, expiresIn }","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","description":"0x…, a carteira (EOA ou contrato na Base)"}},"required":["address"]},"example":{"address":"0x2c7536E3605D9C16a7a3D7b1898e529396a65c23"}}}},"responses":{"200":{"description":"{ message, issuedAt, expiresIn }","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"EIP-4361"},"issuedAt":{"type":"number","description":"segundos / seconds"},"expiresIn":{"type":"number","description":"300"}},"required":["message","issuedAt","expiresIn"]}}}},"400":{"description":"invalid_wallet_address"},"503":{"description":"auth_unavailable"}}}},"/api/auth/wallet/agent/token":{"post":{"operationId":"post_api_auth_wallet_agent_token","summary":"Recebe a credencial da carteira (mmw_…) deste produto.","description":"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.\nDevolve: { token, owner, expiresAt }","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","description":"0x…, a mesma carteira do start / the same wallet as in start"},"issuedAt":{"type":"number","description":"o issuedAt do start / start's issuedAt"},"signature":{"type":"string","description":"personal_sign (0x…)"}},"required":["address","issuedAt","signature"]},"example":{"address":"0x2c7536E3605D9C16a7a3D7b1898e529396a65c23","issuedAt":1791400000,"signature":"0x…"}}}},"responses":{"200":{"description":"{ token, owner, expiresAt }","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","description":"mmw_…"},"owner":{"type":"string","description":"x402:0x…"},"expiresAt":{"type":"number","description":"segundos / seconds"}},"required":["token","owner","expiresAt"]}}}},"400":{"description":"invalid_body"},"401":{"description":"invalid_wallet"},"429":{"description":"wallet_limited"},"503":{"description":"wallet_unavailable / auth_unavailable"}}}},"/api/auth/claim/wallets":{"post":{"operationId":"post_api_auth_claim_wallets","summary":"Passa para a conta o que as carteiras dela fizeram sem conta.","description":"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.\nDevolve: { carteiras, direitos }","security":[{"globalAccount":[]}],"responses":{"200":{"description":"{ carteiras, direitos }","content":{"application/json":{"schema":{"type":"object","properties":{"carteiras":{"type":"number","description":"wallets"},"direitos":{"type":"number","description":"rights moved"}},"required":["carteiras","direitos"]}}}},"401":{"description":"invalid_session"},"503":{"description":"auth_unavailable"}}}},"/api/":{"get":{"operationId":"api_index","summary":"Índice auto-descrito: cada rota, o que cobra e como plugar o MCP.","description":"Devolve: { name, description, build, base_url, docs, endpoints, mcp_tools }","security":[],"responses":{"200":{"description":"{ name, description, build, base_url, docs, endpoints, mcp_tools }","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Nome do produto."},"description":{"type":"string","description":"O que o produto faz."},"build":{"type":"string","description":"Commit publicado."},"base_url":{"type":"string","description":"Origem em que esta API está servindo."},"docs":{"type":"object","description":"Links para llms.txt, OpenAPI, MCP e a UI."},"endpoints":{"type":"array","items":{"type":"object"},"description":"Catálogo de endpoints."},"mcp_tools":{"type":"array","items":{"type":"string"},"description":"Tools do MCP."}},"required":["name","description","build","base_url","docs","endpoints","mcp_tools"]}}}}}}},"/api/health":{"get":{"operationId":"get_api_health","summary":"Se o serviço responde, e o build no ar.","description":"Devolve: { ok, service, build, request_id }","security":[],"responses":{"200":{"description":"{ ok, service, build, request_id }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"Sempre `true` quando o processo responde."},"service":{"type":"string","description":"O serviço: `rota-nacional`."},"build":{"type":"string","description":"O commit no ar."},"request_id":{"type":"string","description":"O id deste pedido, para o suporte."}},"required":["ok","service","build","request_id"]}}}}}}},"/mcp":{"post":{"operationId":"post_mcp","summary":"MCP Streamable HTTP — as tools deste catálogo, despachadas neste mesmo Worker.","description":"Devolve: JSON-RPC 2.0 (`initialize`, `tools/list`, `tools/call`).","security":[],"responses":{"200":{"description":"JSON-RPC 2.0 (`initialize`, `tools/list`, `tools/call`)."}}}},"/api/erro-cliente":{"post":{"operationId":"post_api_erro_cliente","summary":"Relato de erro do navegador, enviado pela própria interface. Agente não precisa chamar.","description":"A interface relata sozinha erro de JS, promessa rejeitada, script/CSS que não carregou e bloqueio de CSP — uma vez por sessão — e o app relata falha tratada por `window.mmErro.relata`. O servidor valida o envelope, redige credencial, e-mail e telefone, junta repetições da mesma falha por minuto e registra um evento operacional; nada é gravado em banco. Não guarda IP, cookie, query nem o User-Agent inteiro. Responde 204 sempre, inclusive para relato inválido.\nDevolve: 204 sem corpo, sempre — relato inválido, repetido ou acima do teto também recebe 204.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Código da falha, `UI-` + letras/dígitos (`UI-JS-001` erro global, `UI-PROMESSA-001`, `UI-RECURSO-001`, `UI-CSP-001`, `UI-APP-001` relato do app)."},"phase":{"type":"string","description":"Fase em que quebrou, minúsculas: `global`, `promessa`, `script`, `carregar_lista`…"},"path":{"type":"string","description":"Caminho da página aberta, sem query; número, hash e token no caminho são guardados como `:id`."},"message":{"type":"string","description":"Mensagem do erro, até 2000 caracteres."},"stack":{"type":"string","description":"Stack trace, até 12000 caracteres."},"source":{"type":"string","description":"Script de origem; só o caminho é guardado."},"line":{"type":"integer","description":"Linha no script de origem."},"column":{"type":"integer","description":"Coluna no script de origem."},"visivel":{"type":"boolean","description":"Se a aba estava visível quando quebrou."},"build":{"type":"string","description":"Build da página que relatou (a `<meta name=\"build\">`), até 64 letras, dígitos, `.`, `_` ou `-`; é ele que data a falha."}},"required":["code","phase"]},"example":{"code":"UI-APP-001","phase":"carregar_lista","path":"/","message":"lista 500"}}}},"responses":{"200":{"description":"204 sem corpo, sempre — relato inválido, repetido ou acima do teto também recebe 204."}}}},"/api/pagamento/aberto":{"post":{"operationId":"post_api_pagamento_aberto","summary":"A interface relata que exibiu uma cobrança. Agentes não devem chamar.","description":"Relato sem corpo, da mesma origem, enviado automaticamente quando uma cobrança fica visível. Não inicia pagamento, não concede acesso e não recebe identidade ou credencial. Não grava banco por relato. Conta eventos, não pessoas únicas. O painel privado do operador separa pedidos de pagamento da API e aberturas da interface por dia UTC; os dois números podem se sobrepor.\nDevolve: 202 sem corpo se aceito; 204 se ignorado. Sempre no-store.","security":[],"parameters":[{"name":"Origin","in":"header","required":true,"schema":{"type":"string"},"description":"A origem da página, idêntica à desta rota."},{"name":"Sec-Fetch-Site","in":"header","required":true,"schema":{"type":"string"},"description":"`same-origin`, definido pelo navegador."},{"name":"X-MM-Payment-View","in":"header","required":true,"schema":{"type":"string"},"description":"`1`, definido pelo componente comum."}],"responses":{"202":{"description":"202 sem corpo se aceito; 204 se ignorado. Sempre no-store."}}}},"/api/funil":{"post":{"operationId":"post_api_funil","summary":"A interface relata os passos da visita (funil de conversão). Agentes não devem chamar.","description":"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.\nDevolve: 202 sem corpo se guardado; 204 se ignorado. Sempre no-store.","security":[],"parameters":[{"name":"Origin","in":"header","required":false,"schema":{"type":"string"},"description":"A origem da página, idêntica à desta rota."},{"name":"Content-Type","in":"header","required":true,"schema":{"type":"string"},"description":"`application/json` ou `text/plain`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"v":{"type":"number","description":"Versão do lote: `1`."},"vid":{"type":"string","description":"Id aleatório deste navegador (UUID v4)."},"sid":{"type":"string","description":"Id da sessão (30 min sem atividade encerram)."},"sn":{"type":"number","description":"Número da sessão deste navegador."},"pv":{"type":"string","description":"Id da página vista."},"e":{"type":"array","items":{"type":"object"},"description":"Até 40 eventos `{ t, n, p? }` do vocabulário do funil."}},"required":["v","vid","sid","sn","pv","e"]}}}},"responses":{"202":{"description":"202 sem corpo se guardado; 204 se ignorado. Sempre no-store."}}}},"/api/funil/arquivos":{"get":{"operationId":"get_api_funil_arquivos","summary":"Operador: os dias do diário do funil guardados neste app, com o tamanho de cada um.","description":"Devolve: { v, produto, teto, dias }","security":[],"parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>`."}],"responses":{"200":{"description":"{ v, produto, teto, dias }","content":{"application/json":{"schema":{"type":"object","properties":{"v":{"type":"number","description":"Versão do lote guardado."},"produto":{"type":"string","description":"O produto."},"teto":{"type":"object","description":"`bytesDia` e `dias` guardados."},"dias":{"type":"array","items":{"type":"object"},"description":"`{ dia, bytes }`, do mais velho ao de hoje."}},"required":["v","produto","teto","dias"]}}}},"401":{"description":"Unauthorized"},"503":{"description":"Not configured"}}}},"/api/funil/arquivo":{"get":{"operationId":"get_api_funil_arquivo","summary":"Operador: um pedaço de um dia do diário do funil, em NDJSON, a partir de um byte.","description":"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.\nDevolve: Linhas JSON, uma por lote guardado.","security":[],"parameters":[{"name":"dia","in":"query","required":true,"schema":{"type":"string"},"description":"O dia, `AAAA-MM-DD` (UTC)."},{"name":"desde","in":"query","required":false,"schema":{"type":"number"},"description":"O byte de onde ler; `0` no começo."},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>`."}],"responses":{"200":{"description":"Linhas JSON, uma por lote guardado."},"400":{"description":"Invalid parameters"},"401":{"description":"Unauthorized"},"503":{"description":"Not configured"}}}},"/api/funil/resumo":{"get":{"operationId":"get_api_funil_resumo","summary":"Operador: o resumo agregado do funil, calculado neste app. O diário não sai do servidor.","description":"Só contagens e listas agregadas: pessoas por etapa, valores, entradas, canais, países e aparelhos. Nenhuma sessão, navegador ou linha do diário sai. Traz as janelas de 1 e 7 dias UTC e os três dias do painel no fuso de Brasília. O app guarda 7 dias de diário.\nDevolve: { v, produto, fuso, desde, atualizado, janelas, dias }","security":[],"parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>`."}],"responses":{"200":{"description":"{ v, produto, fuso, desde, atualizado, janelas, dias }","content":{"application/json":{"schema":{"type":"object","properties":{"v":{"type":"number","description":"Versão do resumo: `1`."},"produto":{"type":"string","description":"O produto."},"fuso":{"type":"string","description":"O fuso dos dias do painel."},"desde":{"type":"string","description":"O dia mais antigo do diário (`AAAA-MM-DD`, UTC); vazio sem diário."},"atualizado":{"type":"string","description":"Quando o resumo foi calculado (ISO 8601)."},"janelas":{"type":"object","description":"`1d` e `7d`: a janela agregada, com `etapas`, `amostra`, `valores`, `qualidade` e as listas."},"dias":{"type":"array","items":{"type":"object"},"description":"Os três dias do painel: `{ day, from, to, janela, medicao }`."}},"required":["v","produto","fuso","desde","atualizado","janelas","dias"]}}}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Funnel summary failed"},"503":{"description":"Not configured"}}}},"/api/metrics":{"get":{"operationId":"get_api_metrics","summary":"Métricas dos últimos 7 dias para o painel do operador; com o token, inclui o financeiro.","description":"Sem credencial devolve o uso: os pedidos da API por dia (`usage.requests`), os jobs `rn.*` aceitos por dia (`usage.rn_job`) e o total de projetos (`accounts.tenants`). Com `METRICS_TOKEN` em Bearer acrescenta o financeiro do razão da casa.\nDevolve: { app, today, days, usage, accounts }","security":[],"parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>` para incluir o financeiro; token errado é 401."}],"responses":{"200":{"description":"{ app, today, days, usage, accounts }","content":{"application/json":{"schema":{"type":"object","properties":{"app":{"type":"string","description":"O nome do produto."},"today":{"type":"string","description":"O dia de hoje em UTC (AAAA-MM-DD)."},"days":{"type":"array","items":{"type":"object"},"description":"Os 7 dias, com as visitas de cada um."},"usage":{"type":"object","description":"`requests` (pedidos da API) e `rn_job` (jobs `rn.*` aceitos): o de hoje (`today`) e o de cada dia (`days`)."},"accounts":{"type":"object","description":"`tenants`: os projetos com conta no RN."}},"required":["app","today","days","usage","accounts"]}}}},"401":{"description":"Token de operador errado."},"503":{"description":"App sem METRICS_TOKEN configurado."}}}},"/api/visit":{"post":{"operationId":"post_api_visit","summary":"O aviso da tela que soma uma visita ao dia. Agentes não precisam chamar.","description":"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`.\nDevolve: { ok, counted, reason? }","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"p":{"type":"string","description":"O caminho da página visitada."},"smoke":{"type":"boolean","description":"`true` marca o pedido como teste, e ele não entra na conta."}}},"example":{"p":"/"}}}},"responses":{"200":{"description":"{ ok, counted, reason? }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"Sempre `true`."},"counted":{"type":"boolean","description":"Se a visita entrou na conta do dia."},"reason":{"type":"string","description":"Por que não contou, quando `counted` é `false`."}},"required":["ok","counted"]}}}}}}},"/api/vitrine":{"get":{"operationId":"get_api_vitrine","summary":"Os números públicos do produto: tráfego, agentes, uso e confiabilidade, sem dinheiro.","description":"Projeção publicada de hora em hora pelo coletor da casa, arredondada a dois dígitos significativos; `null` é medição ausente, nunca zero. Cache de 15 minutos com ETag (`If-None-Match` → 304). Não há como enviar números por esta rota: a publicação é do coletor, com token próprio.\nDevolve: { v, produto, publicado, atualizado_em, stale, nome?, desde?, fuso?, hoje?, dias?, janelas?, visitantes?, pessoas?, agentes?, superficies?, mcp?, uso?, contas?, confiabilidade?, catalogo?, apoio? }","security":[],"responses":{"200":{"description":"{ v, produto, publicado, atualizado_em, stale, nome?, desde?, fuso?, hoje?, dias?, janelas?, visitantes?, pessoas?, agentes?, superficies?, mcp?, uso?, contas?, confiabilidade?, catalogo?, apoio? }","content":{"application/json":{"schema":{"type":"object","properties":{"v":{"type":"integer","description":"Versão do contrato (1)."},"produto":{"type":"string","description":"Id do produto."},"publicado":{"type":"boolean","description":"`false` antes da primeira publicação do coletor; aí só estas cinco chaves vêm."},"atualizado_em":{"type":"string","description":"Quando o coletor publicou (ISO 8601).","nullable":true},"stale":{"type":"boolean","description":"`true` quando a projeção tem mais de 26 h."},"nome":{"type":"string","description":"Nome do produto."},"desde":{"type":"string","description":"Dia a partir do qual a série vale.","nullable":true},"fuso":{"type":"string","description":"Fuso dos dias (`UTC`)."},"hoje":{"type":"object","description":"O dia de hoje: páginas por classe (pessoa, IA, bot), chamadas de API por classe, leituras das superfícies de máquina e uso do produto."},"dias":{"type":"array","items":{"type":"object"},"description":"Até 31 dias, o mais antigo primeiro: `dia`, `paginas`, `api`, `api_ia`, `maquina`, `visitantes`, `uso`."},"janelas":{"type":"object","description":"Somas de 7 e 30 dias (`d7`, `d30`)."},"visitantes":{"type":"object","description":"Visitantes únicos na borda em 7 dias."},"pessoas":{"type":"object","description":"GA4 quando há: usuários, sessões, países, aparelhos e quem chegou de IA.","nullable":true},"agentes":{"type":"object","description":"Os agentes de IA e os bots que mais leem, 7 dias."},"superficies":{"type":"object","description":"Leituras de OKF, llms, well-known, OpenAPI e MCP em 7 dias."},"mcp":{"type":"object","description":"Chamadas MCP em 7 dias."},"uso":{"type":"object","description":"Uso real do produto por recurso: rótulo, hoje, 7 e 30 dias."},"contas":{"type":"object","description":"Usuários e convidados.","nullable":true},"confiabilidade":{"type":"object","description":"Percentual de pedidos sem 5xx em 7 dias e o build no ar."},"catalogo":{"type":"object","description":"Tamanho do acervo, quando o produto tem um.","nullable":true},"apoio":{"type":"object","description":"Impressões e cliques por patrocinador, quando houver."}},"required":["v","produto","publicado","atualizado_em","stale"]}}}}}}},"/api/vitrine/operador":{"get":{"operationId":"get_api_vitrine_operador","summary":"O documento completo do produto no painel do operador — só com o token do operador.","description":"Devolve: { produto, atualizado_em, operador }","security":[],"parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>` — a classe operador."}],"responses":{"200":{"description":"{ produto, atualizado_em, operador }","content":{"application/json":{"schema":{"type":"object","properties":{"produto":{"type":"string","description":"Id do produto."},"atualizado_em":{"type":"string","description":"Quando o coletor publicou.","nullable":true},"operador":{"type":"object","description":"O documento completo do coletor, com o que a projeção pública não carrega.","nullable":true}},"required":["produto","atualizado_em","operador"]}}}},"401":{"description":"Sem token, token errado ou token de outra classe."},"503":{"description":"Worker sem `METRICS_TOKEN` ou sem o control plane."}}}},"/api/vitrine/painel":{"get":{"operationId":"get_api_vitrine_painel","summary":"O painel da casa inteira, na forma que o gm lê — só com o token do operador.","description":"Devolve: { apps, updated?, totals? }","security":[],"parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>` — a classe operador."}],"responses":{"200":{"description":"{ apps, updated?, totals? }","content":{"application/json":{"schema":{"type":"object","properties":{"apps":{"type":"array","items":{"type":"object"},"description":"Um documento do operador por produto, em ordem de id."},"updated":{"type":"string","description":"Quando o coletor fechou a rodada."},"totals":{"type":"object","description":"Os totais da casa."}},"required":["apps"]}}}},"401":{"description":"Sem token, token errado ou token de outra classe."},"503":{"description":"Worker sem `METRICS_TOKEN` ou sem o control plane."}}}},"/api/vitrine/cursores":{"get":{"operationId":"get_api_vitrine_cursores","summary":"O cursor de erro resolvido por produto (`borda`, `cli`) — só com o token do operador.","description":"Devolve: JSON: `{ [produto]: { borda?: ISO, cli?: ISO } }`; vazio é `{}`.","security":[],"parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>` — a classe operador."}],"responses":{"200":{"description":"JSON: `{ [produto]: { borda?: ISO, cli?: ISO } }`; vazio é `{}`."},"401":{"description":"Sem token, token errado ou token de outra classe."},"503":{"description":"Worker sem `METRICS_TOKEN` ou sem o control plane."}}}},"/api/contact":{"post":{"operationId":"post_api_contact","summary":"Fale com quem faz o produto — de graça, para pessoa e agente.","description":"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.\nDevolve: { ok }","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Como chamar quem escreve (alias `nome`)."},"email":{"type":"string","description":"Para onde responder."},"message":{"type":"string","description":"O que você quer dizer (alias `mensagem`)."},"tipo":{"type":"string","description":"Proposta: `patrocinio`, `parceria` ou `anuncio`. Liga os campos abaixo."},"empresa":{"type":"string","description":"Quem propõe, quando é empresa."},"site":{"type":"string","description":"Site de quem propõe."},"orcamento":{"type":"string","description":"`ate_100`, `100_500`, `500_2000`, `2000_mais` ou `a_combinar`."},"espaco":{"type":"array","items":{"type":"string"},"description":"Ids de placement de `GET /api/partners`, até 6."},"duracao":{"type":"string","description":"Dias de exposição: `30`, `90` ou `365`."},"pagamento":{"type":"string","description":"`usdc`, `deposito` ou `a_combinar`."}},"required":["name","email","message"]},"example":{"name":"Agente","email":"agent@example.com","message":"olá, sou um agente"}}}},"responses":{"200":{"description":"{ ok }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"Sempre `true` quando a mensagem foi aceita."}},"required":["ok"]}}}},"400":{"description":"Validação: o `code` diz o campo."},"503":{"description":"O contato não está configurado neste servidor."}}}},"/api/partners":{"get":{"operationId":"get_api_partners","summary":"Parceria, patrocínio e anúncio: os espaços do produto com preço sugerido, os números públicos ao lado e como propor.","description":"Informação sob consulta, sem ativação: espaços do catálogo da casa com preço em USD por 30 dias (90 e 365 dias com desconto), patrocinadores em vigor, recorte de `/api/vitrine`, carteira da casa (USDC na Base) e o caminho de contato — depósito, PIX ou fatura são combinados na resposta. Cache de 1 hora.\nDevolve: { status, produto, idioma, titulo, descricao, publico, modalidades, placements, house_bundle, parcerias, current_sponsors, stats, payment, contact, politica, _links }","security":[],"responses":{"200":{"description":"{ status, produto, idioma, titulo, descricao, publico, modalidades, placements, house_bundle, parcerias, current_sponsors, stats, payment, contact, politica, _links }","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"`sob_consulta`: informação e proposta, sem ativação nem cobrança."},"produto":{"type":"string","description":"Nome do produto."},"idioma":{"type":"string","description":"Idioma dos textos (o do produto)."},"titulo":{"type":"string","description":"Título da oferta."},"descricao":{"type":"string","description":"Uma frase sobre a oferta."},"publico":{"type":"string","description":"Quem usa o produto — o público que o patrocinador alcança."},"modalidades":{"type":"array","items":{"type":"object"},"description":"`{ id, nome }`: patrocinio, parceria, anuncio."},"placements":{"type":"array","items":{"type":"object"},"description":"Os espaços do produto: `id`, `nome`, `onde`, `formato`, `exclusivo`, `medicao`, `price_usd_30d` (sugestão; `null` é sob consulta), `exposure[{ dias, price_usd }]` para 30, 90 e 365 dias, `disponivel`."},"house_bundle":{"type":"object","description":"O pacote da casa: rodapé e menção para agentes nos dez produtos, com desconto."},"parcerias":{"type":"array","items":{"type":"string"},"description":"Ideias de parceria que o produto aceita discutir."},"current_sponsors":{"type":"array","items":{"type":"object"},"description":"Patrocinadores em vigor: `id`, `nome`, `url`, `frase`, `espacos`, `ate`."},"stats":{"type":"object","description":"Recorte dos números públicos (`hoje`, `janelas`, `agentes`, `confiabilidade`) e o `link` para `/api/vitrine`; `publicado: false` antes da primeira publicação."},"payment":{"type":"object","description":"Como pagar: `rede`, `chain_id`, `ativo`, `pay_to`, `eip681` (a carteira da casa, quando declarada), `alternativas` e a `nota` — depósito, PIX ou fatura pela resposta."},"contact":{"type":"object","description":"`email`, `form_url`, `api_url` (`POST /api/contact`, 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":{"type":"object","description":"Rótulo do espaço, setores recusados, pagamento adiantado, prazos."},"_links":{"type":"object","description":"`self`, `stats`, `page` (`null` até a página existir), `contact`, `casa` (o mesmo caminho nos dez produtos)."}},"required":["status","produto","idioma","titulo","descricao","publico","modalidades","placements","house_bundle","parcerias","current_sponsors","stats","payment","contact","politica","_links"]}}}}}}},"/api/credito":{"post":{"operationId":"post_api_credito","summary":"Recarrega crédito pré-pago: paga uma vez com x402 e recebe o token que desconta em qualquer API da casa.","description":"Devolve: { token, saldo_usd, guarde, usar, saldo_em }","security":[],"parameters":[{"name":"usd","in":"query","required":true,"schema":{"type":"number"},"description":"Pacote: 0.1, 1, 5, 10 ou 25 dólares."}],"responses":{"200":{"description":"{ token, saldo_usd, guarde, usar, saldo_em }","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","description":"Token portador do saldo (`cred_…`). Mostrado UMA vez — não há como recuperá-lo."},"saldo_usd":{"type":"string","description":"Saldo creditado."},"guarde":{"type":"string","description":"Aviso de que o token é o portador do crédito."},"usar":{"type":"string","description":"Como apresentar o token nas rotas pagas."},"saldo_em":{"type":"string","description":"Onde consultar saldo e extrato."}},"required":["token","saldo_usd","guarde","usar","saldo_em"]}}}},"400":{"description":"Pacote fora da lista (0.1, 1, 5, 10 ou 25)."},"402":{"description":"Sem pagamento — o corpo traz `accepts[]` do x402."}}},"get":{"operationId":"get_api_credito","summary":"Saldo e extrato do crédito — as últimas movimentações, sem devolver o token.","description":"Devolve: { saldo_micros, saldo_usd, criado_em, movimentos, proximo }","security":[{"creditoCasa":[]}],"parameters":[{"name":"movimentos","in":"query","required":false,"schema":{"type":"string"},"description":"`1`: consulta só o histórico paginado, sem saldo."},{"name":"de","in":"query","required":false,"schema":{"type":"string"},"description":"Início inclusivo em UTC ISO 8601 com milissegundos. Padrão: 1970-01-01T00:00:00.000Z."},{"name":"ate","in":"query","required":false,"schema":{"type":"string"},"description":"Fim exclusivo em UTC ISO 8601 com milissegundos. Padrão: agora. Conserve o valor entre páginas."},{"name":"antes","in":"query","required":false,"schema":{"type":"string"},"description":"Cursor `proximo` da página anterior. Só com movimentos=1."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer"},"description":"1 a 50 movimentos por página; padrão 20. Só com movimentos=1."}],"responses":{"200":{"description":"{ saldo_micros, saldo_usd, criado_em, movimentos, proximo }","content":{"application/json":{"schema":{"type":"object","properties":{"saldo_micros":{"type":"integer","description":"Saldo em micro-dólares (1e-6 USD)."},"saldo_usd":{"type":"string","description":"Saldo formatado."},"criado_em":{"type":"string","description":"Quando o crédito foi aberto."},"movimentos":{"type":"array","items":{"type":"object"},"description":"Entradas e saídas recentes, com produto e recurso."},"proximo":{"type":"object","description":"Só com movimentos=1: cursor da próxima página ou null; movimentos inclui id, em, valor_usd, saldo_usd, motivo, produto e recurso."}},"required":["saldo_micros","saldo_usd","criado_em","movimentos","proximo"]}}}},"400":{"description":"Período, limite ou cursor inválido."},"401":{"description":"Sem token ou token desconhecido."}}}},"/api/credito/pix":{"get":{"operationId":"get_api_credito_pix","summary":"Crédito por Pix: a chave, o câmbio fixo, os pacotes em reais e o que o comprovante aceita.","description":"Devolve: { chave, brl_por_usd, pacotes, comprovante, liberacao }","security":[],"responses":{"200":{"description":"{ chave, brl_por_usd, pacotes, comprovante, liberacao }","content":{"application/json":{"schema":{"type":"object","properties":{"chave":{"type":"string","description":"A chave Pix que recebe o pagamento."},"brl_por_usd":{"type":"number","description":"Câmbio fixo usado nos pacotes."},"pacotes":{"type":"array","items":{"type":"object"},"description":"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":{"type":"object","description":"Tipos aceitos (foto ou PDF) e o tamanho máximo, em bytes."},"liberacao":{"type":"string","description":"`manual`: o dono confere o Pix e libera."}},"required":["chave","brl_por_usd","pacotes","comprovante","liberacao"]}}}}}},"post":{"operationId":"post_api_credito_pix","summary":"Pede crédito pago por Pix: multipart com `usd`, `comprovante` (foto ou PDF até 2 MB) e `email`; o resto é opcional.","description":"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.\nDevolve: { id, estado, credito, estado_em }","security":[],"responses":{"200":{"description":"{ id, estado, credito, estado_em }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Id do pedido, para acompanhar."},"estado":{"type":"string","description":"`pendente` até a decisão."},"credito":{"type":"string","description":"O token `cred_…`, mostrado UMA vez; vale depois da liberação."},"estado_em":{"type":"string","description":"Onde acompanhar o pedido."}},"required":["id","estado","credito","estado_em"]}}}},"400":{"description":"Pacote fora da lista (3, 5, 10 ou 25), sem comprovante ou sem e-mail válido."},"413":{"description":"Comprovante acima de 2 MB."},"415":{"description":"Comprovante que não é foto (JPEG, PNG, WebP) nem PDF."},"429":{"description":"A rede já mandou os pedidos do dia."},"502":{"description":"O e-mail ao dono não saiu: o pedido fica registrado como `falhou`; mande de novo."},"503":{"description":"Fila de conferência cheia, ou Pix indisponível neste app."}}}},"/api/credito/pix/{id}":{"get":{"operationId":"get_api_credito_pix_by_id","summary":"Estado de um pedido de crédito por Pix: `pendente`, `liberado`, `recusado` ou `falhou`.","description":"Devolve: { estado, usd, decidido_em }","security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Id do pedido (32 hex).","example":"0123456789abcdef0123456789abcdef"}],"responses":{"200":{"description":"{ estado, usd, decidido_em }","content":{"application/json":{"schema":{"type":"object","properties":{"estado":{"type":"string","description":"`pendente`, `liberado`, `recusado` ou `falhou` (o e-mail ao dono não saiu; mande de novo)."},"usd":{"type":"integer","description":"O pacote pedido."},"decidido_em":{"type":"string","description":"Quando o dono decidiu, ou `null`."}},"required":["estado","usd","decidido_em"]}}}},"404":{"description":"Pedido desconhecido."}}}},"/api/credito/asaas/{id}/cancelar":{"post":{"operationId":"post_api_credito_asaas_by_id_cancelar","summary":"Cancela uma cobrança pendente ao fechar o pagamento.","description":"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.\nDevolve: { id, estado }","security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Id da cobrança (32 hex).","example":"0123456789abcdef0123456789abcdef"}],"responses":{"200":{"description":"{ id, estado }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Id da cobrança."},"estado":{"type":"string","description":"`cancelando`, `vencido` ou o estado final já confirmado."}},"required":["id","estado"]}}}},"404":{"description":"Cobrança ou bilhete inválido, produto ou ambiente diferente."}}}},"/api/credito/asaas":{"get":{"operationId":"get_api_credito_asaas","summary":"Pix automático: se está disponível neste app, os pacotes em reais e o saldo que o produto vende.","description":"Devolve: { disponivel, pacotes, exatos, saldo, precisa_documento }","security":[],"responses":{"200":{"description":"{ disponivel, pacotes, exatos, saldo, precisa_documento }","content":{"application/json":{"schema":{"type":"object","properties":{"disponivel":{"type":"object","description":"`false` quando o app não tem o Asaas configurado (use o Pix com comprovante)."},"pacotes":{"type":"array","items":{"type":"object"},"description":"Os pacotes de crédito (3, 5, 10 ou 25 dólares), com `brl_centavos`."},"exatos":{"type":"array","items":{"type":"object"},"description":"Preços declarados pelo app, com `usd` e `brl_centavos`. Só aparecem a partir de R$ 5,00 e até R$ 10.000."},"saldo":{"type":"object","description":"Quando o produto vende saldo em reais: a faixa e se a conta logada pode comprar."},"precisa_documento":{"type":"object","description":"Se o CPF ou CNPJ de quem paga ainda é pedido."}},"required":["disponivel","pacotes","exatos","saldo","precisa_documento"]}}}}}},"post":{"operationId":"post_api_credito_asaas","summary":"Gera um Pix dinâmico: JSON com `oferta` (`pacote` com `usd`, ou `saldo` com `centavos`) e o pagador.","description":"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.\nDevolve: { id, credito, forma, pix, pagamento_em, estado, estado_em, cancelamento }","security":[],"responses":{"200":{"description":"{ id, credito, forma, pix, pagamento_em, estado, estado_em, cancelamento }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Id da cobrança, para acompanhar."},"credito":{"type":"string","description":"No pacote: o token `cred_…`, mostrado UMA vez; vale quando o pagamento cair."},"forma":{"type":"string","description":"`pix` (o padrão), `cartao` ou `cartao_boleto`."},"pix":{"type":"object","description":"`copia_e_cola`, `imagem` (QR em PNG, data URI) e `expira_em`; só na forma `pix`."},"pagamento_em":{"type":"string","description":"Na forma `cartao_boleto`: a página de pagamento do gateway."},"estado":{"type":"string","description":"Na forma `cartao`: `pago`, ou `pendente` com `conferir`."},"estado_em":{"type":"string","description":"Onde acompanhar o pagamento."},"cancelamento":{"type":"string","description":"Bilhete para cancelar a cobrança pendente de Pix ou boleto."}},"required":["id","credito","forma","pix","pagamento_em","estado","estado_em","cancelamento"]}}}},"400":{"description":"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":{"description":"Cartão recusado (`cartao_recusado`, com o `campo` quando o gateway diz qual); troque em `POST /api/credito/asaas/:id/cartao`."},"429":{"description":"Limite de 3 tentativas por minuto ou 10 por dia, por conta ou rede, ou limite do cartão."},"502":{"description":"O gateway não gerou o Pix; tente de novo."},"503":{"description":"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."}}}},"/api/credito/asaas/{id}":{"get":{"operationId":"get_api_credito_asaas_by_id","summary":"Estado de uma cobrança Pix automática: `pendente`, `pago`, `vencido`, `estornado` ou `falhou`.","description":"Devolve: { estado, pago_em }","security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Id da cobrança (32 hex).","example":"0123456789abcdef0123456789abcdef"}],"responses":{"200":{"description":"{ estado, pago_em }","content":{"application/json":{"schema":{"type":"object","properties":{"estado":{"type":"string","description":"`pago` libera o token do pacote ou o saldo; o Pix pago depois do vencimento vale."},"pago_em":{"type":"string","description":"Quando o pagamento foi confirmado, ou `null`."}},"required":["estado","pago_em"]}}}},"404":{"description":"Cobrança desconhecida."}}}},"/api/credito/asaas/{id}/cartao":{"post":{"operationId":"post_api_credito_asaas_by_id_cartao","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.","description":"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.\nDevolve: { estado, estado_em }","security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Id da cobrança (32 hex).","example":"0123456789abcdef0123456789abcdef"}],"responses":{"200":{"description":"{ estado, estado_em }","content":{"application/json":{"schema":{"type":"object","properties":{"estado":{"type":"string","description":"`pago`, ou `pendente` com `conferir` enquanto o emissor analisa."},"estado_em":{"type":"string","description":"Onde acompanhar o pagamento."}},"required":["estado","estado_em"]}}}},"400":{"description":"Dado do cartão inválido (`cartao_dados`, com o `campo`)."},"404":{"description":"Cobrança desconhecida, de outra pessoa ou que não é de cartão."},"409":{"description":"A cobrança já venceu ou foi encerrada; comece o pagamento de novo."},"422":{"description":"Cartão recusado (`cartao_recusado`)."},"429":{"description":"Passou das tentativas de cartão desta cobrança ou do dia."}}}},"/api/credito/asaas/saude":{"get":{"operationId":"get_api_credito_asaas_saude","summary":"A saúde do Pix e das assinaturas ativas deste app: falhas com motivo, para o painel.","description":"Devolve: { ativo, tarefas }","security":[],"responses":{"200":{"description":"{ ativo, tarefas }","content":{"application/json":{"schema":{"type":"object","properties":{"ativo":{"type":"object","description":"`false` quando o Asaas e as assinaturas estão desligados."},"tarefas":{"type":"array","items":{"type":"object"},"description":"Cada problema: `id`, `falhando` e `motivo`. Inclui Pix e, quando ativas, recuperação, fila e orçamento das assinaturas. Não consulta o provedor."}},"required":["ativo","tarefas"]}}}}}}},"/v1/models":{"get":{"operationId":"listar_modelos","summary":"O catálogo curado de modelos `rota/*`, com janela de contexto e para que cada um serve.","description":"Devolve: { object, data }","security":[],"responses":{"200":{"description":"{ object, data }","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","description":"`list`."},"data":{"type":"array","items":{"type":"object"},"description":"Os modelos: `id`, `display_name`, `context_window`, `description`."}},"required":["object","data"]}}}}}}},"/v1/chat/completions":{"post":{"operationId":"conversar","summary":"Chat compatível com a OpenAI, com `stream: true` em SSE. Os dados pessoais são tratados antes do modelo.","description":"O corpo é o da OpenAI (`model`, `messages`, `max_tokens`, `temperature`, `tools`…). Antes de qualquer envio, a barreira troca CPF, CNPJ, e-mail, telefone e nomes por marcadores (`placeholder`), os remove (`redact`) ou recusa o pedido (`block`), conforme a política da organização. `rota/auto` escolhe o modelo pelo conteúdo. Imagem e documento no corpo são recusados com erro claro: use `/v1/privacy/extract` antes.\nDevolve: { choices, usage }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"model":{"type":"string","description":"Um id do catálogo (`rota/*`, em `GET /v1/models`); `rota/auto` escolhe pelo conteúdo."},"messages":{"type":"array","items":{"type":"object"},"description":"A conversa: `role` (`system`, `user`, `assistant` ou `tool`) e `content` de cada mensagem; o conteúdo passa pela barreira."},"max_tokens":{"type":"number","description":"O teto de tokens da resposta; conta na cota e no débito do crédito."},"stream":{"type":"boolean","description":"`true` devolve a resposta em SSE, pedaço a pedaço, sem esperar o fim."}}},"example":{"model":"rota/rapido","messages":[{"role":"user","content":"Olá"}],"max_tokens":64}}}},"responses":{"200":{"description":"{ choices, usage }","content":{"application/json":{"schema":{"type":"object","properties":{"choices":{"type":"array","items":{"type":"object"},"description":"As respostas, no formato da OpenAI."},"usage":{"type":"object","description":"`prompt_tokens`, `completion_tokens`, `total_tokens`."}},"required":["choices","usage"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem chave, a chamada paga por x402: o corpo traz o preço em reais (`preco_brl`), o `accepts` e os termos. No chat, o preço é o teto (os tokens de entrada estimados e o `max_tokens`, padrão 1.024); a sobra fica no saldo da carteira."},"403":{"description":"Conta aguardando liberação, teste gratuito encerrado, modelo não liberado (sem chave, só os modelos vendidos por crédito: `model_not_sold_per_use`) ou origem de rede fora da política da organização."},"422":{"description":"A política de privacidade `block` recusou o envio: havia dados pessoais."},"429":{"description":"Limite por minuto ou cota do mês."}}}},"/v1/messages":{"post":{"operationId":"post_v1_messages","summary":"A API Messages da Anthropic (Claude Code e compatíveis), pela mesma barreira de privacidade, cota e auditoria.","description":"O corpo é o da Anthropic (`model`, `max_tokens`, `messages`, `system`, `tools`, `stream`). A resposta e o fluxo saem no formato da Anthropic. No Claude Code: `ANTHROPIC_BASE_URL=$ORIGIN` e a chave em `ANTHROPIC_AUTH_TOKEN`.\nDevolve: { content, stop_reason }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"model":{"type":"string","description":"Um id do catálogo (`rota/*`, em `GET /v1/models`); `rota/auto` escolhe pelo conteúdo."},"max_tokens":{"type":"number","description":"O teto de tokens da resposta; conta na cota e no débito do crédito."},"messages":{"type":"array","items":{"type":"object"},"description":"A conversa: `role` (`system`, `user`, `assistant` ou `tool`) e `content` de cada mensagem; o conteúdo passa pela barreira."},"stream":{"type":"boolean","description":"`true` devolve a resposta em SSE, pedaço a pedaço, sem esperar o fim."}}},"example":{"model":"rota/rapido","max_tokens":64,"messages":[{"role":"user","content":"Olá"}]}}}},"responses":{"200":{"description":"{ content, stop_reason }","content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"array","items":{"type":"object"},"description":"Blocos `text` e `tool_use`."},"stop_reason":{"type":"string","description":"`end_turn`, `max_tokens` ou `tool_use`."}},"required":["content","stop_reason"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem chave, a chamada paga por x402: o corpo traz o preço em reais (`preco_brl`), o `accepts` e os termos. No chat, o preço é o teto (os tokens de entrada estimados e o `max_tokens`, padrão 1.024); a sobra fica no saldo da carteira."},"403":{"description":"Conta aguardando liberação, teste gratuito encerrado, modelo não liberado (sem chave, só os modelos vendidos por crédito: `model_not_sold_per_use`) ou origem de rede fora da política da organização."},"422":{"description":"A política de privacidade `block` recusou o envio: havia dados pessoais."},"429":{"description":"Limite por minuto ou cota do mês."}}}},"/v1/privacy/clean":{"post":{"operationId":"limpar_dados_pessoais","summary":"Limpa dados pessoais de um texto, JSON ou lista, sem modelo nenhum: marcadores, remoção ou bloqueio.","description":"Mande `text`, `input` ou `items`; `policy` só endurece a da organização. A resposta traz o texto limpo e as categorias encontradas, nunca os valores.\nDevolve: { clean_text, findings, audit_id }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"O texto a limpar (ou `input`, um JSON, ou `items`, uma lista curta)."},"policy":{"type":"string","description":"`placeholder`, `redact` ou `block`; só endurece a política da organização."}}},"example":{"text":"Contato: teste@example.com"}}}},"responses":{"200":{"description":"{ clean_text, findings, audit_id }","content":{"application/json":{"schema":{"type":"object","properties":{"clean_text":{"type":"string","description":"O texto com os marcadores (`[CPF_1]`, `[EMAIL_1]`…)."},"findings":{"type":"array","items":{"type":"object"},"description":"Categoria, contagem e ação."},"audit_id":{"type":"string","description":"O registro cifrado da chamada."}},"required":["clean_text","findings","audit_id"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem chave, a chamada paga por x402: o corpo traz o preço em reais (`preco_brl`), o `accepts` e os termos. No chat, o preço é o teto (os tokens de entrada estimados e o `max_tokens`, padrão 1.024); a sobra fica no saldo da carteira."},"403":{"description":"Conta aguardando liberação, teste gratuito encerrado, modelo não liberado (sem chave, só os modelos vendidos por crédito: `model_not_sold_per_use`) ou origem de rede fora da política da organização."},"422":{"description":"A política de privacidade `block` recusou o envio: havia dados pessoais."},"429":{"description":"Limite por minuto ou cota do mês."}}}},"/v1/privacy/jobs":{"post":{"operationId":"post_v1_privacy_jobs","summary":"A mesma limpeza como job consultável depois (`GET /v1/privacy/jobs/:id`), para lotes.","description":"Devolve: { id, status }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"},"description":"Os textos do lote, cada um limpo à parte; a resposta traz só categorias e contagens."}}},"example":{"items":["Ana, CPF 529.982.247-25"]}}}},"responses":{"202":{"description":"{ id, status }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"O id do job."},"status":{"type":"string","description":"`completed` ou `blocked`."}},"required":["id","status"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem chave, a chamada paga por x402: o corpo traz o preço em reais (`preco_brl`), o `accepts` e os termos. No chat, o preço é o teto (os tokens de entrada estimados e o `max_tokens`, padrão 1.024); a sobra fica no saldo da carteira."},"403":{"description":"Conta aguardando liberação, teste gratuito encerrado, modelo não liberado (sem chave, só os modelos vendidos por crédito: `model_not_sold_per_use`) ou origem de rede fora da política da organização."},"422":{"description":"A política de privacidade `block` recusou o envio: havia dados pessoais."},"429":{"description":"Limite por minuto ou cota do mês."}}}},"/v1/privacy/jobs/{id}":{"get":{"operationId":"get_v1_privacy_jobs_by_id","summary":"O resultado de um job de limpeza: categorias, contagens e o registro de auditoria, sem o conteúdo.","description":"Devolve: { status, privacy }","security":[{"contaChaveApi":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"O id do job (`privjob_…`).","example":"privjob_0123456789abcdef"}],"responses":{"200":{"description":"{ status, privacy }","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"`completed` ou `failed`."},"privacy":{"type":"object","description":"Categorias, contagens e total."}},"required":["status","privacy"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"404":{"description":"Job desconhecido para esta organização."}}}},"/v1/privacy/extract":{"post":{"operationId":"post_v1_privacy_extract","summary":"Extrai o texto de um PDF (ou de uma imagem, por OCR em beta) e o devolve já limpo pela barreira.","description":"Multipart com `file` (até 25 MB). O arquivo não fica guardado; PDF escaneado ou imagem ilegível recebem 422 claro.\nDevolve: { text, findings }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"responses":{"200":{"description":"{ text, findings }","content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"O texto limpo."},"findings":{"type":"array","items":{"type":"object"},"description":"Categoria, contagem e ação."}},"required":["text","findings"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem chave, a chamada paga por x402: o corpo traz o preço em reais (`preco_brl`), o `accepts` e os termos. No chat, o preço é o teto (os tokens de entrada estimados e o `max_tokens`, padrão 1.024); a sobra fica no saldo da carteira."},"403":{"description":"Conta aguardando liberação, teste gratuito encerrado, modelo não liberado (sem chave, só os modelos vendidos por crédito: `model_not_sold_per_use`) ou origem de rede fora da política da organização."},"413":{"description":"Documento acima de 25 MB."},"422":{"description":"Sem texto extraível, ou bloqueado pela política."},"429":{"description":"Limite por minuto ou cota do mês."}}}},"/v1/audio/transcriptions":{"post":{"operationId":"post_v1_audio_transcriptions","summary":"Transcreve um áudio (compatível com a OpenAI) e devolve o texto já limpo pela barreira.","description":"Multipart com `file` (até 25 MB), `language` e `response_format` (`json` ou `text`). O áudio não fica guardado. Preço: R$ 0,01 por MB de áudio (ou fração). Paga do saldo em reais da organização (Pix no painel, pacotes de R$ 10,00 a R$ 100,00) ou por x402 com `X-PAYMENT` (USDC na Base, mínimo de US$ 0,001 por chamada), também sem chave: a carteira que paga vira a conta. O débito volta ao saldo de quem pagou se o job falhar, for cancelado ou vencer na fila.\nDevolve: { text }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"responses":{"200":{"description":"{ text }","content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"A transcrição limpa."}},"required":["text"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem saldo que cubra a chamada nem pagamento x402: o corpo traz o `accepts` do x402, o `preco_brl` e o `buy_credit_url`."},"403":{"description":"Conta aguardando liberação, teste gratuito encerrado, modelo não liberado (sem chave, só os modelos vendidos por crédito: `model_not_sold_per_use`) ou origem de rede fora da política da organização."},"413":{"description":"Áudio acima de 25 MB."},"422":{"description":"A política de privacidade `block` recusou o envio: havia dados pessoais."},"429":{"description":"Limite por minuto ou cota do mês."},"504":{"description":"Áudio longo demais para a transcrição síncrona."}}}},"/v1/capabilities":{"get":{"operationId":"get_v1_capabilities","summary":"As capacidades `rn.*` que os workers ligados anunciam agora (sem chave, só a lista; com a chave, também os workers).","description":"Devolve: { capabilities, workers }","security":[],"responses":{"200":{"description":"{ capabilities, workers }","content":{"application/json":{"schema":{"type":"object","properties":{"capabilities":{"type":"array","items":{"type":"string"},"description":"As capacidades disponíveis."},"workers":{"type":"array","items":{"type":"object"},"description":"Cada worker visto nos últimos 2 min."}},"required":["capabilities","workers"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."}}}},"/v1/embeddings":{"post":{"operationId":"post_v1_embeddings","summary":"Vetores de textos para busca por significado (espera até 2 min; senão, 202 com o job).","description":"Prévia (`rn.*`): o contrato pode mudar e depende de worker ligado (veja `GET /v1/capabilities`). Preço: R$ 0,0002 por texto. Paga do saldo em reais da organização (Pix no painel, pacotes de R$ 10,00 a R$ 100,00) ou por x402 com `X-PAYMENT` (USDC na Base, mínimo de US$ 0,001 por chamada), também sem chave: a carteira que paga vira a conta. O débito volta ao saldo de quem pagou se o job falhar, for cancelado ou vencer na fila.\nDevolve: { id, status, status_url }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"array","items":{"type":"string"},"description":"O texto, ou a lista de textos, a vetorizar; passa pela barreira antes do worker."}}}}}},"responses":{"200":{"description":"{ id, status, status_url }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"O id do job (`rnj_…`)."},"status":{"type":"string","description":"`queued`, `leased`, `completed`, `failed` ou `cancelled`."},"status_url":{"type":"string","description":"Onde acompanhar."}},"required":["id","status","status_url"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem saldo que cubra a chamada nem pagamento x402: o corpo traz o `accepts` do x402, o `preco_brl` e, com a chave, o `buy_credit_url`."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis (`capability_unavailable`: nenhum worker atende a capacidade agora; nada foi cobrado)."}}}},"/v1/audio/speech":{"post":{"operationId":"post_v1_audio_speech","summary":"Voz a partir de um texto (espera até 5 min; senão, 202 com o job).","description":"Prévia (`rn.*`): o contrato pode mudar e depende de worker ligado (veja `GET /v1/capabilities`). Preço: R$ 0,02 por mil caracteres (ou fração). Paga do saldo em reais da organização (Pix no painel, pacotes de R$ 10,00 a R$ 100,00) ou por x402 com `X-PAYMENT` (USDC na Base, mínimo de US$ 0,001 por chamada), também sem chave: a carteira que paga vira a conta. O débito volta ao saldo de quem pagou se o job falhar, for cancelado ou vencer na fila.\nDevolve: { id, status, status_url }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"O texto a falar; obrigatório, e passa pela barreira antes do worker."}}}}}},"responses":{"200":{"description":"{ id, status, status_url }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"O id do job (`rnj_…`)."},"status":{"type":"string","description":"`queued`, `leased`, `completed`, `failed` ou `cancelled`."},"status_url":{"type":"string","description":"Onde acompanhar."}},"required":["id","status","status_url"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem saldo que cubra a chamada nem pagamento x402: o corpo traz o `accepts` do x402, o `preco_brl` e, com a chave, o `buy_credit_url`."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis (`capability_unavailable`: nenhum worker atende a capacidade agora; nada foi cobrado)."}}}},"/v1/audio/music":{"post":{"operationId":"post_v1_audio_music","summary":"Música a partir de uma descrição (60, 120 ou 180 s).","description":"Prévia (`rn.*`): o contrato pode mudar e depende de worker ligado (veja `GET /v1/capabilities`). Preço: R$ 0,10 por minuto de música. Paga do saldo em reais da organização (Pix no painel, pacotes de R$ 10,00 a R$ 100,00) ou por x402 com `X-PAYMENT` (USDC na Base, mínimo de US$ 0,001 por chamada), também sem chave: a carteira que paga vira a conta. O débito volta ao saldo de quem pagou se o job falhar, for cancelado ou vencer na fila.\nDevolve: { id, status, status_url }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"style":{"type":"string","description":"A descrição do estilo da música (instrumentos, clima, andamento)."},"seconds":{"type":"number","description":"A duração: 60, 120 ou 180 segundos (padrão 60)."}}}}}},"responses":{"202":{"description":"{ id, status, status_url }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"O id do job (`rnj_…`)."},"status":{"type":"string","description":"`queued`, `leased`, `completed`, `failed` ou `cancelled`."},"status_url":{"type":"string","description":"Onde acompanhar."}},"required":["id","status","status_url"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem saldo que cubra a chamada nem pagamento x402: o corpo traz o `accepts` do x402, o `preco_brl` e, com a chave, o `buy_credit_url`."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis (`capability_unavailable`: nenhum worker atende a capacidade agora; nada foi cobrado)."}}}},"/v1/audio/compositions":{"post":{"operationId":"post_v1_audio_compositions","summary":"Composição de voz e fundo com ganhos e rampas.","description":"Prévia (`rn.*`): o contrato pode mudar e depende de worker ligado (veja `GET /v1/capabilities`). Preço: R$ 0,01 por composição. Paga do saldo em reais da organização (Pix no painel, pacotes de R$ 10,00 a R$ 100,00) ou por x402 com `X-PAYMENT` (USDC na Base, mínimo de US$ 0,001 por chamada), também sem chave: a carteira que paga vira a conta. O débito volta ao saldo de quem pagou se o job falhar, for cancelado ou vencer na fila.\nDevolve: { id, status, status_url }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"responses":{"202":{"description":"{ id, status, status_url }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"O id do job (`rnj_…`)."},"status":{"type":"string","description":"`queued`, `leased`, `completed`, `failed` ou `cancelled`."},"status_url":{"type":"string","description":"Onde acompanhar."}},"required":["id","status","status_url"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem saldo que cubra a chamada nem pagamento x402: o corpo traz o `accepts` do x402, o `preco_brl` e, com a chave, o `buy_credit_url`."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis (`capability_unavailable`: nenhum worker atende a capacidade agora; nada foi cobrado)."}}}},"/v1/images/generations":{"post":{"operationId":"post_v1_images_generations","summary":"Imagem a partir de uma descrição.","description":"Prévia (`rn.*`): o contrato pode mudar e depende de worker ligado (veja `GET /v1/capabilities`). Preço: R$ 0,10 por imagem. Paga do saldo em reais da organização (Pix no painel, pacotes de R$ 10,00 a R$ 100,00) ou por x402 com `X-PAYMENT` (USDC na Base, mínimo de US$ 0,001 por chamada), também sem chave: a carteira que paga vira a conta. O débito volta ao saldo de quem pagou se o job falhar, for cancelado ou vencer na fila.\nDevolve: { id, status, status_url }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"A descrição da imagem; obrigatória, e passa pela barreira antes do worker."}}}}}},"responses":{"202":{"description":"{ id, status, status_url }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"O id do job (`rnj_…`)."},"status":{"type":"string","description":"`queued`, `leased`, `completed`, `failed` ou `cancelled`."},"status_url":{"type":"string","description":"Onde acompanhar."}},"required":["id","status","status_url"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem saldo que cubra a chamada nem pagamento x402: o corpo traz o `accepts` do x402, o `preco_brl` e, com a chave, o `buy_credit_url`."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis (`capability_unavailable`: nenhum worker atende a capacidade agora; nada foi cobrado)."}}}},"/v1/images/edits":{"post":{"operationId":"post_v1_images_edits","summary":"Edição de uma imagem com uma instrução.","description":"Prévia (`rn.*`): o contrato pode mudar e depende de worker ligado (veja `GET /v1/capabilities`). Preço: R$ 0,10 por imagem. Paga do saldo em reais da organização (Pix no painel, pacotes de R$ 10,00 a R$ 100,00) ou por x402 com `X-PAYMENT` (USDC na Base, mínimo de US$ 0,001 por chamada), também sem chave: a carteira que paga vira a conta. O débito volta ao saldo de quem pagou se o job falhar, for cancelado ou vencer na fila.\nDevolve: { id, status, status_url }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"responses":{"202":{"description":"{ id, status, status_url }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"O id do job (`rnj_…`)."},"status":{"type":"string","description":"`queued`, `leased`, `completed`, `failed` ou `cancelled`."},"status_url":{"type":"string","description":"Onde acompanhar."}},"required":["id","status","status_url"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem saldo que cubra a chamada nem pagamento x402: o corpo traz o `accepts` do x402, o `preco_brl` e, com a chave, o `buy_credit_url`."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis (`capability_unavailable`: nenhum worker atende a capacidade agora; nada foi cobrado)."}}}},"/v1/ocr":{"post":{"operationId":"post_v1_ocr","summary":"Texto de uma imagem ou documento (espera até 3 min; senão, 202 com o job).","description":"Prévia (`rn.*`): o contrato pode mudar e depende de worker ligado (veja `GET /v1/capabilities`). Preço: R$ 0,01 por página lida. Paga do saldo em reais da organização (Pix no painel, pacotes de R$ 10,00 a R$ 100,00) ou por x402 com `X-PAYMENT` (USDC na Base, mínimo de US$ 0,001 por chamada), também sem chave: a carteira que paga vira a conta. O débito volta ao saldo de quem pagou se o job falhar, for cancelado ou vencer na fila.\nDevolve: { id, status, status_url }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","description":"A imagem ou o PDF (multipart)."},"max_pages":{"type":"number","description":"O máximo de páginas do PDF a ler, de 1 a 40 (padrão 40). A cobrança reserva esse máximo e devolve as páginas não lidas; no x402, paga-se o máximo."}}}}}},"responses":{"200":{"description":"{ id, status, status_url }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"O id do job (`rnj_…`)."},"status":{"type":"string","description":"`queued`, `leased`, `completed`, `failed` ou `cancelled`."},"status_url":{"type":"string","description":"Onde acompanhar."}},"required":["id","status","status_url"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem saldo que cubra a chamada nem pagamento x402: o corpo traz o `accepts` do x402, o `preco_brl` e, com a chave, o `buy_credit_url`."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis (`capability_unavailable`: nenhum worker atende a capacidade agora; nada foi cobrado)."}}}},"/v1/documents/fidelity/jobs":{"post":{"operationId":"post_v1_documents_fidelity_jobs","summary":"OCR documental fiel (páginas, imagens), como job.","description":"Prévia (`rn.*`): o contrato pode mudar e depende de worker ligado (veja `GET /v1/capabilities`). Preço: R$ 0,01 por página lida. Paga do saldo em reais da organização (Pix no painel, pacotes de R$ 10,00 a R$ 100,00) ou por x402 com `X-PAYMENT` (USDC na Base, mínimo de US$ 0,001 por chamada), também sem chave: a carteira que paga vira a conta. O débito volta ao saldo de quem pagou se o job falhar, for cancelado ou vencer na fila.\nDevolve: { id, status, status_url }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"responses":{"202":{"description":"{ id, status, status_url }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"O id do job (`rnj_…`)."},"status":{"type":"string","description":"`queued`, `leased`, `completed`, `failed` ou `cancelled`."},"status_url":{"type":"string","description":"Onde acompanhar."}},"required":["id","status","status_url"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem saldo que cubra a chamada nem pagamento x402: o corpo traz o `accepts` do x402, o `preco_brl` e, com a chave, o `buy_credit_url`."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis (`capability_unavailable`: nenhum worker atende a capacidade agora; nada foi cobrado)."}}}},"/v1/documents/review/jobs":{"post":{"operationId":"post_v1_documents_review_jobs","summary":"Revisão documental como job.","description":"Prévia (`rn.*`): o contrato pode mudar e depende de worker ligado (veja `GET /v1/capabilities`). Preço: R$ 0,05 por página. Paga do saldo em reais da organização (Pix no painel, pacotes de R$ 10,00 a R$ 100,00) ou por x402 com `X-PAYMENT` (USDC na Base, mínimo de US$ 0,001 por chamada), também sem chave: a carteira que paga vira a conta. O débito volta ao saldo de quem pagou se o job falhar, for cancelado ou vencer na fila.\nDevolve: { id, status, status_url }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"document":{"type":"string","description":"O texto do documento; o resto do JSON (instruções, esquema do resultado) segue ao worker depois da barreira."}}}}}},"responses":{"202":{"description":"{ id, status, status_url }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"O id do job (`rnj_…`)."},"status":{"type":"string","description":"`queued`, `leased`, `completed`, `failed` ou `cancelled`."},"status_url":{"type":"string","description":"Onde acompanhar."}},"required":["id","status","status_url"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem saldo que cubra a chamada nem pagamento x402: o corpo traz o `accepts` do x402, o `preco_brl` e, com a chave, o `buy_credit_url`."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis (`capability_unavailable`: nenhum worker atende a capacidade agora; nada foi cobrado)."}}}},"/v1/moderations":{"post":{"operationId":"post_v1_moderations","summary":"Moderação de mensagens pela política da organização, no formato da OpenAI (espera até 30 s; senão, 202 com o job).","description":"Prévia (`rn.*`): o contrato pode mudar e depende de worker ligado (veja `GET /v1/capabilities`). Preço: R$ 0,002 por mensagem. Paga do saldo em reais da organização (Pix no painel, pacotes de R$ 10,00 a R$ 100,00) ou por x402 com `X-PAYMENT` (USDC na Base, mínimo de US$ 0,001 por chamada), também sem chave: a carteira que paga vira a conta. O débito volta ao saldo de quem pagou se o job falhar, for cancelado ou vencer na fila.\nDevolve: { results, mode }","security":[{"contaChaveApi":[]},{"x402":[]},{"carteiraAgente":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"array","items":{"type":"object"},"description":"A mensagem, ou até 32 mensagens, cada uma com até 8.000 caracteres; passam pela barreira antes do worker."},"categories":{"type":"array","items":{"type":"object"},"description":"A política: até 16 categorias com `name`, `violation` (quando sinalizar) e, se quiser, `not_violation` e `exception`. Sem ela, vale a taxonomia geral de segurança (`violence`, `hate`, `fraud`…). Se a barreira trocar um nome por marcador, a chave volta com o marcador, na ordem enviada."},"cutoff":{"type":"object","description":"`precision` (padrão, sinaliza menos), `balanced` ou um número entre 0 e 1."}}}}}},"responses":{"200":{"description":"{ results, mode }","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object"},"description":"Por mensagem: `flagged`, `score` e o `cutoff` da decisão; por categoria, `categories` (sinalizada ou não), `category_scores` (de 0 a 1) e `category_cutoffs` (o corte de cada uma; na taxonomia geral, cada categoria tem o seu)."},"mode":{"type":"string","description":"`policy` com a política do pedido; `generic` com a taxonomia geral."}},"required":["results","mode"]}}}},"400":{"description":"Entrada, política ou corte inválidos; ou a política passa do que o modelo lê junto da mensagem."},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"402":{"description":"Sem saldo que cubra a chamada nem pagamento x402: o corpo traz o `accepts` do x402, o `preco_brl` e, com a chave, o `buy_credit_url`."},"413":{"description":"Entrada acima do limite."},"422":{"description":"A política de privacidade bloqueou dados pessoais."},"503":{"description":"Workers indisponíveis (`capability_unavailable`: nenhum worker atende a capacidade agora; nada foi cobrado)."}}}},"/v1/jobs/{id}":{"get":{"operationId":"get_v1_jobs_by_id","summary":"O estado de um job `rn.*` da organização.","description":"Devolve: { status, progress_pct }","security":[{"contaChaveApi":[]},{"carteiraAgente":[]},{"tokenDoJob":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"O id do job.","example":"rnj_0123456789abcdef"}],"responses":{"200":{"description":"{ status, progress_pct }","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"O estado."},"progress_pct":{"type":"number","description":"O progresso, quando o worker informa."}},"required":["status","progress_pct"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"404":{"description":"Job desconhecido para esta organização."}}},"delete":{"operationId":"delete_v1_jobs_by_id","summary":"Cancela um job que ainda está na fila.","description":"Devolve: { status }","security":[{"contaChaveApi":[]},{"carteiraAgente":[]},{"tokenDoJob":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"O id do job.","example":"rnj_0123456789abcdef"}],"responses":{"200":{"description":"{ status }","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"`cancelled`."}},"required":["status"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"404":{"description":"Job desconhecido."},"409":{"description":"O job já saiu da fila."}}}},"/v1/jobs/{id}/result":{"get":{"operationId":"get_v1_jobs_by_id_result","summary":"O resultado de um job concluído: o arquivo gerado, ou o JSON já limpo pela barreira.","description":"Devolve: { result }","security":[{"contaChaveApi":[]},{"carteiraAgente":[]},{"tokenDoJob":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"O id do job.","example":"rnj_0123456789abcdef"}],"responses":{"200":{"description":"{ result }","content":{"application/json":{"schema":{"type":"object","properties":{"result":{"type":"object","description":"O resultado, quando é JSON."}},"required":["result"]}}}},"401":{"description":"Chave de API ausente ou inválida (`invalid_api_key`), ou credencial da carteira recusada ou vencida (`invalid_wallet_token`: peça outra)."},"404":{"description":"Job desconhecido."},"409":{"description":"Job ainda não concluído."}}}},"/api/app/perfil":{"get":{"operationId":"get_api_app_perfil","summary":"Quem está no painel e a organização aberta: o acesso à API, o teste, os limites, a política e a origem.","description":"Devolve: { user, organization, legal_retention_days }","security":[{"globalAccount":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"type":"string"},"description":"A organização em que o pedido age (sem ele, a conta pessoal); o vínculo e o papel são conferidos na conta."}],"responses":{"200":{"description":"{ user, organization, legal_retention_days }","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","description":"`id`, `email`, `display_name`, `plan`, `api_access_status`, `trial_days_remaining`, `tenant_role`, `can_manage_tenant` e `needs_terms_acceptance`."},"organization":{"type":"object","description":"`id`, `name`, `personal`, `pii_policy`, os limites (`rpm_limit`, `monthly_request_limit`, `monthly_token_limit`), a origem (`network`) e o `role`."},"legal_retention_days":{"type":"number","description":"Os dias da retenção legal cifrada que o aceite cobre."}},"required":["user","organization","legal_retention_days"]}}}},"401":{"description":"Sem sessão da conta."},"404":{"description":"Organização desconhecida para esta conta."}}}},"/api/app/aceite":{"post":{"operationId":"post_api_app_aceite","summary":"Registra o aceite dos Termos de Uso e da retenção legal cifrada de prompts e saídas, pela pessoa da sessão.","description":"Devolve: { user, organization }","security":[{"globalAccount":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"type":"string"},"description":"A organização em que o pedido age (sem ele, a conta pessoal); o vínculo e o papel são conferidos na conta."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"accepted_terms":{"type":"boolean","description":"`true`: aceita os Termos de Uso."},"accepted_legal_retention":{"type":"boolean","description":"`true`: autoriza a retenção legal cifrada pelo prazo do perfil."}},"required":["accepted_terms","accepted_legal_retention"]}}}},"responses":{"200":{"description":"{ user, organization }","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","description":"O perfil de novo, já com `needs_terms_acceptance: false`."},"organization":{"type":"object","description":"A organização aberta."}},"required":["user","organization"]}}}},"400":{"description":"Faltou aceitar um dos dois (`terms_required`)."},"401":{"description":"Sem sessão da conta."}}}},"/api/app/organizacao":{"patch":{"operationId":"patch_api_app_organizacao","summary":"Muda a origem de inferência da organização: os países e as redes de onde a chave pode chamar a API.","description":"Devolve: { ok, network }","security":[{"globalAccount":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"type":"string"},"description":"A organização em que o pedido age (sem ele, a conta pessoal); o vínculo e o papel são conferidos na conta."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"inference_geo_policy":{"type":"string","description":"`allowlist` (só os países e IPs listados) ou `disabled`."},"allowed_countries":{"type":"array","items":{"type":"string"},"description":"Países permitidos, em ISO 3166-1 alfa-2 (`BR`)."},"allowed_ips":{"type":"array","items":{"type":"string"},"description":"IPs ou faixas CIDR permitidos."}}}}}},"responses":{"200":{"description":"{ ok, network }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"`true` quando gravou."},"network":{"type":"object","description":"A origem gravada."}},"required":["ok","network"]}}}},"400":{"description":"Política, país ou IP inválido, ou nenhum país nem IP na `allowlist`."},"401":{"description":"Sem sessão da conta."},"403":{"description":"Só o dono ou um administrador muda a origem (ou falta o aceite)."},"404":{"description":"Organização desconhecida para esta conta."}}}},"/api/app/resumo":{"get":{"operationId":"get_api_app_resumo","summary":"O resumo do painel: o acesso, hoje, o mês, a cota, os últimos 30 dias e os modelos mais usados do mês.","description":"Devolve: { access, today, month, quota, series, top_models }","security":[{"globalAccount":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"type":"string"},"description":"A organização em que o pedido age (sem ele, a conta pessoal); o vínculo e o papel são conferidos na conta."}],"responses":{"200":{"description":"{ access, today, month, quota, series, top_models }","content":{"application/json":{"schema":{"type":"object","properties":{"access":{"type":"object","description":"`api_access_status`, `access_reason`, o teste e a liberação comercial."},"today":{"type":"object","description":"`requests`, `total_tokens` e `pii_total` de hoje (UTC)."},"month":{"type":"object","description":"Os mesmos números no mês."},"quota":{"type":"object","description":"Os limites, o usado, o que resta e `reset_at`."},"series":{"type":"array","items":{"type":"object"},"description":"Um dia por item: `date`, `requests`, `total_tokens`, `pii_total`."},"top_models":{"type":"array","items":{"type":"object"},"description":"Até 5: `model_id`, `requests`, `total_tokens`."}},"required":["access","today","month","quota","series","top_models"]}}}},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem o aceite dos Termos e da retenção legal (`terms_required`)."},"404":{"description":"Organização desconhecida para esta conta."}}}},"/api/app/quota":{"get":{"operationId":"get_api_app_quota","summary":"A cota do mês: o plano, o limite por minuto, os pedidos e tokens usados e o que resta, e quando reinicia.","description":"Devolve: { quota }","security":[{"globalAccount":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"type":"string"},"description":"A organização em que o pedido age (sem ele, a conta pessoal); o vínculo e o papel são conferidos na conta."}],"responses":{"200":{"description":"{ quota }","content":{"application/json":{"schema":{"type":"object","properties":{"quota":{"type":"object","description":"`plan`, `rpm_limit`, os limites do mês, o usado, o restante e `reset_at`."}},"required":["quota"]}}}},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem o aceite dos Termos e da retenção legal (`terms_required`)."},"404":{"description":"Organização desconhecida para esta conta."}}}},"/api/app/uso":{"get":{"operationId":"get_api_app_uso","summary":"O uso do mais novo para o mais velho, em páginas: só metadados, nunca o texto nem os valores pessoais.","description":"Devolve: { events, has_more, next_cursor }","security":[{"globalAccount":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"O `next_cursor` da página anterior.","example":"2026-09-29 12:00:00.000|evt_1"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"Eventos por página, de 1 a 100 (padrão 50).","example":"50"},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"type":"string"},"description":"A organização em que o pedido age (sem ele, a conta pessoal); o vínculo e o papel são conferidos na conta."}],"responses":{"200":{"description":"{ events, has_more, next_cursor }","content":{"application/json":{"schema":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object"},"description":"Quando, modelo, rota, status, latência, tokens, a política e as categorias e contagens de dados pessoais, a chave e a origem."},"has_more":{"type":"boolean","description":"Há mais eventos depois desta página."},"next_cursor":{"type":"string","description":"O cursor da próxima página.","nullable":true}},"required":["events","has_more","next_cursor"]}}}},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem o aceite dos Termos e da retenção legal (`terms_required`)."},"404":{"description":"Organização desconhecida para esta conta."}}}},"/api/app/modelos":{"get":{"operationId":"get_api_app_modelos","summary":"O catálogo com a preferência da pessoa: o bloqueado recusa a chamada da chave dela com 403; e o padrão.","description":"Devolve: { models }","security":[{"globalAccount":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"type":"string"},"description":"A organização em que o pedido age (sem ele, a conta pessoal); o vínculo e o papel são conferidos na conta."}],"responses":{"200":{"description":"{ models }","content":{"application/json":{"schema":{"type":"object","properties":{"models":{"type":"array","items":{"type":"object"},"description":"O catálogo com `enabled` e `is_default` de cada modelo."}},"required":["models"]}}}},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem o aceite dos Termos e da retenção legal (`terms_required`)."},"404":{"description":"Organização desconhecida para esta conta."}}},"post":{"operationId":"post_api_app_modelos","summary":"Permite ou bloqueia um modelo do catálogo para as chaves da pessoa, ou o torna o padrão.","description":"Devolve: { models }","security":[{"globalAccount":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"type":"string"},"description":"A organização em que o pedido age (sem ele, a conta pessoal); o vínculo e o papel são conferidos na conta."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"model_id":{"type":"string","description":"O id do modelo no catálogo (`rota/*`)."},"enabled":{"type":"boolean","description":"`false` bloqueia: a API recusa o modelo com 403."},"is_default":{"type":"boolean","description":"`true` torna o modelo o padrão (e permitido)."}},"required":["model_id"]}}}},"responses":{"200":{"description":"{ models }","content":{"application/json":{"schema":{"type":"object","properties":{"models":{"type":"array","items":{"type":"object"},"description":"O catálogo com a preferência já mudada."}},"required":["models"]}}}},"400":{"description":"Id fora do catálogo."},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem o aceite dos Termos e da retenção legal (`terms_required`)."},"404":{"description":"Organização desconhecida para esta conta."}}}},"/api/app/creditos":{"get":{"operationId":"get_api_app_creditos","summary":"O saldo de crédito em reais, os preços por milhão de tokens e o extrato do Pix; a compra é o Pix da casa.","description":"Devolve: { balance_centavos, can_buy, prices, transactions }","security":[{"globalAccount":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"type":"string"},"description":"A organização em que o pedido age (sem ele, a conta pessoal); o vínculo e o papel são conferidos na conta."}],"responses":{"200":{"description":"{ balance_centavos, can_buy, prices, transactions }","content":{"application/json":{"schema":{"type":"object","properties":{"balance_centavos":{"type":"number","description":"O saldo em centavos de real."},"can_buy":{"type":"boolean","description":"Se quem pede compra (na organização, só o dono ou um administrador)."},"prices":{"type":"array","items":{"type":"object"},"description":"Os modelos vendidos por crédito, com entrada e saída por milhão de tokens."},"transactions":{"type":"array","items":{"type":"object"},"description":"As compras por Pix: tipo, valor, data e descrição."}},"required":["balance_centavos","can_buy","prices","transactions"]}}}},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem o aceite dos Termos e da retenção legal (`terms_required`)."},"404":{"description":"Organização desconhecida para esta conta."}}}},"/api/app/privacy/clean":{"post":{"operationId":"post_api_app_privacy_clean","summary":"O teste da barreira no painel: um texto curto pela mesma limpeza da API, com a política da organização.","description":"Só `text`, até 8 KB, e no máximo 10 por minuto; conta na cota do mês e fica na auditoria cifrada.\nDevolve: { clean_text, privacy }","security":[{"globalAccount":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"type":"string"},"description":"A organização em que o pedido age (sem ele, a conta pessoal); o vínculo e o papel são conferidos na conta."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"O texto de teste (fictício), até 8 KB."}},"required":["text"]}}}},"responses":{"200":{"description":"{ clean_text, privacy }","content":{"application/json":{"schema":{"type":"object","properties":{"clean_text":{"type":"string","description":"O que chegaria ao modelo, com os marcadores."},"privacy":{"type":"object","description":"Categorias, contagens e total, nunca os valores."}},"required":["clean_text","privacy"]}}}},"401":{"description":"Sem sessão da conta."},"403":{"description":"Acesso não liberado, ou falta o aceite."},"404":{"description":"Organização desconhecida para esta conta."},"413":{"description":"Texto acima de 8 KB."},"422":{"description":"Bloqueado pela política."},"429":{"description":"Limite por minuto ou cota."}}}},"/api/app/lab/estado":{"get":{"operationId":"get_api_app_lab_estado","summary":"O laboratório numa resposta: o acesso e cada ferramenta com o estado, o uso da organização em 24 h, o teto e a fila.","description":"Devolve: { access, tools }","security":[{"globalAccount":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"type":"string"},"description":"A organização em que o pedido age (sem ele, a conta pessoal); o vínculo e o papel são conferidos na conta."}],"responses":{"200":{"description":"{ access, tools }","content":{"application/json":{"schema":{"type":"object","properties":{"access":{"type":"object","description":"`status` do acesso à API, `reason` e o fim do teste (`trial_expires_at`)."},"tools":{"type":"array","items":{"type":"object"},"description":"`id`, `capability` (`rn.*`), `status` (`live`, `offline` ou `soon`), `daily_limit`, `used_24h` e `queued`."}},"required":["access","tools"]}}}},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem o aceite dos Termos e da retenção legal (`terms_required`)."},"404":{"description":"Organização desconhecida para esta conta."}}}},"/api/app/lab/{ferramenta}":{"post":{"operationId":"post_api_app_lab_by_ferramenta","summary":"Executa uma ferramenta pela rota da API dela, com a barreira, a fila e a auditoria, e os tetos do laboratório.","description":"JSON: `chat` (`messages`, até 12, de até 4.000 caracteres), `voz` (`text`, até 500), `musica` (`style`, até 300; 60 s). Multipart: `transcricao` (`file` de áudio e `language` pt, en ou es), `mixagem` (`voice` e `background`, até 6 MB cada), `leitura` e `leitura-fiel` (`file` PDF ou imagem, até 8 MB). A rota espera o worker até 15 s; depois, devolve o job para acompanhar. `revisao`, `imagem` e `busca` respondem 409 até chegarem.\nDevolve: { job, poll_url, result_url, result, text, received }","security":[{"globalAccount":[]}],"parameters":[{"name":"ferramenta","in":"path","required":true,"schema":{"type":"string"},"description":"`chat`, `transcricao`, `voz`, `musica`, `mixagem`, `leitura` ou `leitura-fiel`.","example":"voz"},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"type":"string"},"description":"A organização em que o pedido age (sem ele, a conta pessoal); o vínculo e o papel são conferidos na conta."}],"responses":{"200":{"description":"{ job, poll_url, result_url, result, text, received }","content":{"application/json":{"schema":{"type":"object","properties":{"job":{"type":"object","description":"`id`, `status`, `progress_pct`, `stage` e `error`, quando a ferramenta roda na fila."},"poll_url":{"type":"string","description":"Onde acompanhar o job."},"result_url":{"type":"string","description":"Onde baixar o resultado, com o job concluído."},"result":{"type":"object","description":"O resultado JSON, quando o worker termina na espera da rota."},"text":{"type":"string","description":"O texto da resposta (chat), já com os marcadores da barreira."},"received":{"type":"string","description":"No chat, a última mensagem como a IA a recebeu, depois da barreira."}},"required":["job","poll_url","result_url","result","text","received"]}}}},"400":{"description":"Entrada fora do formato ou dos limites (`lab_*`)."},"401":{"description":"Sem sessão da conta."},"403":{"description":"Acesso à API não liberado, ou falta o aceite."},"404":{"description":"Organização desconhecida para esta conta."},"409":{"description":"Ferramenta em breve (`lab_tool_soon`)."},"413":{"description":"Arquivo acima do limite (`lab_file_too_large`)."},"415":{"description":"Tipo de arquivo não aceito (`lab_file_type`)."},"429":{"description":"Teto de 24 h da ferramenta (`lab_daily_limit`), limite por minuto ou cota do mês."},"503":{"description":"Ferramenta indisponível (`lab_tool_offline`), fila cheia (`lab_queue_full`) ou envios demais (`lab_busy`)."}}}},"/api/app/lab/jobs/{id}":{"get":{"operationId":"get_api_app_lab_jobs_by_id","summary":"O estado de um job do laboratório, com espera longa: responde quando ele sai do estado `desde`, ou em 15 s.","description":"Devolve: { job, mark, result_url }","security":[{"globalAccount":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"O id do job do laboratório.","example":"rnj_0123456789abcdef0123456789abcdef"},{"name":"desde","in":"query","required":false,"schema":{"type":"string"},"description":"O `mark` da resposta anterior; vazio responde na hora.","example":"queued::"},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"type":"string"},"description":"A organização em que o pedido age (sem ele, a conta pessoal); o vínculo e o papel são conferidos na conta."}],"responses":{"200":{"description":"{ job, mark, result_url }","content":{"application/json":{"schema":{"type":"object","properties":{"job":{"type":"object","description":"O job: `status`, `progress_pct` e `stage`."},"mark":{"type":"string","description":"A marca do estado, para o próximo `desde`."},"result_url":{"type":"string","description":"Onde baixar o resultado, com o job concluído."}},"required":["job","mark","result_url"]}}}},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem o aceite dos Termos e da retenção legal (`terms_required`)."},"404":{"description":"Job desconhecido para esta organização (`rn_job_not_found`)."}}},"delete":{"operationId":"delete_api_app_lab_jobs_by_id","summary":"Cancela um job do laboratório que ainda está na fila.","description":"Devolve: { status }","security":[{"globalAccount":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"O id do job do laboratório.","example":"rnj_0123456789abcdef0123456789abcdef"},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"type":"string"},"description":"A organização em que o pedido age (sem ele, a conta pessoal); o vínculo e o papel são conferidos na conta."}],"responses":{"200":{"description":"{ status }","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"`cancelled`."}},"required":["status"]}}}},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem o aceite dos Termos e da retenção legal (`terms_required`)."},"404":{"description":"Job desconhecido para esta organização."},"409":{"description":"O job já saiu da fila (`rn_job_not_cancellable`)."}}}},"/api/app/lab/jobs/{id}/result":{"get":{"operationId":"get_api_app_lab_jobs_by_id_result","summary":"O resultado do job concluído: o arquivo (o áudio gerado) ou o JSON, sem os dados pessoais.","description":"Devolve: { job, result }","security":[{"globalAccount":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"O id do job do laboratório.","example":"rnj_0123456789abcdef0123456789abcdef"},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"type":"string"},"description":"A organização em que o pedido age (sem ele, a conta pessoal); o vínculo e o papel são conferidos na conta."}],"responses":{"200":{"description":"{ job, result }","content":{"application/json":{"schema":{"type":"object","properties":{"job":{"type":"object","description":"O job concluído, quando o resultado é JSON."},"result":{"type":"object","description":"O resultado em JSON (texto, páginas ou campos), já sem os dados pessoais; áudio vem como o próprio arquivo."}},"required":["job","result"]}}}},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem o aceite dos Termos e da retenção legal (`terms_required`)."},"404":{"description":"Job desconhecido para esta organização."},"409":{"description":"O job ainda não terminou."}}}},"/api/public/stats":{"get":{"operationId":"get_api_public_stats","summary":"Os números públicos da home: pedidos, tokens e dados pessoais tratados, os modelos mais usados e os 14 dias.","description":"Devolve: { totals, last_30_days, top_models, series }","security":[],"responses":{"200":{"description":"{ totals, last_30_days, top_models, series }","content":{"application/json":{"schema":{"type":"object","properties":{"totals":{"type":"object","description":"`requests`, `tokens`, `pii_items` e `active_models`, desde o início."},"last_30_days":{"type":"object","description":"`requests`, `tokens` e `pii_items` dos últimos 30 dias."},"top_models":{"type":"array","items":{"type":"object"},"description":"Os mais usados em 30 dias: `id`, `display_name`, `requests` e `tokens`."},"series":{"type":"array","items":{"type":"object"},"description":"Um dia por item: `date`, `requests` e `tokens`."}},"required":["totals","last_30_days","top_models","series"]}}}}}}},"/api/public/contact":{"post":{"operationId":"post_api_public_contact","summary":"O formulário de contato do site: a mensagem chega à equipe pelo contato da casa.","description":"Devolve: { ok }","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Como chamar quem escreve."},"email":{"type":"string","description":"Para onde responder."},"message":{"type":"string","description":"O que você quer dizer: o piloto, a dúvida ou a proposta."},"organization":{"type":"string","description":"A organização de quem escreve."},"role_title":{"type":"string","description":"O cargo de quem escreve, para a equipe saber com quem fala."},"phone":{"type":"string","description":"Um telefone, se preferir."},"intent":{"type":"string","description":"O objetivo: `piloto`, `contratacao`, `duvida` ou `parceria`."},"source_path":{"type":"string","description":"A página de onde a mensagem saiu."}},"required":["name","email","message"]}}}},"responses":{"200":{"description":"{ ok }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"`true` quando a mensagem foi aceita."}},"required":["ok"]}}}},"400":{"description":"Validação: nome, e-mail ou mensagem."},"503":{"description":"O contato não está configurado neste servidor."}}}},"/api/public/analytics":{"post":{"operationId":"post_api_public_analytics","summary":"A medida de visita das páginas, sem terceiros: a `page_view` conta como a visita da casa; o resto é aceito sem registro.","description":"","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"event_type":{"type":"string","description":"`page_view` conta a visita."},"path":{"type":"string","description":"A página visitada."}},"required":["event_type"]}}}},"responses":{"200":{"description":"OK"}}}},"/api/radar":{"get":{"operationId":"listar_radar","summary":"Bookmarks atualizados diariamente, com notícias, fatos relevantes e fonte original.","description":"Todo o histórico público dos bookmarks, inclusive os que renderam Guia. O modelo decide quando há orientação útil ao RN; segurança fica em Cyber. Navegue por page ou leia /pt/radar/feed.json e /pt/radar/feed.xml. Páginas `/pt/radar/` e `/en/radar/`.\nDevolve: { total, pagina, paginas, itens }","security":[],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"number"},"description":"A página, de 1 em diante. Vinte peças por página, até o fim do acervo."}],"responses":{"200":{"description":"{ total, pagina, paginas, itens }","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number","description":"Quantas peças a lista tem."},"pagina":{"type":"number","description":"A página devolvida."},"paginas":{"type":"number","description":"Quantas páginas existem."},"itens":{"type":"array","items":{"type":"object"},"description":"As peças desta página."}},"required":["total","pagina","paginas","itens"]}}}}}}},"/api/cyber":{"get":{"operationId":"listar_cyber","summary":"Notícias de segurança, advisories e assuntos relacionados.","description":"Todo o histórico Cyber, sem notícias gerais da Inova e sem gerar Guias. Navegue por page ou leia /pt/cyber/feed.json e /pt/cyber/feed.xml. Páginas `/pt/cyber/` e `/en/cyber/`.\nDevolve: { total, pagina, paginas, itens }","security":[],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"number"},"description":"A página, de 1 em diante. Vinte peças por página, até o fim do acervo."}],"responses":{"200":{"description":"{ total, pagina, paginas, itens }","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number","description":"Quantas peças a lista tem."},"pagina":{"type":"number","description":"A página devolvida."},"paginas":{"type":"number","description":"Quantas páginas existem."},"itens":{"type":"array","items":{"type":"object"},"description":"As peças desta página."}},"required":["total","pagina","paginas","itens"]}}}}}}},"/api/guias":{"get":{"operationId":"listar_guias","summary":"Guias práticos com passos, critérios de verificação e fontes.","description":"Derivados somente dos bookmarks do Radar quando o modelo encontra uma tarefa útil ao usuário do RN. Tamanho sozinho não basta; Cyber e notícias gerais da Inova não geram Guias. Páginas `/pt/guias/<slug>/` e `/en/guides/<slug>/`.\nDevolve: { total, pagina, paginas, itens }","security":[],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"number"},"description":"A página, de 1 em diante. Vinte peças por página, até o fim do acervo."}],"responses":{"200":{"description":"{ total, pagina, paginas, itens }","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number","description":"Quantas peças a lista tem."},"pagina":{"type":"number","description":"A página devolvida."},"paginas":{"type":"number","description":"Quantas páginas existem."},"itens":{"type":"array","items":{"type":"object"},"description":"As peças desta página."}},"required":["total","pagina","paginas","itens"]}}}}}}},"/api/radar/{slug}":{"get":{"operationId":"get_api_radar_by_slug","summary":"Uma peça do radar, em português e inglês, com a fonte e o teste grátis.","description":"Devolve: { slug, fonte, guia, imagem, pt, en, original, teste }","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"O slug estável da peça.","example":"prompt-em-log-aberto"}],"responses":{"200":{"description":"{ slug, fonte, guia, imagem, pt, en, original, teste }","content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string","description":"O endereço estável da peça."},"fonte":{"type":"string","description":"`briefing` (bookmark do Radar) ou `cyber` (segurança)."},"guia":{"type":"boolean","description":"`true` para um guia prático, com texto e endereço próprios."},"imagem":{"type":"object","description":"Quando disponível: capa WebP, OG JPEG e texto alternativo em português e inglês."},"pt":{"type":"object","description":"Título, resumo, corpo, como a Rota ajuda e como usar, em português, e a página."},"en":{"type":"object","description":"The same fields in English, plus the page URL."},"original":{"type":"object","description":"A fonte original: `url` e `titulo`."},"teste":{"type":"object","description":"O teste grátis de 30 dias, em `/pt/app/experimentar/` e `/en/app/try/`."}},"required":["slug","fonte","guia","imagem","pt","en","original","teste"]}}}},"404":{"description":"Slug não publicado."}}}},"/api/cyber/{slug}":{"get":{"operationId":"get_api_cyber_by_slug","summary":"Uma publicação de cyber, em português e inglês.","description":"Devolve: { slug, fonte, guia, imagem, pt, en, original, teste }","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Slug publicado nesta área.","example":"acesso-remoto-e-ia-reduza-o-d6ed11"}],"responses":{"200":{"description":"{ slug, fonte, guia, imagem, pt, en, original, teste }","content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string","description":"O endereço estável da peça."},"fonte":{"type":"string","description":"`briefing` (bookmark do Radar) ou `cyber` (segurança)."},"guia":{"type":"boolean","description":"`true` para um guia prático, com texto e endereço próprios."},"imagem":{"type":"object","description":"Quando disponível: capa WebP, OG JPEG e texto alternativo em português e inglês."},"pt":{"type":"object","description":"Título, resumo, corpo, como a Rota ajuda e como usar, em português, e a página."},"en":{"type":"object","description":"The same fields in English, plus the page URL."},"original":{"type":"object","description":"A fonte original: `url` e `titulo`."},"teste":{"type":"object","description":"O teste grátis de 30 dias, em `/pt/app/experimentar/` e `/en/app/try/`."}},"required":["slug","fonte","guia","imagem","pt","en","original","teste"]}}}},"404":{"description":"Slug não publicado nesta área."}}}},"/api/guias/{slug}":{"get":{"operationId":"get_api_guias_by_slug","summary":"Uma publicação de guias, em português e inglês.","description":"Devolve: { slug, fonte, guia, imagem, pt, en, original, teste }","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Slug publicado nesta área.","example":"como-comparar-modelos-sem-expor-documentos-5e896a"}],"responses":{"200":{"description":"{ slug, fonte, guia, imagem, pt, en, original, teste }","content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string","description":"O endereço estável da peça."},"fonte":{"type":"string","description":"`briefing` (bookmark do Radar) ou `cyber` (segurança)."},"guia":{"type":"boolean","description":"`true` para um guia prático, com texto e endereço próprios."},"imagem":{"type":"object","description":"Quando disponível: capa WebP, OG JPEG e texto alternativo em português e inglês."},"pt":{"type":"object","description":"Título, resumo, corpo, como a Rota ajuda e como usar, em português, e a página."},"en":{"type":"object","description":"The same fields in English, plus the page URL."},"original":{"type":"object","description":"A fonte original: `url` e `titulo`."},"teste":{"type":"object","description":"O teste grátis de 30 dias, em `/pt/app/experimentar/` e `/en/app/try/`."}},"required":["slug","fonte","guia","imagem","pt","en","original","teste"]}}}},"404":{"description":"Slug não publicado nesta área."}}}},"/api/conteudo/novidades":{"get":{"operationId":"listar_novidades","summary":"IDs e datas das publicações de Radar, Cyber e Guias.","description":"O navegador compara com as peças já vistas, sem enviar o histórico de leitura ao servidor.\nDevolve: { areas }","security":[],"responses":{"200":{"description":"{ areas }","content":{"application/json":{"schema":{"type":"object","properties":{"areas":{"type":"object","description":"Por área: total e itens com id e publicado_em."}},"required":["areas"]}}}}}}},"/api/newsletter":{"get":{"operationId":"get_api_newsletter","summary":"Preferências de newsletter da conta autenticada.","description":"Devolve: { ativo, areas, idioma, verificado }","security":[{"globalAccount":[]}],"responses":{"200":{"description":"{ ativo, areas, idioma, verificado }","content":{"application/json":{"schema":{"type":"object","properties":{"ativo":{"type":"boolean","description":"Consentimento ativo."},"areas":{"type":"array","items":{"type":"string"},"description":"radar, cyber e/ou guias."},"idioma":{"type":"string","description":"pt ou en."},"verificado":{"type":"boolean","description":"A conta tem e-mail verificado."}},"required":["ativo","areas","idioma","verificado"]}}}},"401":{"description":"Entre na conta."},"503":{"description":"Newsletter indisponível."}}},"put":{"operationId":"put_api_newsletter","summary":"Salvar ou cancelar a newsletter, com consentimento explícito.","description":"Exige mesma origem e CSRF do SDK. Nunca recebe ID de conta nem endereço de e-mail. Só ativa a assinatura com e-mail verificado.\nDevolve: { ok, ativo, areas, idioma }","security":[{"globalAccount":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ativo":{"type":"boolean","description":"true para assinar, false para cancelar."},"areas":{"type":"array","items":{"type":"string"},"description":"radar, cyber e/ou guias."},"idioma":{"type":"string","description":"Idioma do resumo: pt (português) ou en (inglês)."},"consentimento":{"type":"boolean","description":"true somente quando a pessoa autorizou o recebimento."}},"required":["ativo","areas","idioma","consentimento"]},"example":{"ativo":true,"areas":["guias"],"idioma":"pt","consentimento":true}}}},"responses":{"200":{"description":"{ ok, ativo, areas, idioma }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"Preferências salvas."},"ativo":{"type":"boolean","description":"Assinatura ativa."},"areas":{"type":"array","items":{"type":"string"},"description":"Assuntos escolhidos."},"idioma":{"type":"string","description":"pt ou en."}},"required":["ok","ativo","areas","idioma"]}}}},"400":{"description":"Seleção inválida."},"401":{"description":"Entre na conta."},"403":{"description":"E-mail verificado ou CSRF exigido."},"429":{"description":"Limite de alterações."},"503":{"description":"Newsletter indisponível."}}}},"/api/newsletter/cancelar":{"post":{"operationId":"post_api_newsletter_cancelar","summary":"Cancelar pelo token do link recebido no e-mail.","description":"O token é uma autorização restrita de cancelamento. GET não cancela. A interface pede confirmação; clientes de e-mail usam List-Unsubscribe=One-Click.\nDevolve: { ok }","security":[],"parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string"},"description":"Alternativa ao corpo no POST one-click de e-mail."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","description":"Token de cancelamento do e-mail, 43 caracteres."}},"required":["token"]}}}},"responses":{"200":{"description":"{ ok }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"Assinatura cancelada."}},"required":["ok"]}}}},"400":{"description":"Token ou confirmação inválidos."},"404":{"description":"Token desconhecido ou vencido."}}}},"/api/pricing":{"get":{"operationId":"pricing","summary":"Preços vigentes e franquias gratuitas.","description":"Devolve: { product, quota{free,paid,how_to_pay,live,free_now?,charged_now?,trial?}, pricing, billing, api_index }","security":[],"responses":{"200":{"description":"{ product, quota{free,paid,how_to_pay,live,free_now?,charged_now?,trial?}, pricing, billing, api_index }","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string","description":"Product name."},"quota":{"allOf":[{"$ref":"#/components/schemas/PaymentQuota"}],"description":"Public allowances and current list prices; not personal usage."},"pricing":{"type":"string","description":"Absolute URL of the current price list."},"billing":{"type":"string","description":"Absolute URL of payment discovery or the existing billing summary."},"api_index":{"type":"string","description":"Absolute URL of the API catalog."}},"required":["product","quota","pricing","billing","api_index"]}}}},"405":{"description":"Use GET ou HEAD."}}}},"/api/billing":{"get":{"operationId":"billing","summary":"Descoberta pública de pagamento e crédito pré-pago.","description":"Devolve: { product, quota{free,paid,how_to_pay,live,free_now?,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} }","security":[],"responses":{"200":{"description":"{ 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} }","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string","description":"Product name."},"quota":{"allOf":[{"$ref":"#/components/schemas/PaymentQuota"}],"description":"Public allowances and current list prices; not personal usage."},"pricing":{"type":"string","description":"Absolute URL of the current price list."},"billing":{"type":"string","description":"Absolute URL of payment discovery or the existing billing summary."},"api_index":{"type":"string","description":"Absolute URL of the API catalog."},"payment":{"allOf":[{"$ref":"#/components/schemas/PaymentX402"}],"description":"Public x402 configuration; pay_to=null means not configured."},"credit":{"allOf":[{"$ref":"#/components/schemas/PaymentCredit"}],"description":"Prepaid credit entry point. Never contains a balance or token."}},"required":["product","quota","pricing","billing","api_index","payment","credit"]}}}},"405":{"description":"Use GET ou HEAD."}}}}}}