vsyncDOCUMENTAÇÃO

API de bots

Referência REST

Todas as rotas REST para bots: aplicativo, comandos, anexos, mensagens, reações, canais, membros, usuários, cargos e interações.

Todas as rotas abaixo usam Authorization: Bot <token> (menos as marcadas como "sem cabeçalho Bot"). Corpo e respostas são JSON. Erros têm o formato { "error": "mensagem em português" }.

Nas rotas de servidor, :g é o id do servidor e :c o id do canal. Você os recebe no gateway (GUILD_CREATE, MESSAGE_CREATE) ou em GET /bot/guilds e GET /guilds/:g.

Aplicativo e bot#

MétodoCaminhoCorpoRespostaPermissão
GET/bot/menenhum{ application, user } (aplicativo sem segredos e a conta do bot)só o token
GET/bot/guildsnenhum{ guilds: [{ id, name, iconUrl, ownerId, partner, verified }] }só o token
GET/oauth2/application/:clientIdnenhum{ id, name, description, avatarUrl, bannerUrl, botPublic } (público, sem login)nenhuma

Usuários#

MétodoCaminhoCorpoRespostaPermissão
GET/users/:idnenhum{ account, live: null }: perfil público da conta, sem presença. account traz os campos do objeto de usuário (createdAt, pulsing, pulseMonths, hiddenBadges...) e ainda bio, connections, profileDecorations e prisma: { active, source, expiresAt, plan, since } (ou null). 404 se a conta não existesó o token (600/min)

prisma.since é desde quando o período atual de Prisma está ativo ("assinante desde"); o dono pode esconder o Prisma (prisma vem null) e o Pulse (pulsing: false). Para "entrou no servidor em", use GET /guilds/:g/members/:id, abaixo.

Bash
curl -s $API/users/$USER_ID -H "Authorization: Bot $TOKEN"
Bash
curl -s $API/bot/me -H "Authorization: Bot $TOKEN"

Comandos de barra#

Veja Interações e comandos. Resumo (aceitam o token do bot ou a sessão do dono):

MétodoCaminhoCorpoResposta
GET/applications/:appId/commandsnenhum{ commands } globais
PUT/applications/:appId/commandslista de comandos, ou { commands: [...] }{ commands } (sobrescreve tudo)
POST/applications/:appId/commandsum comando201 { command } novo, 200 se atualizou o de mesmo nome
PATCH/applications/:appId/commands/:commandIdcampos a mudar{ command }
DELETE/applications/:appId/commands/:commandIdnenhum{ ok: true }
GET, PUT, POST, PATCH, DELETE/applications/:appId/guilds/:g/commands[/:commandId]igualigual, só para o servidor :g (o bot precisa estar nele)
GET/guilds/:g/commandsnenhumcomandos de todos os bots do servidor (para membros logados)

:appId é o id do aplicativo (o mesmo do bot).

Anexos#

Bots enviam imagens, vídeos, áudios e arquivos como anexos, pelo mesmo fluxo que as pessoas usam no app (os bytes vão direto ao armazenamento privado por uma URL assinada; a API nunca os recebe). Para bots, só em canais de texto de servidor. Passo a passo com exemplos em curl e Node em Enviar imagens e arquivos.

MétodoCaminhoCorpoRespostaPermissão
GET/attachments/limitsnenhum{ tier: "bot", maxBytes, limits, available, maxPending }só o token
POST/attachments/init{ name, size, contentType?, scope: { guildId, channelId } }201 { id, name, size, warn, uploadUrl, uploadHeaders, expiresAt }SEND_MESSAGES e ATTACH_FILES no canal
PUTa uploadUrl devolvida (fora da API, sem Authorization)os bytes, com uploadHeaders e exatamente size bytes200 do armazenamentonenhuma (URL assinada, 15 min)
POST/attachments/:id/completenenhum{ id, name, size, kind, mime, warn }dono do envio
DELETE/attachments/:idnenhum{ ok: true } (só antes de virar mensagem)dono do envio
GET/attachments/:idnenhum{ url, downloadUrl, expiresAt } (URLs de 5 min)ver o canal da mensagem
POST/attachments/resolve{ ids: [...] } (até 60){ items: { id: { url, downloadUrl, expiresAt } } }; sem acesso = ausentever o canal da mensagem
Bash
# 1) preparar  2) PUT dos bytes (sem token)  3) concluir  4) usar na mensagem
curl -s -X POST $API/attachments/init -H "Authorization: Bot $TOKEN" -H "Content-Type: application/json" \
  -d '{"name":"imagem.png","size":12345,"contentType":"image/png","scope":{"guildId":"'$G'","channelId":"'$C'"}}'
curl -s -X PUT "URL_DE_ENVIO" -H "Content-Type: application/octet-stream" --data-binary @imagem.png
curl -s -X POST $API/attachments/ID_DO_ANEXO/complete -H "Authorization: Bot $TOKEN"
curl -s -X POST $API/guilds/$G/channels/$C/messages -H "Authorization: Bot $TOKEN" -H "Content-Type: application/json" \
  -d '{"body":"Veja a imagem","attachments":["att:ID_DO_ANEXO"]}'

Regras e limites para bots:

  • O bot precisa estar no servidor e ter SEND_MESSAGES e ATTACH_FILES no canal (sobrescritas do canal valem); senão 403 O bot não pode anexar arquivos aqui.. scope com dmUserId ou groupId responde 403 (bots não têm mensagens diretas).
  • 100 MB por arquivo, fixo (413 { error, maxBytes, tier: "bot" }, sem upgrade). 10 envios pendentes por bot (429) e 20 init por minuto. Anexos por mensagem: 4 a 10, conforme o nível de Pulse do servidor (400 Envie até N anexos por mensagem.).
  • O tipo (kind, mime) vem do conteúdo, conferido no complete; o contentType declarado não manda. warn: true marca executáveis.
  • Um anexo só vira mensagem se estiver concluído, for do próprio bot e do mesmo canal do scope, e só uma vez (400 Anexo inválido.). Envio não concluído expira em 1 h; concluído e sem mensagem, em 24 h.
  • A resposta da mensagem e os eventos do gateway trazem attachments (referências) e files (metadados), nunca URLs assinadas. 503 Envio de arquivos indisponível no momento. quando o armazenamento não está configurado.
  • Respostas efêmeras de interação não aceitam anexos; respostas normais, follow-ups e edições aceitam o mesmo campo attachments (veja Anexos em respostas de interação).

Mensagens#

Canais de voz também têm mensagens: as rotas desta seção e as de Reações e Anexos valem para type: "voice" com as mesmas permissões dos canais de texto. Só categorias não têm mensagens.

MétodoCaminhoCorpoRespostaPermissão
GET/guilds/:g/channels/:c/messages?before=<ms>nenhum{ messages, hasMore }, até 50 por página, em ordem cronológica; before é o createdAt (ms) da mensagem mais antiga que você já temver o canal
GET/guilds/:g/channels/:c/pinsnenhum{ messages } fixadasver o canal
POST/guilds/:g/channels/:c/messages{ body?, embeds?, components?, attachments?, replyToId? }201 { message }SEND_MESSAGES no canal; ATTACH_FILES se houver anexos
PATCH/guilds/:g/channels/:c/messages/:m{ body?, embeds?, components? } (anexos não mudam na edição){ message }só mensagens do próprio bot
DELETE/guilds/:g/channels/:c/messages/:mnenhum{ ok: true }autor, ou MANAGE_MESSAGES
POST/guilds/:g/channels/:c/messages/:m/pin{ pinned?: boolean } (padrão fixar){ message }MANAGE_MESSAGES

Detalhes:

  • body aceita até 2000 caracteres (formatação em Mensagens e embeds). Para o bot, body pode ficar vazio se houver embeds, componentes ou anexos. Mensagem sem nada devolve 400.
  • embeds é uma lista de até 10 embeds (veja o schema do embed). Só contas de bot podem enviá-los: de pessoas, o campo é ignorado.
  • components são botões e menus (veja Componentes e modais). Com embeds ou componentes, o body pode ficar vazio.
  • replyToId responde a uma mensagem do mesmo canal.
  • attachments recebe uma lista de referências att:<id> preparadas com as rotas de Anexos no mesmo canal. Exige ATTACH_FILES (403 O bot não pode anexar arquivos aqui.); referência inválida, de outro canal ou já usada dá 400 Anexo inválido.; acima do limite do servidor, 400 Envie até N anexos por mensagem..
  • @everyone e @here só notificam se o bot tiver MENTION_EVERYONE no canal.
  • Em canais com modo lento, o bot só fica isento com MANAGE_MESSAGES (ou MANAGE_CHANNELS). Sem isso, recebe 429 com { error, retryAfter } em segundos.
  • A resposta de message traz id, guildId, channelId, authorId, body, embeds, components, attachments, files (metadados dos anexos: id, name, size, kind, mime, warn), reactions, replyToId, pinned, interaction, createdAt, editedAt e author (identidade completa, com bot: true).
Bash
curl -s -X POST $API/guilds/$G/channels/$C/messages \
  -H "Authorization: Bot $TOKEN" -H "Content-Type: application/json" \
  -d '{"body":"Olá do bot!","embeds":[{"title":"Oi","description":"Mensagem com embed","color":"#7c5cff"}]}'

curl -s -X PATCH $API/guilds/$G/channels/$C/messages/$M \
  -H "Authorization: Bot $TOKEN" -H "Content-Type: application/json" \
  -d '{"body":"Texto editado"}'

curl -s -X DELETE $API/guilds/$G/channels/$C/messages/$M -H "Authorization: Bot $TOKEN"

Reações#

MétodoCaminhoCorpoRespostaPermissão
POST/guilds/:g/channels/:c/messages/:m/reactions{ "emoji": "👍" }{ message }ADD_REACTIONS ao adicionar

A rota alterna: reagir de novo com o mesmo emoji remove a reação do bot. Aceita emojis unicode (até 16 unidades de texto) e o token de um emoji personalizado do servidor (veja Menções, emojis e escape); não há rota para remover reação de outra pessoa. O gateway avisa com MESSAGE_REACTION_ADD e MESSAGE_REACTION_REMOVE.

Canais#

MétodoCaminhoCorpoRespostaPermissão
GET/guilds/:gnenhumservidor, canais visíveis, cargos, membros (com presença) e permissões do botser membro
POST/guilds/:g/channels{ name, type: "text", "voice" ou "category", parentId? }201 { channel }MANAGE_CHANNELS
PATCH/guilds/:g/channels/:c{ name?, topic?, slowmodeSeconds?, parentId? }{ channel }MANAGE_CHANNELS
PUT/guilds/:g/channels/:c/overwrites{ overwrites: [{ id, type: "role" ou "member", allow, deny }] }{ channel }MANAGE_ROLES. Como no Discord, a hierarquia de cargos não limita as permissões do canal (o bot pode definir as de qualquer cargo ou membro); o bot só não pode liberar (allow) uma permissão que ele mesmo não tem
DELETE/guilds/:g/channels/:cnenhum{ ok: true }MANAGE_CHANNELS

slowmodeSeconds aceita 0, 5, 10, 15, 30, 60, 120, 300, 600, 900, 1800, 3600, 7200 ou 21600. O tópico tem até 300 caracteres. Nunca é possível apagar o último canal de texto do servidor.

Membros, cargos e moderação#

MétodoCaminhoCorpoPermissão
GET/guilds/:g/members/:accountIdnenhumser membro. Resposta { member }: usuário + presença + membro no mesmo objeto (createdAt, prismaSince, pulsingSince, pulseBadge, nextPulseBadge, nickname, roleIds, joinedAt, timeoutUntil, status...), igual a um item de members de GET /guilds/:g; 404 se a pessoa não está no servidor
PATCH/guilds/:g/members/:accountId{ nickname?, roleIds? }CHANGE_NICKNAME no próprio apelido; MANAGE_NICKNAMES e MANAGE_ROLES nos demais, só abaixo do cargo do bot
DELETE/guilds/:g/members/:accountIdnenhumKICK_MEMBERS e cargo acima do alvo
GET/guilds/:g/bansnenhumBAN_MEMBERS
PUT/guilds/:g/bans/:accountId{ reason? }BAN_MEMBERS e cargo acima do alvo
DELETE/guilds/:g/bans/:accountIdnenhumBAN_MEMBERS
POST/guilds/:g/roles{ name, color?, permissions?, hoist? }MANAGE_ROLES (só permissões que o bot tem)
PATCH/guilds/:g/roles/:roleId{ name?, color?, permissions?, hoist? }MANAGE_ROLES, cargo abaixo do bot
DELETE/guilds/:g/roles/:roleIdnenhumMANAGE_ROLES, cargo abaixo do bot
POST/guilds/:g/members/:accountId/voice{ action: "mute", "unmute", "deafen", "undeafen" ou "disconnect" }MUTE_MEMBERS (mute, unmute, deafen e undeafen) ou MOVE_MEMBERS (disconnect); só em quem tem cargo abaixo do bot. deafen também silencia (como no Discord) e a pessoa não ouve ninguém até receber undeafen; a voz do participante traz serverMuted e serverDeafened
GET/guilds/:g/audit-logquery action, actorId, before, limitVIEW_AUDIT_LOG
POST/guilds/:g/leavenenhumo bot sai do servidor (menos se for dono)

A hierarquia vale para bots como para pessoas: o bot só mexe em cargos e membros abaixo do seu cargo mais alto, e o cargo gerenciado nasce abaixo de quem o adicionou. Rotas de gerenciamento do servidor (PATCH /guilds/:g etc.) exigem MANAGE_GUILD e seguem as mesmas regras de qualquer membro.

Para listar membros e cargos, use GET /guilds/:g (campos members e roles) ou os dados do GUILD_CREATE no gateway. Para um só membro (um comando userinfo, por exemplo), GET /guilds/:g/members/:accountId:

Bash
curl -s $API/guilds/$G/members/$USER_ID -H "Authorization: Bot $TOKEN"
# { "member": { "id": "...", "username": "ana", "displayName": "Ana", "createdAt": 1791420368416, "prismaActive": true, "prismaSince": 1791500000000,
#               "pulsing": true, "pulseMonths": 2, "pulsingSince": 1792000000000, "pulseBadge": { "id": "PULSE_2", "months": 2 },
#               "nextPulseBadge": { "id": "PULSE_3", "months": 3, "at": 1799776000000 }, "nickname": null, "roleIds": [], "joinedAt": 1791420368416,
#               "timeoutUntil": null, "status": "online", ... } }

Os campos de cada pessoa (e o que o dono da conta pode esconder) estão em Objetos: usuário e membro.

Interações e webhooks (sem cabeçalho Bot)#

Estas rotas são autenticadas pelo token da interação na URL. Não envie Authorization: Bot nelas: /webhooks responde 403 a bots que enviam o cabeçalho.

MétodoCaminhoCorpoResposta
POST/interactions/:interactionId/:token/callback{ type: "message", "defer", "update", "defer_update" ou "modal", data? }{ ok: true, messageId? }
POST/webhooks/:appId/:token{ body?, embeds?, components?, attachments?, ephemeral? }201 { ok, messageId } (follow-up)
PATCH/webhooks/:appId/:token/messages/@original{ body?, embeds?, components?, attachments? }{ ok, messageId }

attachments segue as regras de Anexos em respostas de interação (não vale em respostas efêmeras). Detalhes em Interações e comandos, Componentes e modais e tipos de interação e respostas.