{"openapi":"3.1.0","info":{"title":"Rota Nacional","version":"3e62f061","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://inferencia.inova.in/","apiReference":"https://inferencia.inova.in/developers","llms":"https://inferencia.inova.in/llms.txt"}},"servers":[{"url":"https://inferencia.inova.in"}],"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":"Credit token in `Authorization: Bearer cred_…` or `X-Credito`. For recovered x402 funds, use the wallet credential mmw_… in Bearer or X-Wallet-Token, issued through /api/auth/wallet/agent/start and /api/auth/wallet/agent/token."},"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, check that the domain and URI of the message are the host and origin that you called, 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 da plataforma que entrou com passkey, autenticador ou código de recuperação; nos demais casos, null. O servidor deriva esse campo da conta autenticada. authTime é a hora da entrada de uma sessão do navegador; numa chave de API ou num token OAuth, é null.\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 feita há até 2 horas; a de organização também exige segundo fator na sessão e o papel de dona/administradora com o produto ligado. No máximo 10 chaves vivas por conta e produto. A chave (`secret`) volta UMA vez.\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/account/apps":{"get":{"operationId":"get_api_account_apps","summary":"Lista os apps conectados à sua conta neste produto.","description":"Os clientes de MCP em que você entrou com a conta (OAuth), como o claude.ai ou o ChatGPT. Nunca devolve token.\nDevolve: { apps }","security":[{"globalAccount":[]}],"responses":{"200":{"description":"{ apps }","content":{"application/json":{"schema":{"type":"object","properties":{"apps":{"type":"array","items":{"type":"object"},"description":"Até 50: `id`, `nome` (o app; o host dele quando ele se identifica por documento de metadados), `criadoEm`, `usadoEm` (por hora, ou null)."}},"required":["apps"]}}}},"401":{"description":"invalid_session"},"503":{"description":"auth_unavailable"}}}},"/api/account/apps/revoke":{"post":{"operationId":"post_api_account_apps_revoke","summary":"Desconecta um app da sua conta.","description":"Para o acesso do app na hora; ele pede o login de novo. 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` do app."}},"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_app_id"},"401":{"description":"invalid_session"},"403":{"description":"invalid_origin / invalid_csrf"},"404":{"description":"app_not_found"},"503":{"description":"auth_unavailable"}}}},"/api/account/callouts":{"get":{"operationId":"get_api_account_callouts","summary":"Lista os avisos que você fechou neste produto.","description":"As chaves dos avisos que ficam fechados para a sua conta, em todo aparelho, como a explicação de uma área.\nDevolve: { callouts }","security":[{"globalAccount":[]}],"responses":{"200":{"description":"{ callouts }","content":{"application/json":{"schema":{"type":"object","properties":{"callouts":{"type":"array","items":{"type":"string"},"description":"Até 200 chaves, em ordem alfabética."}},"required":["callouts"]}}}},"401":{"description":"invalid_session"},"403":{"description":"product_required"},"503":{"description":"auth_unavailable"}}}},"/api/account/callouts/dismiss":{"post":{"operationId":"post_api_account_callouts_dismiss","summary":"Fecha um aviso de vez.","description":"O aviso não abre de novo para a sua conta neste produto. Repetir não faz mal.\nDevolve: { ok }","security":[{"globalAccount":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string","description":"A chave do aviso: letras, números e `_.:-`, até 80."}},"required":["key"]},"example":{"key":"financeiro_expense"}}}},"responses":{"200":{"description":"{ ok }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"true"}},"required":["ok"]}}}},"400":{"description":"invalid_callout"},"401":{"description":"invalid_session"},"403":{"description":"invalid_origin / invalid_csrf"},"409":{"description":"too_many_callouts"},"503":{"description":"auth_unavailable"}}}},"/api/account/callouts/reopen":{"post":{"operationId":"post_api_account_callouts_reopen","summary":"Reabre um aviso fechado.","description":"Desfaz o fechar: o aviso volta para a sua conta neste produto. O produto guarda aqui também uma escolha de ligar e desligar, como os valores ocultos do Financeiro. Repetir não faz mal.\nDevolve: { ok }","security":[{"globalAccount":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string","description":"A chave do aviso: letras, números e `_.:-`, até 80."}},"required":["key"]},"example":{"key":"financeiro_expense"}}}},"responses":{"200":{"description":"{ ok }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"true"}},"required":["ok"]}}}},"400":{"description":"invalid_callout"},"401":{"description":"invalid_session"},"403":{"description":"invalid_origin / invalid_csrf"},"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. Antes de assinar, compare a mensagem com a URL chamada. O domínio da primeira linha deve ser o host dessa URL. O URI deve ser a origem dela. Se um deles for diferente, não assine. Assine com personal_sign e envie a /api/auth/wallet/agent/token.\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/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`. Só o aviso da própria página conta: a chamada de fora de uma página do mesmo site (User-Agent de robô, ou sem `Sec-Fetch-Site: same-origin`) volta com `counted: false` e `reason: \"robo\"`.\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":"Cursores por produto: `borda`, `borda5xx` (só 5xx) e `cli`. Só com token do operador.","description":"Devolve: JSON: `{ [produto]: { borda?: ISO, borda5xx?: 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, borda5xx?: 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. Para voz, envie multipart/form-data: `dados` contém este JSON (até 32 KiB) e `audio` contém um arquivo de áudio WebM, Ogg ou M4A (até 2 MB). O áudio pode substituir message. O navegador grava até dois minutos. O áudio vai como anexo ao e-mail do dono.\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`)."},"whatsapp":{"type":"string","description":"Número opcional para resposta, com código do país. Ex.: +5561999999999."},"prefer_whatsapp":{"type":"boolean","description":"Pede resposta por WhatsApp. Exige whatsapp."},"tipo":{"type":"string","description":"Proposta: `patrocinio`, `parceria`, `anuncio` ou `consultoria`. 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":"Anúncio: `ate_100`, `100_500`, `500_2000`, `2000_mais` ou `a_combinar`. Consultoria, em dólar: `ate_2000`, `2000_5000`, `5000_10000`, `10000_mais` ou `nao_sei`."},"espaco":{"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`."},"projeto":{"type":"string","description":"Consultoria: o tipo de projeto (`llm_privado`, `voz`, `dados_sensiveis`, `gpu`, `integracao` ou `outro`)."},"prazo":{"type":"string","description":"Consultoria: quando começar (`agora`, `1_mes`, `1_3_meses` ou `explorando`)."},"formato":{"type":"string","description":"Consultoria: `projeto` (por escopo), `mensal` ou `assessoria`."},"pais":{"type":"string","description":"Consultoria: o país de quem pede."},"fuso":{"type":"string","description":"Consultoria: o fuso IANA, como `America/New_York`."},"horarios":{"type":"array","items":{"type":"string"},"description":"Consultoria: até 3 horários para a conversa, `AAAA-MM-DDTHH:MM` na hora do fuso."}},"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/x402/saude":{"get":{"operationId":"get_api_credito_x402_saude","summary":"Saúde do verificador x402: pendências, falta de hash e falha ou parada da conciliação.","description":"Devolve: { verificado_em, ativo, tarefas }","security":[],"responses":{"200":{"description":"{ verificado_em, ativo, tarefas }","content":{"application/json":{"schema":{"type":"object","properties":{"verificado_em":{"type":"string","description":"Hora da leitura, em UTC."},"ativo":{"type":"object","description":"Verificador configurado no processo."},"tarefas":{"type":"array","items":{"type":"object"},"description":"Falhas com id e motivo, sem dados do pagador. Contagem limitada indica +."}},"required":["verificado_em","ativo","tarefas"]}}}},"503":{"description":"Verificador indisponível neste processo."}}}},"/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, usar_com_outra_credencial, saldo_em, onde_gastar }","x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.1","max":"25"},"protocols":[{"x402":{}}]},"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, usar_com_outra_credencial, saldo_em, onde_gastar }","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."},"usar_com_outra_credencial":{"type":"string","description":"O header `X-Credito`, para quando o `Authorization` já leva outra credencial."},"saldo_em":{"type":"string","description":"Onde consultar saldo e extrato."},"onde_gastar":{"type":"object","description":"`precos`: as ações pagas e os preços deste produto (`/api/pricing`); `produtos`: o APIs.json com os outros produtos da casa."}},"required":["token","saldo_usd","guarde","usar","usar_com_outra_credencial","saldo_em","onde_gastar"]}}}},"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 com cred_…; com mmw_…, saldo da carteira e até 20 pagamentos em recuperação.","description":"Devolve: { saldo_micros, saldo_usd, criado_em, movimentos, wallet, payments, proximo, onde_gastar }","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, wallet, payments, proximo, onde_gastar }","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."},"wallet":{"type":"string","description":"Só com mmw_…: endereço autenticado da carteira."},"payments":{"type":"array","items":{"type":"object"},"description":"Só com mmw_…: até 20 pagamentos, com id, produto, rede, tx_hash, micros, estado e criado_ms. creditado indica saldo recuperado."},"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."},"onde_gastar":{"type":"object","description":"`precos`: as ações pagas e os preços deste produto; `produtos`: o APIs.json com os outros produtos da casa."}},"required":["saldo_micros","saldo_usd","criado_em","movimentos","wallet","payments","proximo","onde_gastar"]}}}},"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/providers/{provider}/v1/chat/completions":{"post":{"operationId":"post_v1_providers_provider_v1_chat_completions","summary":"Native chat completions","description":"Requires an organization API key and an active private provider connection with native consent. The original provider body and model are preserved. Personal data is sent without the privacy barrier. Use the protected rota/* catalog when the request requires that barrier. Resources remain scoped to the organization and the connection that created them. A submitted request is not retried by the gateway. Provider charges remain on the connected provider account.\nDevolve: The native provider response. Streaming requests retain the native event stream.\nSend the original native JSON body. JSON is limited to 32 MiB. Examples use synthetic text. FILE_ID, BATCH_ID and INPUT_FILE_ID must come from successful gateway responses in this organization. Batch input requires a validated file uploaded with purpose=batch.","security":[{"contaChaveApi":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string"},"description":"The provider identifier configured by the administrator.","example":"openai"},{"name":"X-RN-Connection-Id","in":"header","required":false,"schema":{"type":"string"},"description":"Optional private connection identifier. Existing resources retain their original connection."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The native provider response. Streaming requests retain the native event stream."},"400":{"description":"Invalid or unsupported native input."},"401":{"description":"An organization API key is required."},"403":{"description":"The organization or network policy denied access."},"404":{"description":"The resource is not registered in this organization, or the endpoint is unsupported."},"409":{"description":"Referenced resources use different connections."},"413":{"description":"The request exceeds the body limit."},"429":{"description":"The request rate or a provider limit was exceeded."},"503":{"description":"No active private connection is available for this organization and provider."}}}},"/v1/providers/openai/v1/responses":{"post":{"operationId":"native_responses","summary":"Native OpenAI Responses request","description":"Requires an organization API key and an active private provider connection with native consent. The original provider body and model are preserved. Personal data is sent without the privacy barrier. Use the protected rota/* catalog when the request requires that barrier. Resources remain scoped to the organization and the connection that created them. A submitted request is not retried by the gateway. Provider charges remain on the connected provider account.\nDevolve: The native provider response. Streaming requests retain the native event stream.\nSend the original native JSON body. JSON is limited to 32 MiB. Examples use synthetic text. FILE_ID, BATCH_ID and INPUT_FILE_ID must come from successful gateway responses in this organization. Batch input requires a validated file uploaded with purpose=batch.","security":[{"contaChaveApi":[]}],"parameters":[{"name":"X-RN-Connection-Id","in":"header","required":false,"schema":{"type":"string"},"description":"Optional private connection identifier. Existing resources retain their original connection."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The native provider response. Streaming requests retain the native event stream."},"400":{"description":"Invalid or unsupported native input."},"401":{"description":"An organization API key is required."},"403":{"description":"The organization or network policy denied access."},"404":{"description":"The resource is not registered in this organization, or the endpoint is unsupported."},"409":{"description":"Referenced resources use different connections."},"413":{"description":"The request exceeds the body limit."},"429":{"description":"The request rate or a provider limit was exceeded."},"503":{"description":"No active private connection is available for this organization and provider."}}}},"/v1/providers/{provider}/v1/messages":{"post":{"operationId":"post_v1_providers_provider_v1_messages","summary":"Native Messages request","description":"Requires an organization API key and an active private provider connection with native consent. The original provider body and model are preserved. Personal data is sent without the privacy barrier. Use the protected rota/* catalog when the request requires that barrier. Resources remain scoped to the organization and the connection that created them. A submitted request is not retried by the gateway. Provider charges remain on the connected provider account.\nDevolve: The native provider response. Streaming requests retain the native event stream.\nSend the original native JSON body. JSON is limited to 32 MiB. Examples use synthetic text. FILE_ID, BATCH_ID and INPUT_FILE_ID must come from successful gateway responses in this organization. Batch input requires a validated file uploaded with purpose=batch.","security":[{"contaChaveApi":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string"},"description":"The provider identifier configured by the administrator.","example":"anthropic"},{"name":"X-RN-Connection-Id","in":"header","required":false,"schema":{"type":"string"},"description":"Optional private connection identifier. Existing resources retain their original connection."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The native provider response. Streaming requests retain the native event stream."},"400":{"description":"Invalid or unsupported native input."},"401":{"description":"An organization API key is required."},"403":{"description":"The organization or network policy denied access."},"404":{"description":"The resource is not registered in this organization, or the endpoint is unsupported."},"409":{"description":"Referenced resources use different connections."},"413":{"description":"The request exceeds the body limit."},"429":{"description":"The request rate or a provider limit was exceeded."},"503":{"description":"No active private connection is available for this organization and provider."}}}},"/v1/providers/{provider}/v1beta/models/{model}:generateContent":{"post":{"operationId":"post_v1_providers_provider_v1beta_models_model_generatecontent","summary":"Native content generation","description":"Requires an organization API key and an active private provider connection with native consent. The original provider body and model are preserved. Personal data is sent without the privacy barrier. Use the protected rota/* catalog when the request requires that barrier. Resources remain scoped to the organization and the connection that created them. A submitted request is not retried by the gateway. Provider charges remain on the connected provider account.\nDevolve: The native provider response. Streaming requests retain the native event stream.\nSend the original native JSON body. JSON is limited to 32 MiB. Examples use synthetic text. FILE_ID, BATCH_ID and INPUT_FILE_ID must come from successful gateway responses in this organization. Batch input requires a validated file uploaded with purpose=batch.","security":[{"contaChaveApi":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string"},"description":"The provider identifier configured by the administrator.","example":"gemini"},{"name":"model","in":"path","required":true,"schema":{"type":"string"},"description":"An available model identifier from the connected provider.","example":"gemini-3.5-flash"},{"name":"X-RN-Connection-Id","in":"header","required":false,"schema":{"type":"string"},"description":"Optional private connection identifier. Existing resources retain their original connection."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The native provider response. Streaming requests retain the native event stream."},"400":{"description":"Invalid or unsupported native input."},"401":{"description":"An organization API key is required."},"403":{"description":"The organization or network policy denied access."},"404":{"description":"The resource is not registered in this organization, or the endpoint is unsupported."},"409":{"description":"Referenced resources use different connections."},"413":{"description":"The request exceeds the body limit."},"429":{"description":"The request rate or a provider limit was exceeded."},"503":{"description":"No active private connection is available for this organization and provider."}}}},"/v1/providers/{provider}/v1beta/models/{model}:streamGenerateContent":{"post":{"operationId":"post_v1_providers_provider_v1beta_models_model_streamgeneratecontent","summary":"Native content stream","description":"Requires an organization API key and an active private provider connection with native consent. The original provider body and model are preserved. Personal data is sent without the privacy barrier. Use the protected rota/* catalog when the request requires that barrier. Resources remain scoped to the organization and the connection that created them. A submitted request is not retried by the gateway. Provider charges remain on the connected provider account.\nDevolve: The native provider response. Streaming requests retain the native event stream.\nSend the original native JSON body. JSON is limited to 32 MiB. Examples use synthetic text. FILE_ID, BATCH_ID and INPUT_FILE_ID must come from successful gateway responses in this organization. Batch input requires a validated file uploaded with purpose=batch.","security":[{"contaChaveApi":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string"},"description":"The provider identifier configured by the administrator.","example":"gemini"},{"name":"model","in":"path","required":true,"schema":{"type":"string"},"description":"An available model identifier from the connected provider.","example":"gemini-3.5-flash"},{"name":"X-RN-Connection-Id","in":"header","required":false,"schema":{"type":"string"},"description":"Optional private connection identifier. Existing resources retain their original connection."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The native provider response. Streaming requests retain the native event stream."},"400":{"description":"Invalid or unsupported native input."},"401":{"description":"An organization API key is required."},"403":{"description":"The organization or network policy denied access."},"404":{"description":"The resource is not registered in this organization, or the endpoint is unsupported."},"409":{"description":"Referenced resources use different connections."},"413":{"description":"The request exceeds the body limit."},"429":{"description":"The request rate or a provider limit was exceeded."},"503":{"description":"No active private connection is available for this organization and provider."}}}},"/v1/providers/{provider}/v1/batches":{"post":{"operationId":"post_v1_providers_provider_v1_batches","summary":"Create a native batch","description":"Requires an organization API key and an active private provider connection with native consent. The original provider body and model are preserved. Personal data is sent without the privacy barrier. Use the protected rota/* catalog when the request requires that barrier. Resources remain scoped to the organization and the connection that created them. A submitted request is not retried by the gateway. Provider charges remain on the connected provider account.\nDevolve: The native provider response. Streaming requests retain the native event stream.\nSend the original native JSON body. JSON is limited to 32 MiB. Examples use synthetic text. FILE_ID, BATCH_ID and INPUT_FILE_ID must come from successful gateway responses in this organization. Batch input requires a validated file uploaded with purpose=batch.","security":[{"contaChaveApi":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string"},"description":"The provider identifier configured by the administrator.","example":"openai"},{"name":"X-RN-Connection-Id","in":"header","required":false,"schema":{"type":"string"},"description":"Optional private connection identifier. Existing resources retain their original connection."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The native provider response. Streaming requests retain the native event stream."},"400":{"description":"Invalid or unsupported native input."},"401":{"description":"An organization API key is required."},"403":{"description":"The organization or network policy denied access."},"404":{"description":"The resource is not registered in this organization, or the endpoint is unsupported."},"409":{"description":"Referenced resources use different connections."},"413":{"description":"The request exceeds the body limit."},"429":{"description":"The request rate or a provider limit was exceeded."},"503":{"description":"No active private connection is available for this organization and provider."}}}},"/v1/providers/{provider}/v1/batches/{id}":{"get":{"operationId":"get_v1_providers_provider_v1_batches_id","summary":"Read an owned native batch","description":"Requires an organization API key and an active private provider connection with native consent. The original provider body and model are preserved. Personal data is sent without the privacy barrier. Use the protected rota/* catalog when the request requires that barrier. Resources remain scoped to the organization and the connection that created them. A submitted request is not retried by the gateway. Provider charges remain on the connected provider account.\nDevolve: The native provider response. Streaming requests retain the native event stream.","security":[{"contaChaveApi":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string"},"description":"The provider identifier configured by the administrator.","example":"openai"},{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"A resource identifier returned through this gateway to this organization."},{"name":"X-RN-Connection-Id","in":"header","required":false,"schema":{"type":"string"},"description":"Optional private connection identifier. Existing resources retain their original connection."}],"responses":{"200":{"description":"The native provider response. Streaming requests retain the native event stream."},"400":{"description":"Invalid or unsupported native input."},"401":{"description":"An organization API key is required."},"403":{"description":"The organization or network policy denied access."},"404":{"description":"The resource is not registered in this organization, or the endpoint is unsupported."},"409":{"description":"Referenced resources use different connections."},"413":{"description":"The request exceeds the body limit."},"429":{"description":"The request rate or a provider limit was exceeded."},"503":{"description":"No active private connection is available for this organization and provider."}}}},"/v1/providers/{provider}/v1/files/{id}/content":{"get":{"operationId":"get_v1_providers_provider_v1_files_id_content","summary":"Read an owned native file","description":"Requires an organization API key and an active private provider connection with native consent. The original provider body and model are preserved. Personal data is sent without the privacy barrier. Use the protected rota/* catalog when the request requires that barrier. Resources remain scoped to the organization and the connection that created them. A submitted request is not retried by the gateway. Provider charges remain on the connected provider account.\nDevolve: The native provider response. Streaming requests retain the native event stream.","security":[{"contaChaveApi":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string"},"description":"The provider identifier configured by the administrator.","example":"openai"},{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"A resource identifier returned through this gateway to this organization."},{"name":"X-RN-Connection-Id","in":"header","required":false,"schema":{"type":"string"},"description":"Optional private connection identifier. Existing resources retain their original connection."}],"responses":{"200":{"description":"The native provider response. Streaming requests retain the native event stream."},"400":{"description":"Invalid or unsupported native input."},"401":{"description":"An organization API key is required."},"403":{"description":"The organization or network policy denied access."},"404":{"description":"The resource is not registered in this organization, or the endpoint is unsupported."},"409":{"description":"Referenced resources use different connections."},"413":{"description":"The request exceeds the body limit."},"429":{"description":"The request rate or a provider limit was exceeded."},"503":{"description":"No active private connection is available for this organization and provider."}}}},"/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: { data, job, model }","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":"{ data, job, model }","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"},"description":"Vetores na ordem dos textos, no formato da OpenAI."},"job":{"type":"object","description":"Recibo com id e result_url para recuperar o resultado sem nova cobrança."},"model":{"type":"string","description":"O modelo da rota."}},"required":["data","job","model"]}}}},"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":{"markdown":{"type":"string","description":"O documento em Markdown, de 1 a 2.000.000 caracteres."},"instructions":{"type":"string","description":"Instruções da revisão, de 1 a 20.000 caracteres."},"schema":{"type":"object","description":"O esquema JSON do resultado esperado."},"pages":{"type":"array","items":{"type":"object"},"description":"De 1 a 40 páginas. Cada uma contém page (inteiro positivo), mime (image/…) e dataBase64 (imagem em base64)."}}}}}},"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"]}}}},"400":{"description":"Formato inválido (`invalid_input`): nada é cobrado nem enviado à fila."},"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, `reset_at` e a franquia grátis do dia (`free_tier`, como em `/api/app/quota`)."},"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`. `free_tier`: a franquia grátis do dia (`model`, `daily_request_limit`, `daily_token_limit`, `requests_today`, `tokens_today` e `resets_at`), ou `null` quando ela está desligada."}},"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/playground":{"post":{"operationId":"post_api_app_playground","summary":"Experimenta um modelo pela sessão do painel, com a política, a cota e a cobrança da organização.","description":"Até 4.000 caracteres e 512 tokens de saída. A comparação na tela faz duas chamadas separadas. Não precisa expor uma chave no navegador.\nDevolve: { choices, usage }","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":{"type":"string","description":"Um modelo público rota/*."},"prompt":{"type":"string","description":"Pedido de 1 a 4.000 caracteres."},"max_tokens":{"type":"number","description":"De 1 a 512; padrão 256."},"temperature":{"type":"number","description":"De 0 a 2; padrão 0,7."}},"required":["model","prompt"]}}}},"responses":{"200":{"description":"{ choices, usage }","content":{"application/json":{"schema":{"type":"object","properties":{"choices":{"type":"array","items":{"type":"object"},"description":"Resposta no formato de chat compatível."},"usage":{"type":"object","description":"Tokens informados pelo provedor."}},"required":["choices","usage"]}}}},"400":{"description":"Modelo, pedido ou parâmetro inválido."},"401":{"description":"Sem sessão da conta."},"402":{"description":"Falta saldo ou o modelo exige crédito."},"403":{"description":"Sem o aceite dos Termos e da retenção legal (`terms_required`)."},"404":{"description":"Organização desconhecida para esta conta."},"422":{"description":"Política de privacidade bloqueou o pedido."},"429":{"description":"Cota ou limite por minuto."},"503":{"description":"Nenhuma conexão disponível."}}}},"/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/credito/asaas/saldo":{"get":{"operationId":"get_api_credito_asaas_saldo","summary":"O saldo de crédito em reais da organização aberta (ou da conta) e as últimas compras. A compra usa o pagamento da casa (`POST /api/credito/asaas`).","description":"Devolve: { moeda, centavos, pode_comprar, compras }","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":"{ moeda, centavos, pode_comprar, compras }","content":{"application/json":{"schema":{"type":"object","properties":{"moeda":{"type":"string","description":"Sempre `BRL`."},"centavos":{"type":"number","description":"O saldo em centavos de real."},"pode_comprar":{"type":"boolean","description":"Se quem pede compra (na organização, só o dono ou um administrador)."},"compras":{"type":"array","items":{"type":"object"},"description":"As últimas 20 compras: `estado` (`pago`, `pendente`, `vencido`, `estornado`), `centavos` e as datas."}},"required":["moeda","centavos","pode_comprar","compras"]}}}},"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/bots":{"get":{"operationId":"get_api_app_bots","summary":"Consulta bots, conversas e memória da organização aberta.","description":"Exige sessão. Até 20 mensagens por bot. Sem gravação, o conteúdo vive em RAM por 30 minutos após a última alteração ou até reiniciar. Com gravação, a cópia é cifrada, retém mensagens por até 30 dias e expira após 30 dias sem alteração. Não é uma implementação A2A ou ACP.\nDevolve: { bots, memoria, gravar, integracoes, administra, versao }","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":"{ bots, memoria, gravar, integracoes, administra, versao }","content":{"application/json":{"schema":{"type":"object","properties":{"bots":{"type":"array","items":{"type":"object"},"description":"Até quatro bots: id, nome, instrucao, modelo, mensagens e tarefa."},"memoria":{"type":"string","description":"Notas comuns enviadas como dados a cada bot, até 4.000 caracteres."},"gravar":{"type":"boolean","description":"Escolha de persistência desta organização; padrão false."},"integracoes":{"type":"boolean","description":"Acesso externo por chave da organização, autorizado no app. Padrão false."},"administra":{"type":"boolean","description":"A sessão pode editar bots, memória e gravação."},"versao":{"type":"number","description":"Versão crescente. Ignore respostas anteriores à versão já recebida."}},"required":["bots","memoria","gravar","integracoes","administra","versao"]}}}},"400":{"description":"Entrada inválida."},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem aceite ou sem papel de administrador para configurar."},"404":{"description":"Organização desconhecida para esta conta."},"409":{"description":"Uma tarefa já está em andamento ou outra alteração ocupa o espaço."},"413":{"description":"Corpo ou histórico acima do limite."},"429":{"description":"Limite por minuto ou cota de inferência."},"503":{"description":"Capacidade, banco ou chave de cifra indisponível."}}},"patch":{"operationId":"configurar_bot","summary":"Edita bots, memória, gravação ou acesso externo.","description":"Só dono ou administrador da organização. Apenas a permissão de conexão pode mudar com tarefa em curso. Gravação também controla a captura de auditoria destas chamadas. Desligar a gravação remove a cópia salva do módulo; não expurga auditorias anteriores. A política das outras rotas /v1/* não muda.\nDevolve: { bots, memoria, gravar, integracoes, administra, versao }","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":{"acao":{"type":"string","description":"bot, remover, memoria, gravacao ou integracoes."},"ativo":{"type":"boolean","description":"Em integracoes: permite acesso às conversas pelas chaves desta organização."},"id":{"type":"string","description":"Em bot: id existente para editar; omita para criar, até quatro. Em remover: id do bot a excluir, exceto o último do espaço."},"nome":{"type":"string","description":"Em bot: nome de 1 a 60 caracteres."},"instrucao":{"type":"string","description":"Em bot: instruções de 1 a 2.000 caracteres."},"modelo":{"type":"string","description":"Em bot: id rota/*, exceto rota/local nesta versão."},"texto":{"type":"string","description":"Em memoria: até 4.000 caracteres; vazio apaga as notas."},"gravar":{"type":"boolean","description":"Em gravacao: true salva cifrado, false mantém somente em RAM."}},"required":["acao"]}}}},"responses":{"200":{"description":"{ bots, memoria, gravar, integracoes, administra, versao }","content":{"application/json":{"schema":{"type":"object","properties":{"bots":{"type":"array","items":{"type":"object"},"description":"Até quatro bots: id, nome, instrucao, modelo, mensagens e tarefa."},"memoria":{"type":"string","description":"Notas comuns enviadas como dados a cada bot, até 4.000 caracteres."},"gravar":{"type":"boolean","description":"Escolha de persistência desta organização; padrão false."},"integracoes":{"type":"boolean","description":"Acesso externo por chave da organização, autorizado no app. Padrão false."},"administra":{"type":"boolean","description":"A sessão pode editar bots, memória e gravação."},"versao":{"type":"number","description":"Versão crescente. Ignore respostas anteriores à versão já recebida."}},"required":["bots","memoria","gravar","integracoes","administra","versao"]}}}},"400":{"description":"Entrada inválida."},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem aceite ou sem papel de administrador para configurar."},"404":{"description":"Organização desconhecida para esta conta."},"409":{"description":"Uma tarefa já está em andamento ou outra alteração ocupa o espaço."},"413":{"description":"Corpo ou histórico acima do limite."},"429":{"description":"Limite por minuto ou cota de inferência."},"503":{"description":"Capacidade, banco ou chave de cifra indisponível."}}}},"/api/app/bots/mensagens":{"post":{"operationId":"post_api_app_bots_mensagens","summary":"Envia uma mensagem ou encaminha a última resposta de outro bot.","description":"Responde 202 com a tarefa em andamento. A inferência usa a política, os limites e o crédito da organização. Até 1.024 tokens de saída, 150 segundos e uma tarefa por organização. Erro da inferência aparece em tarefa.erro. O id evita nova execução enquanto a mensagem estiver no histórico; não há retry automático.\nDevolve: { bots, memoria, gravar, integracoes, administra, versao }","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":{"id":{"type":"string","description":"UUID da ação. Preserve ao repetir após falha de rede."},"bot":{"type":"string","description":"Id do bot de destino."},"texto":{"type":"string","description":"Pedido de 1 a 4.000 caracteres."},"origem":{"type":"string","description":"Id de outro bot. Anexa sua última resposta ao pedido."}},"required":["id","bot","texto"]}}}},"responses":{"200":{"description":"{ bots, memoria, gravar, integracoes, administra, versao }","content":{"application/json":{"schema":{"type":"object","properties":{"bots":{"type":"array","items":{"type":"object"},"description":"Até quatro bots: id, nome, instrucao, modelo, mensagens e tarefa."},"memoria":{"type":"string","description":"Notas comuns enviadas como dados a cada bot, até 4.000 caracteres."},"gravar":{"type":"boolean","description":"Escolha de persistência desta organização; padrão false."},"integracoes":{"type":"boolean","description":"Acesso externo por chave da organização, autorizado no app. Padrão false."},"administra":{"type":"boolean","description":"A sessão pode editar bots, memória e gravação."},"versao":{"type":"number","description":"Versão crescente. Ignore respostas anteriores à versão já recebida."}},"required":["bots","memoria","gravar","integracoes","administra","versao"]}}}},"400":{"description":"Entrada inválida."},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem aceite ou sem papel de administrador para configurar."},"404":{"description":"Organização desconhecida para esta conta."},"409":{"description":"Uma tarefa já está em andamento ou outra alteração ocupa o espaço."},"413":{"description":"Corpo ou histórico acima do limite."},"429":{"description":"Limite por minuto ou cota de inferência."},"503":{"description":"Capacidade, banco ou chave de cifra indisponível."}}}},"/api/app/bots/cancelar":{"post":{"operationId":"post_api_app_bots_cancelar","summary":"Interrompe a tarefa do bot da organização.","description":"Marca a tarefa como cancelada e pede cancelamento ao motor. Uma resposta tardia não entra no histórico. Trabalho que o provedor já processou pode ter custo.\nDevolve: { bots, memoria, gravar, integracoes, administra, versao }","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":{"bot":{"type":"string","description":"Id do bot cuja tarefa será interrompida."}},"required":["bot"]}}}},"responses":{"200":{"description":"{ bots, memoria, gravar, integracoes, administra, versao }","content":{"application/json":{"schema":{"type":"object","properties":{"bots":{"type":"array","items":{"type":"object"},"description":"Até quatro bots: id, nome, instrucao, modelo, mensagens e tarefa."},"memoria":{"type":"string","description":"Notas comuns enviadas como dados a cada bot, até 4.000 caracteres."},"gravar":{"type":"boolean","description":"Escolha de persistência desta organização; padrão false."},"integracoes":{"type":"boolean","description":"Acesso externo por chave da organização, autorizado no app. Padrão false."},"administra":{"type":"boolean","description":"A sessão pode editar bots, memória e gravação."},"versao":{"type":"number","description":"Versão crescente. Ignore respostas anteriores à versão já recebida."}},"required":["bots","memoria","gravar","integracoes","administra","versao"]}}}},"400":{"description":"Entrada inválida."},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem aceite ou sem papel de administrador para configurar."},"404":{"description":"Organização desconhecida para esta conta."},"409":{"description":"Uma tarefa já está em andamento ou outra alteração ocupa o espaço."},"413":{"description":"Corpo ou histórico acima do limite."},"429":{"description":"Limite por minuto ou cota de inferência."},"503":{"description":"Capacidade, banco ou chave de cifra indisponível."}}}},"/api/app/bots/eventos":{"get":{"operationId":"get_api_app_bots_eventos","summary":"Acompanha o estado dos bots por eventos do servidor.","description":"text/event-stream. Cada data contém o mesmo objeto do GET /api/app/bots. A conexão dura até 25 segundos; reconecte para conferir sessão e organização. Até quatro conexões por organização e 64 por processo. Sem broker externo.\nDevolve: { bots, memoria, gravar, integracoes, administra, versao }","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":"{ bots, memoria, gravar, integracoes, administra, versao }","content":{"application/json":{"schema":{"type":"object","properties":{"bots":{"type":"array","items":{"type":"object"},"description":"Até quatro bots: id, nome, instrucao, modelo, mensagens e tarefa."},"memoria":{"type":"string","description":"Notas comuns enviadas como dados a cada bot, até 4.000 caracteres."},"gravar":{"type":"boolean","description":"Escolha de persistência desta organização; padrão false."},"integracoes":{"type":"boolean","description":"Acesso externo por chave da organização, autorizado no app. Padrão false."},"administra":{"type":"boolean","description":"A sessão pode editar bots, memória e gravação."},"versao":{"type":"number","description":"Versão crescente. Ignore respostas anteriores à versão já recebida."}},"required":["bots","memoria","gravar","integracoes","administra","versao"]}}}},"400":{"description":"Entrada inválida."},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem aceite ou sem papel de administrador para configurar."},"404":{"description":"Organização desconhecida para esta conta."},"409":{"description":"Uma tarefa já está em andamento ou outra alteração ocupa o espaço."},"413":{"description":"Corpo ou histórico acima do limite."},"429":{"description":"Limite por minuto ou cota de inferência."},"503":{"description":"Capacidade, banco ou chave de cifra indisponível."}}}},"/v1/bots":{"get":{"operationId":"consultar_bots","summary":"Consulta pela chave os bots, as conversas e a memória da organização.","description":"Chave da conta ou organização, com conexão externa autorizada em Bots. Consulta o mesmo espaço do app. Sem autorização, 403 bots_external_disabled.\nDevolve: { bots, memoria, gravar, integracoes, administra, versao }","security":[{"contaChaveApi":[]}],"responses":{"200":{"description":"{ bots, memoria, gravar, integracoes, administra, versao }","content":{"application/json":{"schema":{"type":"object","properties":{"bots":{"type":"array","items":{"type":"object"},"description":"Até quatro bots: id, nome, instrucao, modelo, mensagens e tarefa."},"memoria":{"type":"string","description":"Notas comuns enviadas como dados a cada bot, até 4.000 caracteres."},"gravar":{"type":"boolean","description":"Escolha de persistência desta organização; padrão false."},"integracoes":{"type":"boolean","description":"Acesso externo por chave da organização, autorizado no app. Padrão false."},"administra":{"type":"boolean","description":"A sessão pode editar bots, memória e gravação."},"versao":{"type":"number","description":"Versão crescente. Ignore respostas anteriores à versão já recebida."}},"required":["bots","memoria","gravar","integracoes","administra","versao"]}}}},"400":{"description":"Entrada inválida."},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem aceite ou sem papel de administrador para configurar."},"404":{"description":"Organização desconhecida para esta conta."},"409":{"description":"Uma tarefa já está em andamento ou outra alteração ocupa o espaço."},"413":{"description":"Corpo ou histórico acima do limite."},"429":{"description":"Limite por minuto ou cota de inferência."},"503":{"description":"Capacidade, banco ou chave de cifra indisponível."}}}},"/v1/bots/mensagens":{"post":{"operationId":"enviar_ao_bot","summary":"Envia pela chave um pedido a um bot ou encaminha a última resposta de outro.","description":"Chave da conta ou organização, com conexão externa autorizada em Bots. Responde 202 com a tarefa em andamento. A inferência usa a política, os limites e o crédito da organização. Até 1.024 tokens de saída, 150 segundos e uma tarefa por organização. Erro da inferência aparece em tarefa.erro. O id evita nova execução enquanto a mensagem estiver no histórico; não há retry automático.\nDevolve: { bots, memoria, gravar, integracoes, administra, versao }","security":[{"contaChaveApi":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"UUID da ação. Preserve ao repetir após falha de rede."},"bot":{"type":"string","description":"Id do bot de destino."},"texto":{"type":"string","description":"Pedido de 1 a 4.000 caracteres."},"origem":{"type":"string","description":"Id de outro bot. Anexa sua última resposta ao pedido."}},"required":["id","bot","texto"]}}}},"responses":{"200":{"description":"{ bots, memoria, gravar, integracoes, administra, versao }","content":{"application/json":{"schema":{"type":"object","properties":{"bots":{"type":"array","items":{"type":"object"},"description":"Até quatro bots: id, nome, instrucao, modelo, mensagens e tarefa."},"memoria":{"type":"string","description":"Notas comuns enviadas como dados a cada bot, até 4.000 caracteres."},"gravar":{"type":"boolean","description":"Escolha de persistência desta organização; padrão false."},"integracoes":{"type":"boolean","description":"Acesso externo por chave da organização, autorizado no app. Padrão false."},"administra":{"type":"boolean","description":"A sessão pode editar bots, memória e gravação."},"versao":{"type":"number","description":"Versão crescente. Ignore respostas anteriores à versão já recebida."}},"required":["bots","memoria","gravar","integracoes","administra","versao"]}}}},"400":{"description":"Entrada inválida."},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem aceite ou sem papel de administrador para configurar."},"404":{"description":"Organização desconhecida para esta conta."},"409":{"description":"Uma tarefa já está em andamento ou outra alteração ocupa o espaço."},"413":{"description":"Corpo ou histórico acima do limite."},"429":{"description":"Limite por minuto ou cota de inferência."},"503":{"description":"Capacidade, banco ou chave de cifra indisponível."}}}},"/v1/bots/cancelar":{"post":{"operationId":"cancelar_bot","summary":"Interrompe pela chave a tarefa em andamento de um bot.","description":"Chave da conta ou organização, com conexão externa autorizada em Bots. Marca a tarefa como cancelada e pede cancelamento ao motor. Uma resposta tardia não entra no histórico. Trabalho que o provedor já processou pode ter custo.\nDevolve: { bots, memoria, gravar, integracoes, administra, versao }","security":[{"contaChaveApi":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"bot":{"type":"string","description":"Id do bot cuja tarefa será interrompida."}},"required":["bot"]}}}},"responses":{"200":{"description":"{ bots, memoria, gravar, integracoes, administra, versao }","content":{"application/json":{"schema":{"type":"object","properties":{"bots":{"type":"array","items":{"type":"object"},"description":"Até quatro bots: id, nome, instrucao, modelo, mensagens e tarefa."},"memoria":{"type":"string","description":"Notas comuns enviadas como dados a cada bot, até 4.000 caracteres."},"gravar":{"type":"boolean","description":"Escolha de persistência desta organização; padrão false."},"integracoes":{"type":"boolean","description":"Acesso externo por chave da organização, autorizado no app. Padrão false."},"administra":{"type":"boolean","description":"A sessão pode editar bots, memória e gravação."},"versao":{"type":"number","description":"Versão crescente. Ignore respostas anteriores à versão já recebida."}},"required":["bots","memoria","gravar","integracoes","administra","versao"]}}}},"400":{"description":"Entrada inválida."},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem aceite ou sem papel de administrador para configurar."},"404":{"description":"Organização desconhecida para esta conta."},"409":{"description":"Uma tarefa já está em andamento ou outra alteração ocupa o espaço."},"413":{"description":"Corpo ou histórico acima do limite."},"429":{"description":"Limite por minuto ou cota de inferência."},"503":{"description":"Capacidade, banco ou chave de cifra indisponível."}}}},"/v1/bots/memoria":{"patch":{"operationId":"atualizar_memoria_bots","summary":"Atualiza a memória compartilhada pelo agente externo.","description":"Requer conexão autorizada. Envie a versao lida por consultar_bots; mudança concorrente retorna 409. Não muda a política de gravação.\nDevolve: { bots, memoria, gravar, integracoes, administra, versao }","security":[{"contaChaveApi":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"texto":{"type":"string","description":"Notas completas, até 4.000 caracteres."},"versao":{"type":"number","description":"Versão lida antes da edição."}},"required":["texto","versao"]}}}},"responses":{"200":{"description":"{ bots, memoria, gravar, integracoes, administra, versao }","content":{"application/json":{"schema":{"type":"object","properties":{"bots":{"type":"array","items":{"type":"object"},"description":"Até quatro bots: id, nome, instrucao, modelo, mensagens e tarefa."},"memoria":{"type":"string","description":"Notas comuns enviadas como dados a cada bot, até 4.000 caracteres."},"gravar":{"type":"boolean","description":"Escolha de persistência desta organização; padrão false."},"integracoes":{"type":"boolean","description":"Acesso externo por chave da organização, autorizado no app. Padrão false."},"administra":{"type":"boolean","description":"A sessão pode editar bots, memória e gravação."},"versao":{"type":"number","description":"Versão crescente. Ignore respostas anteriores à versão já recebida."}},"required":["bots","memoria","gravar","integracoes","administra","versao"]}}}},"400":{"description":"Entrada inválida."},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem aceite ou sem papel de administrador para configurar."},"404":{"description":"Organização desconhecida para esta conta."},"409":{"description":"Uma tarefa já está em andamento ou outra alteração ocupa o espaço."},"413":{"description":"Corpo ou histórico acima do limite."},"429":{"description":"Limite por minuto ou cota de inferência."},"503":{"description":"Capacidade, banco ou chave de cifra indisponível."}}}},"/v1/bots/resultados":{"post":{"operationId":"registrar_resultado_bot","summary":"Registra o resultado produzido por um agente externo na conversa.","description":"Requer conexão autorizada. Texto aparece com origem MCP. UUID repetido com os mesmos dados não duplica; dados diferentes retornam 409. Não executa inferência.\nDevolve: { bots, memoria, gravar, integracoes, administra, versao }","security":[{"contaChaveApi":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"UUID da ação."},"bot":{"type":"string","description":"Bot cuja conversa recebe o resultado."},"texto":{"type":"string","description":"Resultado de 1 a 8.000 caracteres."}},"required":["id","bot","texto"]}}}},"responses":{"200":{"description":"{ bots, memoria, gravar, integracoes, administra, versao }","content":{"application/json":{"schema":{"type":"object","properties":{"bots":{"type":"array","items":{"type":"object"},"description":"Até quatro bots: id, nome, instrucao, modelo, mensagens e tarefa."},"memoria":{"type":"string","description":"Notas comuns enviadas como dados a cada bot, até 4.000 caracteres."},"gravar":{"type":"boolean","description":"Escolha de persistência desta organização; padrão false."},"integracoes":{"type":"boolean","description":"Acesso externo por chave da organização, autorizado no app. Padrão false."},"administra":{"type":"boolean","description":"A sessão pode editar bots, memória e gravação."},"versao":{"type":"number","description":"Versão crescente. Ignore respostas anteriores à versão já recebida."}},"required":["bots","memoria","gravar","integracoes","administra","versao"]}}}},"400":{"description":"Entrada inválida."},"401":{"description":"Sem sessão da conta."},"403":{"description":"Sem aceite ou sem papel de administrador para configurar."},"404":{"description":"Organização desconhecida para esta conta."},"409":{"description":"Uma tarefa já está em andamento ou outra alteração ocupa o espaço."},"413":{"description":"Corpo ou histórico acima do limite."},"429":{"description":"Limite por minuto ou cota de inferência."},"503":{"description":"Capacidade, banco ou chave de cifra indisponível."}}}},"/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/slot":{"get":{"operationId":"get_api_slot","summary":"A oferta da casa que o pacote Pi mostra durante o turno: o texto e o link que conta o clique.","description":"Devolve: { id, texto, url }","security":[],"parameters":[{"name":"lingua","in":"query","required":false,"schema":{"type":"string"},"description":"`pt` (padrão) ou `en`."}],"responses":{"200":{"description":"{ id, texto, url }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"A oferta: `pix` (crédito do RN por Pix) ou `hookpulse`."},"texto":{"type":"string","description":"Uma frase, na língua pedida."},"url":{"type":"string","description":"O link do clique (`/api/slot/ir/:oferta`), que leva ao destino da oferta."}},"required":["id","texto","url"]}}}}}}},"/api/slot/exibicao":{"post":{"operationId":"post_api_slot_exibicao","summary":"Conta uma exibição da oferta. Aceita só a oferta e um id; campo a mais é recusado.","description":"Devolve: 204 sem corpo.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"oferta":{"type":"string","description":"O `id` que o `GET /api/slot` devolveu."},"id":{"type":"string","description":"Um UUID por exibição: o mesmo id conta uma vez."}},"required":["oferta","id"]}}}},"responses":{"200":{"description":"204 sem corpo."},"400":{"description":"Corpo diferente de `{ oferta, id }`, oferta desconhecida ou id inválido."}}}},"/api/slot/ir/{oferta}":{"get":{"operationId":"get_api_slot_ir_by_oferta","summary":"Conta o clique e leva ao destino fixo da oferta (302).","description":"Devolve: 302 para o destino da oferta.","security":[],"parameters":[{"name":"oferta","in":"path","required":true,"schema":{"type":"string"},"description":"`pix` ou `hookpulse`.","example":"pix"},{"name":"lingua","in":"query","required":false,"schema":{"type":"string"},"description":"`pt` (padrão) ou `en`."}],"responses":{"200":{"description":"302 para o destino da oferta."},"404":{"description":"Oferta desconhecida."}}}},"/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, acoes }","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, acoes }","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/`."},"acoes":{"type":"object","description":"Optional API documentation links in pt and en, or null per language. Each block has id, tipo, zero-based paragraph posicao, rotulo, titulo, condicao, acao and href. Opening a link does not execute or charge an API request."}},"required":["slug","fonte","guia","imagem","pt","en","original","teste","acoes"]}}}},"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, acoes }","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, acoes }","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/`."},"acoes":{"type":"object","description":"Optional API documentation links in pt and en, or null per language. Each block has id, tipo, zero-based paragraph posicao, rotulo, titulo, condicao, acao and href. Opening a link does not execute or charge an API request."}},"required":["slug","fonte","guia","imagem","pt","en","original","teste","acoes"]}}}},"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, acoes }","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, acoes }","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/`."},"acoes":{"type":"object","description":"Optional API documentation links in pt and en, or null per language. Each block has id, tipo, zero-based paragraph posicao, rotulo, titulo, condicao, acao and href. Opening a link does not execute or charge an API request."}},"required":["slug","fonte","guia","imagem","pt","en","original","teste","acoes"]}}}},"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."}}}}}}