{
  "info": {
    "name": "Hermes Publisher API",
    "description": "Generated from https://socialmedia.janvalellam.com.br/api/ai/openapi.yaml. Contains no credentials. Set accessToken to a Supabase session or hms_live_ personal token; session-only requests require the Supabase session.",
    "version": "1.3.0",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{accessToken}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://socialmedia.janvalellam.com.br",
      "type": "string"
    },
    {
      "key": "accessToken",
      "value": "",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "AI Contract",
      "item": [
        {
          "name": "Baixar a skill operacional do Hermes",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/ai/SKILL.md",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "ai",
                "SKILL.md"
              ],
              "variable": []
            },
            "description": "Instruções de operação segura, roteamento de repositórios e deploy.\n\nInstruções operacionais da skill oficial do Hermes. Use o ZIP quando quiser instalar também referências, metadados e scripts auxiliares.\n\noperationId: getAiSkill\n\nauthentication: public"
          },
          "response": []
        },
        {
          "name": "Baixar instruções para ChatGPT",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/ai/chatgpt.md",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "ai",
                "chatgpt.md"
              ],
              "variable": []
            },
            "description": "Instruções para projetos e GPTs que operam o Hermes, incluindo limites de segurança, CAS e confirmação de ações destrutivas.\n\noperationId: getAiChatGptInstructions\n\nauthentication: public"
          },
          "response": []
        },
        {
          "name": "Baixar instruções para Claude",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/ai/claude.md",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "ai",
                "claude.md"
              ],
              "variable": []
            },
            "description": "Instruções de projeto para Claude, geradas da mesma versão do contrato público.\n\noperationId: getAiClaudeInstructions\n\nauthentication: public"
          },
          "response": []
        },
        {
          "name": "Baixar regras do Cursor",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/ai/cursor.mdc",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "ai",
                "cursor.mdc"
              ],
              "variable": []
            },
            "description": "Regras de projeto para configurar o Cursor com o contrato e as práticas seguras do Hermes.\n\noperationId: getAiCursorRules\n\nauthentication: public"
          },
          "response": []
        },
        {
          "name": "Baixar a CLI Hermes",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/ai/hermes.mjs",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "ai",
                "hermes.mjs"
              ],
              "variable": []
            },
            "description": "CLI Node.js sem dependências externas para autenticar por sessão Supabase, consultar o manifesto e instalar artefatos oficiais com verificação de integridade. Tokens pessoais são destinados ao HTTP/MCP e não são gravados automaticamente pela CLI.\n\noperationId: getAiCli\n\nauthentication: public"
          },
          "response": []
        },
        {
          "name": "Baixar a referência completa para LLMs",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/ai/llms-full.txt",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "ai",
                "llms-full.txt"
              ],
              "variable": []
            },
            "description": "Referência expandida para LLMs, com referências locais resolvidas, corpos de requisição, respostas e exemplos de todas as operações.\n\noperationId: getAiLlmsFull\n\nauthentication: public"
          },
          "response": []
        },
        {
          "name": "Baixar o índice conciso para LLMs",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/ai/llms.txt",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "ai",
                "llms.txt"
              ],
              "variable": []
            },
            "description": "Índice curto, em texto puro, para descoberta por agentes. Ele aponta para o contrato completo e resume as operações disponíveis.\n\noperationId: getAiLlms\n\nauthentication: public"
          },
          "response": []
        },
        {
          "name": "Baixar o manifesto verificável dos artefatos",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/ai/manifest.json",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "ai",
                "manifest.json"
              ],
              "variable": []
            },
            "description": "Lista cada artefato público com URL, MIME type, tamanho e SHA-256. É a fonte para downloads verificáveis e atualização automatizada.\n\noperationId: getAiManifest\n\nauthentication: public"
          },
          "response": []
        },
        {
          "name": "Baixar instruções de conexão MCP",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/ai/mcp-setup.md",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "ai",
                "mcp-setup.md"
              ],
              "variable": []
            },
            "description": "Guia de conexão ao MCP stateless do Hermes para clientes compatíveis. Use uma sessão Supabase ativa ou um token pessoal `hms_live_` com os scopes exigidos pelas tools.\n\noperationId: getAiMcpSetup\n\nauthentication: public"
          },
          "response": []
        },
        {
          "name": "Baixar o contrato OpenAPI 3.1",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/ai/openapi.json",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "ai",
                "openapi.json"
              ],
              "variable": []
            },
            "description": "Fonte pública das rotas, autenticação, capabilities, corpos e respostas do Hermes Publisher.\n\nUse este documento como fonte canônica para gerar clientes, validar payloads e descobrir códigos de resposta. O JSON e o YAML descrevem exatamente o mesmo contrato.\n\noperationId: getAiOpenApi\n\nauthentication: public"
          },
          "response": []
        },
        {
          "name": "Baixar o contrato OpenAPI 3.1 em YAML",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/ai/openapi.yaml",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "ai",
                "openapi.yaml"
              ],
              "variable": []
            },
            "description": "Versão YAML do contrato canônico, indicada para Scalar, Swagger UI, Postman, geradores de SDK e assistentes de código.\n\noperationId: getAiOpenApiYaml\n\nauthentication: public"
          },
          "response": []
        },
        {
          "name": "Baixar a coleção Postman gerada",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/ai/postman.json",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "ai",
                "postman.json"
              ],
              "variable": []
            },
            "description": "Contém somente placeholders; nenhum token ou segredo é distribuído.\n\nColeção gerada automaticamente do OpenAPI. Defina `baseUrl` e `accessToken` no ambiente do Postman; o arquivo distribuído não contém credenciais.\n\noperationId: getAiPostmanCollection\n\nauthentication: public"
          },
          "response": []
        },
        {
          "name": "Baixar a skill completa e instalável",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/ai/skill.zip",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "ai",
                "skill.zip"
              ],
              "variable": []
            },
            "description": "ZIP determinístico com SKILL.md, agents/openai.yaml, CLI e referências versionadas.\n\nPacote determinístico da skill oficial. Confira o SHA-256 publicado no manifesto antes de instalar ou atualizar.\n\noperationId: getAiSkillZip\n\nauthentication: public"
          },
          "response": []
        }
      ]
    },
    {
      "name": "API Access",
      "item": [
        {
          "name": "Consultar a trilha de auditoria da API",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/access/audit",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "access",
                "audit"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "100",
                  "description": "Máximo de eventos recentes.",
                  "disabled": true
                },
                {
                  "key": "member_id",
                  "value": "string",
                  "description": "Filtrar pelo membro autor do evento.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Exige sessão Supabase de administrador da equipe. Lista eventos recentes de autorização e gestão sem corpo da requisição, Authorization, segredo, hash de token ou conteúdo sensível.\n\noperationId: listApiAccessAudit\n\nauthentication: Supabase session bearer token (session only)\n\ncapability: team_admin"
          },
          "response": []
        },
        {
          "name": "Consultar o catálogo de rotas e ferramentas MCP (Central da API)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/access/catalog",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "access",
                "catalog"
              ],
              "variable": []
            },
            "description": "Catálogo da Central da API: todas as rotas do contrato com área, permissão exigida, nível mínimo que a tem (ou a flag Financeiro), se é só de sessão ou webhook, os parâmetros de caminho e de query e o nome da ferramenta MCP equivalente. Sai do mesmo contrato que gera o MCP. Só administradores, por sessão do Studio.\n\noperationId: getApiCatalog\n\nauthentication: Supabase session bearer token (session only)\n\ncapability: team_admin"
          },
          "response": []
        },
        {
          "name": "Consultar o próprio acesso individual à API",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/access/me",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "access",
                "me"
              ],
              "variable": []
            },
            "description": "Exige sessão Supabase interativa e nunca aceita token pessoal. Retorna a configuração destinada aos tokens pessoais do membro, o nível efetivo limitado pelo cargo do Studio e a contagem de tokens ativos; essa configuração não limita a própria sessão.\n\noperationId: getMyApiAccess\n\nauthentication: Supabase session bearer token (session only)"
          },
          "response": []
        },
        {
          "name": "Listar acessos individuais da equipe",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/access/members",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "access",
                "members"
              ],
              "variable": []
            },
            "description": "Exige sessão Supabase de administrador da equipe. Lista membros ativos, cargo do Studio e configuração exclusiva dos tokens pessoais, capabilities efetivas de PAT e metadados de tokens, sem segredo ou hash.\n\noperationId: listApiAccessMembers\n\nauthentication: Supabase session bearer token (session only)\n\ncapability: team_admin"
          },
          "response": []
        },
        {
          "name": "Alterar o nível individual de API de um membro",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"api_access_level\": \"leitor\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/access/members/:memberId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "access",
                "members",
                ":memberId"
              ],
              "variable": [
                {
                  "key": "memberId",
                  "value": "string",
                  "description": "ID de team_members."
                }
              ]
            },
            "description": "Exige sessão Supabase de administrador da equipe. O nível da API nunca pode superar o cargo atual no Studio; rebaixamentos reduzem permissões imediatamente e `nenhum` revoga todos os tokens ativos.\n\noperationId: updateMemberApiAccess\n\nauthentication: Supabase session bearer token (session only)\n\ncapability: team_admin"
          },
          "response": []
        },
        {
          "name": "Revogar um token pessoal como administrador",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/access/members/:memberId/tokens/:tokenId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "access",
                "members",
                ":memberId",
                "tokens",
                ":tokenId"
              ],
              "variable": [
                {
                  "key": "memberId",
                  "value": "string",
                  "description": "ID de team_members."
                },
                {
                  "key": "tokenId",
                  "value": "string",
                  "description": "ID público de metadados do token pessoal; nunca é o segredo `hms_live_` nem seu hash."
                }
              ]
            },
            "description": "Exige sessão Supabase de administrador da equipe. Revoga exatamente o token indicado de um membro, preservando metadados e trilha de auditoria.\n\noperationId: revokeMemberApiToken\n\nauthentication: Supabase session bearer token (session only)\n\ncapability: team_admin"
          },
          "response": []
        },
        {
          "name": "Listar os próprios tokens pessoais",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/access/tokens",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "access",
                "tokens"
              ],
              "variable": []
            },
            "description": "Exige sessão Supabase interativa. Lista somente metadados dos tokens pessoais do próprio membro; o valor secreto e o hash nunca são retornados.\n\noperationId: listMyApiTokens\n\nauthentication: Supabase session bearer token (session only)"
          },
          "response": []
        },
        {
          "name": "Criar um token pessoal com escopo e expiração",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"label\": \"Automação editorial\",\n  \"scopes\": [\n    \"projects_view\",\n    \"projects_edit\"\n  ],\n  \"expiresInDays\": 30\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/access/tokens",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "access",
                "tokens"
              ],
              "variable": []
            },
            "description": "Exige sessão Supabase interativa. Cria um token pessoal com validade de 1 a 90 dias e scopes dentro do acesso efetivo. O segredo `hms_live_` aparece uma única vez nesta resposta e não pode ser recuperado depois.\n\noperationId: createMyApiToken\n\nauthentication: Supabase session bearer token (session only)"
          },
          "response": []
        },
        {
          "name": "Revogar um token pessoal próprio",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/access/tokens/:tokenId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "access",
                "tokens",
                ":tokenId"
              ],
              "variable": [
                {
                  "key": "tokenId",
                  "value": "string",
                  "description": "ID público de metadados do token pessoal; nunca é o segredo `hms_live_` nem seu hash."
                }
              ]
            },
            "description": "Exige sessão Supabase interativa. Revoga um token do próprio membro de forma idempotente; somente metadados seguros permanecem disponíveis para auditoria.\n\noperationId: revokeMyApiToken\n\nauthentication: Supabase session bearer token (session only)"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Configuration",
      "item": [
        {
          "name": "Ler configuração versionada",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/config",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "config"
              ],
              "variable": []
            },
            "description": "Lê o valor mais recente de cada configuração versionada. A resposta inclui a versão para auditoria e diagnóstico.\n\noperationId: getConfig\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: config_view"
          },
          "response": []
        },
        {
          "name": "Criar nova versão de uma configuração",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"key\": \"horarios\",\n  \"value\": {\n    \"segunda\": [\n      \"12:00\"\n    ]\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/config",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "config"
              ],
              "variable": []
            },
            "description": "Publica uma nova versão imutável para uma chave de configuração. Exige a capability `config`; versões anteriores permanecem no histórico.\n\noperationId: setConfig\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: config"
          },
          "response": []
        },
        {
          "name": "Listar histórico de configurações",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/config/log",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "config",
                "log"
              ],
              "query": [
                {
                  "key": "key",
                  "value": "string",
                  "description": "Filtrar por chave.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Lista o histórico de configurações, opcionalmente filtrado por chave, para auditoria e comparação de versões.\n\noperationId: getConfigLog\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: config"
          },
          "response": []
        },
        {
          "name": "Listar skills publicadas",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/skills",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "skills"
              ],
              "query": [
                {
                  "key": "name",
                  "value": "string",
                  "description": "Filtrar pelo nome exato.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Lista as skills versionadas publicadas no backend, com filtro opcional pelo nome estável.\n\noperationId: listSkills\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: skills_view"
          },
          "response": []
        },
        {
          "name": "Publicar nova versão de uma skill",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"hermes-calendar\",\n  \"content\": \"# Hermes Calendar\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/skills",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "skills"
              ],
              "variable": []
            },
            "description": "Publica uma nova versão do conteúdo de uma skill. Não sobrescreve silenciosamente o histórico e exige a capability `config`.\n\noperationId: publishSkill\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: config"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Creative",
      "item": [
        {
          "name": "Gerar e armazenar uma arte",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "docs-20260822-001",
                "description": "Chave opcional de 8 a 128 caracteres seguros. Repita a mesma chave somente com o mesmo payload; reutilização com conteúdo diferente retorna 409.",
                "disabled": true
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"prompt\": \"Céu estrelado em verde profundo\",\n  \"event_id\": \"event-id\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/art",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "art"
              ],
              "variable": []
            },
            "description": "Gera uma imagem, armazena o resultado e opcionalmente a anexa a um evento acessível. Use `Idempotency-Key` para repetir com segurança após timeout.\n\noperationId: generateArt\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: art"
          },
          "response": []
        },
        {
          "name": "Gerar carrossel com até dez cards",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "docs-20260822-001",
                "description": "Chave opcional de 8 a 128 caracteres seguros. Repita a mesma chave somente com o mesmo payload; reutilização com conteúdo diferente retorna 409.",
                "disabled": true
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"event-id\",\n  \"cards\": [\n    {\n      \"text\": \"Primeiro insight\",\n      \"prompt\": \"Cosmos verde escuro\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/carousel",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "carousel"
              ],
              "variable": []
            },
            "description": "Gera de um a dez cards e os persiste como um conjunto ordenado. Se houver `event_id`, o vínculo de todas as mídias é atômico.\n\noperationId: generateCarousel\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: carousel"
          },
          "response": []
        },
        {
          "name": "Iniciar geração assíncrona de vídeo",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "docs-20260822-001",
                "description": "Chave opcional de 8 a 128 caracteres seguros. Repita a mesma chave somente com o mesmo payload; reutilização com conteúdo diferente retorna 409.",
                "disabled": true
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"prompt\": \"Luzes sutis na floresta\",\n  \"duration\": \"6\",\n  \"resolution\": \"720p\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/reels",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "reels"
              ],
              "variable": []
            },
            "description": "Cria um job assíncrono de vídeo e retorna imediatamente o identificador para polling. Somente o criador do job ou líderes podem consultar o resultado.\n\noperationId: generateReel\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: video"
          },
          "response": []
        },
        {
          "name": "Consultar uma geração de vídeo",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/reels/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "reels",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "string",
                  "description": "ID da geração de Reel."
                }
              ]
            },
            "description": "Consulta o estado de um job de vídeo. Faça polling moderado até `completed` ou `failed`; a URL só está disponível após conclusão.\n\noperationId: getReelJob\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: reels_view"
          },
          "response": []
        },
        {
          "name": "Enviar arquivo pronto",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/octet-stream"
              },
              {
                "key": "Idempotency-Key",
                "value": "docs-20260822-001",
                "description": "Chave opcional de 8 a 128 caracteres seguros. Repita a mesma chave somente com o mesmo payload; reutilização com conteúdo diferente retorna 409.",
                "disabled": true
              }
            ],
            "body": {
              "mode": "file",
              "file": {
                "src": ""
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/upload",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "upload"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "string",
                  "description": "Evento opcional.",
                  "disabled": true
                },
                {
                  "key": "filename",
                  "value": "string",
                  "description": "Nome usado também para detectar vídeo.",
                  "disabled": true
                },
                {
                  "key": "format",
                  "value": "string",
                  "description": "Proporção/formato.",
                  "disabled": true
                },
                {
                  "key": "kind",
                  "value": "string",
                  "description": "Tipo lógico.",
                  "disabled": true
                },
                {
                  "key": "slide_index",
                  "value": "0",
                  "description": "Ordem.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Corpo binário, limite de 300 MB. Metadados seguem na query string.\n\nRecebe bytes diretamente no corpo e armazena o arquivo. Metadados ficam na query string; use `Idempotency-Key` para evitar duplicatas em repetições.\n\noperationId: uploadMedia\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: art"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Email Drafts",
      "item": [
        {
          "name": "Listar metadados de rascunhos de e-mail",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/email-drafts",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "email-drafts"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "100",
                  "description": "Máximo de rascunhos.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "A listagem não inclui HTML. Consulte o template individual quando precisar editar.\n\nLista apenas metadados, sem transferir HTML potencialmente grande. Abra individualmente somente o template que será consultado ou editado.\n\noperationId: listEmailDrafts\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: email_drafts_view"
          },
          "response": []
        },
        {
          "name": "Excluir exatamente um rascunho com CAS",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/email-drafts/:templateId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "email-drafts",
                ":templateId"
              ],
              "query": [
                {
                  "key": "expected_updated_at",
                  "value": "2026-09-02T15:00:00.000Z",
                  "description": "Token CAS da leitura mais recente.",
                  "disabled": false
                }
              ],
              "variable": [
                {
                  "key": "templateId",
                  "value": "string",
                  "description": "ID lógico seguro do template."
                }
              ]
            },
            "description": "A exclusão é destrutiva e exige o updated_at atual. Leia o rascunho e confirme o template exato antes de chamar.\n\nExclusão destrutiva de um único template. Confirme o identificador e envie o `expected_updated_at` atual; conflitos nunca são sobrescritos.\n\noperationId: deleteEmailDraft\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: delete"
          },
          "response": []
        },
        {
          "name": "Consultar um rascunho de e-mail",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/email-drafts/:templateId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "email-drafts",
                ":templateId"
              ],
              "variable": [
                {
                  "key": "templateId",
                  "value": "string",
                  "description": "ID lógico seguro do template."
                }
              ]
            },
            "description": "Retorna o HTML completo, metadados e `updated_at`, que funciona como token CAS para a próxima edição ou exclusão.\n\noperationId: getEmailDraft\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: email_drafts_view"
          },
          "response": []
        },
        {
          "name": "Criar ou atualizar um rascunho com CAS",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "docs-20260822-001",
                "description": "Chave opcional de 8 a 128 caracteres seguros. Repita a mesma chave somente com o mesmo payload; reutilização com conteúdo diferente retorna 409.",
                "disabled": true
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"html\": \"<!doctype html><html><body>...</body></html>\",\n  \"metadata\": {\n    \"campaign\": \"xamanismo\"\n  },\n  \"expected_updated_at\": null\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/email-drafts/:templateId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "email-drafts",
                ":templateId"
              ],
              "variable": [
                {
                  "key": "templateId",
                  "value": "string",
                  "description": "ID lógico seguro do template."
                }
              ]
            },
            "description": "Use expected_updated_at null somente para criar. Para editar, use exatamente o updated_at da leitura mais recente.\n\nCria ou atualiza um template com CAS. Use `expected_updated_at: null` somente na criação e o timestamp exato da leitura mais recente nas edições.\n\noperationId: putEmailDraft\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: email_drafts_edit"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Identity",
      "item": [
        {
          "name": "Consultar membro autenticado e capacidades",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/me",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "me"
              ],
              "variable": []
            },
            "description": "Primeira chamada recomendada após autenticar. Em uma sessão Supabase, as capabilities vêm exclusivamente do cargo `access_level` do Studio; em um token pessoal, vêm da interseção entre scopes, nível individual da API e teto do cargo.\n\noperationId: getCurrentMember\n\nauthentication: Supabase session or `hms_live_` personal bearer token"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Intelligence",
      "item": [
        {
          "name": "Consultar melhores horários de publicação",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/insights/horarios",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "insights",
                "horarios"
              ],
              "variable": []
            },
            "description": "Retorna horários e sinais disponíveis para orientar o planejamento editorial. A origem do cálculo aparece no campo `fonte`.\n\noperationId: getPublishingTimes\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: analytics"
          },
          "response": []
        },
        {
          "name": "Buscar contexto e citações no Cérebro",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"tema\": \"consciência\",\n  \"n_chunks\": 6,\n  \"n_resultados\": 4\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/rag",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "rag"
              ],
              "variable": []
            },
            "description": "Pesquisa o Cérebro e devolve contexto consolidado, resultados e citações. Preserve as citações ao produzir conteúdo derivado.\n\noperationId: searchHermesKnowledge\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: rag"
          },
          "response": []
        },
        {
          "name": "Gerar roteiro com pesquisa e verificação",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"tema\": \"O poder da curiosidade\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/roteiro",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "roteiro"
              ],
              "variable": []
            },
            "description": "Gera um roteiro a partir do tema usando a camada de inteligência do Hermes. O formato detalhado pode evoluir e campos adicionais devem ser preservados pelos clientes.\n\noperationId: generateScript\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: roteiro"
          },
          "response": []
        }
      ]
    },
    {
      "name": "MCP",
      "item": [
        {
          "name": "Chamar o MCP Streamable HTTP do Hermes",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/list\",\n  \"params\": {}\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/mcp",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "mcp"
              ],
              "variable": []
            },
            "description": "Endpoint MCP oficial e stateless. Registra somente tools explícitas e encaminha cada ação para uma rota Hermes fixa com as mesmas guardas de capability, CAS e idempotência.\n\nEnvie mensagens JSON-RPC 2.0 do MCP por HTTP. Cada chamada é stateless, aceita sessão Supabase ou token pessoal `hms_live_` e só expõe ferramentas explícitas com as mesmas autorizações da API REST.\n\noperationId: callHermesMcp\n\nauthentication: Supabase session or `hms_live_` personal bearer token"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Members",
      "item": [
        {
          "name": "Listar membros ativos",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/membros",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "membros"
              ],
              "variable": []
            },
            "description": "Lista membros ativos que podem receber atribuições, sem retornar credenciais ou registros já desativados.\n\noperationId: listMembers\n\nauthentication: Supabase session bearer token (session only)\n\ncapability: members"
          },
          "response": []
        },
        {
          "name": "Alterar nível de acesso ou permissão financeira",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"member_id\": \"member-id\",\n  \"access_level\": \"lider\",\n  \"financeiro\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/membros",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "membros"
              ],
              "variable": []
            },
            "description": "Altera o nível de acesso (criador, líder, admin) e/ou a permissão por pessoa `financeiro`, que libera o painel de Vendas. Informe ao menos um dos dois; as capabilities efetivas são recalculadas na próxima requisição. Evite elevar privilégios sem necessidade operacional.\n\noperationId: updateMemberAccess\n\nauthentication: Supabase session bearer token (session only)\n\ncapability: members"
          },
          "response": []
        },
        {
          "name": "Convidar um novo membro",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Novo membro\",\n  \"email\": \"membro@example.com\",\n  \"access_level\": \"criador\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/membros",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "membros"
              ],
              "variable": []
            },
            "description": "O Supabase envia um link de convite para o e-mail informado. O usuário define a própria senha no fluxo de onboarding; a API nunca cria nem retorna senha provisória.\n\nEnvia um convite seguro por e-mail e cria o vínculo ativo na equipe. Nenhuma senha provisória é criada ou devolvida pela API.\n\noperationId: createMember\n\nauthentication: Supabase session bearer token (session only)\n\ncapability: members"
          },
          "response": []
        },
        {
          "name": "Revogar acesso e limpar atribuições atuais",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/membros/:memberId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "membros",
                ":memberId"
              ],
              "variable": [
                {
                  "key": "memberId",
                  "value": "string",
                  "description": "ID de team_members."
                }
              ]
            },
            "description": "Não exclui tarefas, conteúdos nem histórico. Preserva o usuário e o membro como âncoras de autoria/FKs; pode retornar 207 quando o acesso foi revogado, mas alguma limpeza precisa ser repetida.\n\nRevoga o login e remove apenas atribuições atuais. Conteúdos, tarefas e histórico permanecem preservados como registros de autoria.\n\noperationId: deactivateMember\n\nauthentication: Supabase session bearer token (session only)\n\ncapability: members"
          },
          "response": []
        },
        {
          "name": "Definir senha nova para um membro",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"password\": \"********\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/membros/:memberId/senha",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "membros",
                ":memberId",
                "senha"
              ],
              "variable": [
                {
                  "key": "memberId",
                  "value": "string",
                  "description": "ID de team_members."
                }
              ]
            },
            "description": "Para quem perdeu a senha e não consegue usar o e-mail de recuperação. A senha é escolhida pelo administrador, aplicada pelo Auth Admin e nunca é armazenada, logada ou devolvida. Não se aplica à própria conta (409).\n\noperationId: setMemberPassword\n\nauthentication: Supabase session bearer token (session only)\n\ncapability: members"
          },
          "response": []
        }
      ]
    },
    {
      "name": "OAuth",
      "item": [
        {
          "name": "Listar provedores e contas conectadas",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/oauth/_accounts",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "oauth",
                "_accounts"
              ],
              "variable": []
            },
            "description": "Nunca retorna tokens.\n\nRetorna provedores habilitados e metadados seguros das contas conectadas. Tokens, refresh tokens e segredos nunca aparecem na resposta.\n\noperationId: listOAuthAccounts\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: connections_view"
          },
          "response": []
        },
        {
          "name": "Consultar restrições do criador no TikTok",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/oauth/tiktok/creator-info",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "oauth",
                "tiktok",
                "creator-info"
              ],
              "variable": []
            },
            "description": "Consulta limites e opções de publicação da conta TikTok conectada, como privacidade e recursos permitidos, antes de preparar um envio.\n\noperationId: getTikTokCreatorInfo\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: connections_view"
          },
          "response": []
        },
        {
          "name": "Publicar conteúdo no TikTok",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"type\": \"PHOTO\",\n  \"caption\": \"Legenda\",\n  \"mediaIds\": [\n    \"media-id\"\n  ],\n  \"privacy_level\": \"SELF_ONLY\",\n  \"disable_comment\": false,\n  \"disable_duet\": false,\n  \"disable_stitch\": false,\n  \"brand_organic_toggle\": false,\n  \"brand_content_toggle\": false,\n  \"auto_add_music\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/oauth/tiktok/publish",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "oauth",
                "tiktok",
                "publish"
              ],
              "variable": []
            },
            "description": "Aceita somente IDs de mídia do Hermes; URLs arbitrárias do cliente são rejeitadas pelo desenho da rota.\n\nPublica foto ou vídeo usando exclusivamente IDs de mídia armazenados pelo Hermes. Valide antes as restrições retornadas por Creator Info.\n\noperationId: publishTikTokContent\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: publish"
          },
          "response": []
        },
        {
          "name": "Concluir callback OAuth",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/oauth/:provider/callback",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "oauth",
                ":provider",
                "callback"
              ],
              "query": [
                {
                  "key": "code",
                  "value": "provider-authorization-code",
                  "description": "Código emitido pelo provedor.",
                  "disabled": false
                },
                {
                  "key": "state",
                  "value": "signed-oauth-state",
                  "description": "Estado HMAC emitido pela rota start.",
                  "disabled": false
                }
              ],
              "variable": [
                {
                  "key": "provider",
                  "value": "meta",
                  "description": "Provedor social potencialmente disponível no ambiente."
                }
              ]
            },
            "description": "O state HMAC expira em dez minutos, contém apenas vínculos opacos com usuário/membro e exige o cookie HttpOnly/Secure/SameSite=Lax do navegador iniciador. O cookie é apagado antes da troca do código.\n\nCallback consumido pelo navegador após autorização no provedor. `state` e cookie precisam corresponder ao fluxo iniciado e expiram em dez minutos.\n\noperationId: completeOAuthProvider\n\nauthentication: public"
          },
          "response": []
        },
        {
          "name": "Desconectar um provedor social",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/oauth/:provider/disconnect",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "oauth",
                ":provider",
                "disconnect"
              ],
              "variable": [
                {
                  "key": "provider",
                  "value": "meta",
                  "description": "Provedor social potencialmente disponível no ambiente."
                }
              ]
            },
            "description": "Revoga a conexão persistida do provedor para a equipe. Depois da operação, confirme o estado com a consulta de contas antes de iniciar uma nova autorização.\n\noperationId: disconnectOAuthProvider\n\nauthentication: Supabase session bearer token (session only)\n\ncapability: connections"
          },
          "response": []
        },
        {
          "name": "Iniciar autorização OAuth",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/oauth/:provider/start",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "oauth",
                ":provider",
                "start"
              ],
              "variable": [
                {
                  "key": "provider",
                  "value": "meta",
                  "description": "Provedor social potencialmente disponível no ambiente."
                }
              ]
            },
            "description": "Exige administrador com capability connections. Cria state opaco ligado ao usuário/membro e cookie HttpOnly restrito ao callback; retorna a URL para um popup já aberto pelo front.\n\nInicia um fluxo OAuth vinculado ao usuário e membro atuais. Abra a URL retornada no navegador que iniciou a operação para preservar o cookie seguro do callback.\n\noperationId: startOAuthProvider\n\nauthentication: Supabase session bearer token (session only)\n\ncapability: connections"
          },
          "response": []
        },
        {
          "name": "Exibir diagnóstico HTML da conexão",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/oauth/:provider/status",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "oauth",
                ":provider",
                "status"
              ],
              "variable": [
                {
                  "key": "provider",
                  "value": "meta",
                  "description": "Provedor social potencialmente disponível no ambiente."
                }
              ]
            },
            "description": "Página HTML de diagnóstico destinada ao navegador. Para integração programática, prefira a listagem JSON de contas conectadas.\n\noperationId: getOAuthProviderStatus\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: connections_view"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Platforms",
      "item": [
        {
          "name": "Ler a senha de uma plataforma",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/plataformas/:platformId/senha",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "plataformas",
                ":platformId",
                "senha"
              ],
              "variable": [
                {
                  "key": "platformId",
                  "value": "00000000-0000-4000-8000-000000000000",
                  "description": "ID (UUID) da plataforma em Gastos de Aplicativos."
                }
              ]
            },
            "description": "Exige sessão Supabase de administrador da equipe e nunca aceita token pessoal nem MCP. Decifra e devolve a senha de uma única plataforma de Gastos de Aplicativos; o banco guarda só a cifra. A auditoria da API registra quem pediu, qual plataforma e quando, sem o valor.\n\noperationId: getPlatformPassword\n\nauthentication: Supabase session bearer token (session only)\n\ncapability: team_admin"
          },
          "response": []
        },
        {
          "name": "Gravar ou apagar a senha de uma plataforma",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"senha\": \"********\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/plataformas/:platformId/senha",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "plataformas",
                ":platformId",
                "senha"
              ],
              "variable": [
                {
                  "key": "platformId",
                  "value": "00000000-0000-4000-8000-000000000000",
                  "description": "ID (UUID) da plataforma em Gastos de Aplicativos."
                }
              ]
            },
            "description": "Exige sessão Supabase de administrador da equipe. Cifra e grava a senha de uma plataforma (AES-256-GCM no servidor) ou apaga a senha salva com `senha: null`. A resposta nunca devolve o valor.\n\noperationId: setPlatformPassword\n\nauthentication: Supabase session bearer token (session only)\n\ncapability: team_admin"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Projects",
      "item": [
        {
          "name": "Listar projetos colaborativos",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/projects",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "projects"
              ],
              "query": [
                {
                  "key": "created_after",
                  "value": "2026-09-02T15:00:00.000Z",
                  "description": "Cursor exclusivo de criação.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "Máximo de projetos.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Paginação determinística por created_at. Use created_after com o último timestamp recebido.\n\nLista projetos em ordem determinística de criação. Para paginação, use o `created_at` do último item como cursor exclusivo em `created_after`.\n\noperationId: listProjects\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: projects_view"
          },
          "response": []
        },
        {
          "name": "Criar projeto colaborativo vazio",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "docs-20260822-001",
                "description": "Chave opcional de 8 a 128 caracteres seguros. Repita a mesma chave somente com o mesmo payload; reutilização com conteúdo diferente retorna 409.",
                "disabled": true
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Lançamento Xamanismo\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/projects",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "projects"
              ],
              "variable": []
            },
            "description": "Cria um documento de projeto vazio no formato atual. Forneça uma chave de idempotência para tornar retries de rede seguros.\n\noperationId: createProject\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: projects_manage"
          },
          "response": []
        },
        {
          "name": "Consultar um projeto e seu token CAS",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/projects/:projectId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "projects",
                ":projectId"
              ],
              "variable": [
                {
                  "key": "projectId",
                  "value": "string",
                  "description": "ID de hermes_projects."
                }
              ]
            },
            "description": "Retorna o projeto completo e os tokens `api_revision`/`revision`. Sempre leia esta rota antes de aplicar uma alteração semântica.\n\noperationId: getProject\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: projects_view"
          },
          "response": []
        },
        {
          "name": "Listar histórico de operações do projeto",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/projects/:projectId/operations",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "projects",
                ":projectId",
                "operations"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "50",
                  "description": "Máximo de operações.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "projectId",
                  "value": "string",
                  "description": "ID de hermes_projects."
                }
              ]
            },
            "description": "Exibe o histórico imutável de operações semânticas, da revisão mais recente para a mais antiga, para auditoria e reconstrução de mudanças.\n\noperationId: listProjectOperations\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: projects_audit_view"
          },
          "response": []
        },
        {
          "name": "Aplicar uma operação semântica com CAS",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "docs-20260822-001",
                "description": "Chave opcional de 8 a 128 caracteres seguros. Repita a mesma chave somente com o mesmo payload; reutilização com conteúdo diferente retorna 409.",
                "disabled": true
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"expected_revision\": 4,\n  \"expected_updated_at\": \"2026-08-21T12:00:00.000Z\",\n  \"operation\": {\n    \"type\": \"task.add\",\n    \"title\": \"Revisar copy\",\n    \"status\": \"pending\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/projects/:projectId/operations",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "projects",
                ":projectId",
                "operations"
              ],
              "variable": [
                {
                  "key": "projectId",
                  "value": "string",
                  "description": "ID de hermes_projects."
                }
              ]
            },
            "description": "Nunca envie um snapshot inteiro. Leia o projeto, use revision/api_revision como expected_revision e aplique uma operação. Em 409, releia antes de decidir um novo payload. O servidor exige `projects_manage` para estrutura, ordem e responsáveis. Com somente `projects_edit`, task.update exige atribuição na tarefa e subtask.update exige atribuição na subtarefa ou tarefa-pai; comentários próprios continuam permitidos.\n\nAplica uma única mudança semântica ao projeto. Criadores só atualizam tarefas atribuídas à própria conta; líderes e admins podem gerenciar a equipe. Nunca envie um snapshot inteiro e, em conflito `409`, releia o projeto.\n\noperationId: applyProjectOperation\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: projects_edit by default; projects_manage according to the documented operation type"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Sales",
      "item": [
        {
          "name": "Receber eventos do checkout (servidor a servidor)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"eventos\": [\n    {\n      \"evento\": \"abriu_checkout\",\n      \"sessao\": \"sess-123456\",\n      \"id\": \"ev-000001\",\n      \"produto\": \"curso_kardec\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/jornada/eventos",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "jornada",
                "eventos"
              ],
              "variable": []
            },
            "description": "Entrada servidor a servidor da linha do tempo: o checkout do Xamanismo avisa quando alguém abre o checkout, muda de etapa ou se identifica. Autentica pelo cabeçalho `x-jornada-token` (segredo compartilhado), não por sessão. Aceita de 1 a 50 eventos; e-mail vira hash e nunca é gravado em claro; eventos repetidos (mesma sessão e id) são ignorados.\n\noperationId: ingestJourneyEvents\n\nauthentication: Supabase session or `hms_live_` personal bearer token"
          },
          "response": []
        },
        {
          "name": "Resumo de um lead para o SiteUP CRM (compras, origem e páginas)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"contato@siteup.com.br\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/jornada/lead",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "jornada",
                "lead"
              ],
              "variable": []
            },
            "description": "Consulta servidor a servidor da aba Contexto do lead do SiteUP CRM: compras de todas as lojas (checkout do Xamanismo e loja nova), primeiro e último toque (canal, UTMs, página de entrada) e as últimas cinco páginas visitadas. Visita anônima só aparece depois que a pessoa se identificou na mesma sessão. O e-mail vai no corpo, vira hash e não é guardado; nenhum dado de cartão ou documento sai. Token só de leitura (JORNADA_LEAD_TOKEN) no cabeçalho `x-jornada-token`.\n\noperationId: getLeadContext\n\nauthentication: Supabase session or `hms_live_` personal bearer token"
          },
          "response": []
        },
        {
          "name": "Consultar o perfil de uma pessoa pelo e-mail (dado pessoal, só Financeiro)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"contato@siteup.com.br\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/jornada/perfil",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "jornada",
                "perfil"
              ],
              "variable": []
            },
            "description": "Perfil de uma pessoa pelo e-mail, enviado no corpo (nunca na URL): segmento, compras, lançamentos em que mexeu, canal e hora preferidos, temas e a sugestão de próximo evento com o motivo. O e-mail só vira hash para a busca e não é guardado. Dado pessoal: exige a capability `vendas` (Financeiro) e a resposta não é cacheada.\n\noperationId: getPersonProfile\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Receber eventos de e-mail do SES (SNS)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "text/plain"
              }
            ],
            "body": {
              "mode": "file",
              "file": {
                "src": ""
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/jornada/ses",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "jornada",
                "ses"
              ],
              "variable": []
            },
            "description": "Entrada dos eventos de e-mail do SES (entregue, aberto, clicado, devolvido, reclamação) publicados pelo SNS do configuration set `jve-rastreio`. Autentica pelo `token` na query (JORNADA_SES_TOKEN) e confere o tópico (JORNADA_SES_TOPIC_ARN); confirma a assinatura do SNS só em URL da própria AWS. Grava na linha do tempo por pessoa (hash do e-mail).\n\noperationId: ingestSesEvent\n\nauthentication: Supabase session or `hms_live_` personal bearer token"
          },
          "response": []
        },
        {
          "name": "Sincronizar a linha do tempo",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"dias\": 30\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/jornada/sincronizar",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "jornada",
                "sincronizar"
              ],
              "variable": []
            },
            "description": "Relê as fontes da linha do tempo (pedidos da Pagar.me e da Stripe em todos os status e envios de recuperação do SiteUP CRM) dos últimos `dias` (1 a 120). A mesma sincronização roda sozinha a cada 15 minutos quando `JORNADA_SYNC=on`. Exige a capability `config`.\n\noperationId: syncJourney\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: config"
          },
          "response": []
        },
        {
          "name": "Listar os lançamentos com dashboard",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/lancamentos",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "lancamentos"
              ],
              "variable": []
            },
            "description": "Lista os lançamentos com dashboard (configuração em hermes_config, chave `lancamentos`; sem ela, os quatro de fábrica) e o projeto do Studio de cada um. Exige a capability `vendas`.\n\noperationId: listLaunches\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Cadastrar ou editar o dashboard de um projeto",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"projeto_id\": \"ca185d1f-b631-4699-9bbc-4cd81169b6a9\",\n  \"nome\": \"O Funeral da Evidência\",\n  \"tipo\": \"lancamento\",\n  \"inicio\": \"2026-09-01\",\n  \"fim\": null,\n  \"grupos\": [\n    {\n      \"chave\": \"ingressos\",\n      \"rotulo\": \"Ingressos\",\n      \"produtos\": [\n        \"o_funeral_da_evidencia_ingresso\"\n      ],\n      \"launch_ids\": [\n        \"funeral-2026-10\"\n      ]\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/lancamentos/:projetoId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "lancamentos",
                ":projetoId"
              ],
              "variable": [
                {
                  "key": "projetoId",
                  "value": "string",
                  "description": "ID do projeto em hermes_projects."
                }
              ]
            },
            "description": "Cadastra ou edita o dashboard de um projeto (grupos de produto, códigos `commerce_product`, `launch_id` opcionais e janela). Grava a lista inteira em hermes_config com nova versão e histórico. Exige a capability `config`.\n\noperationId: putLaunch\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: config"
          },
          "response": []
        },
        {
          "name": "Listar os compradores de um lançamento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/lancamentos/:projetoId/compradores",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "lancamentos",
                ":projetoId",
                "compradores"
              ],
              "query": [
                {
                  "key": "aba",
                  "value": "lancamento",
                  "description": "Aba do lançamento.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "2026-09-21",
                  "description": "Início do período.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "2026-09-23",
                  "description": "Fim do período.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "projetoId",
                  "value": "string",
                  "description": "ID do projeto em hermes_projects."
                }
              ]
            },
            "description": "Aba Compradores: pedidos pagos do lançamento no período com nome, e-mail, telefone, produto, valor, método e canal, mais recentes primeiro (até 2000). Contém dados pessoais: exige a capability `vendas` (permissão Financeiro) e a resposta nunca é cacheada.\n\noperationId: getLaunchBuyers\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Consultar o painel de decisão de um lançamento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/lancamentos/:projetoId/decisao",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "lancamentos",
                ":projetoId",
                "decisao"
              ],
              "query": [
                {
                  "key": "aba",
                  "value": "lancamento",
                  "description": "Aba do lançamento.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "2026-09-21",
                  "description": "Início do período.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "2026-09-23",
                  "description": "Fim do período.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "projetoId",
                  "value": "string",
                  "description": "ID do projeto em hermes_projects."
                }
              ]
            },
            "description": "Painel de decisão do lançamento: metas escritas no projeto do Studio contra o realizado, ritmo dos últimos dias (sem o dia da abertura) e projeção até o fim; comparação com o lançamento anterior no mesmo dia do ciclo (ingressos, receita, Orbum); custo de mídia (anúncio + WhatsApp) e resultado; quem já era cliente; ingressos que viraram Orbum e por qual caminho; vendas por lote com a hora da virada; e o efeito de cada onda de WhatsApp (recebeu, leu, comprou em 24 h, custo). Só números agregados; exige a capability `vendas`. Cada bloco traz `status` próprio e um erro num bloco não derruba os outros.\n\noperationId: getLaunchDecision\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Consultar os disparos de WhatsApp de um lançamento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/lancamentos/:projetoId/disparos",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "lancamentos",
                ":projetoId",
                "disparos"
              ],
              "query": [
                {
                  "key": "aba",
                  "value": "lancamento",
                  "description": "Aba do lançamento.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "2026-09-21",
                  "description": "Início do período.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "2026-09-23",
                  "description": "Fim do período.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "projetoId",
                  "value": "string",
                  "description": "ID do projeto em hermes_projects."
                }
              ]
            },
            "description": "Aba Disparos do lançamento: cada template de WhatsApp cujo nome casa com `disparos.templates` da configuração, com enviadas, entregues, lidas, taxa de leitura e custo (USD da Meta e BRL pela PTAX), prévia da mensagem e vendas atribuídas pelo `utm_content` do botão. Cache de 30 minutos; templates que a Meta não respondeu aparecem em `incompletos`. Exige a capability `vendas`.\n\noperationId: getLaunchBroadcasts\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Consultar o funil do CRM de um lançamento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/lancamentos/:projetoId/funil",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "lancamentos",
                ":projetoId",
                "funil"
              ],
              "query": [
                {
                  "key": "aba",
                  "value": "lancamento",
                  "description": "Aba do lançamento.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "2026-09-21",
                  "description": "Início do período.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "2026-09-23",
                  "description": "Fim do período.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "projetoId",
                  "value": "string",
                  "description": "ID do projeto em hermes_projects."
                }
              ]
            },
            "description": "Aba Check-in e presença: quantos cards estão em cada etapa do funil do lançamento no SiteUP CRM (config `funil`) e quantos entraram em cada etapa por dia no período. Cache de 5 minutos; exige a capability `vendas`.\n\noperationId: getLaunchCrmFunnel\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Consultar o funil da linha do tempo de um lançamento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/lancamentos/:projetoId/jornada",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "lancamentos",
                ":projetoId",
                "jornada"
              ],
              "query": [
                {
                  "key": "aba",
                  "value": "lancamento",
                  "description": "Aba do lançamento.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "2026-09-21",
                  "description": "Início do período.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "2026-09-23",
                  "description": "Fim do período.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "projetoId",
                  "value": "string",
                  "description": "ID do projeto em hermes_projects."
                }
              ]
            },
            "description": "Funil agregado do lançamento a partir da linha do tempo: pessoas que abriram o checkout, se identificaram, geraram pagamento e compraram, onde cada uma parou, pagamentos recusados e expirados, recuperações enviadas e quem voltou em até 7 dias. Sessões anônimas contam como a pessoa que se identificou nelas. Só números agregados; exige a capability `vendas`.\n\noperationId: getLaunchJourney\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Consultar a mídia paga de um lançamento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/lancamentos/:projetoId/midia",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "lancamentos",
                ":projetoId",
                "midia"
              ],
              "query": [
                {
                  "key": "aba",
                  "value": "lancamento",
                  "description": "Aba do lançamento.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "2026-09-21",
                  "description": "Início do período.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "2026-09-23",
                  "description": "Fim do período.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "projetoId",
                  "value": "string",
                  "description": "ID do projeto em hermes_projects."
                }
              ]
            },
            "description": "Aba Mídia do lançamento: gasto em anúncios do Meta e do Google das campanhas cujo nome casa com `midia.campanhas` da configuração, com impressões, cliques, CTR, CPC e CPM por plataforma, por grupo de produto (`midia.produtos`), por campanha (até 50), por anúncio (até 20) e por dia. Fonte: tabelas sincronizadas a cada ~5 h. Valores em reais; exige a capability `vendas`.\n\noperationId: getLaunchMedia\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Consultar a origem das vendas de um lançamento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/lancamentos/:projetoId/origem",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "lancamentos",
                ":projetoId",
                "origem"
              ],
              "query": [
                {
                  "key": "aba",
                  "value": "lancamento",
                  "description": "Aba do lançamento.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "2026-09-21",
                  "description": "Início do período.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "2026-09-23",
                  "description": "Fim do período.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "projetoId",
                  "value": "string",
                  "description": "ID do projeto em hermes_projects."
                }
              ]
            },
            "description": "Aba Origem do lançamento: vendas pagas agrupadas por canal (derivado do utm_source), campanha (utm_campaign), conteúdo (utm_content) e origem_venda, com receita por moeda. Último clique, pelas marcações que o checkout grava no pedido; vendas da loja Shopify ficam de fora. Exige a capability `vendas`.\n\noperationId: getLaunchOrigin\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Consultar os perfis agregados de quem mexeu num lançamento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/lancamentos/:projetoId/perfis",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "lancamentos",
                ":projetoId",
                "perfis"
              ],
              "variable": [
                {
                  "key": "projetoId",
                  "value": "string",
                  "description": "ID do projeto em hermes_projects."
                }
              ]
            },
            "description": "Perfis agregados de quem mexeu no lançamento (Fase 4): pessoas por segmento (recorrente, comprador, quase comprou, interessado, só mensagem), canal que mais responde, hora em que mais age (Brasília), assinantes do Orbum, quem comprou em outro lançamento, temas votados e a sugestão de próximo evento com a regra usada. As chaves `funeral` e `funeral-2026-10` contam como o mesmo lançamento. Só contagens, nenhuma pessoa; exige a capability `vendas`.\n\noperationId: getLaunchProfiles\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Consultar o painel de um lançamento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/lancamentos/:projetoId/resumo",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "lancamentos",
                ":projetoId",
                "resumo"
              ],
              "query": [
                {
                  "key": "aba",
                  "value": "lancamento",
                  "description": "Aba com datas e grupos próprios; padrão é a primeira.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "2026-09-01",
                  "description": "Início do período; padrão é o início do lançamento.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "2026-09-23",
                  "description": "Fim do período, no máximo amanhã.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "projetoId",
                  "value": "string",
                  "description": "ID do projeto em hermes_projects."
                }
              ]
            },
            "description": "Painel de um lançamento: vendas por grupo de produto, pagamentos falhos, pendentes e quantos iniciaram o pagamento, lidos ao vivo da Pagar.me e da Stripe por `commerce_product` e `launch_id`. Sem from/to usa a janela do lançamento ou da aba pedida (30 dias no perpétuo), no máximo 400 dias. Abas separam períodos, como pré-venda e lançamento, sem misturar números. Valores desconhecidos vêm como `null`, moedas nunca são somadas e a resposta nunca inclui dados pessoais. Cache de cinco minutos no servidor.\n\noperationId: getLaunchSummary\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Consultar a saúde de um lançamento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/lancamentos/:projetoId/saude",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "lancamentos",
                ":projetoId",
                "saude"
              ],
              "query": [
                {
                  "key": "aba",
                  "value": "lancamento",
                  "description": "Aba do lançamento.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "2026-09-21",
                  "description": "Início do período.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "2026-09-23",
                  "description": "Fim do período.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "projetoId",
                  "value": "string",
                  "description": "ID do projeto em hermes_projects."
                }
              ]
            },
            "description": "Aba Saúde: última venda, vendas e receita de hoje e o estado de cada fonte e rotina (leituras de pagamento, sincronização da linha do tempo, última recuperação enviada, último aviso do checkout e dados de anúncio). Exige a capability `vendas`.\n\noperationId: getLaunchHealth\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Registrar o motivo de saída de um assinante do Orbum",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"pessoa\": \"string\",\n  \"motivo\": \"financeiro\",\n  \"oferta\": \"nenhuma\",\n  \"resultado\": \"saiu\",\n  \"observacao\": \"string\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/orbum/cancelamentos",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "orbum",
                "cancelamentos"
              ],
              "variable": []
            },
            "description": "Grava em `orbum_cancelamentos` o motivo, a oferta feita e o resultado (skill resgate-cancelamento-orbum). Não aceita dado pessoal: a pessoa é o hash vindo de /api/orbum/saidas.\n\noperationId: createOrbumCancelReason\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Consultar o painel da assinatura Orbum",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/orbum/resumo",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "orbum",
                "resumo"
              ],
              "query": [
                {
                  "key": "atualizar",
                  "value": "1",
                  "description": "Força uma leitura nova das fontes.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Cruza o acesso no TheMembers com o pagamento (Hotmart, Pagar.me, Asaas) pessoa a pessoa. Assinante ativo é quem tem pagamento vigente; acesso sem pagamento, pagamento sem acesso e atraso vêm em `alertas`. Grava uma foto agregada por dia em `orbum_snapshots` e devolve o histórico. Só agregados. `atualizar=1` ignora o cache de 10 minutos.\n\noperationId: getOrbumSummary\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Listar quem está saindo do Orbum",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/orbum/saidas",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "orbum",
                "saidas"
              ],
              "variable": []
            },
            "description": "Pessoas que vão sair (acesso valendo sem cobrança futura), estão em atraso ou saíram nos últimos 60 dias, com e-mail mascarado e o motivo já registrado. `pessoa` é o hash do e-mail usado no registro do motivo.\n\noperationId: listOrbumExits\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Consultar as vendas do time comercial e a comissão",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/vendas/comercial",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "vendas",
                "comercial"
              ],
              "query": [
                {
                  "key": "from",
                  "value": "2026-09-01",
                  "description": "Início do período.",
                  "disabled": false
                },
                {
                  "key": "to",
                  "value": "2026-09-30",
                  "description": "Fim do período, no máximo amanhã e até 730 dias depois de `from`.",
                  "disabled": false
                }
              ],
              "variable": []
            },
            "description": "Vendas com UTM `comercial` na Hotmart, no checkout Pagar.me e no Asaas, pela data do pedido, com a comissão de 4 % sobre as vendas novas (recorrências ficam fora). Mesmas regras da guia Comissão Nina da planilha de acerto. Só agregados, sem dados de compradores.\n\noperationId: getCommercialSales\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        },
        {
          "name": "Consultar o resumo de vendas do período",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/vendas/resumo",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "vendas",
                "resumo"
              ],
              "query": [
                {
                  "key": "from",
                  "value": "2026-08-01",
                  "description": "Início do período.",
                  "disabled": false
                },
                {
                  "key": "produtos",
                  "value": "top",
                  "description": "Quantos produtos listar por fonte.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "2026-08-31",
                  "description": "Fim do período, no máximo amanhã e até 730 dias depois de `from`.",
                  "disabled": false
                }
              ],
              "variable": []
            },
            "description": "Resumo financeiro consolidado do período (Hotmart, Shopify, Asaas e checkout Pagar.me) mais custos de mídia e ROAS. Exige a capability `vendas`, concedida pela permissão por pessoa `financeiro` (não pelo nível). Datas são dias em horário de Brasília, intervalo máximo de 730 dias; valores desconhecidos vêm como `null`, nunca como zero; a resposta nunca inclui dados pessoais de compradores e fica em cache por cinco minutos no servidor.\n\noperationId: getSalesSummary\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: vendas"
          },
          "response": []
        }
      ]
    },
    {
      "name": "System",
      "item": [
        {
          "name": "Consultar saúde do serviço",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/health",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "health"
              ],
              "variable": []
            },
            "description": "Verificação pública e leve do processo HTTP. Um `200` confirma que o serviço responde; não garante a disponibilidade de cada provedor externo.\n\noperationId: getHealth\n\nauthentication: public"
          },
          "response": []
        },
        {
          "name": "Baixar uma mídia pelo domínio do Hermes",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/media/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "media",
                ":id"
              ],
              "query": [
                {
                  "key": "exp",
                  "value": "string",
                  "description": "Validade do link em segundos Unix, emitida pelo Hermes.",
                  "disabled": false
                },
                {
                  "key": "sig",
                  "value": "string",
                  "description": "Assinatura HMAC do link, emitida pelo Hermes.",
                  "disabled": false
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "string",
                  "description": "ID de media_assets."
                }
              ]
            },
            "description": "Proxy público necessário para provedores que fazem pull da mídia por URL (Post for Me, TikTok PULL_FROM_URL). Não exige login, mas só abre com a assinatura `sig` e dentro da validade `exp` que o Hermes coloca na URL. O tipo retornado depende do asset.\n\nEntrega um asset armazenado pelo Hermes para visualização ou consumo por provedores sociais. Use sempre a URL completa devolvida pelas operações de mídia: ela leva `exp` e `sig` e vale por 7 dias. Link sem assinatura, adulterado ou vencido recebe 403; peça a mídia de novo para obter um link novo.\n\noperationId: getMedia\n\nauthentication: public"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Workflow",
      "item": [
        {
          "name": "Listar eventos que aceitam mídia do membro",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/anexaveis",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "anexaveis"
              ],
              "variable": []
            },
            "description": "Lista eventos nos quais o membro pode anexar mídia, já acompanhados das referências atualmente persistidas.\n\noperationId: listAttachableEvents\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: art"
          },
          "response": []
        },
        {
          "name": "Listar conteúdos aguardando aprovação",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/aprovacoes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "aprovacoes"
              ],
              "variable": []
            },
            "description": "Lista conteúdos aguardando decisão para membros com capability `approve`, incluindo mídias e revisão atual do evento.\n\noperationId: listApprovals\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: approve"
          },
          "response": []
        },
        {
          "name": "Aprovar ou recusar conteúdo",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"event-id\",\n  \"action\": \"aprovar\",\n  \"day\": 2,\n  \"month\": 9,\n  \"year\": 2026,\n  \"hour\": \"19:00\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/aprovar",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "aprovar"
              ],
              "variable": []
            },
            "description": "A aprovação é atômica e idempotente no banco; a recusa preserva o conteúdo e muda o status.\n\nAprova ou recusa o conteúdo sem apagar o histórico. Ao recusar, informe um motivo útil; ao aprovar, a data final pode ser ajustada.\n\noperationId: decideApproval\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: approve"
          },
          "response": []
        },
        {
          "name": "Criar demanda editorial",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Novo corte\",\n  \"channel\": \"instagram\",\n  \"assignee_id\": \"member-id\",\n  \"day\": 2,\n  \"month\": 9,\n  \"year\": 2026,\n  \"hour\": \"12:00\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/demanda",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "demanda"
              ],
              "variable": []
            },
            "description": "Cria uma demanda no calendário e, quando informado, atribui somente um membro ativo. Datas são interpretadas no horário de Brasília.\n\noperationId: createDemand\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: tasks_assign"
          },
          "response": []
        },
        {
          "name": "Salvar rascunho editorial",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"event-id\",\n  \"expected_revision\": 4,\n  \"caption\": \"Nova legenda\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/draft",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "draft"
              ],
              "variable": []
            },
            "description": "Atualiza legenda e estado editorial usando CAS. Leia o evento imediatamente antes e envie o `api_revision` obtido como `expected_revision`.\n\noperationId: saveDraft\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: draft_save"
          },
          "response": []
        },
        {
          "name": "Enviar conteúdo para aprovação",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "docs-20260822-001",
                "description": "Chave opcional de 8 a 128 caracteres seguros. Repita a mesma chave somente com o mesmo payload; reutilização com conteúdo diferente retorna 409.",
                "disabled": true
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"event-id\",\n  \"expected_revision\": 4,\n  \"day\": 2,\n  \"month\": 9,\n  \"year\": 2026,\n  \"hour\": \"15:30\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/api/enviar",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "enviar"
              ],
              "variable": []
            },
            "description": "Move um conteúdo editável para o fluxo de aprovação e pode atualizar a data proposta. Exige o `api_revision` mais recente e aceita repetição segura com `Idempotency-Key`.\n\noperationId: submitForApproval\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: enviar"
          },
          "response": []
        },
        {
          "name": "Listar tarefas ativas do membro",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/tarefas",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "tarefas"
              ],
              "variable": []
            },
            "description": "Lista tarefas ativas visíveis ao membro autenticado. Cada evento inclui `api_revision`, que deve ser reutilizado em mutações protegidas por CAS.\n\noperationId: listMyTasks\n\nauthentication: Supabase session or `hms_live_` personal bearer token\n\ncapability: tasks_view"
          },
          "response": []
        }
      ]
    }
  ]
}
