{"openapi":"3.1.0","info":{"title":"Rota Nacional","version":"0419241e","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://staging.rota-nacional.ia.br/","apiReference":"https://staging.rota-nacional.ia.br/developers","llms":"https://staging.rota-nacional.ia.br/llms.txt"}},"servers":[{"url":"https://staging.rota-nacional.ia.br"}],"components":{"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."},"trial":{"allOf":[{"$ref":"#/components/schemas/PaymentTrial"}],"description":"Registration trial, when offered."}},"required":["free","paid","how_to_pay","live"]},"PaymentFree":{"type":"object","properties":{"o_que":{"type":"string","description":"Operation or allowance."},"limite":{"type":"string","description":"Allowance and eligibility."},"janela":{"type":"string","description":"Reset window, when applicable.","nullable":true}},"required":["o_que","limite","janela"]},"PaymentPrice":{"type":"object","properties":{"o_que":{"type":"string","description":"Operation and billing unit."},"price_usd":{"type":"number","description":"Current list price in USD."}},"required":["o_que","price_usd"]},"PaymentTrial":{"type":"object","properties":{"days":{"type":"integer","description":"Trial duration in days."},"how":{"type":"string","description":"Eligibility and activation steps."}},"required":["days","how"]},"PaymentX402":{"type":"object","properties":{"provider":{"type":"string","description":"Always `x402` — the only billing protocol accepted."},"mode":{"type":"string","description":"Seller mode: `live` charges for real, `dev` lets calls through unpaid."},"network":{"type":"string","description":"USDC network: `base` in production, `base-sepolia` in staging."},"chain_id":{"type":"integer","description":"EVM chain ID of the network above, so the wallet signs on the right chain."},"pay_to":{"type":"string","description":"Address that receives the payment.","nullable":true},"homolog":{"type":"boolean","description":"Staging seam on: the loop can be closed without spending USDC."},"dev":{"type":"boolean","description":"Development mode: the 402 is simulated."},"dev_gate":{"type":"boolean","description":"A homologation credential is configured; this grants no access."},"gratis":{"type":"array","items":{"type":"string"},"description":"Temporarily free SKUs."},"facilitator":{"type":"string","description":"URL of the facilitator that verifies and settles the payment."},"asset":{"type":"string","description":"Accepted currency — always `USDC`."},"asset_address":{"type":"string","description":"USDC contract on the network above."},"faucet":{"type":"string","description":"Test-USDC faucet; only on base-sepolia.","nullable":true},"wallets":{"type":"object","description":"Links to wallets that speak x402 (metamask, coinbase, base_app)."}},"required":["provider","mode","network","chain_id","pay_to","homolog","dev","dev_gate","facilitator","asset","asset_address","faucet","wallets"],"description":"x402 payment configuration in force. Comes from `planPublic` and is the same across the products."},"PaymentCredit":{"type":"object","properties":{"url":{"type":"string","description":"POST to purchase credit; GET with X-Credito to inspect its balance."},"header":{"type":"string","description":"Header for a previously issued credit token: X-Credito."}},"required":["url","header"]}},"securitySchemes":{"globalAccount":{"type":"apiKey","in":"cookie","name":"__Host-mm-auth","description":"Global session in the product's HttpOnly cookie; writes require exact Origin and X-CSRF-Token."},"contaChaveApi":{"type":"http","scheme":"bearer","bearerFormat":"mmk_…","description":"Account API key: `Authorization: Bearer mmk_…` or `X-Api-Key: mmk_…`. Created on the account page (API keys), valid only in the product where it was created; it acts as the account (or the organization that owns it)."}}},"paths":{"/api/auth/bootstrap":{"get":{"operationId":"get_api_auth_bootstrap","summary":"Prepara o navegador para entrar na conta global.","description":"Define cookie HttpOnly restrito ao host. CSRF vinculado à sessão atual. Sem CORS.\nDevolve: { csrf, context }","responses":{"200":{"description":"{ csrf, context }","content":{"application/json":{"schema":{"type":"object","properties":{"csrf":{"type":"string","description":"X-CSRF-Token"},"context":{"type":"string","description":"Opaque view context, also in X-MM-Context; not a credential / contexto opaco da vista, não é credencial."}},"required":["csrf","context"]}}}},"400":{"description":"invalid_request"},"403":{"description":"invalid_origin / invalid_csrf"},"503":{"description":"auth_unavailable: a sessão anterior é preservada / the previous session is preserved"}},"security":[]}},"/api/account/profile":{"get":{"operationId":"get_api_account_profile","summary":"Consulta seu perfil global.","description":"Lê preferências atuais da conta. Altere-as na página da conta; produtos não mantêm perfil autoritativo separado.\nDevolve: {profile:{name,locale,timeZone,theme,revision}}","responses":{"200":{"description":"{profile:{name,locale,timeZone,theme,revision}}"},"401":{"description":"invalid_session"},"503":{"description":"auth_unavailable"}},"security":[{"globalAccount":[]}]}},"/api/account/avatar":{"get":{"operationId":"get_api_account_avatar","summary":"Consulta sua foto de perfil global.","description":"WebP privado de até 64 KiB, sem cache. Altere-o na conta. Não aceita ID de usuário ou URL de objeto.\nDevolve: image/webp; Cache-Control: no-store","responses":{"200":{"description":"image/webp; Cache-Control: no-store","content":{"image/webp":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"invalid_session"},"404":{"description":"not_found: no photo / sem foto"},"503":{"description":"auth_unavailable"}},"security":[{"globalAccount":[]}]}},"/api/me":{"get":{"operationId":"get_api_me","summary":"Lê a conta global atual neste produto.","description":"Devolve: {user:{identityId,sessionId,productId,audience,authTime,methods,mfaState}}","responses":{"200":{"description":"{user:{identityId,sessionId,productId,audience,authTime,methods,mfaState}}"},"401":{"description":"invalid_session"},"503":{"description":"auth_unavailable"}},"security":[{"globalAccount":[]}]}},"/api/auth/logout":{"post":{"operationId":"post_api_auth_logout","summary":"Revoga esta sessão do produto.","description":"Exige bootstrap/CSRF deste navegador e sessão. As sessões de outros produtos permanecem ativas.\nDevolve: { ok }","responses":{"200":{"description":"{ ok }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"true"}},"required":["ok"]}}}},"400":{"description":"invalid_request"},"403":{"description":"invalid_origin / invalid_csrf"},"503":{"description":"auth_unavailable: a sessão anterior é preservada / the previous session is preserved"}},"security":[{"globalAccount":[]}]}},"/api/account/keys":{"get":{"operationId":"get_api_account_keys","summary":"Lista suas chaves de API neste produto.","description":"Nunca devolve a chave: nome, 4 últimos caracteres, organização, criação, último uso (por hora) e se ainda vale.\nDevolve: { keys }","responses":{"200":{"description":"{ keys }","content":{"application/json":{"schema":{"type":"object","properties":{"keys":{"type":"array","items":{"type":"object"},"description":"`id`, `name`, `organizationId`, `last4`, `createdAt`, `lastUsedAt`, `revokedAt`, `active` (false quando revogada ou parada por troca de senha / encerrar todos os acessos)."}},"required":["keys"]}}}},"401":{"description":"invalid_session"},"503":{"description":"auth_unavailable"}},"security":[{"globalAccount":[]}]}},"/api/account/keys/create":{"post":{"operationId":"post_api_account_keys_create","summary":"Cria uma chave de API para agentes e scripts.","description":"Exige entrada nos últimos 5 minutos; a de organização também exige segundo fator na sessão e o papel de dona/administradora com o produto ligado. No máximo 10 chaves vivas por conta e produto. A chave (`secret`) volta UMA vez.\nDevolve: { key, secret }","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Até 60 caracteres."},"organizationId":{"type":"string","description":"`null` para chave da conta."}},"required":["name","organizationId"]},"example":{"name":"agent","organizationId":null}}}},"responses":{"200":{"description":"{ key, secret }","content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"object","description":"`id`, `name`, `organizationId`, `last4`, `createdAt`."},"secret":{"type":"string","description":"`mmk_…`, mostrada uma vez."}},"required":["key","secret"]}}}},"400":{"description":"invalid_key_name / invalid_organization"},"401":{"description":"invalid_session / reauth_required"},"403":{"description":"invalid_origin / invalid_csrf / organization_forbidden / organization_mfa_required"},"409":{"description":"key_limit_reached"},"503":{"description":"auth_unavailable"}},"security":[{"globalAccount":[]}]}},"/api/account/keys/revoke":{"post":{"operationId":"post_api_account_keys_revoke","summary":"Revoga uma das suas chaves de API.","description":"Para a chave na hora. Repetir não faz mal.\nDevolve: { ok }","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"O `id` da chave."}},"required":["id"]},"example":{"id":"…"}}}},"responses":{"200":{"description":"{ ok }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"true"}},"required":["ok"]}}}},"400":{"description":"invalid_key_id"},"401":{"description":"invalid_session"},"403":{"description":"invalid_origin / invalid_csrf"},"404":{"description":"key_not_found"},"503":{"description":"auth_unavailable"}},"security":[{"globalAccount":[]}]}},"/api/":{"get":{"operationId":"api_index","summary":"Índice auto-descrito: cada rota, o que cobra e como plugar o MCP.","description":"Devolve: { name, description, build, base_url, docs, endpoints, mcp_tools }","responses":{"200":{"description":"{ name, description, build, base_url, docs, endpoints, mcp_tools }","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Nome do produto."},"description":{"type":"string","description":"O que o produto faz."},"build":{"type":"string","description":"Commit publicado."},"base_url":{"type":"string","description":"Origem em que esta API está servindo."},"docs":{"type":"object","description":"Links para llms.txt, OpenAPI, MCP e a UI."},"endpoints":{"type":"array","items":{"type":"object"},"description":"Catálogo de endpoints."},"mcp_tools":{"type":"array","items":{"type":"string"},"description":"Tools do MCP."}},"required":["name","description","build","base_url","docs","endpoints","mcp_tools"]}}}}}}},"/api/health":{"get":{"operationId":"get_api_health","summary":"Se o serviço responde, e o build no ar.","description":"Devolve: { ok, service, build, request_id }","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`).","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.","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.","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.","parameters":[{"name":"Origin","in":"header","required":false,"schema":{"type":"string"},"description":"A origem da página, idêntica à desta rota."},{"name":"Content-Type","in":"header","required":true,"schema":{"type":"string"},"description":"`application/json` ou `text/plain`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"v":{"type":"number","description":"Versão do lote: `1`."},"vid":{"type":"string","description":"Id aleatório deste navegador (UUID v4)."},"sid":{"type":"string","description":"Id da sessão (30 min sem atividade encerram)."},"sn":{"type":"number","description":"Número da sessão deste navegador."},"pv":{"type":"string","description":"Id da página vista."},"e":{"type":"array","items":{"type":"object"},"description":"Até 40 eventos `{ t, n, p? }` do vocabulário do funil."}},"required":["v","vid","sid","sn","pv","e"]}}}},"responses":{"202":{"description":"202 sem corpo se guardado; 204 se ignorado. Sempre no-store."}}}},"/api/funil/arquivos":{"get":{"operationId":"get_api_funil_arquivos","summary":"Operador: os dias do diário do funil guardados neste app, com o tamanho de cada um.","description":"Devolve: { v, produto, teto, dias }","parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>`."}],"responses":{"200":{"description":"{ v, produto, teto, dias }","content":{"application/json":{"schema":{"type":"object","properties":{"v":{"type":"number","description":"Versão do lote guardado."},"produto":{"type":"string","description":"O produto."},"teto":{"type":"object","description":"`bytesDia` e `dias` guardados."},"dias":{"type":"array","items":{"type":"object"},"description":"`{ dia, bytes }`, do mais velho ao de hoje."}},"required":["v","produto","teto","dias"]}}}},"401":{"description":"Unauthorized"},"503":{"description":"Not configured"}}}},"/api/funil/arquivo":{"get":{"operationId":"get_api_funil_arquivo","summary":"Operador: um pedaço de um dia do diário do funil, em NDJSON, a partir de um byte.","description":"Até 4 MiB por resposta, cortados na última linha inteira. `X-MM-Funil-Proximo` diz de onde pedir o resto; `X-MM-Funil-Tamanho`, o tamanho do dia agora.\nDevolve: Linhas JSON, uma por lote guardado.","parameters":[{"name":"dia","in":"query","required":true,"schema":{"type":"string"},"description":"O dia, `AAAA-MM-DD` (UTC)."},{"name":"desde","in":"query","required":false,"schema":{"type":"number"},"description":"O byte de onde ler; `0` no começo."},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>`."}],"responses":{"200":{"description":"Linhas JSON, uma por lote guardado."},"400":{"description":"Invalid parameters"},"401":{"description":"Unauthorized"},"503":{"description":"Not configured"}}}},"/api/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`) 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 }","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`: os pedidos de hoje (`today`) e 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/vitrine":{"get":{"operationId":"get_api_vitrine","summary":"Os números públicos do produto: tráfego, agentes, uso e confiabilidade, sem dinheiro.","description":"Projeção publicada de hora em hora pelo coletor da casa, arredondada a dois dígitos significativos; `null` é medição ausente, nunca zero. Cache de 15 minutos com ETag (`If-None-Match` → 304). Não há como enviar números por esta rota: a publicação é do coletor, com token próprio.\nDevolve: { v, produto, publicado, atualizado_em, stale, nome?, desde?, fuso?, hoje?, dias?, janelas?, visitantes?, pessoas?, agentes?, superficies?, mcp?, uso?, contas?, confiabilidade?, catalogo?, apoio? }","responses":{"200":{"description":"{ v, produto, publicado, atualizado_em, stale, nome?, desde?, fuso?, hoje?, dias?, janelas?, visitantes?, pessoas?, agentes?, superficies?, mcp?, uso?, contas?, confiabilidade?, catalogo?, apoio? }","content":{"application/json":{"schema":{"type":"object","properties":{"v":{"type":"integer","description":"Versão do contrato (1)."},"produto":{"type":"string","description":"Id do produto."},"publicado":{"type":"boolean","description":"`false` antes da primeira publicação do coletor; aí só estas cinco chaves vêm."},"atualizado_em":{"type":"string","description":"Quando o coletor publicou (ISO 8601).","nullable":true},"stale":{"type":"boolean","description":"`true` quando a projeção tem mais de 26 h."},"nome":{"type":"string","description":"Nome do produto."},"desde":{"type":"string","description":"Dia a partir do qual a série vale.","nullable":true},"fuso":{"type":"string","description":"Fuso dos dias (`UTC`)."},"hoje":{"type":"object","description":"O dia de hoje: páginas por classe (pessoa, IA, bot), chamadas de API por classe, leituras das superfícies de máquina e uso do produto."},"dias":{"type":"array","items":{"type":"object"},"description":"Até 31 dias, o mais antigo primeiro: `dia`, `paginas`, `api`, `api_ia`, `maquina`, `visitantes`, `uso`."},"janelas":{"type":"object","description":"Somas de 7 e 30 dias (`d7`, `d30`)."},"visitantes":{"type":"object","description":"Visitantes únicos na borda em 7 dias."},"pessoas":{"type":"object","description":"GA4 quando há: usuários, sessões, países, aparelhos e quem chegou de IA.","nullable":true},"agentes":{"type":"object","description":"Os agentes de IA e os bots que mais leem, 7 dias."},"superficies":{"type":"object","description":"Leituras de OKF, llms, well-known, OpenAPI e MCP em 7 dias."},"mcp":{"type":"object","description":"Chamadas MCP em 7 dias."},"uso":{"type":"object","description":"Uso real do produto por recurso: rótulo, hoje, 7 e 30 dias."},"contas":{"type":"object","description":"Usuários e convidados.","nullable":true},"confiabilidade":{"type":"object","description":"Percentual de pedidos sem 5xx em 7 dias e o build no ar."},"catalogo":{"type":"object","description":"Tamanho do acervo, quando o produto tem um.","nullable":true},"apoio":{"type":"object","description":"Impressões e cliques por patrocinador, quando houver."}},"required":["v","produto","publicado","atualizado_em","stale"]}}}}}}},"/api/vitrine/operador":{"get":{"operationId":"get_api_vitrine_operador","summary":"O documento completo do produto no painel do operador — só com o token do operador.","description":"Devolve: { produto, atualizado_em, operador }","parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>` — a classe operador."}],"responses":{"200":{"description":"{ produto, atualizado_em, operador }","content":{"application/json":{"schema":{"type":"object","properties":{"produto":{"type":"string","description":"Id do produto."},"atualizado_em":{"type":"string","description":"Quando o coletor publicou.","nullable":true},"operador":{"type":"object","description":"O documento completo do coletor, com o que a projeção pública não carrega.","nullable":true}},"required":["produto","atualizado_em","operador"]}}}},"401":{"description":"Sem token, token errado ou token de outra classe."},"503":{"description":"Worker sem `METRICS_TOKEN` ou sem o control plane."}}}},"/api/vitrine/painel":{"get":{"operationId":"get_api_vitrine_painel","summary":"O painel da casa inteira, na forma que o gm lê — só com o token do operador.","description":"Devolve: { apps, updated?, totals? }","parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>` — a classe operador."}],"responses":{"200":{"description":"{ apps, updated?, totals? }","content":{"application/json":{"schema":{"type":"object","properties":{"apps":{"type":"array","items":{"type":"object"},"description":"Um documento do operador por produto, em ordem de id."},"updated":{"type":"string","description":"Quando o coletor fechou a rodada."},"totals":{"type":"object","description":"Os totais da casa."}},"required":["apps"]}}}},"401":{"description":"Sem token, token errado ou token de outra classe."},"503":{"description":"Worker sem `METRICS_TOKEN` ou sem o control plane."}}}},"/api/vitrine/cursores":{"get":{"operationId":"get_api_vitrine_cursores","summary":"O cursor de erro resolvido por produto (`borda`, `cli`) — só com o token do operador.","description":"Devolve: JSON: `{ [produto]: { borda?: ISO, cli?: ISO } }`; vazio é `{}`.","parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"},"description":"`Bearer <METRICS_TOKEN>` — a classe operador."}],"responses":{"200":{"description":"JSON: `{ [produto]: { borda?: ISO, cli?: ISO } }`; vazio é `{}`."},"401":{"description":"Sem token, token errado ou token de outra classe."},"503":{"description":"Worker sem `METRICS_TOKEN` ou sem o control plane."}}}},"/api/contact":{"post":{"operationId":"post_api_contact","summary":"Fale com quem faz o produto — de graça, para pessoa e agente.","description":"Uma rota para dúvida e para proposta de patrocínio, parceria ou anúncio (`tipo`, com os espaços de `GET /api/partners`). Sem captcha, sem conta, sem pagamento. Uma mensagem a cada 10 segundos por rede: a que chega antes espera a vez e sai — sem erro. A mensagem chega à equipe por e-mail, com o `email` como endereço de resposta.\nDevolve: { ok }","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Como chamar quem escreve (alias `nome`)."},"email":{"type":"string","description":"Para onde responder."},"message":{"type":"string","description":"O que você quer dizer (alias `mensagem`)."},"tipo":{"type":"string","description":"Proposta: `patrocinio`, `parceria` ou `anuncio`. Liga os campos abaixo."},"empresa":{"type":"string","description":"Quem propõe, quando é empresa."},"site":{"type":"string","description":"Site de quem propõe."},"orcamento":{"type":"string","description":"`ate_100`, `100_500`, `500_2000`, `2000_mais` ou `a_combinar`."},"espaco":{"type":"array","items":{"type":"string"},"description":"Ids de placement de `GET /api/partners`, até 6."},"duracao":{"type":"string","description":"Dias de exposição: `30`, `90` ou `365`."},"pagamento":{"type":"string","description":"`usdc`, `deposito` ou `a_combinar`."}},"required":["name","email","message"]},"example":{"name":"Agente","email":"agent@example.com","message":"olá, sou um agente"}}}},"responses":{"200":{"description":"{ ok }","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"Sempre `true` quando a mensagem foi aceita."}},"required":["ok"]}}}},"400":{"description":"Validação: o `code` diz o campo."},"503":{"description":"O contato não está configurado neste servidor."}}}},"/api/partners":{"get":{"operationId":"get_api_partners","summary":"Parceria, patrocínio e anúncio: os espaços do produto com preço sugerido, os números públicos ao lado e como propor.","description":"Informação sob consulta, sem ativação: espaços do catálogo da casa com preço em USD por 30 dias (90 e 365 dias com desconto), patrocinadores em vigor, recorte de `/api/vitrine`, carteira da casa (USDC na Base) e o caminho de contato — depósito, PIX ou fatura são combinados na resposta. Cache de 1 hora.\nDevolve: { status, produto, idioma, titulo, descricao, publico, modalidades, placements, house_bundle, parcerias, current_sponsors, stats, payment, contact, politica, _links }","responses":{"200":{"description":"{ status, produto, idioma, titulo, descricao, publico, modalidades, placements, house_bundle, parcerias, current_sponsors, stats, payment, contact, politica, _links }","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"`sob_consulta`: informação e proposta, sem ativação nem cobrança."},"produto":{"type":"string","description":"Nome do produto."},"idioma":{"type":"string","description":"Idioma dos textos (o do produto)."},"titulo":{"type":"string","description":"Título da oferta."},"descricao":{"type":"string","description":"Uma frase sobre a oferta."},"publico":{"type":"string","description":"Quem usa o produto — o público que o patrocinador alcança."},"modalidades":{"type":"array","items":{"type":"object"},"description":"`{ id, nome }`: patrocinio, parceria, anuncio."},"placements":{"type":"array","items":{"type":"object"},"description":"Os espaços do produto: `id`, `nome`, `onde`, `formato`, `exclusivo`, `medicao`, `price_usd_30d` (sugestão; `null` é sob consulta), `exposure[{ dias, price_usd }]` para 30, 90 e 365 dias, `disponivel`."},"house_bundle":{"type":"object","description":"O pacote da casa: rodapé e menção para agentes nos dez produtos, com desconto."},"parcerias":{"type":"array","items":{"type":"string"},"description":"Ideias de parceria que o produto aceita discutir."},"current_sponsors":{"type":"array","items":{"type":"object"},"description":"Patrocinadores em vigor: `id`, `nome`, `url`, `frase`, `espacos`, `ate`."},"stats":{"type":"object","description":"Recorte dos números públicos (`hoje`, `janelas`, `agentes`, `confiabilidade`) e o `link` para `/api/vitrine`; `publicado: false` antes da primeira publicação."},"payment":{"type":"object","description":"Como pagar: `rede`, `chain_id`, `ativo`, `pay_to`, `eip681` (a carteira da casa, quando declarada), `alternativas` e a `nota` — depósito, PIX ou fatura pela resposta."},"contact":{"type":"object","description":"`email`, `form_url`, `api_url` (`POST /api/contact`, livre: uma mensagem a cada 10 s por rede), `campos` (os obrigatórios), `campos_proposta` (os opcionais da proposta, com os valores aceitos de cada um), `message_template`, `instructions`."},"politica":{"type":"object","description":"Rótulo do espaço, setores recusados, pagamento adiantado, prazos."},"_links":{"type":"object","description":"`self`, `stats`, `page` (`null` até a página existir), `contact`, `casa` (o mesmo caminho nos dez produtos)."}},"required":["status","produto","idioma","titulo","descricao","publico","modalidades","placements","house_bundle","parcerias","current_sponsors","stats","payment","contact","politica","_links"]}}}}}}},"/api/credito":{"post":{"operationId":"post_api_credito","summary":"Recarrega crédito pré-pago: paga uma vez com x402 e recebe o token que desconta em qualquer API da casa.","description":"Devolve: { token, saldo_usd, guarde, usar, saldo_em }","parameters":[{"name":"usd","in":"query","required":true,"schema":{"type":"integer"},"description":"Pacote: 1, 5, 10 ou 25 dólares."}],"responses":{"200":{"description":"{ token, saldo_usd, guarde, usar, saldo_em }","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","description":"Token portador do saldo (`cred_…`). Mostrado UMA vez — não há como recuperá-lo."},"saldo_usd":{"type":"string","description":"Saldo creditado."},"guarde":{"type":"string","description":"Aviso de que o token é o portador do crédito."},"usar":{"type":"string","description":"Como apresentar o token nas rotas pagas."},"saldo_em":{"type":"string","description":"Onde consultar saldo e extrato."}},"required":["token","saldo_usd","guarde","usar","saldo_em"]}}}},"400":{"description":"Pacote fora da lista (1, 5, 10 ou 25)."},"402":{"description":"Sem pagamento — o corpo traz `accepts[]` do x402."}}},"get":{"operationId":"get_api_credito","summary":"Saldo e extrato do crédito — as últimas movimentações, sem devolver o token.","description":"Devolve: { saldo_micros, saldo_usd, criado_em, movimentos }","responses":{"200":{"description":"{ saldo_micros, saldo_usd, criado_em, movimentos }","content":{"application/json":{"schema":{"type":"object","properties":{"saldo_micros":{"type":"integer","description":"Saldo em micro-dólares (1e-6 USD)."},"saldo_usd":{"type":"string","description":"Saldo formatado."},"criado_em":{"type":"string","description":"Quando o crédito foi aberto."},"movimentos":{"type":"array","items":{"type":"object"},"description":"Entradas e saídas recentes, com produto e recurso."}},"required":["saldo_micros","saldo_usd","criado_em","movimentos"]}}}},"401":{"description":"Sem token ou token desconhecido."}}}},"/api/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 }","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 (1, 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 }","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 (1, 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 }","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":{"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, saldo, precisa_documento }","responses":{"200":{"description":"{ disponivel, pacotes, 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 (1, 5, 10 ou 25 dólares), com `brl_centavos`."},"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","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.\nDevolve: { id, credito, pix, estado_em }","responses":{"200":{"description":"{ id, credito, pix, estado_em }","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 Pix cair."},"pix":{"type":"object","description":"`copia_e_cola`, `imagem` (QR em PNG, data URI) e `expira_em`."},"estado_em":{"type":"string","description":"Onde acompanhar o pagamento."}},"required":["id","credito","pix","estado_em"]}}}},"400":{"description":"Pacote fora da lista (1, 5, 10 ou 25), valor fora da faixa, ou CPF/CNPJ, nome ou e-mail inválido."},"429":{"description":"A rede já gerou as cobranças do dia."},"502":{"description":"O gateway não gerou o Pix; tente de novo."},"503":{"description":"Pix automático indisponível neste app, ou cobranças demais 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 }","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."}}}},"/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 }","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 }","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."},"403":{"description":"Conta aguardando liberação, teste gratuito encerrado, modelo não liberado 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 }","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."},"403":{"description":"Conta aguardando liberação, teste gratuito encerrado, modelo não liberado ou origem de rede fora da política da organização."},"422":{"description":"A política de privacidade `block` recusou o envio: havia dados pessoais."},"429":{"description":"Limite por minuto ou cota do mês."}}}},"/v1/privacy/clean":{"post":{"operationId":"limpar_dados_pessoais","summary":"Limpa dados pessoais de um texto, JSON ou lista, sem modelo nenhum: marcadores, remoção ou bloqueio.","description":"Mande `text`, `input` ou `items`; `policy` só endurece a da organização. A resposta traz o texto limpo e as categorias encontradas, nunca os valores.\nDevolve: { clean_text, findings, audit_id }","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."},"403":{"description":"Conta aguardando liberação, teste gratuito encerrado, modelo não liberado 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 }","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."},"403":{"description":"Conta aguardando liberação, teste gratuito encerrado, modelo não liberado 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 }","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."},"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 }","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."},"403":{"description":"Conta aguardando liberação, teste gratuito encerrado, modelo não liberado 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.\nDevolve: { text }","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."},"403":{"description":"Conta aguardando liberação, teste gratuito encerrado, modelo não liberado 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.","description":"Devolve: { capabilities, workers }","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."}}}},"/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`).\nDevolve: { id, status, status_url }","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"array","items":{"type":"string"},"description":"O texto, ou a lista de textos, a vetorizar; passa pela barreira antes do worker."}}}}}},"responses":{"200":{"description":"{ id, status, status_url }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"O id do job (`rnj_…`)."},"status":{"type":"string","description":"`queued`, `leased`, `completed`, `failed` ou `cancelled`."},"status_url":{"type":"string","description":"Onde acompanhar."}},"required":["id","status","status_url"]}}}},"401":{"description":"Chave de API ausente ou inválida."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis."}}}},"/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`).\nDevolve: { id, status, status_url }","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."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis."}}}},"/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`).\nDevolve: { id, status, status_url }","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."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis."}}}},"/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`).\nDevolve: { id, status, status_url }","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."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis."}}}},"/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`).\nDevolve: { id, status, status_url }","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."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis."}}}},"/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`).\nDevolve: { id, status, status_url }","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."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis."}}}},"/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`).\nDevolve: { id, status, status_url }","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."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis."}}}},"/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`).\nDevolve: { id, status, status_url }","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."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis."}}}},"/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`).\nDevolve: { id, status, status_url }","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"document":{"type":"string","description":"O texto do documento; o resto do JSON (instruções, esquema do resultado) segue ao worker depois da barreira."}}}}}},"responses":{"202":{"description":"{ id, status, status_url }","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"O id do job (`rnj_…`)."},"status":{"type":"string","description":"`queued`, `leased`, `completed`, `failed` ou `cancelled`."},"status_url":{"type":"string","description":"Onde acompanhar."}},"required":["id","status","status_url"]}}}},"401":{"description":"Chave de API ausente ou inválida."},"413":{"description":"Entrada acima do limite."},"503":{"description":"Workers indisponíveis."}}}},"/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 }","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."},"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 }","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."},"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 }","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."},"404":{"description":"Job desconhecido."},"409":{"description":"Job ainda não concluído."}}}},"/api/app/resumo":{"get":{"operationId":"get_api_app_resumo","summary":"O resumo do painel: o acesso à API, o teste, a cota do mês, o uso de hoje, os modelos mais usados e o saldo.","description":"Devolve: { acesso, cota, saldo_centavos }","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":"{ acesso, cota, saldo_centavos }","content":{"application/json":{"schema":{"type":"object","properties":{"acesso":{"type":"object","description":"`status`, `motivo`, `teste_ate`, `liberado_em` e a `politica` de privacidade."},"cota":{"type":"object","description":"Pedidos e tokens do mês contra os limites, e quando a cota reinicia."},"saldo_centavos":{"type":"number","description":"O saldo de crédito em centavos de real."}},"required":["acesso","cota","saldo_centavos"]}}}},"401":{"description":"Sem sessão da conta."},"404":{"description":"Organização desconhecida para esta conta."}}}},"/api/app/uso":{"get":{"operationId":"get_api_app_uso","summary":"O uso do período, do mais novo para o mais velho: só metadados, nunca o texto nem os valores pessoais.","description":"Devolve: { eventos }","parameters":[{"name":"dias","in":"query","required":false,"schema":{"type":"string"},"description":"O período em dias, de 1 a 90 (padrão 30).","example":"30"},{"name":"formato","in":"query","required":false,"schema":{"type":"string"},"description":"`csv` baixa o mesmo uso em CSV (até 500 linhas); sem ele, JSON (até 100).","example":"csv"},{"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":"{ eventos }","content":{"application/json":{"schema":{"type":"object","properties":{"eventos":{"type":"array","items":{"type":"object"},"description":"Quando, modelo, rota, status, tokens, latência e as categorias de dados pessoais."}},"required":["eventos"]}}}},"401":{"description":"Sem sessão da conta."},"404":{"description":"Organização desconhecida para esta conta."}}}},"/api/app/modelos":{"get":{"operationId":"get_api_app_modelos","summary":"O catálogo com a preferência da pessoa: o modelo desligado recusa a chamada da chave dela com 403.","description":"Devolve: { modelos }","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":"{ modelos }","content":{"application/json":{"schema":{"type":"object","properties":{"modelos":{"type":"array","items":{"type":"object"},"description":"Id, nome, contexto, descrição e se está ligado."}},"required":["modelos"]}}}},"401":{"description":"Sem sessão da conta."},"404":{"description":"Organização desconhecida para esta conta."}}},"patch":{"operationId":"patch_api_app_modelos","summary":"Liga ou desliga um modelo do catálogo para as chaves da pessoa.","description":"Devolve: { modelos }","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":"O id do modelo no catálogo (`rota/*`)."},"ligado":{"type":"boolean","description":"`false` desliga: a API recusa o modelo com 403."}}}}}},"responses":{"200":{"description":"{ modelos }","content":{"application/json":{"schema":{"type":"object","properties":{"modelos":{"type":"array","items":{"type":"object"},"description":"O catálogo com a preferência já mudada."}},"required":["modelos"]}}}},"400":{"description":"Id fora do catálogo, ou sem o `ligado`."},"401":{"description":"Sem sessão da conta."},"404":{"description":"Organização desconhecida para esta conta."}}}},"/api/app/creditos":{"get":{"operationId":"get_api_app_creditos","summary":"O saldo de crédito em reais e as compras por Pix; a compra em si é o Pix automático da casa.","description":"Devolve: { saldo_centavos, pode_comprar, compras }","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":"{ saldo_centavos, pode_comprar, compras }","content":{"application/json":{"schema":{"type":"object","properties":{"saldo_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":"Cada compra: valor, estado (`pendente`, `pago`, `vencido`, `estornado`) e datas."}},"required":["saldo_centavos","pode_comprar","compras"]}}}},"401":{"description":"Sem sessão da conta."},"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 }","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."}}}}}},"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."},"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/pricing":{"get":{"operationId":"pricing","summary":"Preços vigentes e franquias gratuitas.","description":"Devolve: { product, quota{free,paid,how_to_pay,live,free_now?,trial?}, pricing, billing, api_index }","responses":{"200":{"description":"{ product, quota{free,paid,how_to_pay,live,free_now?,trial?}, pricing, billing, api_index }","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string","description":"Product name."},"quota":{"allOf":[{"$ref":"#/components/schemas/PaymentQuota"}],"description":"Public allowances and current list prices; not personal usage."},"pricing":{"type":"string","description":"Absolute URL of the current price list."},"billing":{"type":"string","description":"Absolute URL of payment discovery or the existing billing summary."},"api_index":{"type":"string","description":"Absolute URL of the API catalog."}},"required":["product","quota","pricing","billing","api_index"]}}}},"405":{"description":"Use GET ou HEAD."}}}},"/api/billing":{"get":{"operationId":"billing","summary":"Descoberta pública de pagamento e crédito pré-pago.","description":"Devolve: { product, quota{free,paid,how_to_pay,live,free_now?,trial?}, pricing, billing, api_index, payment{provider,mode,network,chain_id,pay_to,homolog,dev,dev_gate,gratis?,facilitator,asset,asset_address,faucet,wallets}, credit{url,header} }","responses":{"200":{"description":"{ product, quota{free,paid,how_to_pay,live,free_now?,trial?}, pricing, billing, api_index, payment{provider,mode,network,chain_id,pay_to,homolog,dev,dev_gate,gratis?,facilitator,asset,asset_address,faucet,wallets}, credit{url,header} }","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string","description":"Product name."},"quota":{"allOf":[{"$ref":"#/components/schemas/PaymentQuota"}],"description":"Public allowances and current list prices; not personal usage."},"pricing":{"type":"string","description":"Absolute URL of the current price list."},"billing":{"type":"string","description":"Absolute URL of payment discovery or the existing billing summary."},"api_index":{"type":"string","description":"Absolute URL of the API catalog."},"payment":{"allOf":[{"$ref":"#/components/schemas/PaymentX402"}],"description":"Public x402 configuration; pay_to=null means not configured."},"credit":{"allOf":[{"$ref":"#/components/schemas/PaymentCredit"}],"description":"Prepaid credit entry point. Never contains a balance or token."}},"required":["product","quota","pricing","billing","api_index","payment","credit"]}}}},"405":{"description":"Use GET ou HEAD."}}}}}}