openapi: 3.0.3 info: title: 'API IncrivelBot' description: 'Integre seu sistema aos bots de venda de acesso a grupos do Telegram.' version: 1.0.0 servers: - url: 'https://bot.incrivel.tech' tags: - name: Conta description: 'Dados da criadora dona do token, limites do plano e configurações de recebimento e integração.' - name: Bots description: 'Bots do Telegram conectados à conta (token do @BotFather). O webhook é registrado automaticamente.' - name: 'Grupos e canais' description: 'Grupos são cadastrados automaticamente quando o bot vira administrador no Telegram. Pela API você ativa as vendas e ajusta as opções.' - name: 'Planos de acesso' description: 'Planos vendidos pelo bot (preço, duração, lembretes de renovação e carência).' - name: Assinantes description: 'Pessoas que iniciaram conversa com o bot. O CPF nunca é exposto completo.' - name: Membros description: 'Permanências dos assinantes nos grupos: vencimentos, extensões, convites e remoções.' - name: Pagamentos description: 'Cobranças Pix de planos de acesso. A confirmação vem do gateway (webhook) e libera o acesso automaticamente.' - name: 'Gateways de pagamento' description: 'Chaves próprias de Asaas, Mercado Pago e Infopago (modo "own"). Os segredos são gravados criptografados e nunca são devolvidos.' - name: 'Plataforma: criadoras' description: 'Exige token da plataforma (criado no painel master). Provisione contas de criadoras a partir do seu sistema.' - name: 'Plataforma: planos' description: 'Planos que as criadoras assinam na plataforma. Exige token da plataforma.' components: securitySchemes: default: type: http scheme: bearer description: 'Gere o token no painel: criadora em Configurações → API e integrações; plataforma em Sistema → API da plataforma.' security: - default: [] paths: /api/v1/me: get: summary: 'Minha conta' operationId: minhaConta description: 'Retorna a criadora, o plano da plataforma, o uso atual e as configurações. Funciona mesmo com a assinatura suspensa.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 9f1c... name: 'Ana VIP' slug: anavip status: active can_operate: true payout_mode: own usage: bots: 1 active_groups: 1 active_members: 42 properties: data: type: object properties: id: type: string example: 9f1c... name: type: string example: 'Ana VIP' slug: type: string example: anavip status: type: string example: active can_operate: type: boolean example: true payout_mode: type: string example: own usage: type: object properties: bots: type: integer example: 1 active_groups: type: integer example: 1 active_members: type: integer example: 42 tags: - Conta patch: summary: 'Atualizar configurações' operationId: atualizarConfiguraes description: 'Modo de recebimento, gateway padrão, Wallet ID do Asaas, contato de suporte e URL de webhooks de integração.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: payout_mode: own default_gateway: asaas integration_webhook_url: 'https://meusistema.com.br/webhooks/incrivelbot' properties: data: type: object properties: payout_mode: type: string example: own default_gateway: type: string example: asaas integration_webhook_url: type: string example: 'https://meusistema.com.br/webhooks/incrivelbot' tags: - Conta requestBody: required: false content: application/json: schema: type: object properties: payout_mode: type: string description: '"own" (sua conta de gateway) ou "platform" (conta da plataforma com split).' example: own enum: - own - platform default_gateway: type: string description: 'asaas, mercadopago ou infopago.' example: asaas enum: - asaas - mercadopago - infopago asaas_wallet_id: type: string description: 'Wallet ID do Asaas, obrigatório no modo platform com Asaas. Must match the regex /^[0-9a-fA-F-]{20,64}$/.' example: 0c4f1e8a-1f0b-4b8e-9c0e-2f3d4a5b6c7d nullable: true support_contact: type: string description: 'Contato exibido aos assinantes. O campo value não pode ser superior a 120 caracteres.' example: '@meusuporte' nullable: true integration_webhook_url: type: string description: 'URL HTTPS que recebe os eventos (payment.paid, membership.*). null desativa. O campo value não pode ser superior a 2048 caracteres.' example: 'https://meusistema.com.br/webhooks/incrivelbot' nullable: true /api/v1/me/webhook-secret: post: summary: 'Gerar novo segredo de webhook' operationId: gerarNovoSegredoDeWebhook description: "Gera (ou rotaciona) o segredo usado para assinar os webhooks de integração. O valor é exibido somente nesta resposta.\nVerifique cada evento com: `sha256=` + HMAC-SHA256(`{X-IncrivelBot-Timestamp}.{corpo}`, segredo) == `X-IncrivelBot-Signature`." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: secret: whsec_6Jx... properties: secret: type: string example: whsec_6Jx... tags: - Conta /api/v1/bots: get: summary: 'Listar bots' operationId: listarBots description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 1 name: 'Bot VIP' username: meu_vip_bot status: active link: 'https://t.me/meu_vip_bot' properties: data: type: array example: - id: 1 name: 'Bot VIP' username: meu_vip_bot status: active link: 'https://t.me/meu_vip_bot' items: type: object properties: id: type: integer example: 1 name: type: string example: 'Bot VIP' username: type: string example: meu_vip_bot status: type: string example: active link: type: string example: 'https://t.me/meu_vip_bot' tags: - Bots post: summary: 'Conectar bot' operationId: conectarBot description: "Valida o token no Telegram, registra o webhook com segredo próprio e os comandos do bot.\nRespeita o limite de bots do plano." parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 1 name: 'Bot VIP' username: meu_vip_bot status: active properties: data: type: object properties: id: type: integer example: 1 name: type: string example: 'Bot VIP' username: type: string example: meu_vip_bot status: type: string example: active 403: description: '' content: application/json: schema: type: object example: message: 'Seu plano atingiu o limite de bots.' properties: message: type: string example: 'Seu plano atingiu o limite de bots.' tags: - Bots requestBody: required: true content: application/json: schema: type: object properties: token: type: string description: 'Token do bot gerado pelo @BotFather. Must match the regex /^\d{5,16}:[A-Za-z0-9_-]{30,}$/. O campo value não pode ser superior a 100 caracteres.' example: '123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsawQ' name: type: string description: 'Nome interno. Se vazio, usa o nome do bot no Telegram. O campo value não pode ser superior a 80 caracteres.' example: 'Bot VIP' nullable: true welcome_message: type: string description: 'Mensagem enviada no /start. O campo value não pode ser superior a 1000 caracteres.' example: 'Oi! Aqui você assina meu grupo VIP 💖' nullable: true required: - token '/api/v1/bots/{id}': get: summary: 'Ver bot' operationId: verBot description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 1 name: 'Bot VIP' username: meu_vip_bot status: active groups_count: 2 properties: data: type: object properties: id: type: integer example: 1 name: type: string example: 'Bot VIP' username: type: string example: meu_vip_bot status: type: string example: active groups_count: type: integer example: 2 tags: - Bots patch: summary: 'Atualizar bot' operationId: atualizarBot description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 1 name: 'Bot VIP' welcome_message: Bem-vindo(a)! properties: data: type: object properties: id: type: integer example: 1 name: type: string example: 'Bot VIP' welcome_message: type: string example: Bem-vindo(a)! tags: - Bots requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Nome interno do bot. O campo value deve ter pelo menos 1 caracteres. O campo value não pode ser superior a 80 caracteres.' example: 'Bot VIP' welcome_message: type: string description: 'Mensagem enviada no /start. O campo value não pode ser superior a 1000 caracteres.' example: Bem-vindo(a)! nullable: true delete: summary: 'Remover bot' operationId: removerBot description: 'Remove o webhook no Telegram e apaga o bot com seus grupos, planos e assinantes.' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Bots parameters: - in: path name: id description: 'The ID of the bot.' example: architecto required: true schema: type: string - in: path name: bot description: 'ID do bot.' example: 1 required: true schema: type: integer '/api/v1/bots/{bot}/reconnect': post: summary: 'Reconectar webhook' operationId: reconectarWebhook description: 'Registra novamente o webhook no Telegram (use após trocar de domínio ou se o status estiver "error").' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 1 status: active last_error: null properties: data: type: object properties: id: type: integer example: 1 status: type: string example: active last_error: type: string example: null nullable: true tags: - Bots parameters: - in: path name: bot description: 'ID do bot.' example: 1 required: true schema: type: integer /api/v1/groups: get: summary: 'Listar grupos' operationId: listarGrupos description: '' parameters: - in: query name: bot_id description: 'Filtra por bot.' example: 1 required: false schema: type: integer description: 'Filtra por bot.' example: 1 - in: query name: is_active description: 'Filtra por vendas ativas.' example: true required: false schema: type: boolean description: 'Filtra por vendas ativas.' example: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 1 bot_id: 1 chat_id: -1001234567890 title: 'VIP da Ana' is_active: true ready_to_sell: true sales_link: 'https://t.me/meu_vip_bot?start=g1' properties: data: type: array example: - id: 1 bot_id: 1 chat_id: -1001234567890 title: 'VIP da Ana' is_active: true ready_to_sell: true sales_link: 'https://t.me/meu_vip_bot?start=g1' items: type: object properties: id: type: integer example: 1 bot_id: type: integer example: 1 chat_id: type: integer example: -1001234567890 title: type: string example: 'VIP da Ana' is_active: type: boolean example: true ready_to_sell: type: boolean example: true sales_link: type: string example: 'https://t.me/meu_vip_bot?start=g1' tags: - 'Grupos e canais' '/api/v1/groups/{id}': get: summary: 'Ver grupo' operationId: verGrupo description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 1 title: 'VIP da Ana' permissions: is_bot_admin: true can_invite_users: true can_restrict_members: true properties: data: type: object properties: id: type: integer example: 1 title: type: string example: 'VIP da Ana' permissions: type: object properties: is_bot_admin: type: boolean example: true can_invite_users: type: boolean example: true can_restrict_members: type: boolean example: true tags: - 'Grupos e canais' patch: summary: 'Atualizar grupo' operationId: atualizarGrupo description: "Para ativar as vendas (`is_active: true`) o bot precisa ser administrador com permissão de convidar e banir,\ne o plano da plataforma precisa ter vaga para mais um grupo ativo." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 1 is_active: true adult_content: true properties: data: type: object properties: id: type: integer example: 1 is_active: type: boolean example: true adult_content: type: boolean example: true tags: - 'Grupos e canais' requestBody: required: false content: application/json: schema: type: object properties: description: type: string description: 'Descrição exibida na vitrine. O campo value não pode ser superior a 1000 caracteres.' example: 'Conteúdo exclusivo diário.' nullable: true adult_content: type: boolean description: 'Exige confirmação de maioridade antes da compra.' example: true is_active: type: boolean description: 'Liga/desliga as vendas. Exige o bot como admin com permissão de convidar e banir.' example: true parameters: - in: path name: id description: 'The ID of the group.' example: architecto required: true schema: type: string - in: path name: group description: 'ID do grupo.' example: 1 required: true schema: type: integer '/api/v1/groups/{group}/check-permissions': post: summary: 'Verificar permissões do bot' operationId: verificarPermissesDoBot description: 'Consulta o Telegram e atualiza se o bot é administrador e quais permissões tem no grupo.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 1 permissions: is_bot_admin: true can_invite_users: true can_restrict_members: true checked_at: '2026-10-18T12:00:00-03:00' properties: data: type: object properties: id: type: integer example: 1 permissions: type: object properties: is_bot_admin: type: boolean example: true can_invite_users: type: boolean example: true can_restrict_members: type: boolean example: true checked_at: type: string example: '2026-10-18T12:00:00-03:00' tags: - 'Grupos e canais' parameters: - in: path name: group description: 'ID do grupo.' example: 1 required: true schema: type: integer /api/v1/plans: get: summary: 'Listar planos' operationId: listarPlanos description: '' parameters: - in: query name: telegram_group_id description: 'Filtra por grupo.' example: 1 required: false schema: type: integer description: 'Filtra por grupo.' example: 1 responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 3 telegram_group_id: 1 name: 'VIP Mensal' price_cents: 2990 price: 'R$ 29,90' duration_days: 30 reminder_days: - 3 - 1 - 0 grace_hours: 0 is_active: true purchase_link: 'https://t.me/meu_vip_bot?start=p3' properties: data: type: array example: - id: 3 telegram_group_id: 1 name: 'VIP Mensal' price_cents: 2990 price: 'R$ 29,90' duration_days: 30 reminder_days: - 3 - 1 - 0 grace_hours: 0 is_active: true purchase_link: 'https://t.me/meu_vip_bot?start=p3' items: type: object properties: id: type: integer example: 3 telegram_group_id: type: integer example: 1 name: type: string example: 'VIP Mensal' price_cents: type: integer example: 2990 price: type: string example: 'R$ 29,90' duration_days: type: integer example: 30 reminder_days: type: array example: - 3 - 1 - 0 items: type: integer grace_hours: type: integer example: 0 is_active: type: boolean example: true purchase_link: type: string example: 'https://t.me/meu_vip_bot?start=p3' tags: - 'Planos de acesso' post: summary: 'Criar plano' operationId: criarPlano description: '' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 3 telegram_group_id: 1 name: 'VIP Mensal' price_cents: 2990 price: 'R$ 29,90' duration_days: 30 reminder_days: - 3 - 1 - 0 grace_hours: 0 is_active: true purchase_link: 'https://t.me/meu_vip_bot?start=p3' properties: data: type: object properties: id: type: integer example: 3 telegram_group_id: type: integer example: 1 name: type: string example: 'VIP Mensal' price_cents: type: integer example: 2990 price: type: string example: 'R$ 29,90' duration_days: type: integer example: 30 reminder_days: type: array example: - 3 - 1 - 0 items: type: integer grace_hours: type: integer example: 0 is_active: type: boolean example: true purchase_link: type: string example: 'https://t.me/meu_vip_bot?start=p3' tags: - 'Planos de acesso' requestBody: required: true content: application/json: schema: type: object properties: telegram_group_id: type: integer description: 'ID do grupo/canal (GET /groups). Must match an existing stored value.' example: 1 name: type: string description: 'Nome exibido no bot. O campo value deve ter pelo menos 2 caracteres. O campo value não pode ser superior a 60 caracteres.' example: 'VIP Mensal' description: type: string description: 'Descrição opcional. O campo value não pode ser superior a 500 caracteres.' example: 'Acesso por 30 dias' nullable: true price_cents: type: integer description: 'Preço em centavos (R$ 29,90 = 2990). Mínimo R$ 1,00. O campo value deve ser pelo menos 100. O campo value não pode ser superior a 100000000.' example: 2990 duration_days: type: integer description: 'Dias de acesso por pagamento. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 3650.' example: 30 reminder_days: type: array description: 'Dia de antecedência. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 30.' example: - 3 items: type: integer grace_hours: type: integer description: 'Horas de tolerância após vencer antes de remover. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 168.' example: 12 is_active: type: boolean description: 'Disponível para venda.' example: true sort_order: type: integer description: 'Ordem de exibição. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 65000.' example: 0 required: - telegram_group_id - name - price_cents - duration_days '/api/v1/plans/{id}': get: summary: 'Ver plano' operationId: verPlano description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 3 telegram_group_id: 1 name: 'VIP Mensal' price_cents: 2990 price: 'R$ 29,90' duration_days: 30 reminder_days: - 3 - 1 - 0 grace_hours: 0 is_active: true purchase_link: 'https://t.me/meu_vip_bot?start=p3' properties: data: type: object properties: id: type: integer example: 3 telegram_group_id: type: integer example: 1 name: type: string example: 'VIP Mensal' price_cents: type: integer example: 2990 price: type: string example: 'R$ 29,90' duration_days: type: integer example: 30 reminder_days: type: array example: - 3 - 1 - 0 items: type: integer grace_hours: type: integer example: 0 is_active: type: boolean example: true purchase_link: type: string example: 'https://t.me/meu_vip_bot?start=p3' tags: - 'Planos de acesso' patch: summary: 'Atualizar plano' operationId: atualizarPlano description: 'Envie apenas os campos que deseja alterar. Assinantes ativos mantêm o vencimento atual.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 3 telegram_group_id: 1 name: 'VIP Mensal' price_cents: 2990 price: 'R$ 29,90' duration_days: 30 reminder_days: - 3 - 1 - 0 grace_hours: 0 is_active: true purchase_link: 'https://t.me/meu_vip_bot?start=p3' properties: data: type: object properties: id: type: integer example: 3 telegram_group_id: type: integer example: 1 name: type: string example: 'VIP Mensal' price_cents: type: integer example: 2990 price: type: string example: 'R$ 29,90' duration_days: type: integer example: 30 reminder_days: type: array example: - 3 - 1 - 0 items: type: integer grace_hours: type: integer example: 0 is_active: type: boolean example: true purchase_link: type: string example: 'https://t.me/meu_vip_bot?start=p3' tags: - 'Planos de acesso' requestBody: required: false content: application/json: schema: type: object properties: telegram_group_id: type: integer description: 'ID do grupo/canal (GET /groups). Must match an existing stored value.' example: 1 name: type: string description: 'Nome exibido no bot. O campo value deve ter pelo menos 2 caracteres. O campo value não pode ser superior a 60 caracteres.' example: 'VIP Mensal' description: type: string description: 'Descrição opcional. O campo value não pode ser superior a 500 caracteres.' example: 'Acesso por 30 dias' nullable: true price_cents: type: integer description: 'Preço em centavos (R$ 29,90 = 2990). Mínimo R$ 1,00. O campo value deve ser pelo menos 100. O campo value não pode ser superior a 100000000.' example: 2990 duration_days: type: integer description: 'Dias de acesso por pagamento. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 3650.' example: 30 reminder_days: type: array description: 'Dia de antecedência. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 30.' example: - 3 items: type: integer grace_hours: type: integer description: 'Horas de tolerância após vencer antes de remover. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 168.' example: 12 is_active: type: boolean description: 'Disponível para venda.' example: true sort_order: type: integer description: 'Ordem de exibição. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 65000.' example: 0 delete: summary: 'Remover plano' operationId: removerPlano description: 'Exclusão lógica: o plano some do bot, mas o histórico de pagamentos é preservado.' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Planos de acesso' parameters: - in: path name: id description: 'The ID of the plan.' example: architecto required: true schema: type: string - in: path name: plan description: 'ID do plano.' example: 3 required: true schema: type: integer /api/v1/subscribers: get: summary: 'Listar assinantes' operationId: listarAssinantes description: '' parameters: - in: query name: search description: 'Busca por nome, @usuário ou e-mail.' example: ana required: false schema: type: string description: 'Busca por nome, @usuário ou e-mail.' example: ana - in: query name: telegram_user_id description: 'Busca exata pelo ID do Telegram.' example: 123456789 required: false schema: type: integer description: 'Busca exata pelo ID do Telegram.' example: 123456789 - in: query name: per_page description: 'Itens por página (máx. 100).' example: 25 required: false schema: type: integer description: 'Itens por página (máx. 100).' example: 25 responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 10 telegram_user_id: 123456789 username: ana full_name: 'Ana Maria Silva' email: ana@example.com document_masked: '***.982.***-25' links: [] meta: current_page: 1 per_page: 25 total: 1 properties: data: type: array example: - id: 10 telegram_user_id: 123456789 username: ana full_name: 'Ana Maria Silva' email: ana@example.com document_masked: '***.982.***-25' items: type: object properties: id: type: integer example: 10 telegram_user_id: type: integer example: 123456789 username: type: string example: ana full_name: type: string example: 'Ana Maria Silva' email: type: string example: ana@example.com document_masked: type: string example: '***.982.***-25' links: type: array example: [] meta: type: object properties: current_page: type: integer example: 1 per_page: type: integer example: 25 total: type: integer example: 1 tags: - Assinantes '/api/v1/subscribers/{id}': get: summary: 'Ver assinante' operationId: verAssinante description: 'Inclui as permanências (acessos) do assinante em cada grupo.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 10 full_name: 'Ana Maria Silva' memberships: - id: 5 telegram_group_id: 1 status: active expires_at: '2026-11-18T12:00:00-03:00' properties: data: type: object properties: id: type: integer example: 10 full_name: type: string example: 'Ana Maria Silva' memberships: type: array example: - id: 5 telegram_group_id: 1 status: active expires_at: '2026-11-18T12:00:00-03:00' items: type: object properties: id: type: integer example: 5 telegram_group_id: type: integer example: 1 status: type: string example: active expires_at: type: string example: '2026-11-18T12:00:00-03:00' tags: - Assinantes parameters: - in: path name: id description: 'The ID of the subscriber.' example: architecto required: true schema: type: string - in: path name: subscriber description: 'ID do assinante.' example: 10 required: true schema: type: integer '/api/v1/subscribers/{subscriber}/grant': post: summary: 'Conceder acesso (cortesia)' operationId: concederAcessocortesia description: 'Libera ou estende o acesso sem cobrança e envia o convite pelo bot.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 5 subscriber_id: 10 telegram_group_id: 1 status: active expires_at: '2026-11-18T12:00:00-03:00' properties: data: type: object properties: id: type: integer example: 5 subscriber_id: type: integer example: 10 telegram_group_id: type: integer example: 1 status: type: string example: active expires_at: type: string example: '2026-11-18T12:00:00-03:00' tags: - Assinantes requestBody: required: true content: application/json: schema: type: object properties: telegram_group_id: type: integer description: 'Grupo ao qual conceder acesso (obrigatório ao conceder pelo assinante). Must match an existing stored value.' example: 1 days: type: integer description: 'Dias de acesso a adicionar (somados ao vencimento atual se ainda ativo). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 3650.' example: 30 required: - telegram_group_id - days parameters: - in: path name: subscriber description: 'ID do assinante.' example: 10 required: true schema: type: integer /api/v1/memberships: get: summary: 'Listar membros' operationId: listarMembros description: '' parameters: - in: query name: status description: 'pending, active, expired ou cancelled.' example: active required: false schema: type: string description: 'pending, active, expired ou cancelled.' example: active - in: query name: telegram_group_id description: 'Filtra por grupo.' example: 1 required: false schema: type: integer description: 'Filtra por grupo.' example: 1 - in: query name: subscriber_id description: 'Filtra por assinante.' example: 10 required: false schema: type: integer description: 'Filtra por assinante.' example: 10 - in: query name: expiring_in_days description: 'Somente ativos que vencem nos próximos N dias.' example: 7 required: false schema: type: integer description: 'Somente ativos que vencem nos próximos N dias.' example: 7 - in: query name: per_page description: 'Itens por página (máx. 100).' example: 25 required: false schema: type: integer description: 'Itens por página (máx. 100).' example: 25 responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 5 subscriber_id: 10 telegram_group_id: 1 access_plan_id: 3 status: active is_active: true expires_at: '2026-11-18T12:00:00-03:00' joined_at: '2026-10-18T12:05:00-03:00' links: [] meta: current_page: 1 per_page: 25 total: 1 properties: data: type: array example: - id: 5 subscriber_id: 10 telegram_group_id: 1 access_plan_id: 3 status: active is_active: true expires_at: '2026-11-18T12:00:00-03:00' joined_at: '2026-10-18T12:05:00-03:00' items: type: object properties: id: type: integer example: 5 subscriber_id: type: integer example: 10 telegram_group_id: type: integer example: 1 access_plan_id: type: integer example: 3 status: type: string example: active is_active: type: boolean example: true expires_at: type: string example: '2026-11-18T12:00:00-03:00' joined_at: type: string example: '2026-10-18T12:05:00-03:00' links: type: array example: [] meta: type: object properties: current_page: type: integer example: 1 per_page: type: integer example: 25 total: type: integer example: 1 tags: - Membros requestBody: required: false content: application/json: schema: type: object properties: status: type: string description: '' example: cancelled enum: - pending - active - expired - cancelled expiring_in_days: type: integer description: 'O campo value deve ser pelo menos 0. O campo value não pode ser superior a 365.' example: 1 '/api/v1/memberships/{id}': get: summary: 'Ver membro' operationId: verMembro description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 5 subscriber_id: 10 telegram_group_id: 1 access_plan_id: 3 status: active is_active: true expires_at: '2026-11-18T12:00:00-03:00' joined_at: '2026-10-18T12:05:00-03:00' properties: data: type: object properties: id: type: integer example: 5 subscriber_id: type: integer example: 10 telegram_group_id: type: integer example: 1 access_plan_id: type: integer example: 3 status: type: string example: active is_active: type: boolean example: true expires_at: type: string example: '2026-11-18T12:00:00-03:00' joined_at: type: string example: '2026-10-18T12:05:00-03:00' tags: - Membros parameters: - in: path name: id description: 'The ID of the membership.' example: architecto required: true schema: type: string - in: path name: membership description: 'ID da permanência.' example: 5 required: true schema: type: integer '/api/v1/memberships/{membership}/extend': post: summary: 'Estender acesso (cortesia)' operationId: estenderAcessocortesia description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 5 subscriber_id: 10 telegram_group_id: 1 access_plan_id: 3 status: active is_active: true expires_at: '2026-11-18T12:00:00-03:00' joined_at: '2026-10-18T12:05:00-03:00' properties: data: type: object properties: id: type: integer example: 5 subscriber_id: type: integer example: 10 telegram_group_id: type: integer example: 1 access_plan_id: type: integer example: 3 status: type: string example: active is_active: type: boolean example: true expires_at: type: string example: '2026-11-18T12:00:00-03:00' joined_at: type: string example: '2026-10-18T12:05:00-03:00' tags: - Membros requestBody: required: true content: application/json: schema: type: object properties: telegram_group_id: type: integer description: 'Grupo ao qual conceder acesso (obrigatório ao conceder pelo assinante). Must match an existing stored value.' example: 1 days: type: integer description: 'Dias de acesso a adicionar (somados ao vencimento atual se ainda ativo). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 3650.' example: 30 required: - telegram_group_id - days parameters: - in: path name: membership description: 'ID da permanência.' example: 5 required: true schema: type: integer '/api/v1/memberships/{membership}/resend-invite': post: summary: 'Reenviar convite' operationId: reenviarConvite description: 'Gera um novo link pessoal (com pedido de entrada) e envia ao assinante pelo bot.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 5 subscriber_id: 10 telegram_group_id: 1 access_plan_id: 3 status: active is_active: true expires_at: '2026-11-18T12:00:00-03:00' joined_at: '2026-10-18T12:05:00-03:00' properties: data: type: object properties: id: type: integer example: 5 subscriber_id: type: integer example: 10 telegram_group_id: type: integer example: 1 access_plan_id: type: integer example: 3 status: type: string example: active is_active: type: boolean example: true expires_at: type: string example: '2026-11-18T12:00:00-03:00' joined_at: type: string example: '2026-10-18T12:05:00-03:00' tags: - Membros parameters: - in: path name: membership description: 'ID da permanência.' example: 5 required: true schema: type: integer '/api/v1/memberships/{membership}/remove': post: summary: 'Remover do grupo agora' operationId: removerDoGrupoAgora description: 'Remove o assinante do grupo imediatamente e encerra a permanência (status "expired").' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 5 status: expired removed_at: '2026-10-18T13:00:00-03:00' properties: data: type: object properties: id: type: integer example: 5 status: type: string example: expired removed_at: type: string example: '2026-10-18T13:00:00-03:00' tags: - Membros parameters: - in: path name: membership description: 'ID da permanência.' example: 5 required: true schema: type: integer /api/v1/payments: get: summary: 'Listar pagamentos' operationId: listarPagamentos description: '' parameters: - in: query name: status description: 'pending, paid, failed, expired, refunded ou cancelled.' example: paid required: false schema: type: string description: 'pending, paid, failed, expired, refunded ou cancelled.' example: paid - in: query name: subscriber_id description: 'Filtra por assinante.' example: 10 required: false schema: type: integer description: 'Filtra por assinante.' example: 10 - in: query name: from description: 'Criados a partir da data (YYYY-MM-DD).' example: '2026-10-01' required: false schema: type: string description: 'Criados a partir da data (YYYY-MM-DD).' example: '2026-10-01' - in: query name: per_page description: 'Itens por página (máx. 100).' example: 25 required: false schema: type: integer description: 'Itens por página (máx. 100).' example: 25 responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 0f8d6c3a-5b1e-4f7a-9a0b-1c2d3e4f5a6b purpose: membership status: pending provider: asaas amount_cents: 2990 platform_fee_cents: 0 net_amount_cents: 2990 subscriber_id: 10 access_plan_id: 3 pix: copy_paste: 00020126580014br.gov.bcb.pix... qr_code_base64: iVBORw0KGgo... checkout_url: 'https://www.asaas.com/i/abc123' expires_at: '2026-10-19T12:00:00-03:00' paid_at: null links: [] meta: current_page: 1 per_page: 25 total: 1 properties: data: type: array example: - id: 0f8d6c3a-5b1e-4f7a-9a0b-1c2d3e4f5a6b purpose: membership status: pending provider: asaas amount_cents: 2990 platform_fee_cents: 0 net_amount_cents: 2990 subscriber_id: 10 access_plan_id: 3 pix: copy_paste: 00020126580014br.gov.bcb.pix... qr_code_base64: iVBORw0KGgo... checkout_url: 'https://www.asaas.com/i/abc123' expires_at: '2026-10-19T12:00:00-03:00' paid_at: null items: type: object properties: id: type: string example: 0f8d6c3a-5b1e-4f7a-9a0b-1c2d3e4f5a6b purpose: type: string example: membership status: type: string example: pending provider: type: string example: asaas amount_cents: type: integer example: 2990 platform_fee_cents: type: integer example: 0 net_amount_cents: type: integer example: 2990 subscriber_id: type: integer example: 10 access_plan_id: type: integer example: 3 pix: type: object properties: copy_paste: type: string example: 00020126580014br.gov.bcb.pix... qr_code_base64: type: string example: iVBORw0KGgo... checkout_url: type: string example: 'https://www.asaas.com/i/abc123' expires_at: type: string example: '2026-10-19T12:00:00-03:00' paid_at: type: string example: null nullable: true links: type: array example: [] meta: type: object properties: current_page: type: integer example: 1 per_page: type: integer example: 25 total: type: integer example: 1 tags: - Pagamentos requestBody: required: false content: application/json: schema: type: object properties: status: type: string description: '' example: pending enum: - pending - paid - failed - expired - refunded - cancelled from: type: string description: 'Must be a valid date in the format Y-m-d.' example: '2026-10-19' post: summary: 'Gerar cobrança Pix' operationId: gerarCobranaPix description: "Cria (ou reaproveita, se ainda válida) a cobrança Pix de um plano para um assinante.\nO pagador precisa ter nome, CPF e e-mail — envie-os aqui se ainda não foram coletados pelo bot." parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 0f8d6c3a-5b1e-4f7a-9a0b-1c2d3e4f5a6b purpose: membership status: pending provider: asaas amount_cents: 2990 platform_fee_cents: 0 net_amount_cents: 2990 subscriber_id: 10 access_plan_id: 3 pix: copy_paste: 00020126580014br.gov.bcb.pix... qr_code_base64: iVBORw0KGgo... checkout_url: 'https://www.asaas.com/i/abc123' expires_at: '2026-10-19T12:00:00-03:00' paid_at: null properties: data: type: object properties: id: type: string example: 0f8d6c3a-5b1e-4f7a-9a0b-1c2d3e4f5a6b purpose: type: string example: membership status: type: string example: pending provider: type: string example: asaas amount_cents: type: integer example: 2990 platform_fee_cents: type: integer example: 0 net_amount_cents: type: integer example: 2990 subscriber_id: type: integer example: 10 access_plan_id: type: integer example: 3 pix: type: object properties: copy_paste: type: string example: 00020126580014br.gov.bcb.pix... qr_code_base64: type: string example: iVBORw0KGgo... checkout_url: type: string example: 'https://www.asaas.com/i/abc123' expires_at: type: string example: '2026-10-19T12:00:00-03:00' paid_at: type: string example: null nullable: true 422: description: '' content: application/json: schema: type: object example: message: 'Gateway da criadora não configurado.' properties: message: type: string example: 'Gateway da criadora não configurado.' tags: - Pagamentos requestBody: required: true content: application/json: schema: type: object properties: subscriber_id: type: integer description: 'Assinante (precisa ter iniciado conversa com o bot). Must match an existing stored value.' example: 10 access_plan_id: type: integer description: 'Plano de acesso a cobrar. Must match an existing stored value.' example: 3 full_name: type: string description: 'Atualiza o nome do pagador antes de cobrar. O campo value deve ter pelo menos 5 caracteres. O campo value não pode ser superior a 120 caracteres.' example: 'Ana Maria Silva' document: type: string description: 'Atualiza o CPF/CNPJ do pagador.' example: 529.982.247-25 email: type: string description: 'Atualiza o e-mail do pagador. O campo value deve ser um endereço de e-mail válido. O campo value não pode ser superior a 191 caracteres.' example: ana@example.com send_to_telegram: type: boolean description: 'Também envia o Pix ao assinante pelo bot.' example: true required: - subscriber_id - access_plan_id '/api/v1/payments/{id}': get: summary: 'Ver pagamento' operationId: verPagamento description: 'Consulta o gateway quando a cobrança ainda está pendente, para refletir o status mais recente.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 0f8d6c3a-5b1e-4f7a-9a0b-1c2d3e4f5a6b purpose: membership status: pending provider: asaas amount_cents: 2990 platform_fee_cents: 0 net_amount_cents: 2990 subscriber_id: 10 access_plan_id: 3 pix: copy_paste: 00020126580014br.gov.bcb.pix... qr_code_base64: iVBORw0KGgo... checkout_url: 'https://www.asaas.com/i/abc123' expires_at: '2026-10-19T12:00:00-03:00' paid_at: null properties: data: type: object properties: id: type: string example: 0f8d6c3a-5b1e-4f7a-9a0b-1c2d3e4f5a6b purpose: type: string example: membership status: type: string example: pending provider: type: string example: asaas amount_cents: type: integer example: 2990 platform_fee_cents: type: integer example: 0 net_amount_cents: type: integer example: 2990 subscriber_id: type: integer example: 10 access_plan_id: type: integer example: 3 pix: type: object properties: copy_paste: type: string example: 00020126580014br.gov.bcb.pix... qr_code_base64: type: string example: iVBORw0KGgo... checkout_url: type: string example: 'https://www.asaas.com/i/abc123' expires_at: type: string example: '2026-10-19T12:00:00-03:00' paid_at: type: string example: null nullable: true tags: - Pagamentos parameters: - in: path name: id description: 'The ID of the payment.' example: architecto required: true schema: type: string - in: path name: payment description: 'UUID do pagamento.' example: 0f8d6c3a-5b1e-4f7a-9a0b-1c2d3e4f5a6b required: true schema: type: string /api/v1/gateways: get: summary: 'Listar gateways' operationId: listarGateways description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 7b2f... provider: asaas label: 'Conta principal' sandbox: true is_active: true configured_fields: api_key: true webhook: url: 'https://bot.incrivel.tech/webhooks/asaas/7b2f...' token: cole-este-token-no-asaas properties: data: type: array example: - id: 7b2f... provider: asaas label: 'Conta principal' sandbox: true is_active: true configured_fields: api_key: true webhook: url: 'https://bot.incrivel.tech/webhooks/asaas/7b2f...' token: cole-este-token-no-asaas items: type: object properties: id: type: string example: 7b2f... provider: type: string example: asaas label: type: string example: 'Conta principal' sandbox: type: boolean example: true is_active: type: boolean example: true configured_fields: type: object properties: api_key: type: boolean example: true webhook: type: object properties: url: type: string example: 'https://bot.incrivel.tech/webhooks/asaas/7b2f...' token: type: string example: cole-este-token-no-asaas tags: - 'Gateways de pagamento' post: summary: 'Cadastrar gateway' operationId: cadastrarGateway description: 'Depois de cadastrar, configure no painel do gateway a URL de webhook retornada (e, no Asaas, o token).' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 7b2f... provider: asaas label: 'Conta principal' sandbox: true is_active: true configured_fields: api_key: true webhook: url: 'https://bot.incrivel.tech/webhooks/asaas/7b2f...' token: cole-este-token-no-asaas properties: data: type: object properties: id: type: string example: 7b2f... provider: type: string example: asaas label: type: string example: 'Conta principal' sandbox: type: boolean example: true is_active: type: boolean example: true configured_fields: type: object properties: api_key: type: boolean example: true webhook: type: object properties: url: type: string example: 'https://bot.incrivel.tech/webhooks/asaas/7b2f...' token: type: string example: cole-este-token-no-asaas tags: - 'Gateways de pagamento' requestBody: required: true content: application/json: schema: type: object properties: provider: type: string description: 'asaas, mercadopago ou infopago. Não pode ser alterado depois.' example: asaas enum: - asaas - mercadopago - infopago label: type: string description: 'Apelido. O campo value não pode ser superior a 80 caracteres.' example: 'Conta principal' nullable: true sandbox: type: boolean description: 'Usa o ambiente de testes do gateway.' example: true is_active: type: boolean description: 'Ativo para novas cobranças.' example: true credentials: type: object description: 'Segredos do gateway. Campos omitidos ou vazios mantêm o valor atual. Nunca são devolvidos.' example: [] properties: api_key: type: string description: 'Asaas/Infopago: chave de API. O campo value não pode ser superior a 500 caracteres.' example: $aact_YTU5YTE0M2M2N2I4MTliNzk0YTI5N2U5MzdjNWZmNDQ6OjAwMDAwMDAwMDAwMDA nullable: true access_token: type: string description: 'Mercado Pago: Access Token. O campo value não pode ser superior a 500 caracteres.' example: APP_USR-0000000000000000-000000-00000000000000000000000000000000-000000000 nullable: true webhook_secret: type: string description: 'Mercado Pago/Infopago: segredo de assinatura dos webhooks. O campo value não pode ser superior a 500 caracteres.' example: segredo-do-webhook nullable: true base_url: type: string description: 'Infopago: URL base da API (HTTPS). Must be a valid URL. Must start with one of https:// O campo value não pode ser superior a 255 caracteres.' example: 'https://api.infopago.com.br' nullable: true required: - provider - credentials '/api/v1/gateways/{credential}': get: summary: 'Ver gateway' operationId: verGateway description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 7b2f... provider: asaas label: 'Conta principal' sandbox: true is_active: true configured_fields: api_key: true webhook: url: 'https://bot.incrivel.tech/webhooks/asaas/7b2f...' token: cole-este-token-no-asaas properties: data: type: object properties: id: type: string example: 7b2f... provider: type: string example: asaas label: type: string example: 'Conta principal' sandbox: type: boolean example: true is_active: type: boolean example: true configured_fields: type: object properties: api_key: type: boolean example: true webhook: type: object properties: url: type: string example: 'https://bot.incrivel.tech/webhooks/asaas/7b2f...' token: type: string example: cole-este-token-no-asaas tags: - 'Gateways de pagamento' patch: summary: 'Atualizar gateway' operationId: atualizarGateway description: 'Campos de `credentials` omitidos ou vazios mantêm o valor atual.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 7b2f... provider: asaas label: 'Conta principal' sandbox: true is_active: true configured_fields: api_key: true webhook: url: 'https://bot.incrivel.tech/webhooks/asaas/7b2f...' token: cole-este-token-no-asaas properties: data: type: object properties: id: type: string example: 7b2f... provider: type: string example: asaas label: type: string example: 'Conta principal' sandbox: type: boolean example: true is_active: type: boolean example: true configured_fields: type: object properties: api_key: type: boolean example: true webhook: type: object properties: url: type: string example: 'https://bot.incrivel.tech/webhooks/asaas/7b2f...' token: type: string example: cole-este-token-no-asaas tags: - 'Gateways de pagamento' requestBody: required: false content: application/json: schema: type: object properties: provider: type: string description: 'asaas, mercadopago ou infopago. Não pode ser alterado depois.' example: asaas enum: - asaas - mercadopago - infopago label: type: string description: 'Apelido. O campo value não pode ser superior a 80 caracteres.' example: 'Conta principal' nullable: true sandbox: type: boolean description: 'Usa o ambiente de testes do gateway.' example: true is_active: type: boolean description: 'Ativo para novas cobranças.' example: true credentials: type: object description: 'Segredos do gateway. Campos omitidos ou vazios mantêm o valor atual. Nunca são devolvidos.' example: null properties: api_key: type: string description: 'Asaas/Infopago: chave de API. O campo value não pode ser superior a 500 caracteres.' example: $aact_YTU5YTE0M2M2N2I4MTliNzk0YTI5N2U5MzdjNWZmNDQ6OjAwMDAwMDAwMDAwMDA nullable: true access_token: type: string description: 'Mercado Pago: Access Token. O campo value não pode ser superior a 500 caracteres.' example: APP_USR-0000000000000000-000000-00000000000000000000000000000000-000000000 nullable: true webhook_secret: type: string description: 'Mercado Pago/Infopago: segredo de assinatura dos webhooks. O campo value não pode ser superior a 500 caracteres.' example: segredo-do-webhook nullable: true base_url: type: string description: 'Infopago: URL base da API (HTTPS). Must be a valid URL. Must start with one of https:// O campo value não pode ser superior a 255 caracteres.' example: 'https://api.infopago.com.br' nullable: true delete: summary: 'Remover gateway' operationId: removerGateway description: '' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Gateways de pagamento' parameters: - in: path name: credential description: 'ID (UUID) do gateway.' example: 7b2f0000-0000-0000-0000-000000000000 required: true schema: type: string '/api/v1/gateways/{credential}/test': post: summary: 'Testar conexão' operationId: testarConexo description: 'Autentica no gateway com as chaves salvas.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: ok: true properties: ok: type: boolean example: true tags: - 'Gateways de pagamento' parameters: - in: path name: credential description: 'ID (UUID) do gateway.' example: 7b2f0000-0000-0000-0000-000000000000 required: true schema: type: string /api/v1/platform/tenants: get: summary: 'Listar criadoras' operationId: listarCriadoras description: '' parameters: - in: query name: status description: 'Filtra por status.' example: active required: false schema: type: string description: 'Filtra por status.' example: active - in: query name: search description: 'Busca por nome ou endereço.' example: ana required: false schema: type: string description: 'Busca por nome ou endereço.' example: ana - in: query name: per_page description: 'Itens por página (máx. 100).' example: 25 required: false schema: type: integer description: 'Itens por página (máx. 100).' example: 25 responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 9f1c2d3e-0000-0000-0000-000000000000 name: 'Ana VIP' slug: anavip url: 'https://anavip.bot.incrivel.tech/' panel_url: 'https://anavip.bot.incrivel.tech/app' status: trial can_operate: true payout_mode: own plan: id: 2 name: Pro links: [] meta: current_page: 1 per_page: 25 total: 1 properties: data: type: array example: - id: 9f1c2d3e-0000-0000-0000-000000000000 name: 'Ana VIP' slug: anavip url: 'https://anavip.bot.incrivel.tech/' panel_url: 'https://anavip.bot.incrivel.tech/app' status: trial can_operate: true payout_mode: own plan: id: 2 name: Pro items: type: object properties: id: type: string example: 9f1c2d3e-0000-0000-0000-000000000000 name: type: string example: 'Ana VIP' slug: type: string example: anavip url: type: string example: 'https://anavip.bot.incrivel.tech/' panel_url: type: string example: 'https://anavip.bot.incrivel.tech/app' status: type: string example: trial can_operate: type: boolean example: true payout_mode: type: string example: own plan: type: object properties: id: type: integer example: 2 name: type: string example: Pro links: type: array example: [] meta: type: object properties: current_page: type: integer example: 1 per_page: type: integer example: 25 total: type: integer example: 1 tags: - 'Plataforma: criadoras' requestBody: required: false content: application/json: schema: type: object properties: status: type: string description: '' example: past_due enum: - pending - trial - active - past_due - suspended - cancelled post: summary: 'Provisionar criadora' operationId: provisionarCriadora description: "Cria a conta (com subdomínio e usuária dona). Com `issue_api_token: true`, devolve um token de API da criadora,\nexibido somente nesta resposta, para seu sistema criar bots, planos etc. em nome dela." parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 9f1c2d3e-0000-0000-0000-000000000000 name: 'Ana VIP' slug: anavip url: 'https://anavip.bot.incrivel.tech/' panel_url: 'https://anavip.bot.incrivel.tech/app' status: trial can_operate: true payout_mode: own plan: id: 2 name: Pro api_token: ibot_12|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx properties: data: type: object properties: id: type: string example: 9f1c2d3e-0000-0000-0000-000000000000 name: type: string example: 'Ana VIP' slug: type: string example: anavip url: type: string example: 'https://anavip.bot.incrivel.tech/' panel_url: type: string example: 'https://anavip.bot.incrivel.tech/app' status: type: string example: trial can_operate: type: boolean example: true payout_mode: type: string example: own plan: type: object properties: id: type: integer example: 2 name: type: string example: Pro api_token: type: string example: ibot_12|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx tags: - 'Plataforma: criadoras' requestBody: required: true content: application/json: schema: type: object properties: saas_plan_id: type: integer description: 'Plano da plataforma (GET /platform/saas-plans). Must match an existing stored value.' example: 2 name: type: string description: 'Nome/marca da criadora. O campo value deve ter pelo menos 2 caracteres. O campo value não pode ser superior a 80 caracteres.' example: 'Ana VIP' slug: type: string description: 'Subdomínio da vitrine (letras minúsculas, números e hífen). Must match the regex /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/. O campo value deve ter pelo menos 3 caracteres. O campo value não pode ser superior a 30 caracteres.' example: anavip owner_name: type: string description: 'Nome da responsável. O campo value deve ter pelo menos 3 caracteres. O campo value não pode ser superior a 120 caracteres.' example: 'Ana Souza' email: type: string description: 'E-mail de login no painel. O campo value deve ser um endereço de e-mail válido. O campo value não pode ser superior a 191 caracteres.' example: ana@example.com password: type: string description: 'Senha do painel. Se omitida, é gerada uma aleatória e a criadora usa "Esqueci minha senha".' example: 'SenhaForte#2026' nullable: true document: type: string description: 'CPF ou CNPJ.' example: 529.982.247-25 phone: type: string description: 'Telefone/WhatsApp. Must match the regex /^[\d\s()+-]{10,20}$/.' example: '(11) 98888-7777' adult_content: type: boolean description: 'Vende conteúdo +18.' example: false issue_api_token: type: boolean description: 'Retorna também um token de API (leitura e escrita) da criadora para seu sistema operar a conta.' example: true required: - saas_plan_id - name - slug - owner_name - email - document - phone '/api/v1/platform/tenants/{id}': get: summary: 'Ver criadora' operationId: verCriadora description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 9f1c2d3e-0000-0000-0000-000000000000 name: 'Ana VIP' slug: anavip url: 'https://anavip.bot.incrivel.tech/' panel_url: 'https://anavip.bot.incrivel.tech/app' status: trial can_operate: true payout_mode: own plan: id: 2 name: Pro properties: data: type: object properties: id: type: string example: 9f1c2d3e-0000-0000-0000-000000000000 name: type: string example: 'Ana VIP' slug: type: string example: anavip url: type: string example: 'https://anavip.bot.incrivel.tech/' panel_url: type: string example: 'https://anavip.bot.incrivel.tech/app' status: type: string example: trial can_operate: type: boolean example: true payout_mode: type: string example: own plan: type: object properties: id: type: integer example: 2 name: type: string example: Pro tags: - 'Plataforma: criadoras' patch: summary: 'Atualizar criadora' operationId: atualizarCriadora description: 'Altere status (ex.: suspender), plano e validade da assinatura.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 9f1c2d3e-0000-0000-0000-000000000000 name: 'Ana VIP' slug: anavip url: 'https://anavip.bot.incrivel.tech/' panel_url: 'https://anavip.bot.incrivel.tech/app' status: trial can_operate: true payout_mode: own plan: id: 2 name: Pro properties: data: type: object properties: id: type: string example: 9f1c2d3e-0000-0000-0000-000000000000 name: type: string example: 'Ana VIP' slug: type: string example: anavip url: type: string example: 'https://anavip.bot.incrivel.tech/' panel_url: type: string example: 'https://anavip.bot.incrivel.tech/app' status: type: string example: trial can_operate: type: boolean example: true payout_mode: type: string example: own plan: type: object properties: id: type: integer example: 2 name: type: string example: Pro tags: - 'Plataforma: criadoras' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Nome/marca. O campo value deve ter pelo menos 2 caracteres. O campo value não pode ser superior a 80 caracteres.' example: 'Ana VIP' status: type: string description: 'pending, trial, active, past_due, suspended ou cancelled.' example: active enum: - pending - trial - active - past_due - suspended - cancelled saas_plan_id: type: integer description: 'Troca de plano. Must match an existing stored value.' example: 2 plan_expires_at: type: string description: 'Validade da assinatura (ISO 8601). O campo value deve ser uma data válida.' example: '2026-12-31T23:59:59-03:00' nullable: true adult_content: type: boolean description: 'Vende conteúdo +18.' example: true parameters: - in: path name: id description: 'The ID of the tenant.' example: architecto required: true schema: type: string - in: path name: tenant description: 'ID da criadora.' example: 9f1c2d3e-0000-0000-0000-000000000000 required: true schema: type: string '/api/v1/platform/tenants/{tenant}/tokens': post: summary: 'Gerar token de API da criadora' operationId: gerarTokenDeAPIDaCriadora description: 'Emite um novo token (leitura e escrita) para a dona da conta. Exibido somente nesta resposta.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: api_token: ibot_13|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx properties: api_token: type: string example: ibot_13|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx tags: - 'Plataforma: criadoras' parameters: - in: path name: tenant description: 'ID da criadora.' example: 9f1c2d3e-0000-0000-0000-000000000000 required: true schema: type: string /api/v1/platform/saas-plans: get: summary: 'Listar planos da plataforma' operationId: listarPlanosDaPlataforma description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 2 name: Pro slug: pro price_cents: 9990 interval_months: 1 trial_days: 7 limits: max_bots: 3 max_groups: 5 max_active_members: 2000 platform_fee_percent: 3 is_active: true properties: data: type: array example: - id: 2 name: Pro slug: pro price_cents: 9990 interval_months: 1 trial_days: 7 limits: max_bots: 3 max_groups: 5 max_active_members: 2000 platform_fee_percent: 3 is_active: true items: type: object properties: id: type: integer example: 2 name: type: string example: Pro slug: type: string example: pro price_cents: type: integer example: 9990 interval_months: type: integer example: 1 trial_days: type: integer example: 7 limits: type: object properties: max_bots: type: integer example: 3 max_groups: type: integer example: 5 max_active_members: type: integer example: 2000 platform_fee_percent: type: integer example: 3 is_active: type: boolean example: true tags: - 'Plataforma: planos' post: summary: 'Criar plano da plataforma' operationId: criarPlanoDaPlataforma description: '' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 2 name: Pro slug: pro price_cents: 9990 interval_months: 1 trial_days: 7 limits: max_bots: 3 max_groups: 5 max_active_members: 2000 platform_fee_percent: 3 is_active: true properties: data: type: object properties: id: type: integer example: 2 name: type: string example: Pro slug: type: string example: pro price_cents: type: integer example: 9990 interval_months: type: integer example: 1 trial_days: type: integer example: 7 limits: type: object properties: max_bots: type: integer example: 3 max_groups: type: integer example: 5 max_active_members: type: integer example: 2000 platform_fee_percent: type: integer example: 3 is_active: type: boolean example: true tags: - 'Plataforma: planos' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Nome do plano. O campo value deve ter pelo menos 2 caracteres. O campo value não pode ser superior a 80 caracteres.' example: Pro slug: type: string description: 'Identificador único. Must contain only letters, numbers, dashes and underscores. O campo value não pode ser superior a 80 caracteres.' example: pro description: type: string description: 'Descrição. O campo value não pode ser superior a 500 caracteres.' example: 'Para criadoras com vários grupos.' nullable: true price_cents: type: integer description: 'Preço em centavos. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 100000000.' example: 9990 interval_months: type: integer description: 'Periodicidade: 1, 3, 6 ou 12 meses.' example: 1 enum: - 1 - 3 - 6 - 12 trial_days: type: integer description: 'Dias de teste grátis. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 90.' example: 7 max_bots: type: integer description: 'Limite de bots. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 1000.' example: 3 max_groups: type: integer description: 'Limite de grupos ativos. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 1000.' example: 5 max_active_members: type: integer description: 'Limite de membros ativos (null = ilimitado). O campo value deve ser pelo menos 1.' example: 2000 nullable: true platform_fee_percent: type: number description: 'Taxa (%) sobre vendas no modo split. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 50.' example: 3.0 allows_custom_domain: type: boolean description: 'Permite domínio próprio.' example: true features: type: array description: 'Benefício. O campo value não pode ser superior a 120 caracteres.' example: - 'Domínio próprio' items: type: string is_featured: type: boolean description: 'Destaque no site.' example: true is_active: type: boolean description: 'Disponível para novas assinaturas.' example: true sort_order: type: integer description: 'Ordem. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 65000.' example: 2 required: - name - slug - price_cents - max_bots - max_groups '/api/v1/platform/saas-plans/{saasPlan}': get: summary: 'Ver plano da plataforma' operationId: verPlanoDaPlataforma description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 2 name: Pro slug: pro price_cents: 9990 interval_months: 1 trial_days: 7 limits: max_bots: 3 max_groups: 5 max_active_members: 2000 platform_fee_percent: 3 is_active: true properties: data: type: object properties: id: type: integer example: 2 name: type: string example: Pro slug: type: string example: pro price_cents: type: integer example: 9990 interval_months: type: integer example: 1 trial_days: type: integer example: 7 limits: type: object properties: max_bots: type: integer example: 3 max_groups: type: integer example: 5 max_active_members: type: integer example: 2000 platform_fee_percent: type: integer example: 3 is_active: type: boolean example: true tags: - 'Plataforma: planos' patch: summary: 'Atualizar plano da plataforma' operationId: atualizarPlanoDaPlataforma description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 2 name: Pro slug: pro price_cents: 9990 interval_months: 1 trial_days: 7 limits: max_bots: 3 max_groups: 5 max_active_members: 2000 platform_fee_percent: 3 is_active: true properties: data: type: object properties: id: type: integer example: 2 name: type: string example: Pro slug: type: string example: pro price_cents: type: integer example: 9990 interval_months: type: integer example: 1 trial_days: type: integer example: 7 limits: type: object properties: max_bots: type: integer example: 3 max_groups: type: integer example: 5 max_active_members: type: integer example: 2000 platform_fee_percent: type: integer example: 3 is_active: type: boolean example: true tags: - 'Plataforma: planos' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Nome do plano. O campo value deve ter pelo menos 2 caracteres. O campo value não pode ser superior a 80 caracteres.' example: Pro slug: type: string description: 'Identificador único. Must contain only letters, numbers, dashes and underscores. O campo value não pode ser superior a 80 caracteres.' example: pro description: type: string description: 'Descrição. O campo value não pode ser superior a 500 caracteres.' example: 'Para criadoras com vários grupos.' nullable: true price_cents: type: integer description: 'Preço em centavos. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 100000000.' example: 9990 interval_months: type: integer description: 'Periodicidade: 1, 3, 6 ou 12 meses.' example: 1 enum: - 1 - 3 - 6 - 12 trial_days: type: integer description: 'Dias de teste grátis. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 90.' example: 7 max_bots: type: integer description: 'Limite de bots. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 1000.' example: 3 max_groups: type: integer description: 'Limite de grupos ativos. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 1000.' example: 5 max_active_members: type: integer description: 'Limite de membros ativos (null = ilimitado). O campo value deve ser pelo menos 1.' example: 2000 nullable: true platform_fee_percent: type: number description: 'Taxa (%) sobre vendas no modo split. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 50.' example: 3.0 allows_custom_domain: type: boolean description: 'Permite domínio próprio.' example: true features: type: array description: 'Benefício. O campo value não pode ser superior a 120 caracteres.' example: - 'Domínio próprio' items: type: string is_featured: type: boolean description: 'Destaque no site.' example: true is_active: type: boolean description: 'Disponível para novas assinaturas.' example: true sort_order: type: integer description: 'Ordem. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 65000.' example: 2 delete: summary: 'Arquivar plano da plataforma' operationId: arquivarPlanoDaPlataforma description: 'Exclusão lógica: criadoras que já assinam continuam no plano.' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Plataforma: planos' parameters: - in: path name: saasPlan description: 'ID do plano.' example: 2 required: true schema: type: integer