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