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étodo | Caminho | Corpo | Resposta | Permissão |
|---|---|---|---|---|
| GET | /bot/me | nenhum | { application, user } (aplicativo sem segredos e a conta do bot) | só o token |
| GET | /bot/guilds | nenhum | { guilds: [{ id, name, iconUrl, ownerId, partner, verified }] } | só o token |
| GET | /oauth2/application/:clientId | nenhum | { id, name, description, avatarUrl, bannerUrl, botPublic } (público, sem login) | nenhuma |
Usuários#
| Método | Caminho | Corpo | Resposta | Permissão |
|---|---|---|---|---|
| GET | /users/:id | nenhum | { 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 existe | só 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.
curl -s $API/users/$USER_ID -H "Authorization: Bot $TOKEN"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étodo | Caminho | Corpo | Resposta |
|---|---|---|---|
| GET | /applications/:appId/commands | nenhum | { commands } globais |
| PUT | /applications/:appId/commands | lista de comandos, ou { commands: [...] } | { commands } (sobrescreve tudo) |
| POST | /applications/:appId/commands | um comando | 201 { command } novo, 200 se atualizou o de mesmo nome |
| PATCH | /applications/:appId/commands/:commandId | campos a mudar | { command } |
| DELETE | /applications/:appId/commands/:commandId | nenhum | { ok: true } |
| GET, PUT, POST, PATCH, DELETE | /applications/:appId/guilds/:g/commands[/:commandId] | igual | igual, só para o servidor :g (o bot precisa estar nele) |
| GET | /guilds/:g/commands | nenhum | comandos 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étodo | Caminho | Corpo | Resposta | Permissão |
|---|---|---|---|---|
| GET | /attachments/limits | nenhum | { 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 |
| PUT | a uploadUrl devolvida (fora da API, sem Authorization) | os bytes, com uploadHeaders e exatamente size bytes | 200 do armazenamento | nenhuma (URL assinada, 15 min) |
| POST | /attachments/:id/complete | nenhum | { id, name, size, kind, mime, warn } | dono do envio |
| DELETE | /attachments/:id | nenhum | { ok: true } (só antes de virar mensagem) | dono do envio |
| GET | /attachments/:id | nenhum | { 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 = ausente | ver o canal da mensagem |
# 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_MESSAGESeATTACH_FILESno canal (sobrescritas do canal valem); senão403 O bot não pode anexar arquivos aqui..scopecomdmUserIdougroupIdresponde403(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 20initpor 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 nocomplete; ocontentTypedeclarado não manda.warn: truemarca 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) efiles(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étodo | Caminho | Corpo | Resposta | Permissã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á tem | ver o canal |
| GET | /guilds/:g/channels/:c/pins | nenhum | { messages } fixadas | ver 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/:m | nenhum | { ok: true } | autor, ou MANAGE_MESSAGES |
| POST | /guilds/:g/channels/:c/messages/:m/pin | { pinned?: boolean } (padrão fixar) | { message } | MANAGE_MESSAGES |
Detalhes:
bodyaceita até 2000 caracteres (formatação em Mensagens e embeds). Para o bot,bodypode ficar vazio se houver embeds, componentes ou anexos. Mensagem sem nada devolve400.embedsé uma lista de até 10 embeds (veja o schema do embed). Só contas de bot podem enviá-los: de pessoas, o campo é ignorado.componentssão botões e menus (veja Componentes e modais). Com embeds ou componentes, obodypode ficar vazio.replyToIdresponde a uma mensagem do mesmo canal.attachmentsrecebe uma lista de referênciasatt:<id>preparadas com as rotas de Anexos no mesmo canal. ExigeATTACH_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..@everyonee@heresó notificam se o bot tiverMENTION_EVERYONEno canal.- Em canais com modo lento, o bot só fica isento com
MANAGE_MESSAGES(ouMANAGE_CHANNELS). Sem isso, recebe429com{ error, retryAfter }em segundos. - A resposta de
messagetrazid,guildId,channelId,authorId,body,embeds,components,attachments,files(metadados dos anexos:id,name,size,kind,mime,warn),reactions,replyToId,pinned,interaction,createdAt,editedAteauthor(identidade completa, combot: true).
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étodo | Caminho | Corpo | Resposta | Permissã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étodo | Caminho | Corpo | Resposta | Permissão |
|---|---|---|---|---|
| GET | /guilds/:g | nenhum | servidor, canais visíveis, cargos, membros (com presença) e permissões do bot | ser 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/:c | nenhum | { 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étodo | Caminho | Corpo | Permissão |
|---|---|---|---|
| GET | /guilds/:g/members/:accountId | nenhum | ser 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/:accountId | nenhum | KICK_MEMBERS e cargo acima do alvo |
| GET | /guilds/:g/bans | nenhum | BAN_MEMBERS |
| PUT | /guilds/:g/bans/:accountId | { reason? } | BAN_MEMBERS e cargo acima do alvo |
| DELETE | /guilds/:g/bans/:accountId | nenhum | BAN_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/:roleId | nenhum | MANAGE_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-log | query action, actorId, before, limit | VIEW_AUDIT_LOG |
| POST | /guilds/:g/leave | nenhum | o 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:
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étodo | Caminho | Corpo | Resposta |
|---|---|---|---|
| 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.