{
  "openapi": "3.0.3",
  "info": {
    "title": "Atomicat API",
    "version": "1.0.0",
    "description": "API HTTPS da conta para páginas, sites, funis, vídeos, produtos, leads e webhooks.\n\nURL base: https://automation.atomicat-api.com/api/automation/v1\n\nEnvie Authorization: Bearer at_live_... em cada chamada, exceto GET /openapi.json. As chaves são criadas no app da Atomicat, em Configurações e depois Chaves de API. A chave aparece uma única vez.\n\nAs respostas de lista e busca são arrays JSON. Não há um envelope { data: [] }.\n\nLimite: 5.000 solicitações por chave a cada 10 minutos. Outro limite de 60.000 solicitações por IP a cada 15 minutos vale para o host inteiro.\n\nOs nomes de campos e rotas permanecem em inglês. Este documento não inclui a gestão de chaves do proprietário nem as rotas internas.",
    "contact": {
      "name": "Atomicat",
      "url": "https://atomicat.com.br"
    }
  },
  "servers": [
    {
      "url": "https://automation.atomicat-api.com/api/automation/v1",
      "description": "Produção"
    }
  ],
  "tags": [
    {
      "name": "Account",
      "description": "Identifica a chave e baixa esta especificação."
    },
    {
      "name": "Projects",
      "description": "Agrupa páginas, sites, funis e produtos."
    },
    {
      "name": "Sites",
      "description": "Destinos de hospedagem para páginas publicadas."
    },
    {
      "name": "Pages",
      "description": "Cria, edita, publica e exclui páginas."
    },
    {
      "name": "Builder",
      "description": "Lê e edita a árvore do construtor."
    },
    {
      "name": "Quizzes",
      "description": "Páginas de quiz e registros de quiz."
    },
    {
      "name": "Funnels",
      "description": "Fluxos ordenados de páginas."
    },
    {
      "name": "Videos",
      "description": "Lista vídeos e atualiza o player."
    },
    {
      "name": "Products",
      "description": "Ofertas usadas nas páginas."
    },
    {
      "name": "Leads",
      "description": "Envios de formulários e quizzes."
    },
    {
      "name": "Analytics",
      "description": "Contagens da conta."
    },
    {
      "name": "Webhooks",
      "description": "Avisos HTTPS de eventos da conta."
    }
  ],
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "at_live",
        "description": "Chave criada em Configurações da Atomicat. Envie a chave completa, incluindo o prefixo at_live_. Não envie só o prefixo."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error",
          "message"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "Código estável, como invalid_request ou page_not_found."
          },
          "message": {
            "type": "string",
            "description": "Explicação legível."
          }
        }
      },
      "Deleted": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "true quando a exclusão teve sucesso."
          },
          "id": {
            "type": "string",
            "description": "Id do registro excluído."
          },
          "deleted": {
            "type": "boolean",
            "description": "true quando o registro foi removido."
          }
        }
      },
      "Account": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id da conta."
          },
          "email": {
            "type": "string",
            "nullable": true,
            "description": "Email da conta."
          },
          "name": {
            "type": "string",
            "description": "Nome de exibição."
          },
          "plan": {
            "nullable": true,
            "description": "Nome do plano quando existir."
          },
          "workspace_id": {
            "type": "string",
            "description": "O mesmo valor de id."
          }
        }
      },
      "Project": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id do projeto."
          },
          "name": {
            "type": "string",
            "description": "Nome."
          },
          "description": {
            "type": "string",
            "nullable": true,
            "description": "Descrição."
          },
          "context": {
            "type": "string",
            "nullable": true,
            "description": "Brief da marca. Presente ao criar e atualizar."
          },
          "active": {
            "type": "boolean",
            "description": "false quando o projeto está inativo."
          },
          "created_at": {
            "type": "string",
            "nullable": true,
            "description": "Timestamp ISO-8601."
          },
          "updated_at": {
            "type": "string",
            "nullable": true,
            "description": "Timestamp ISO-8601."
          }
        }
      },
      "ProjectCreate": {
        "type": "object",
        "required": [
          "name",
          "description",
          "context"
        ],
        "example": {
          "name": "Spring campaign",
          "description": "Campaign assets for the spring launch across offers and traffic sources.",
          "context": "Spring campaign sells a 6-week fitness program for busy professionals. The brand voice is direct and encouraging. The offer is a starter kit plus one coaching call. Pages should speak to people who started short workouts and quit, explain the weekly plan and the support included, and state the refund window before the call to action."
        },
        "properties": {
          "name": {
            "type": "string",
            "description": "Nome do projeto.",
            "example": "Spring campaign"
          },
          "description": {
            "type": "string",
            "minLength": 50,
            "example": "Campaign assets for the spring launch across offers and traffic sources.",
            "description": "Pelo menos 50 caracteres."
          },
          "context": {
            "type": "string",
            "minLength": 200,
            "example": "Spring campaign sells a 6-week fitness program for busy professionals. The brand voice is direct and encouraging. The offer is a starter kit plus one coaching call. Pages should speak to people who started short workouts and quit, explain the weekly plan and the support included, and state the refund window before the call to action.",
            "description": "Pelo menos 200 caracteres sobre a marca e a oferta."
          }
        }
      },
      "ProjectUpdate": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Novo nome."
          },
          "description": {
            "type": "string",
            "description": "Nova descrição."
          },
          "context": {
            "type": "string",
            "description": "Novo brief."
          }
        }
      },
      "Site": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id do site."
          },
          "name": {
            "type": "string",
            "description": "Nome de exibição, muitas vezes o domínio."
          },
          "site_name": {
            "type": "string",
            "nullable": true,
            "description": "Nome salvo no site."
          },
          "domain": {
            "type": "string",
            "nullable": true,
            "description": "Domínio público."
          },
          "custom_domain": {
            "type": "string",
            "nullable": true,
            "description": "Domínio próprio, quando conectado."
          },
          "atomic_domain": {
            "type": "string",
            "nullable": true,
            "description": "Domínio fornecido pela Atomicat."
          },
          "project_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do projeto."
          },
          "status": {
            "type": "string",
            "nullable": true,
            "description": "Status do site quando existir."
          },
          "created_at": {
            "type": "string",
            "nullable": true,
            "description": "Timestamp ISO-8601."
          },
          "updated_at": {
            "type": "string",
            "nullable": true,
            "description": "Timestamp ISO-8601."
          }
        }
      },
      "SiteCreated": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id do site."
          },
          "site_id": {
            "type": "string",
            "description": "O mesmo valor de id."
          },
          "name": {
            "type": "string",
            "nullable": true,
            "description": "Nome do site."
          },
          "atomic_domain": {
            "type": "string",
            "nullable": true,
            "description": "Domínio Atomicat."
          },
          "url": {
            "type": "string",
            "nullable": true,
            "description": "URL pública."
          },
          "project_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do projeto."
          },
          "custom_domain_instructions": {
            "nullable": true,
            "description": "Instruções de DNS do domínio próprio, quando devolvidas."
          }
        }
      },
      "SiteCreate": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Nome do site."
          },
          "description": {
            "type": "string",
            "description": "Descrição."
          },
          "project_id": {
            "type": "string",
            "description": "Projeto ao qual o site será ligado."
          }
        }
      },
      "Page": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id da página."
          },
          "name": {
            "type": "string",
            "description": "Nome de exibição. Inclui o site entre parênteses quando a página está em um site."
          },
          "page_name": {
            "type": "string",
            "description": "Nome sem o sufixo do site."
          },
          "status": {
            "type": "string",
            "description": "published ou draft."
          },
          "is_quiz": {
            "type": "boolean",
            "description": "true quando a página é um quiz."
          },
          "project_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do projeto."
          },
          "site_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do site quando a página está ligada a um site."
          },
          "site_name": {
            "type": "string",
            "nullable": true,
            "description": "Nome do site."
          },
          "domain": {
            "type": "string",
            "nullable": true,
            "description": "Domínio publicado."
          },
          "slug": {
            "type": "string",
            "nullable": true,
            "description": "Caminho no site. Vazio significa a raiz."
          },
          "url": {
            "type": "string",
            "nullable": true,
            "description": "URL pública depois de publicar."
          },
          "edit_url": {
            "type": "string",
            "description": "Link da página no construtor."
          },
          "created_at": {
            "type": "string",
            "nullable": true,
            "description": "Timestamp ISO-8601."
          },
          "updated_at": {
            "type": "string",
            "nullable": true,
            "description": "Timestamp ISO-8601."
          },
          "published_at": {
            "type": "string",
            "nullable": true,
            "description": "Hora de publicação ISO-8601."
          }
        }
      },
      "PageCreate": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Nome da página."
          },
          "project_id": {
            "type": "string",
            "description": "Id do projeto."
          }
        }
      },
      "PageFromTemplate": {
        "type": "object",
        "required": [
          "template_id"
        ],
        "properties": {
          "template_id": {
            "type": "string",
            "description": "Id do modelo de GET /templates."
          },
          "name": {
            "type": "string",
            "description": "Nome da nova página."
          },
          "site_id": {
            "type": "string",
            "description": "Site para ligar, se houver."
          },
          "project_id": {
            "type": "string",
            "description": "Id do projeto."
          }
        }
      },
      "PageDuplicate": {
        "type": "object",
        "required": [
          "page_id"
        ],
        "properties": {
          "page_id": {
            "type": "string",
            "description": "Página a copiar."
          },
          "new_name": {
            "type": "string",
            "description": "Nome da cópia."
          }
        }
      },
      "PageDuplicateResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id da nova página."
          },
          "name": {
            "type": "string",
            "description": "Novo nome."
          },
          "page_name": {
            "type": "string",
            "description": "Novo nome."
          },
          "source_page_id": {
            "type": "string",
            "description": "Id da página copiada."
          },
          "edit_url": {
            "type": "string",
            "description": "URL do construtor."
          }
        }
      },
      "PageMetadata": {
        "type": "object",
        "required": [
          "page_id"
        ],
        "properties": {
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "name": {
            "type": "string",
            "description": "Novo nome."
          },
          "project_id": {
            "type": "string",
            "description": "Novo id de projeto."
          },
          "tags": {
            "description": "Array de tags, ou texto separado por vírgulas."
          },
          "product_label": {
            "type": "string",
            "description": "Rótulo de produto. produkt é aceito como alias."
          }
        }
      },
      "PageMetadataResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id da página."
          },
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "updated": {
            "type": "boolean",
            "description": "true quando foi salvo."
          },
          "name": {
            "type": "string",
            "nullable": true,
            "description": "Nome depois da atualização."
          },
          "project_id": {
            "type": "string",
            "nullable": true,
            "description": "Id de projeto depois da atualização."
          },
          "tags": {
            "nullable": true,
            "description": "Tags depois da atualização."
          },
          "product_label": {
            "type": "string",
            "nullable": true,
            "description": "Rótulo depois da atualização."
          }
        }
      },
      "PageIdBody": {
        "type": "object",
        "required": [
          "page_id"
        ],
        "properties": {
          "page_id": {
            "type": "string",
            "description": "Id da página."
          }
        }
      },
      "PageContentUpdate": {
        "type": "object",
        "required": [
          "page_id",
          "updates"
        ],
        "properties": {
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "updates": {
            "type": "object",
            "additionalProperties": true,
            "description": "Mapa de chaves de conteúdo para novos valores. Um string JSON também é aceito."
          }
        }
      },
      "PageContentResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id da página."
          },
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "success": {
            "type": "boolean",
            "description": "true quando a solicitação terminou."
          },
          "applied_count": {
            "type": "number",
            "description": "Quantidade de campos atualizados."
          },
          "changed_section_count": {
            "type": "number",
            "description": "Quantidade de seções reescritas."
          },
          "missing_count": {
            "type": "number",
            "description": "Quantidade de chaves não encontradas."
          },
          "applied": {
            "type": "string",
            "description": "Texto JSON das atualizações aplicadas."
          },
          "missing": {
            "type": "string",
            "description": "Texto JSON das chaves não aplicadas."
          }
        }
      },
      "PageVariables": {
        "type": "object",
        "required": [
          "page_id",
          "variables"
        ],
        "properties": {
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "variables": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Nome do marcador para o texto. Um string JSON também é aceito."
          }
        }
      },
      "PageVariablesResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id da página."
          },
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "success": {
            "type": "boolean",
            "description": "true quando terminou."
          },
          "replacement_count": {
            "type": "number",
            "description": "Quantidade de substituições."
          },
          "changed_section_count": {
            "type": "number",
            "description": "Seções reescritas."
          },
          "replaced_variables": {
            "type": "string",
            "description": "Texto JSON das variáveis substituídas."
          },
          "remaining_variables": {
            "type": "string",
            "description": "Texto JSON das variáveis que ainda estão na página."
          },
          "remaining_variable_count": {
            "type": "number",
            "description": "Quantidade de variáveis restantes."
          }
        }
      },
      "PageValidation": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id da página."
          },
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "ready_to_publish": {
            "type": "boolean",
            "description": "true quando não há problemas."
          },
          "issue_count": {
            "type": "number",
            "description": "Quantidade de problemas."
          },
          "issues": {
            "type": "string",
            "description": "Texto JSON dos problemas."
          },
          "field_count": {
            "type": "number",
            "description": "Quantidade de campos editáveis."
          },
          "remaining_variable_count": {
            "type": "number",
            "description": "Variáveis que ainda estão na página."
          },
          "remaining_variables": {
            "type": "string",
            "description": "Texto JSON das variáveis restantes."
          }
        }
      },
      "PagePublish": {
        "type": "object",
        "required": [
          "page_id",
          "site_id"
        ],
        "properties": {
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "site_id": {
            "type": "string",
            "description": "Site que vai hospedar a página."
          },
          "slug": {
            "type": "string",
            "description": "Caminho no site. Omita ou envie vazio para a raiz."
          }
        }
      },
      "PagePublishResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id da página."
          },
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "site_id": {
            "type": "string",
            "description": "Id do site."
          },
          "success": {
            "type": "boolean",
            "description": "true quando a publicação teve sucesso."
          },
          "url": {
            "type": "string",
            "nullable": true,
            "description": "URL pública."
          },
          "domain": {
            "type": "string",
            "nullable": true,
            "description": "Domínio publicado."
          },
          "slug": {
            "type": "string",
            "description": "Caminho publicado."
          },
          "revision_saved": {
            "type": "boolean",
            "description": "true quando uma revisão foi salva."
          },
          "revision_warning": {
            "type": "string",
            "nullable": true,
            "description": "Aviso se a revisão não pôde ser salva."
          }
        }
      },
      "PageDelay": {
        "type": "object",
        "required": [
          "page_id"
        ],
        "properties": {
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "time": {
            "type": "number",
            "description": "Atraso em segundos."
          },
          "sync_with_video": {
            "type": "boolean",
            "description": "Revelar em sincronia com um vídeo."
          },
          "scroll_into_view": {
            "type": "boolean",
            "description": "Rolar a seção para a vista."
          },
          "video_node_id": {
            "type": "string",
            "description": "Id do nó de vídeo."
          }
        }
      },
      "PageDelayResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id da página."
          },
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "updated": {
            "type": "boolean",
            "description": "true quando foi salvo."
          },
          "delay": {
            "type": "object",
            "additionalProperties": true,
            "description": "Configurações de atraso salvas."
          }
        }
      },
      "BuilderSummary": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id da página."
          },
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "builder": {
            "type": "object",
            "additionalProperties": true,
            "description": "Resumo do construtor, com a árvore se include_tree for true."
          }
        }
      },
      "BuilderNode": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id do nó."
          },
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "node_id": {
            "type": "string",
            "description": "Id do nó."
          },
          "path": {
            "type": "string",
            "nullable": true,
            "description": "Local do nó na árvore."
          },
          "summary": {
            "nullable": true,
            "description": "Resumo curto quando o construtor devolve."
          },
          "node": {
            "type": "object",
            "additionalProperties": true,
            "description": "O objeto do nó."
          }
        }
      },
      "BuilderNodeFields": {
        "type": "object",
        "required": [
          "page_id",
          "node_id",
          "updates"
        ],
        "properties": {
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "node_id": {
            "type": "string",
            "description": "Id do nó."
          },
          "node_type": {
            "type": "string",
            "description": "Tipo de nó opcional."
          },
          "updates": {
            "type": "object",
            "description": "Deve incluir misc, style ou ambos.",
            "properties": {
              "misc": {
                "type": "object",
                "additionalProperties": true
              },
              "style": {
                "type": "object",
                "additionalProperties": true
              }
            }
          }
        }
      },
      "BuilderNodeUpdate": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id do nó."
          },
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "node_id": {
            "type": "string",
            "description": "Id do nó."
          },
          "updated": {
            "type": "boolean",
            "description": "true quando foi salvo."
          },
          "path": {
            "type": "string",
            "nullable": true,
            "description": "Caminho do nó."
          }
        }
      },
      "BuilderNodeReplace": {
        "type": "object",
        "required": [
          "page_id",
          "node_id",
          "node"
        ],
        "properties": {
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "node_id": {
            "type": "string",
            "description": "Id do nó a substituir."
          },
          "node": {
            "type": "object",
            "additionalProperties": true,
            "description": "Nó completo de substituição. Um string JSON também é aceito."
          }
        }
      },
      "BuilderNodeReplaceResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id do nó."
          },
          "page_id": {
            "type": "string",
            "description": "Id da página."
          },
          "node_id": {
            "type": "string",
            "description": "Id do nó."
          },
          "updated": {
            "type": "boolean",
            "description": "true quando foi substituído."
          },
          "path": {
            "type": "string",
            "nullable": true,
            "description": "Caminho do nó."
          },
          "builder_warnings": {
            "type": "string",
            "description": "Texto JSON de avisos."
          }
        }
      },
      "ContentMap": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true,
            "description": "Id da página."
          },
          "page_id": {
            "type": "string",
            "nullable": true,
            "description": "Id da página."
          },
          "page_name": {
            "type": "string",
            "nullable": true,
            "description": "Nome da página."
          },
          "field_count": {
            "type": "number",
            "description": "Quantidade de campos editáveis."
          },
          "variable_count": {
            "type": "number",
            "description": "Quantidade de variáveis."
          },
          "variables": {
            "type": "string",
            "description": "Texto JSON dos nomes das variáveis."
          },
          "fields": {
            "type": "string",
            "description": "Texto JSON dos campos editáveis."
          },
          "ready_for_variable_replacement": {
            "type": "boolean",
            "description": "true quando a página ainda tem variáveis."
          }
        }
      },
      "Template": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id do modelo."
          },
          "name": {
            "type": "string",
            "description": "Nome."
          },
          "template_name": {
            "type": "string",
            "description": "Igual a name."
          },
          "category": {
            "type": "string",
            "nullable": true,
            "description": "Categoria."
          },
          "type": {
            "type": "string",
            "description": "Tipo, normalmente page."
          },
          "description": {
            "type": "string",
            "nullable": true,
            "description": "Descrição."
          },
          "preview_url": {
            "type": "string",
            "nullable": true,
            "description": "URL de pré-visualização."
          },
          "image_url": {
            "type": "string",
            "nullable": true,
            "description": "URL da miniatura."
          }
        }
      },
      "Quiz": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id do quiz (qid)."
          },
          "name": {
            "type": "string",
            "description": "Nome de exibição, com o nome da página quando conhecido."
          },
          "quiz_name": {
            "type": "string",
            "description": "Nome do quiz."
          },
          "page_id": {
            "type": "string",
            "nullable": true,
            "description": "Página que hospeda o quiz."
          },
          "page_name": {
            "type": "string",
            "nullable": true,
            "description": "Nome da página."
          },
          "site_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do site."
          },
          "project_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do projeto."
          },
          "created_at": {
            "type": "string",
            "nullable": true,
            "description": "Timestamp ISO-8601."
          },
          "updated_at": {
            "type": "string",
            "nullable": true,
            "description": "Timestamp ISO-8601."
          }
        }
      },
      "QuizPage": {
        "type": "object",
        "description": "Uma página de quiz recém-criada. id é o id da página. Listagens posteriores devolvem o qid, que pode ser diferente.",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id da página."
          },
          "quiz_id": {
            "type": "string",
            "description": "Igual a id na criação."
          },
          "is_quiz": {
            "type": "boolean",
            "description": "Sempre true."
          },
          "name": {
            "type": "string",
            "description": "Nome."
          },
          "page_name": {
            "type": "string",
            "description": "Nome."
          },
          "project_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do projeto."
          },
          "site_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do site."
          },
          "edit_url": {
            "type": "string",
            "description": "URL do construtor."
          }
        }
      },
      "QuizCreate": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Nome da página de quiz."
          },
          "project_id": {
            "type": "string",
            "description": "Id do projeto."
          },
          "site_id": {
            "type": "string",
            "description": "Id do site."
          }
        }
      },
      "Funnel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id do funil."
          },
          "name": {
            "type": "string",
            "description": "Nome."
          },
          "site_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do site."
          },
          "project_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do projeto."
          },
          "status": {
            "type": "string",
            "nullable": true,
            "description": "Status."
          },
          "pages": {
            "type": "array",
            "items": {},
            "description": "Ids de página ou passos salvos no funil."
          },
          "page_ids": {
            "type": "string",
            "description": "Ids separados por vírgula quando pages é um array de ids."
          },
          "steps": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Passos quando o funil os guarda."
          },
          "created_at": {
            "type": "string",
            "nullable": true,
            "description": "Timestamp ISO-8601."
          },
          "updated_at": {
            "type": "string",
            "nullable": true,
            "description": "Timestamp ISO-8601."
          }
        }
      },
      "FunnelPage": {
        "type": "object",
        "properties": {
          "pageId": {
            "type": "string",
            "description": "Id de uma página existente."
          },
          "url": {
            "type": "string",
            "description": "URL externa, quando não há pageId."
          },
          "pageType": {
            "type": "string",
            "description": "Tipo do passo, como presell, sales ou thankyou."
          }
        }
      },
      "FunnelCreate": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Nome do funil."
          },
          "project_id": {
            "type": "string",
            "description": "Id do projeto."
          },
          "pages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FunnelPage"
            },
            "description": "Passos. Cada um precisa de pageId ou url."
          }
        }
      },
      "FunnelUpdate": {
        "type": "object",
        "required": [
          "funnel_id"
        ],
        "properties": {
          "funnel_id": {
            "type": "string",
            "description": "Id do funil."
          },
          "name": {
            "type": "string",
            "description": "Novo nome."
          },
          "pages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FunnelPage"
            }
          }
        }
      },
      "Video": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true,
            "description": "Id do vídeo."
          },
          "video_id": {
            "type": "string",
            "nullable": true,
            "description": "Igual a id."
          },
          "name": {
            "type": "string",
            "nullable": true,
            "description": "Nome."
          },
          "title": {
            "type": "string",
            "nullable": true,
            "description": "Título do player."
          },
          "status": {
            "type": "string",
            "nullable": true,
            "description": "Status de codificação ou reprodução."
          },
          "duration": {
            "nullable": true,
            "description": "Duração em segundos quando o player a devolve."
          },
          "thumbnail_url": {
            "type": "string",
            "nullable": true,
            "description": "URL da miniatura."
          },
          "project_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do projeto."
          },
          "created_at": {
            "type": "string",
            "nullable": true,
            "description": "Data de criação."
          },
          "updated_at": {
            "type": "string",
            "nullable": true,
            "description": "Data de atualização."
          }
        }
      },
      "VideoUpdate": {
        "type": "object",
        "required": [
          "video_id"
        ],
        "properties": {
          "video_id": {
            "type": "string",
            "description": "Id do vídeo."
          },
          "name": {
            "type": "string",
            "description": "Nome na biblioteca."
          },
          "title": {
            "type": "string",
            "description": "Título do player."
          },
          "language": {
            "type": "string",
            "description": "Idioma do player."
          },
          "project_id": {
            "type": "string",
            "description": "Id do projeto."
          },
          "primary_color": {
            "type": "string",
            "description": "Cor de destaque do player."
          },
          "controls": {
            "type": "boolean",
            "description": "Mostrar controles."
          },
          "autoplay": {
            "type": "boolean",
            "description": "Iniciar a reprodução automaticamente."
          },
          "muted": {
            "type": "boolean",
            "description": "Iniciar sem som."
          },
          "loop": {
            "type": "boolean",
            "description": "Repetir a reprodução."
          }
        }
      },
      "Product": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id do produto."
          },
          "name": {
            "type": "string",
            "description": "Nome."
          },
          "type": {
            "type": "string",
            "description": "simple ou bundle."
          },
          "sku": {
            "type": "string",
            "nullable": true,
            "description": "SKU."
          },
          "description": {
            "type": "string",
            "nullable": true,
            "description": "Descrição."
          },
          "image": {
            "type": "string",
            "nullable": true,
            "description": "URL da imagem."
          },
          "show_full_product": {
            "type": "boolean",
            "description": "Mostrar o bloco completo do produto."
          },
          "price": {
            "type": "number",
            "description": "Preço."
          },
          "compare_price": {
            "type": "number",
            "description": "Preço de comparação."
          },
          "rating": {
            "type": "string",
            "nullable": true,
            "description": "Rótulo de avaliação."
          },
          "rating_count": {
            "type": "string",
            "nullable": true,
            "description": "Rótulo da quantidade de avaliações."
          },
          "project_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do projeto."
          },
          "cta_text": {
            "type": "string",
            "nullable": true,
            "description": "Texto do botão."
          },
          "cta_url": {
            "type": "string",
            "nullable": true,
            "description": "URL do botão."
          },
          "cta_target": {
            "type": "boolean",
            "description": "Abrir a URL em uma nova aba."
          },
          "use_single_cta_link": {
            "type": "boolean",
            "description": "Usar um único link de chamada."
          },
          "bundle_discount": {
            "type": "number",
            "description": "Desconto do bundle."
          },
          "bundle_item_count": {
            "type": "number",
            "description": "Quantidade de itens do bundle."
          },
          "tiers_enabled": {
            "type": "boolean",
            "description": "Os níveis de quantidade estão ativos."
          },
          "subscription_enabled": {
            "type": "boolean",
            "description": "A opção de assinatura está ativa."
          },
          "created_at": {
            "type": "string",
            "nullable": true,
            "description": "Timestamp ISO-8601."
          },
          "updated_at": {
            "type": "string",
            "nullable": true,
            "description": "Timestamp ISO-8601."
          }
        }
      },
      "ProductWrite": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Nome."
          },
          "type": {
            "type": "string",
            "enum": [
              "simple",
              "bundle"
            ],
            "description": "Padrão simple."
          },
          "project_id": {
            "type": "string",
            "description": "Id do projeto."
          },
          "sku": {
            "type": "string",
            "description": "SKU."
          },
          "description": {
            "type": "string",
            "description": "Descrição."
          },
          "image": {
            "type": "string",
            "description": "URL da imagem."
          },
          "price": {
            "type": "number",
            "description": "Preço."
          },
          "compare_price": {
            "type": "number",
            "description": "Preço de comparação."
          },
          "cta_text": {
            "type": "string",
            "description": "Texto do botão."
          },
          "cta_url": {
            "type": "string",
            "description": "URL do botão."
          },
          "show_full_product": {
            "type": "boolean",
            "description": "Mostrar o bloco completo."
          },
          "cta_target": {
            "type": "boolean",
            "description": "Abrir a URL em uma nova aba."
          },
          "use_single_cta_link": {
            "type": "boolean",
            "description": "Usar um único link."
          },
          "rating": {
            "type": "string",
            "description": "Rótulo de avaliação. Padrão 4.9 se enviado vazio."
          },
          "rating_count": {
            "type": "string",
            "description": "Rótulo da quantidade."
          },
          "trust_badges_json": {
            "description": "Array de rótulos, ou um string JSON."
          },
          "variants_json": {
            "description": "Array de { id, name, image }, ou um string JSON."
          },
          "tiers_enabled": {
            "type": "boolean",
            "description": "Ativar níveis de quantidade."
          },
          "tiers_json": {
            "description": "Objetos de nível, ou um string JSON."
          },
          "bundle_items_json": {
            "description": "Obrigatório quando type é bundle."
          },
          "bundle_discount": {
            "type": "number",
            "description": "Desconto do bundle."
          },
          "subscription_json": {
            "description": "Objeto com enabled, discountPercent e benefits."
          }
        }
      },
      "ProductUpdate": {
        "type": "object",
        "required": [
          "product_id"
        ],
        "properties": {
          "product_id": {
            "type": "string",
            "description": "Id do produto."
          },
          "name": {
            "type": "string",
            "description": "Novo nome."
          },
          "type": {
            "type": "string",
            "enum": [
              "simple",
              "bundle"
            ]
          },
          "sku": {
            "type": "string",
            "description": "SKU."
          },
          "description": {
            "type": "string",
            "description": "Descrição."
          },
          "image": {
            "type": "string",
            "description": "URL da imagem."
          },
          "price": {
            "type": "number",
            "description": "Preço."
          },
          "compare_price": {
            "type": "number",
            "description": "Preço de comparação."
          },
          "project_id": {
            "type": "string",
            "description": "Id do projeto."
          },
          "cta_text": {
            "type": "string",
            "description": "Texto do botão."
          },
          "cta_url": {
            "type": "string",
            "description": "URL do botão."
          },
          "show_full_product": {
            "type": "boolean",
            "description": "Mostrar o bloco completo."
          },
          "cta_target": {
            "type": "boolean",
            "description": "Abrir em uma nova aba."
          },
          "use_single_cta_link": {
            "type": "boolean",
            "description": "Usar um único link."
          },
          "rating": {
            "type": "string",
            "description": "Rótulo de avaliação."
          },
          "rating_count": {
            "type": "string",
            "description": "Rótulo da quantidade."
          },
          "trust_badges_json": {
            "description": "Rótulos."
          },
          "variants_json": {
            "description": "Objetos de variante."
          },
          "tiers_enabled": {
            "type": "boolean",
            "description": "Ativar níveis."
          },
          "tiers_json": {
            "description": "Objetos de nível."
          },
          "bundle_items_json": {
            "description": "Itens do bundle."
          },
          "bundle_discount": {
            "type": "number",
            "description": "Desconto."
          },
          "subscription_json": {
            "description": "Configurações de assinatura."
          }
        }
      },
      "Lead": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id do lead."
          },
          "lead_id": {
            "type": "string",
            "description": "Igual a id."
          },
          "type": {
            "type": "string",
            "description": "form ou quiz."
          },
          "name": {
            "type": "string",
            "nullable": true,
            "description": "Nome."
          },
          "first_name": {
            "type": "string",
            "nullable": true,
            "description": "Nome."
          },
          "last_name": {
            "type": "string",
            "nullable": true,
            "description": "Sobrenome."
          },
          "email": {
            "type": "string",
            "nullable": true,
            "description": "Email."
          },
          "phone": {
            "type": "string",
            "nullable": true,
            "description": "Telefone."
          },
          "form_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do formulário. Presente em leads de formulário."
          },
          "form_name": {
            "type": "string",
            "nullable": true,
            "description": "Nome do formulário."
          },
          "quiz_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do quiz. Presente em leads de quiz."
          },
          "quiz_name": {
            "type": "string",
            "nullable": true,
            "description": "Nome do quiz."
          },
          "page_id": {
            "type": "string",
            "nullable": true,
            "description": "Id da página."
          },
          "page_url": {
            "type": "string",
            "nullable": true,
            "description": "URL da página."
          },
          "project_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do projeto."
          },
          "site_id": {
            "type": "string",
            "nullable": true,
            "description": "Id do site."
          },
          "abandoned": {
            "type": "boolean",
            "description": "true quando um lead de formulário foi abandonado."
          },
          "is_completed": {
            "type": "boolean",
            "description": "Presente em leads de quiz."
          },
          "fields": {
            "type": "object",
            "additionalProperties": true,
            "description": "Campos brutos do formulário."
          },
          "answers": {
            "type": "object",
            "additionalProperties": true,
            "description": "Respostas brutas do quiz."
          },
          "created_at": {
            "type": "string",
            "nullable": true,
            "description": "Timestamp ISO-8601."
          }
        }
      },
      "Analytics": {
        "type": "object",
        "properties": {
          "pages": {
            "type": "number",
            "description": "Quantidade de páginas."
          },
          "sites": {
            "type": "number",
            "description": "Quantidade de sites."
          },
          "funnels": {
            "type": "number",
            "description": "Quantidade de funis."
          },
          "products": {
            "type": "number",
            "description": "Quantidade de produtos."
          },
          "projects": {
            "type": "number",
            "description": "Quantidade de projetos."
          },
          "form_leads": {
            "type": "number",
            "description": "Quantidade de leads de formulário."
          },
          "quiz_leads": {
            "type": "number",
            "description": "Quantidade de leads de quiz."
          }
        }
      },
      "HookCreate": {
        "type": "object",
        "required": [
          "target_url",
          "event_type"
        ],
        "properties": {
          "target_url": {
            "type": "string",
            "format": "uri",
            "description": "URL HTTPS pública que recebe o evento."
          },
          "event_type": {
            "type": "string",
            "enum": [
              "form_lead.created",
              "quiz_lead.created",
              "page.published",
              "page.created",
              "product.created",
              "funnel.created",
              "site.created",
              "project.created"
            ],
            "description": "Evento a assinar."
          },
          "filters": {
            "type": "object",
            "additionalProperties": true,
            "description": "Objeto de filtro opcional salvo com a assinatura."
          }
        }
      },
      "HookSubscription": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id da assinatura. Envie para DELETE /hooks/{subscriptionId}."
          },
          "event_type": {
            "type": "string",
            "description": "Evento assinado."
          },
          "active": {
            "type": "boolean",
            "description": "true até a assinatura ser desativada."
          },
          "created_at": {
            "type": "string",
            "description": "Timestamp ISO-8601."
          }
        }
      }
    }
  },
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "paths": {
    "/me": {
      "get": {
        "operationId": "getAccount",
        "tags": [
          "Account"
        ],
        "summary": "Obter a conta autenticada",
        "description": "Devolve a conta Atomicat dona da chave. O id do espaço de trabalho é o mesmo id da conta.\n\nEscopo exigido: account:read.",
        "responses": {
          "200": {
            "description": "A conta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Account"
                },
                "example": {
                  "id": "user_123",
                  "email": "owner@example.com",
                  "name": "Ada Lovelace",
                  "plan": "pro",
                  "workspace_id": "user_123"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/openapi.json": {
      "get": {
        "operationId": "getOpenApiDocument",
        "tags": [
          "Account"
        ],
        "summary": "Baixar o documento OpenAPI",
        "description": "Documento público. Não exige chave. É a mesma especificação usada para construir este site.",
        "responses": {
          "200": {
            "description": "JSON do OpenAPI 3.0.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/projects": {
      "get": {
        "operationId": "listProjects",
        "tags": [
          "Projects"
        ],
        "summary": "Listar projetos",
        "description": "Os projetos agrupam páginas, sites, funis e produtos.\n\nEscopo exigido: projects:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "description": "Quantidade máxima de registros. O padrão é 50 e o máximo é 100."
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            },
            "description": "Índice de página começando em zero. A API devolve limit registros a partir de page × limit."
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Project"
                  }
                },
                "example": [
                  {
                    "id": "project_123",
                    "name": "Spring campaign",
                    "description": "Campaign assets for the spring launch across offers and traffic sources.",
                    "active": true,
                    "created_at": "2026-09-26T12:00:00.000Z",
                    "updated_at": "2026-09-26T12:00:00.000Z"
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      },
      "post": {
        "operationId": "createProject",
        "tags": [
          "Projects"
        ],
        "summary": "Criar um projeto",
        "description": "name é obrigatório. description precisa de pelo menos 50 caracteres. context precisa de pelo menos 200 caracteres. É necessário um plano pago.\n\nEscopo exigido: projects:write.",
        "responses": {
          "201": {
            "description": "O projeto criado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                },
                "example": {
                  "id": "project_123",
                  "name": "Spring campaign",
                  "description": "Campaign assets for the spring launch across offers and traffic sources.",
                  "active": true,
                  "created_at": "2026-09-26T12:00:00.000Z",
                  "updated_at": "2026-09-26T12:00:00.000Z",
                  "context": "Spring campaign sells a 6-week fitness program for busy professionals. The brand voice is direct and encouraging. The offer is a starter kit plus one coaching call. Pages should speak to people who started short workouts and quit, explain the weekly plan and the support included, and state the refund window before the call to action."
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectCreate"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/search/projects": {
      "get": {
        "operationId": "searchProjects",
        "tags": [
          "Projects"
        ],
        "summary": "Buscar projetos",
        "description": "Passe project_id para um, ou query para nome e descrição. Sempre devolve um array.\n\nEscopo exigido: projects:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "description": "Quantidade máxima de registros. O padrão é 50 e o máximo é 100."
          },
          {
            "name": "query",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Texto sem distinção de maiúsculas comparado com o nome e os campos relacionados."
          },
          {
            "name": "project_id",
            "in": "query",
            "required": false,
            "description": "Id exato do projeto.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Project"
                  }
                },
                "example": [
                  {
                    "id": "project_123",
                    "name": "Spring campaign",
                    "description": "Campaign assets for the spring launch across offers and traffic sources.",
                    "active": true,
                    "created_at": "2026-09-26T12:00:00.000Z",
                    "updated_at": "2026-09-26T12:00:00.000Z"
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/projects/{projectId}": {
      "get": {
        "operationId": "getProject",
        "tags": [
          "Projects"
        ],
        "summary": "Obter um projeto",
        "description": "Escopo exigido: projects:read.",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Id do projeto.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "O projeto.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                },
                "example": {
                  "id": "project_123",
                  "name": "Spring campaign",
                  "description": "Campaign assets for the spring launch across offers and traffic sources.",
                  "active": true,
                  "created_at": "2026-09-26T12:00:00.000Z",
                  "updated_at": "2026-09-26T12:00:00.000Z"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "O registro não existe ou pertence a outra conta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      },
      "patch": {
        "operationId": "updateProject",
        "tags": [
          "Projects"
        ],
        "summary": "Atualizar um projeto",
        "description": "Envie apenas os campos que deseja alterar.\n\nEscopo exigido: projects:write.",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Id do projeto.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "O projeto atualizado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                },
                "example": {
                  "id": "project_123",
                  "name": "Spring campaign",
                  "description": "Campaign assets for the spring launch across offers and traffic sources.",
                  "active": true,
                  "created_at": "2026-09-26T12:00:00.000Z",
                  "updated_at": "2026-09-26T12:00:00.000Z"
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "O registro não existe ou pertence a outra conta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectUpdate"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      },
      "delete": {
        "operationId": "deleteProject",
        "tags": [
          "Projects"
        ],
        "summary": "Excluir um projeto sem uso",
        "description": "Exclui o projeto só se nenhuma página, produto, site ou funil o referencia. Caso contrário, responde 409 project_in_use.\n\nEscopo exigido: projects:write.",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Id do projeto.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "O registro foi excluído.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Deleted"
                },
                "example": {
                  "success": true,
                  "id": "record_123",
                  "deleted": true
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "O registro não existe ou pertence a outra conta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "O registro não pode ser excluído porque outros registros ainda o usam.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/sites": {
      "get": {
        "operationId": "listSites",
        "tags": [
          "Sites"
        ],
        "summary": "Listar sites",
        "description": "Um site é o host onde uma página é publicada. Esta API não exclui sites.\n\nEscopo exigido: sites:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "description": "Quantidade máxima de registros. O padrão é 50 e o máximo é 100."
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            },
            "description": "Índice de página começando em zero. A API devolve limit registros a partir de page × limit."
          },
          {
            "name": "project_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Apenas registros deste projeto."
          },
          {
            "name": "query",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Texto sem distinção de maiúsculas comparado com o nome e os campos relacionados."
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Site"
                  }
                },
                "example": [
                  {
                    "id": "site_123",
                    "name": "example.com",
                    "site_name": "Main site",
                    "domain": "example.com",
                    "custom_domain": "example.com",
                    "atomic_domain": "main.atomicat.net",
                    "project_id": "project_123",
                    "status": null,
                    "created_at": "2026-09-26T12:00:00.000Z",
                    "updated_at": "2026-09-26T12:00:00.000Z"
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      },
      "post": {
        "operationId": "createSite",
        "tags": [
          "Sites"
        ],
        "summary": "Criar um site",
        "description": "Cria um site e devolve o domínio Atomicat. Inclui instruções de DNS do domínio próprio quando existirem.\n\nEscopo exigido: sites:write.",
        "responses": {
          "201": {
            "description": "O site criado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteCreated"
                },
                "example": {
                  "id": "site_123",
                  "site_id": "site_123",
                  "name": "Main site",
                  "atomic_domain": "main.atomicat.net",
                  "url": "https://main.atomicat.net",
                  "project_id": "project_123",
                  "custom_domain_instructions": null
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SiteCreate"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/search/sites": {
      "get": {
        "operationId": "searchSites",
        "tags": [
          "Sites"
        ],
        "summary": "Buscar sites",
        "description": "Escopo exigido: sites:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "description": "Quantidade máxima de registros. O padrão é 50 e o máximo é 100."
          },
          {
            "name": "query",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Texto sem distinção de maiúsculas comparado com o nome e os campos relacionados."
          },
          {
            "name": "project_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Apenas registros deste projeto."
          },
          {
            "name": "site_id",
            "in": "query",
            "required": false,
            "description": "Id exato. Devolve um array com um item.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Site"
                  }
                },
                "example": [
                  {
                    "id": "site_123",
                    "name": "example.com",
                    "site_name": "Main site",
                    "domain": "example.com",
                    "custom_domain": "example.com",
                    "atomic_domain": "main.atomicat.net",
                    "project_id": "project_123",
                    "status": null,
                    "created_at": "2026-09-26T12:00:00.000Z",
                    "updated_at": "2026-09-26T12:00:00.000Z"
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/sites/{siteId}": {
      "get": {
        "operationId": "getSite",
        "tags": [
          "Sites"
        ],
        "summary": "Obter um site",
        "description": "Escopo exigido: sites:read.",
        "parameters": [
          {
            "name": "siteId",
            "in": "path",
            "required": true,
            "description": "Id do site.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "O site.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Site"
                },
                "example": {
                  "id": "site_123",
                  "name": "example.com",
                  "site_name": "Main site",
                  "domain": "example.com",
                  "custom_domain": "example.com",
                  "atomic_domain": "main.atomicat.net",
                  "project_id": "project_123",
                  "status": null,
                  "created_at": "2026-09-26T12:00:00.000Z",
                  "updated_at": "2026-09-26T12:00:00.000Z"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "O registro não existe ou pertence a outra conta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/pages": {
      "get": {
        "operationId": "listPages",
        "tags": [
          "Pages"
        ],
        "summary": "Listar páginas",
        "description": "Escopo exigido: pages:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "description": "Quantidade máxima de registros. O padrão é 50 e o máximo é 100."
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            },
            "description": "Índice de página começando em zero. A API devolve limit registros a partir de page × limit."
          },
          {
            "name": "project_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Apenas registros deste projeto."
          },
          {
            "name": "site_id",
            "in": "query",
            "required": false,
            "description": "Apenas páginas deste site.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "published",
            "in": "query",
            "required": false,
            "description": "true para publicadas, false para rascunhos.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "is_quiz",
            "in": "query",
            "required": false,
            "description": "true para devolver apenas quizzes.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "has_element",
            "in": "query",
            "required": false,
            "description": "Apenas páginas cujo construtor contém este tipo de elemento.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "available_for_funnel",
            "in": "query",
            "required": false,
            "description": "true para ocultar páginas que já estão em um funil.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Page"
                  }
                },
                "example": [
                  {
                    "id": "page_123",
                    "name": "Main Offer",
                    "page_name": "Main Offer",
                    "status": "draft",
                    "is_quiz": false,
                    "project_id": "project_123",
                    "site_id": null,
                    "site_name": null,
                    "domain": null,
                    "slug": "",
                    "url": null,
                    "edit_url": "https://app.atomicat.com.br/builder/page_123",
                    "created_at": "2026-09-26T12:00:00.000Z",
                    "updated_at": "2026-09-26T12:00:00.000Z",
                    "published_at": null
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      },
      "post": {
        "operationId": "createPage",
        "tags": [
          "Pages"
        ],
        "summary": "Criar uma página em branco",
        "description": "Cria um rascunho. Publique depois com POST /pages/publish.\n\nEscopo exigido: pages:write.",
        "responses": {
          "201": {
            "description": "A página criada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Page"
                },
                "example": {
                  "id": "page_123",
                  "name": "Main Offer",
                  "page_name": "Main Offer",
                  "status": "draft",
                  "is_quiz": false,
                  "project_id": "project_123",
                  "site_id": null,
                  "site_name": null,
                  "domain": null,
                  "slug": "",
                  "url": null,
                  "edit_url": "https://app.atomicat.com.br/builder/page_123",
                  "created_at": "2026-09-26T12:00:00.000Z",
                  "updated_at": "2026-09-26T12:00:00.000Z",
                  "published_at": null
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PageCreate"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/pages/from-template": {
      "post": {
        "operationId": "createPageFromTemplate",
        "tags": [
          "Pages"
        ],
        "summary": "Criar uma página a partir de um modelo",
        "description": "Escopo exigido: pages:write.",
        "responses": {
          "201": {
            "description": "A página clonada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Page"
                },
                "example": {
                  "id": "page_123",
                  "name": "Main Offer",
                  "page_name": "Main Offer",
                  "status": "draft",
                  "is_quiz": false,
                  "project_id": "project_123",
                  "site_id": null,
                  "site_name": null,
                  "domain": null,
                  "slug": "",
                  "url": null,
                  "edit_url": "https://app.atomicat.com.br/builder/page_123",
                  "created_at": "2026-09-26T12:00:00.000Z",
                  "updated_at": "2026-09-26T12:00:00.000Z",
                  "published_at": null,
                  "template_id": "template_123",
                  "from_template": true
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PageFromTemplate"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/pages/duplicate": {
      "post": {
        "operationId": "duplicatePage",
        "tags": [
          "Pages"
        ],
        "summary": "Duplicar uma página",
        "description": "Escopo exigido: pages:write.",
        "responses": {
          "201": {
            "description": "A página duplicada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageDuplicateResult"
                },
                "example": {
                  "id": "page_456",
                  "name": "Main Offer copy",
                  "page_name": "Main Offer copy",
                  "source_page_id": "page_123",
                  "edit_url": "https://app.atomicat.com.br/builder/page_456"
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PageDuplicate"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/pages/metadata": {
      "patch": {
        "operationId": "updatePageMetadata",
        "tags": [
          "Pages"
        ],
        "summary": "Atualizar metadados da página",
        "description": "page_id é obrigatório, mais pelo menos um entre name, project_id, tags ou product_label. tags pode ser um array ou texto separado por vírgulas.\n\nEscopo exigido: pages:write.",
        "responses": {
          "200": {
            "description": "Os metadados atualizados.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageMetadataResult"
                },
                "example": {
                  "id": "page_123",
                  "page_id": "page_123",
                  "updated": true,
                  "name": "Main Offer",
                  "project_id": "project_123",
                  "tags": [
                    "sales"
                  ],
                  "product_label": "Starter kit"
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PageMetadata"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/pages/content": {
      "patch": {
        "operationId": "updatePageContent",
        "tags": [
          "Pages"
        ],
        "summary": "Atualizar conteúdo mapeado",
        "description": "updates é um objeto com as chaves do mapa de conteúdo. Leia-as em GET /search/page-content-map. Chaves desconhecidas voltam em missing e não são aplicadas.\n\nEscopo exigido: pages:write.",
        "responses": {
          "200": {
            "description": "O resultado da atualização.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageContentResult"
                },
                "example": {
                  "id": "page_123",
                  "page_id": "page_123",
                  "success": true,
                  "applied_count": 1,
                  "changed_section_count": 1,
                  "missing_count": 0,
                  "applied": "[]",
                  "missing": "[]"
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PageContentUpdate"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/pages/replace-variables": {
      "post": {
        "operationId": "replacePageVariables",
        "tags": [
          "Pages"
        ],
        "summary": "Substituir variáveis do modelo",
        "description": "variables mapeia nomes de marcadores para o texto substituto. Os marcadores têm a forma {{name}}.\n\nEscopo exigido: pages:write.",
        "responses": {
          "200": {
            "description": "O resultado da substituição.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageVariablesResult"
                },
                "example": {
                  "id": "page_123",
                  "page_id": "page_123",
                  "success": true,
                  "replacement_count": 2,
                  "changed_section_count": 1,
                  "replaced_variables": "[\"headline\"]",
                  "remaining_variables": "[]",
                  "remaining_variable_count": 0
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PageVariables"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/pages/builder": {
      "get": {
        "operationId": "getPageBuilder",
        "tags": [
          "Builder"
        ],
        "summary": "Ler o construtor da página",
        "description": "Exige builder:read ou pages:read. include_tree=false omite a árvore de seções.\n\nEscopo exigido: qualquer um de builder:read, pages:read.",
        "parameters": [
          {
            "name": "page_id",
            "in": "query",
            "required": true,
            "description": "Id da página.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_tree",
            "in": "query",
            "required": false,
            "description": "Incluir a árvore. Padrão true.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "O resumo do construtor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BuilderSummary"
                },
                "example": {
                  "id": "page_123",
                  "page_id": "page_123",
                  "builder": {
                    "sectionCount": 1,
                    "tree": {
                      "sections": []
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/pages/builder/node": {
      "get": {
        "operationId": "getBuilderNode",
        "tags": [
          "Builder"
        ],
        "summary": "Ler um nó do construtor",
        "description": "Escopo exigido: qualquer um de builder:read, pages:read.",
        "parameters": [
          {
            "name": "page_id",
            "in": "query",
            "required": true,
            "description": "Id da página.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "node_id",
            "in": "query",
            "required": true,
            "description": "Id do nó na árvore.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "O nó.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BuilderNode"
                },
                "example": {
                  "id": "node_123",
                  "page_id": "page_123",
                  "node_id": "node_123",
                  "path": "sections[0]",
                  "summary": null,
                  "node": {
                    "id": "node_123"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      },
      "patch": {
        "operationId": "updateBuilderNodeFields",
        "tags": [
          "Builder"
        ],
        "summary": "Atualizar campos do nó",
        "description": "updates deve incluir misc, style ou ambos. Isso altera esses objetos. Não substitui o nó inteiro.\n\nEscopo exigido: qualquer um de builder:write, pages:write.",
        "responses": {
          "200": {
            "description": "O resultado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BuilderNodeUpdate"
                },
                "example": {
                  "id": "node_123",
                  "page_id": "page_123",
                  "node_id": "node_123",
                  "updated": true,
                  "path": "sections[0]"
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BuilderNodeFields"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/pages/builder/node/replace": {
      "patch": {
        "operationId": "replaceBuilderNode",
        "tags": [
          "Builder"
        ],
        "summary": "Substituir um nó",
        "description": "node é o objeto completo que substitui o nó existente.\n\nEscopo exigido: qualquer um de builder:write, pages:write.",
        "responses": {
          "200": {
            "description": "O resultado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BuilderNodeReplaceResult"
                },
                "example": {
                  "id": "node_123",
                  "page_id": "page_123",
                  "node_id": "node_123",
                  "updated": true,
                  "path": "sections[0]",
                  "builder_warnings": "[]"
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BuilderNodeReplace"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/pages/delay": {
      "patch": {
        "operationId": "updatePageDelay",
        "tags": [
          "Builder"
        ],
        "summary": "Atualizar o atraso de revelação",
        "description": "Escopo exigido: qualquer um de pages:write, builder:write.",
        "responses": {
          "200": {
            "description": "O resultado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageDelayResult"
                },
                "example": {
                  "id": "page_123",
                  "page_id": "page_123",
                  "updated": true,
                  "delay": {
                    "time": 5
                  }
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PageDelay"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/pages/validate-before-publish": {
      "post": {
        "operationId": "validatePageBeforePublish",
        "tags": [
          "Pages"
        ],
        "summary": "Verificar se a página pode ser publicada",
        "description": "ready_to_publish é false se não há seções ou restam variáveis. As listas voltam como texto JSON.\n\nEscopo exigido: pages:read.",
        "responses": {
          "200": {
            "description": "O resultado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageValidation"
                },
                "example": {
                  "id": "page_123",
                  "page_id": "page_123",
                  "ready_to_publish": true,
                  "issue_count": 0,
                  "issues": "[]",
                  "field_count": 4,
                  "remaining_variable_count": 0,
                  "remaining_variables": "[]"
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PageIdBody"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/pages/publish": {
      "post": {
        "operationId": "publishPage",
        "tags": [
          "Pages"
        ],
        "summary": "Publicar uma página",
        "description": "page_id e site_id são obrigatórios. slug é o caminho no site. Um slug vazio publica na raiz.\n\nEscopo exigido: qualquer um de pages:publish, pages:write.",
        "responses": {
          "200": {
            "description": "O resultado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagePublishResult"
                },
                "example": {
                  "id": "page_123",
                  "page_id": "page_123",
                  "site_id": "site_123",
                  "success": true,
                  "url": "https://example.com/offer",
                  "domain": "example.com",
                  "slug": "offer",
                  "revision_saved": true,
                  "revision_warning": null
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PagePublish"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/pages/{pageId}": {
      "get": {
        "operationId": "getPage",
        "tags": [
          "Pages"
        ],
        "summary": "Obter uma página",
        "description": "Lê um rascunho que ainda não aparece na lista, e também páginas publicadas.\n\nEscopo exigido: pages:read.",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "description": "Id da página.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A página.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Page"
                },
                "example": {
                  "id": "page_123",
                  "name": "Main Offer",
                  "page_name": "Main Offer",
                  "status": "draft",
                  "is_quiz": false,
                  "project_id": "project_123",
                  "site_id": null,
                  "site_name": null,
                  "domain": null,
                  "slug": "",
                  "url": null,
                  "edit_url": "https://app.atomicat.com.br/builder/page_123",
                  "created_at": "2026-09-26T12:00:00.000Z",
                  "updated_at": "2026-09-26T12:00:00.000Z",
                  "published_at": null
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "O registro não existe ou pertence a outra conta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      },
      "delete": {
        "operationId": "deletePage",
        "tags": [
          "Pages"
        ],
        "summary": "Excluir uma página",
        "description": "Um rascunho sem site é excluído diretamente. Uma página publicada ou já ligada a um site é excluída pelo site e precisa ter site id. Uma página publicada sem site responde 400.\n\nEscopo exigido: pages:write.",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "description": "Id da página.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "O registro foi excluído.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Deleted"
                },
                "example": {
                  "success": true,
                  "id": "record_123",
                  "deleted": true
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "O registro não existe ou pertence a outra conta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/templates": {
      "get": {
        "operationId": "listTemplates",
        "tags": [
          "Pages"
        ],
        "summary": "Listar modelos",
        "description": "Escopo exigido: pages:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "description": "Quantidade máxima de registros. O padrão é 50 e o máximo é 100."
          },
          {
            "name": "query",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Texto sem distinção de maiúsculas comparado com o nome e os campos relacionados."
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Categoria.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Tipo. Padrão page.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "template_id",
            "in": "query",
            "required": false,
            "description": "Id exato.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Template"
                  }
                },
                "example": [
                  {
                    "id": "template_123",
                    "name": "Offer",
                    "template_name": "Offer",
                    "category": "sales",
                    "type": "page",
                    "description": null,
                    "preview_url": null,
                    "image_url": null
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/search/templates": {
      "get": {
        "operationId": "searchTemplates",
        "tags": [
          "Pages"
        ],
        "summary": "Buscar modelos",
        "description": "Os mesmos filtros e a mesma resposta de GET /templates.\n\nEscopo exigido: pages:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "description": "Quantidade máxima de registros. O padrão é 50 e o máximo é 100."
          },
          {
            "name": "query",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Texto sem distinção de maiúsculas comparado com o nome e os campos relacionados."
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Categoria.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Tipo.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "template_id",
            "in": "query",
            "required": false,
            "description": "Id exato.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Template"
                  }
                },
                "example": [
                  {
                    "id": "template_123",
                    "name": "Offer",
                    "template_name": "Offer",
                    "category": "sales",
                    "type": "page",
                    "description": null,
                    "preview_url": null,
                    "image_url": null
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/search/pages": {
      "get": {
        "operationId": "searchPages",
        "tags": [
          "Pages"
        ],
        "summary": "Buscar páginas",
        "description": "Compara nome, título, domínio e slug. page_id devolve um array de um item. O limite padrão é 100.\n\nEscopo exigido: pages:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "description": "Quantidade máxima de registros. O padrão é 50 e o máximo é 100."
          },
          {
            "name": "query",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Texto sem distinção de maiúsculas comparado com o nome e os campos relacionados."
          },
          {
            "name": "page_id",
            "in": "query",
            "required": false,
            "description": "Id exato.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Page"
                  }
                },
                "example": [
                  {
                    "id": "page_123",
                    "name": "Main Offer",
                    "page_name": "Main Offer",
                    "status": "draft",
                    "is_quiz": false,
                    "project_id": "project_123",
                    "site_id": null,
                    "site_name": null,
                    "domain": null,
                    "slug": "",
                    "url": null,
                    "edit_url": "https://app.atomicat.com.br/builder/page_123",
                    "created_at": "2026-09-26T12:00:00.000Z",
                    "updated_at": "2026-09-26T12:00:00.000Z",
                    "published_at": null
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/search/page-content-map": {
      "get": {
        "operationId": "getPageContentMap",
        "tags": [
          "Builder"
        ],
        "summary": "Ler campos de conteúdo editáveis",
        "description": "fields e variables são texto JSON. Use as chaves com PATCH /pages/content.\n\nEscopo exigido: pages:read.",
        "parameters": [
          {
            "name": "page_id",
            "in": "query",
            "required": true,
            "description": "Id da página.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "O mapa de conteúdo.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContentMap"
                },
                "example": {
                  "id": "page_123",
                  "page_id": "page_123",
                  "page_name": "Main Offer",
                  "field_count": 1,
                  "variable_count": 1,
                  "variables": "[\"headline\"]",
                  "fields": "[]",
                  "ready_for_variable_replacement": true
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/quizzes": {
      "get": {
        "operationId": "listQuizzes",
        "tags": [
          "Quizzes"
        ],
        "summary": "Listar quizzes",
        "description": "Os ids de quiz vêm do registro (qid) e nem sempre são o id da página.\n\nEscopo exigido: pages:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "description": "Quantidade máxima de registros. O padrão é 50 e o máximo é 100."
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            },
            "description": "Índice de página começando em zero. A API devolve limit registros a partir de page × limit."
          },
          {
            "name": "query",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Texto sem distinção de maiúsculas comparado com o nome e os campos relacionados."
          },
          {
            "name": "page_id",
            "in": "query",
            "required": false,
            "description": "Apenas quizzes desta página.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "quiz_id",
            "in": "query",
            "required": false,
            "description": "Id exato do quiz.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Quiz"
                  }
                },
                "example": [
                  {
                    "id": "quiz_123",
                    "name": "Main quiz",
                    "quiz_name": "Main quiz",
                    "page_id": "page_123",
                    "page_name": "Quiz page",
                    "site_id": null,
                    "project_id": "project_123",
                    "created_at": "2026-09-26T12:00:00.000Z",
                    "updated_at": "2026-09-26T12:00:00.000Z"
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      },
      "post": {
        "operationId": "createQuiz",
        "tags": [
          "Quizzes"
        ],
        "summary": "Criar uma página de quiz",
        "description": "Escopo exigido: pages:write.",
        "responses": {
          "201": {
            "description": "A página de quiz criada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuizPage"
                },
                "example": {
                  "id": "page_123",
                  "name": "Main Offer",
                  "page_name": "Main Offer",
                  "status": "draft",
                  "is_quiz": true,
                  "project_id": "project_123",
                  "site_id": null,
                  "site_name": null,
                  "domain": null,
                  "slug": "",
                  "url": null,
                  "edit_url": "https://app.atomicat.com.br/builder/page_123",
                  "created_at": "2026-09-26T12:00:00.000Z",
                  "updated_at": "2026-09-26T12:00:00.000Z",
                  "published_at": null,
                  "quiz_id": "page_123"
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QuizCreate"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/search/quizzes": {
      "get": {
        "operationId": "searchQuizzes",
        "tags": [
          "Quizzes"
        ],
        "summary": "Buscar quizzes",
        "description": "Os mesmos filtros e a mesma resposta de GET /quizzes.\n\nEscopo exigido: pages:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "description": "Quantidade máxima de registros. O padrão é 50 e o máximo é 100."
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            },
            "description": "Índice de página começando em zero. A API devolve limit registros a partir de page × limit."
          },
          {
            "name": "query",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Texto sem distinção de maiúsculas comparado com o nome e os campos relacionados."
          },
          {
            "name": "page_id",
            "in": "query",
            "required": false,
            "description": "Id da página.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "quiz_id",
            "in": "query",
            "required": false,
            "description": "Id do quiz.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Quiz"
                  }
                },
                "example": [
                  {
                    "id": "quiz_123",
                    "name": "Main quiz",
                    "quiz_name": "Main quiz",
                    "page_id": "page_123",
                    "page_name": "Quiz page",
                    "site_id": null,
                    "project_id": "project_123",
                    "created_at": null,
                    "updated_at": null
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/quizzes/{quizId}": {
      "get": {
        "operationId": "getQuiz",
        "tags": [
          "Quizzes"
        ],
        "summary": "Obter um quiz",
        "description": "quizId pode ser o id do quiz (qid) ou o id de uma página marcada como quiz.\n\nEscopo exigido: pages:read.",
        "parameters": [
          {
            "name": "quizId",
            "in": "path",
            "required": true,
            "description": "Id do quiz ou da página quiz.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "O quiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Quiz"
                },
                "example": {
                  "id": "quiz_123",
                  "name": "Main quiz",
                  "quiz_name": "Main quiz",
                  "page_id": "page_123",
                  "page_name": "Quiz page",
                  "site_id": null,
                  "project_id": "project_123",
                  "created_at": null,
                  "updated_at": null
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "O registro não existe ou pertence a outra conta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/quizzes/from-template": {
      "post": {
        "operationId": "createQuizFromTemplate",
        "tags": [
          "Quizzes"
        ],
        "summary": "Criar um quiz a partir de um modelo",
        "description": "Escopo exigido: pages:write.",
        "responses": {
          "201": {
            "description": "A página de quiz criada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuizPage"
                },
                "example": {
                  "id": "page_123",
                  "name": "Main Offer",
                  "page_name": "Main Offer",
                  "status": "draft",
                  "is_quiz": true,
                  "project_id": "project_123",
                  "site_id": null,
                  "site_name": null,
                  "domain": null,
                  "slug": "",
                  "url": null,
                  "edit_url": "https://app.atomicat.com.br/builder/page_123",
                  "created_at": "2026-09-26T12:00:00.000Z",
                  "updated_at": "2026-09-26T12:00:00.000Z",
                  "published_at": null,
                  "quiz_id": "page_123",
                  "from_template": true,
                  "template_id": "template_123"
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PageFromTemplate"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/funnels": {
      "get": {
        "operationId": "listFunnels",
        "tags": [
          "Funnels"
        ],
        "summary": "Listar funis",
        "description": "Esta API não exclui funis.\n\nEscopo exigido: funnels:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "description": "Quantidade máxima de registros. O padrão é 50 e o máximo é 100."
          },
          {
            "name": "project_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Apenas registros deste projeto."
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Funnel"
                  }
                },
                "example": [
                  {
                    "id": "funnel_123",
                    "name": "Main funnel",
                    "site_id": "site_123",
                    "project_id": "project_123",
                    "status": "active",
                    "pages": [
                      "page_123"
                    ],
                    "page_ids": "page_123",
                    "steps": [],
                    "created_at": "2026-09-26T12:00:00.000Z",
                    "updated_at": "2026-09-26T12:00:00.000Z"
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      },
      "post": {
        "operationId": "createFunnel",
        "tags": [
          "Funnels"
        ],
        "summary": "Criar um funil",
        "description": "Cada página precisa de pageId ou url, e pageType.\n\nEscopo exigido: funnels:write.",
        "responses": {
          "201": {
            "description": "O funil criado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Funnel"
                },
                "example": {
                  "id": "funnel_123",
                  "name": "Main funnel",
                  "site_id": null,
                  "project_id": "project_123",
                  "status": null,
                  "pages": [],
                  "page_ids": "",
                  "steps": [],
                  "created_at": null,
                  "updated_at": null
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FunnelCreate"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      },
      "patch": {
        "operationId": "updateFunnel",
        "tags": [
          "Funnels"
        ],
        "summary": "Atualizar um funil",
        "description": "funnel_id é obrigatório. pages substitui a lista de passos quando enviado.\n\nEscopo exigido: funnels:write.",
        "responses": {
          "200": {
            "description": "O funil atualizado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Funnel"
                },
                "example": {
                  "id": "funnel_123",
                  "name": "Main funnel",
                  "site_id": null,
                  "project_id": null,
                  "status": null,
                  "pages": [],
                  "page_ids": "",
                  "steps": [],
                  "created_at": null,
                  "updated_at": null
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FunnelUpdate"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/search/funnels": {
      "get": {
        "operationId": "searchFunnels",
        "tags": [
          "Funnels"
        ],
        "summary": "Buscar funis",
        "description": "Escopo exigido: funnels:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "description": "Quantidade máxima de registros. O padrão é 50 e o máximo é 100."
          },
          {
            "name": "query",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Texto sem distinção de maiúsculas comparado com o nome e os campos relacionados."
          },
          {
            "name": "project_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Apenas registros deste projeto."
          },
          {
            "name": "funnel_id",
            "in": "query",
            "required": false,
            "description": "Id exato.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Funnel"
                  }
                },
                "example": [
                  {
                    "id": "funnel_123",
                    "name": "Main funnel",
                    "site_id": null,
                    "project_id": null,
                    "status": null,
                    "pages": [],
                    "page_ids": "",
                    "steps": [],
                    "created_at": null,
                    "updated_at": null
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/funnels/{funnelId}": {
      "get": {
        "operationId": "getFunnel",
        "tags": [
          "Funnels"
        ],
        "summary": "Obter um funil",
        "description": "Escopo exigido: funnels:read.",
        "parameters": [
          {
            "name": "funnelId",
            "in": "path",
            "required": true,
            "description": "Id do funil.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "O funil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Funnel"
                },
                "example": {
                  "id": "funnel_123",
                  "name": "Main funnel",
                  "site_id": null,
                  "project_id": null,
                  "status": null,
                  "pages": [],
                  "page_ids": "",
                  "steps": [],
                  "created_at": null,
                  "updated_at": null
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "O registro não existe ou pertence a outra conta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/videos": {
      "get": {
        "operationId": "listVideos",
        "tags": [
          "Videos"
        ],
        "summary": "Listar vídeos",
        "description": "Usa skip em vez de page. Esta API não envia nem exclui vídeos. Consulte este endpoint depois de um upload; não há webhook video.uploaded.\n\nEscopo exigido: videos:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Máximo de vídeos. Padrão 50, máximo 100.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          },
          {
            "name": "skip",
            "in": "query",
            "required": false,
            "description": "Quantidade de vídeos a pular. Padrão 0.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Video"
                  }
                },
                "example": [
                  {
                    "id": "video_123",
                    "video_id": "video_123",
                    "name": "Lesson 1",
                    "title": "Lesson 1",
                    "status": "ready",
                    "duration": 120,
                    "thumbnail_url": null,
                    "project_id": "project_123",
                    "created_at": "2026-09-26T12:00:00.000Z",
                    "updated_at": null
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      },
      "patch": {
        "operationId": "updateVideo",
        "tags": [
          "Videos"
        ],
        "summary": "Atualizar o player",
        "description": "video_id é obrigatório. Envie apenas as configurações que deseja alterar.\n\nEscopo exigido: videos:write.",
        "responses": {
          "200": {
            "description": "O vídeo atualizado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Video"
                },
                "example": {
                  "id": "video_123",
                  "video_id": "video_123",
                  "name": "Lesson 1",
                  "title": "Lesson 1",
                  "status": "ready",
                  "duration": 120,
                  "thumbnail_url": null,
                  "project_id": "project_123",
                  "created_at": null,
                  "updated_at": null
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VideoUpdate"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/search/videos": {
      "get": {
        "operationId": "searchVideos",
        "tags": [
          "Videos"
        ],
        "summary": "Buscar vídeos",
        "description": "Escopo exigido: videos:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "description": "Quantidade máxima de registros. O padrão é 50 e o máximo é 100."
          },
          {
            "name": "query",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Texto sem distinção de maiúsculas comparado com o nome e os campos relacionados."
          },
          {
            "name": "video_id",
            "in": "query",
            "required": false,
            "description": "Id exato. Devolve um array com um item.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "skip",
            "in": "query",
            "required": false,
            "description": "Vídeos a pular ao buscar na lista.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Video"
                  }
                },
                "example": [
                  {
                    "id": "video_123",
                    "video_id": "video_123",
                    "name": "Lesson 1",
                    "title": "Lesson 1",
                    "status": "ready",
                    "duration": null,
                    "thumbnail_url": null,
                    "project_id": null,
                    "created_at": null,
                    "updated_at": null
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/videos/{videoId}": {
      "get": {
        "operationId": "getVideo",
        "tags": [
          "Videos"
        ],
        "summary": "Obter um vídeo",
        "description": "Escopo exigido: videos:read.",
        "parameters": [
          {
            "name": "videoId",
            "in": "path",
            "required": true,
            "description": "Id do vídeo.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "O vídeo.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Video"
                },
                "example": {
                  "id": "video_123",
                  "video_id": "video_123",
                  "name": "Lesson 1",
                  "title": "Lesson 1",
                  "status": "ready",
                  "duration": 120,
                  "thumbnail_url": null,
                  "project_id": null,
                  "created_at": null,
                  "updated_at": null
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "O registro não existe ou pertence a outra conta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/products": {
      "get": {
        "operationId": "listProducts",
        "tags": [
          "Products"
        ],
        "summary": "Listar produtos",
        "description": "Escopo exigido: products:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "description": "Quantidade máxima de registros. O padrão é 50 e o máximo é 100."
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            },
            "description": "Índice de página começando em zero. A API devolve limit registros a partir de page × limit."
          },
          {
            "name": "project_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Apenas registros deste projeto."
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "simple ou bundle.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Product"
                  }
                },
                "example": [
                  {
                    "id": "product_123",
                    "name": "Starter kit",
                    "type": "simple",
                    "sku": "KIT-1",
                    "description": "Example product",
                    "image": null,
                    "show_full_product": false,
                    "price": 97,
                    "compare_price": 197,
                    "rating": "4.9",
                    "rating_count": "10K+",
                    "project_id": "project_123",
                    "cta_text": "Buy now",
                    "cta_url": "https://example.com/checkout",
                    "cta_target": false,
                    "use_single_cta_link": false,
                    "bundle_discount": 0,
                    "bundle_item_count": 0,
                    "tiers_enabled": false,
                    "subscription_enabled": false,
                    "created_at": "2026-09-26T12:00:00.000Z",
                    "updated_at": "2026-09-26T12:00:00.000Z"
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      },
      "post": {
        "operationId": "createProduct",
        "tags": [
          "Products"
        ],
        "summary": "Criar um produto",
        "description": "name é obrigatório. type é simple ou bundle. Um bundle exige bundle_items_json.\n\nEscopo exigido: products:write.",
        "responses": {
          "201": {
            "description": "O produto criado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Product"
                },
                "example": {
                  "id": "product_123",
                  "name": "Starter kit",
                  "type": "simple",
                  "sku": "KIT-1",
                  "description": "Example product",
                  "image": null,
                  "show_full_product": false,
                  "price": 97,
                  "compare_price": 197,
                  "rating": "4.9",
                  "rating_count": "10K+",
                  "project_id": "project_123",
                  "cta_text": "Buy now",
                  "cta_url": "https://example.com/checkout",
                  "cta_target": false,
                  "use_single_cta_link": false,
                  "bundle_discount": 0,
                  "bundle_item_count": 0,
                  "tiers_enabled": false,
                  "subscription_enabled": false,
                  "created_at": "2026-09-26T12:00:00.000Z",
                  "updated_at": "2026-09-26T12:00:00.000Z"
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductWrite"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      },
      "patch": {
        "operationId": "updateProduct",
        "tags": [
          "Products"
        ],
        "summary": "Atualizar um produto",
        "description": "product_id é obrigatório. Envie apenas os campos que deseja alterar.\n\nEscopo exigido: products:write.",
        "responses": {
          "200": {
            "description": "O produto atualizado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Product"
                },
                "example": {
                  "id": "product_123",
                  "name": "Starter kit",
                  "type": "simple",
                  "sku": "KIT-1",
                  "description": "Example product",
                  "image": null,
                  "show_full_product": false,
                  "price": 97,
                  "compare_price": 197,
                  "rating": "4.9",
                  "rating_count": "10K+",
                  "project_id": "project_123",
                  "cta_text": "Buy now",
                  "cta_url": "https://example.com/checkout",
                  "cta_target": false,
                  "use_single_cta_link": false,
                  "bundle_discount": 0,
                  "bundle_item_count": 0,
                  "tiers_enabled": false,
                  "subscription_enabled": false,
                  "created_at": "2026-09-26T12:00:00.000Z",
                  "updated_at": "2026-09-26T12:00:00.000Z"
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductUpdate"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/search/products": {
      "get": {
        "operationId": "searchProducts",
        "tags": [
          "Products"
        ],
        "summary": "Buscar produtos",
        "description": "Escopo exigido: products:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "description": "Quantidade máxima de registros. O padrão é 50 e o máximo é 100."
          },
          {
            "name": "query",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Texto sem distinção de maiúsculas comparado com o nome e os campos relacionados."
          },
          {
            "name": "project_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Apenas registros deste projeto."
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "simple ou bundle.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "product_id",
            "in": "query",
            "required": false,
            "description": "Id exato.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Product"
                  }
                },
                "example": [
                  {
                    "id": "product_123",
                    "name": "Starter kit",
                    "type": "simple",
                    "sku": "KIT-1",
                    "description": "Example product",
                    "image": null,
                    "show_full_product": false,
                    "price": 97,
                    "compare_price": 197,
                    "rating": "4.9",
                    "rating_count": "10K+",
                    "project_id": "project_123",
                    "cta_text": "Buy now",
                    "cta_url": "https://example.com/checkout",
                    "cta_target": false,
                    "use_single_cta_link": false,
                    "bundle_discount": 0,
                    "bundle_item_count": 0,
                    "tiers_enabled": false,
                    "subscription_enabled": false,
                    "created_at": "2026-09-26T12:00:00.000Z",
                    "updated_at": "2026-09-26T12:00:00.000Z"
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/products/{productId}": {
      "get": {
        "operationId": "getProduct",
        "tags": [
          "Products"
        ],
        "summary": "Obter um produto",
        "description": "Escopo exigido: products:read.",
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "description": "Id do produto.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "O produto.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Product"
                },
                "example": {
                  "id": "product_123",
                  "name": "Starter kit",
                  "type": "simple",
                  "sku": "KIT-1",
                  "description": "Example product",
                  "image": null,
                  "show_full_product": false,
                  "price": 97,
                  "compare_price": 197,
                  "rating": "4.9",
                  "rating_count": "10K+",
                  "project_id": "project_123",
                  "cta_text": "Buy now",
                  "cta_url": "https://example.com/checkout",
                  "cta_target": false,
                  "use_single_cta_link": false,
                  "bundle_discount": 0,
                  "bundle_item_count": 0,
                  "tiers_enabled": false,
                  "subscription_enabled": false,
                  "created_at": "2026-09-26T12:00:00.000Z",
                  "updated_at": "2026-09-26T12:00:00.000Z"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "O registro não existe ou pertence a outra conta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      },
      "delete": {
        "operationId": "deleteProduct",
        "tags": [
          "Products"
        ],
        "summary": "Excluir um produto",
        "description": "Escopo exigido: products:write.",
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "description": "Id do produto.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "O registro foi excluído.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Deleted"
                },
                "example": {
                  "success": true,
                  "id": "record_123",
                  "deleted": true
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "O registro não existe ou pertence a outra conta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/search/leads": {
      "get": {
        "operationId": "searchLeads",
        "tags": [
          "Leads"
        ],
        "summary": "Buscar leads",
        "description": "type é form, quiz, ou omitido para ambos. O limite padrão é 25 e o máximo é 50. Não há endpoint para criar ou excluir leads.\n\nEscopo exigido: leads:read.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Máximo de leads. Padrão 25, máximo 50.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 25
            }
          },
          {
            "name": "query",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Texto sem distinção de maiúsculas comparado com o nome e os campos relacionados."
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "form ou quiz.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lead_id",
            "in": "query",
            "required": false,
            "description": "Id exato.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page_id",
            "in": "query",
            "required": false,
            "description": "Apenas leads desta página.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "email",
            "in": "query",
            "required": false,
            "description": "Correspondência exata de email.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Registros correspondentes. O corpo é um array JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Lead"
                  }
                },
                "example": [
                  {
                    "id": "lead_123",
                    "lead_id": "lead_123",
                    "type": "form",
                    "name": "Jane Example",
                    "first_name": "Jane",
                    "last_name": "Example",
                    "email": "jane@example.com",
                    "phone": "+15555550123",
                    "form_id": "form_123",
                    "form_name": "Checkout",
                    "page_id": "page_123",
                    "page_url": "https://example.com/offer",
                    "project_id": "project_123",
                    "site_id": "site_123",
                    "abandoned": false,
                    "fields": {},
                    "created_at": "2026-09-26T12:00:00.000Z"
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/analytics": {
      "get": {
        "operationId": "getAnalytics",
        "tags": [
          "Analytics"
        ],
        "summary": "Obter contagens da conta",
        "description": "Contagens da conta. Não é um relatório de visitas, conversões ou receita.\n\nEscopo exigido: analytics:read.",
        "responses": {
          "200": {
            "description": "As contagens.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Analytics"
                },
                "example": {
                  "pages": 12,
                  "sites": 2,
                  "funnels": 3,
                  "products": 4,
                  "projects": 1,
                  "form_leads": 80,
                  "quiz_leads": 20
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/hooks": {
      "post": {
        "operationId": "createHook",
        "tags": [
          "Webhooks"
        ],
        "summary": "Assinar um evento",
        "description": "target_url precisa ser HTTPS público. Localhost, IPs privados e hostnames que resolvem para eles são recusados. A URL é verificada de novo antes de cada entrega. Basta um dos escopos listados.\n\nEscopo exigido: qualquer um de leads:read, pages:read, products:read, funnels:read, sites:read, projects:read.",
        "responses": {
          "201": {
            "description": "A assinatura. A URL de destino não é devolvida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HookSubscription"
                },
                "example": {
                  "id": "sub_123",
                  "event_type": "form_lead.created",
                  "active": true,
                  "created_at": "2026-09-26T12:00:00.000Z"
                }
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HookCreate"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/hooks/{subscriptionId}": {
      "delete": {
        "operationId": "deleteHook",
        "tags": [
          "Webhooks"
        ],
        "summary": "Desativar uma assinatura",
        "description": "Marca a assinatura como inativa. As entregas param. A resposta é { success: true }.\n\nEscopo exigido: qualquer um de leads:read, pages:read, products:read, funnels:read, sites:read, projects:read.",
        "parameters": [
          {
            "name": "subscriptionId",
            "in": "path",
            "required": true,
            "description": "Id devolvido por POST /hooks.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A assinatura foi desativada.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "success"
                  ]
                },
                "example": {
                  "success": true
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    },
    "/hooks/sample/{eventType}": {
      "get": {
        "operationId": "getHookSample",
        "tags": [
          "Webhooks"
        ],
        "summary": "Obter um payload de exemplo",
        "description": "Devolve um array com um objeto de exemplo. eventType é form_lead.created, quiz_lead.created, page.published, page.created, product.created, funnel.created, site.created ou project.created. Um tipo desconhecido devolve o exemplo de lead de formulário.\n\nEscopo exigido: qualquer um de leads:read, pages:read, products:read, funnels:read, sites:read, projects:read.",
        "parameters": [
          {
            "name": "eventType",
            "in": "path",
            "required": true,
            "description": "Nome do evento, por exemplo form_lead.created.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Um evento de exemplo em um array.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                },
                "example": [
                  {
                    "id": "sample_123",
                    "event_type": "form_lead.created",
                    "email": "jane@example.com"
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Falta um campo ou há um valor inválido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "O token Bearer está ausente, é inválido, expirou ou foi revogado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O token é válido, mas não inclui o escopo exigido ou o IP não está na lista permitida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "O token ultrapassou 5.000 solicitações em 10 minutos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ]
      }
    }
  }
}
