Aparência
API REST
https://apigolive.nemtudo.me- Corpo e respostas em JSON. Mande
Content-Type: application/jsonsó quando houver corpo — umContent-TypeJSON com corpo vazio é recusado com400. Nas rotasPOSTsem campos, mande{}. - Autenticação:
Authorization: Bot <token>. Rotas marcadas como pública funcionam sem. - Erros vêm como
{ "error": "mensagem" }— veja Erros. - Cada rota tem seu limite de requisições por IP, na coluna "Limite" (por minuto, salvo indicação) — veja Limites.
:idé o id do grupo,:cido id da sala,:mido id da mensagem,:userIdo id de uma conta.- As rotas de Entrar com Go Live — o seu site agindo em nome de outra pessoa, com
Authorization: Bearer— estão numa página só delas: OAuth2.
Índice de rotas
Conta e perfil
| Método | Rota | O que faz | Limite |
|---|---|---|---|
| GET | /auth/me | A conta do bot. | 120 |
| PATCH | /account/profile | Edita o perfil do bot (nome, bio, avatar, banner, degradê, música). | 30 |
| GET | /account/avatars | Avatares que o bot pode usar. | 60 |
| GET | /users/:usuarioOuId | Perfil público de uma conta. Pública. | 60 |
| GET | /account/bots | Bots de uma conta. Sessão de pessoa, não de bot. | 60 |
| POST | /account/bots | Cria um bot. Sessão de pessoa. | 5 / 15 min |
| GET | /account/bots/:id | Um bot e os grupos em que está. Sessão de pessoa. | 120 |
| PATCH | /account/bots/:id | Edita o perfil do bot e se ele é público. Sessão de pessoa. | 30 |
| POST | /account/bots/:id/token | Gera novo token (derruba as conexões do antigo). Sessão de pessoa. | 10 / 5 min |
| DELETE | /account/bots/:id | Exclui o bot. Sessão de pessoa. | 10 / 5 min |
Grupos
| Método | Rota | O que faz | Permissão | Limite |
|---|---|---|---|---|
| GET | /groups | Grupos em que o bot está. | — | 120 |
| GET | /groups/:id | Salas, cargos, permissões e o bot no grupo. | membro | 240 |
| GET | /groups/:id/voice | Quem está em cada sala de voz. | membro | 240 |
| POST | /groups | Cria um grupo. Recusado para bots (403). | — | 10 |
| PATCH | /groups/:id | Muda nome e descrição. | manageGroup | 30 |
| POST | /groups/:id/icon | Troca o ícone ({ image: dataURL }). | manageGroup | 10 |
| DELETE | /groups/:id/icon | Remove o ícone. | manageGroup | 30 |
| PUT | /groups/:id/notify | Nível de notificação do bot no grupo. | membro | 60 |
| PUT | /groups/:id/channels/:cid/mute | Silencia ou reativa uma sala para o bot. | membro | 60 |
| PUT | /groups/:id/visibility | { visibility: "public" | "private" }. | dono | 20 |
| PUT | /groups/:id/location | Posição no mapa ({ location: { lat, lng } | null }). | manageGroup | 30 |
| PUT | /groups/:id/custom-invite | Link personalizado ({ code }). Plano Pro Max do dono. | manageGroup | 20 |
| POST | /groups/:id/transfer | Passa o grupo para outro membro ({ userId }). Nunca para um bot. | dono | 10 |
| POST | /groups/:id/leave | Sai do grupo. | membro | 20 |
| DELETE | /groups/:id | Apaga o grupo. | dono | 10 |
| POST | /groups/:id/join | Entra num grupo público. Recusado para bots (403). | — | 20 |
| POST | /groups/:id/bots | Adiciona um bot ao grupo. Sessão de pessoa. | manageGroup | 20 |
| GET | /bots/:idOuUsuario | O bot e os grupos em que quem pergunta pode adicioná-lo. Pública. | — | 60 |
| GET | /groups/:id/preview | Cartão de um grupo público. Pública. | — | 60 |
| GET | /groups/search?q= | Busca grupos públicos pelo nome. Pública. | — | 60 |
| GET | /groups/map | Grupos no mapa-múndi. Pública. | — | 60 |
| PUT | /groups/order | Ordem dos grupos na barra lateral ({ ids }). | — | 60 |
Salas e categorias
| Método | Rota | O que faz | Permissão | Limite |
|---|---|---|---|---|
| POST | /groups/:id/channels | Cria uma sala. | manageChannels | 30 |
| PATCH | /groups/:id/channels/:cid | Renomeia ({ name }). | manageChannels | 30 |
| DELETE | /groups/:id/channels/:cid | Apaga a sala. | manageChannels | 30 |
| PUT | /groups/:id/channels/order | Reordena ({ ids }). | manageChannels | 30 |
| PUT | /groups/:id/channels/:cid/permissions | Exceções de permissão da sala. | manageChannels | 60 |
| POST | /groups/:id/categories | Cria categoria ({ name }). | manageChannels | 30 |
| PATCH | /groups/:id/categories/:catId | Renomeia categoria ({ name }). | manageChannels | 30 |
| DELETE | /groups/:id/categories/:catId | Apaga a categoria (as salas ficam, sem categoria). | manageChannels | 30 |
| PUT | /groups/:id/layout | Reorganiza tudo ({ categories, containers }). | manageChannels | 60 |
Mensagens
| Método | Rota | O que faz | Permissão | Limite |
|---|---|---|---|---|
| GET | /groups/:id/channels/:cid/messages | Histórico (50 por página). | ver a sala | 240 |
| POST | /groups/:id/channels/:cid/messages | Envia mensagem. | sendMessages | 120 |
| PATCH | /groups/:id/channels/:cid/messages/:mid | Edita o texto de uma mensagem. | só a própria, e sendMessages | 60 |
| DELETE | /groups/:id/channels/:cid/messages/:mid | Apaga mensagem. | própria, ou manageMessages | 60 |
| GET | /groups/:id/channels/:cid/mention-audience?m= | Quantos uma menção avisaria agora. | ver a sala | 60 |
| POST | /groups/:id/channels/:cid/messages/:mid/reactions | Coloca/tira reação. | addReactions / react | 120 |
| GET | /groups/:id/channels/:cid/messages/:mid/reactions?emoji= | Quem reagiu com um emoji, paginado. | ver a sala | 120 |
| DELETE | /groups/:id/channels/:cid/messages/:mid/reactions?emoji=&userId= | Tira a reação de alguém. Resposta: { reactions }. | a própria, ou manageReactions | 120 |
| POST | /groups/:id/channels/:cid/typing | "Está digitando...". | sendMessages | 120 |
| POST | /groups/:id/channels/:cid/read | Marca a sala como lida. | ver a sala | 240 |
Webhooks
| Método | Rota | O que faz | Permissão | Limite |
|---|---|---|---|---|
| GET | /groups/:id/webhooks | Lista os webhooks. | manageWebhooks | 120 |
| POST | /groups/:id/channels/:cid/webhooks | Cria ({ name }). | manageWebhooks | 20 |
| PATCH | /groups/:id/webhooks/:wid | Renomeia ou move ({ name?, channelId? }). | manageWebhooks | 60 |
| POST | /groups/:id/webhooks/:wid/avatar | Troca a foto ({ image: dataURL }). | manageWebhooks | 10 |
| DELETE | /groups/:id/webhooks/:wid/avatar | Tira a foto. | manageWebhooks | 30 |
| POST | /groups/:id/webhooks/:wid/token | Gera um novo endereço. | manageWebhooks | 20 |
| DELETE | /groups/:id/webhooks/:wid | Apaga. | manageWebhooks | 30 |
| POST | /webhooks/:id/:token | Posta pelo webhook. Sem autenticação. | — | 5 / 2 s por webhook |
Membros e moderação
| Método | Rota | O que faz | Permissão | Limite |
|---|---|---|---|---|
| GET | /groups/:id/members | Lista de membros. | membro | 120 |
| POST | /groups/:id/members/:userId/kick | Expulsa. | kickMembers | 30 |
| GET | /groups/:id/bans | Banidos. | banMembers | 60 |
| POST | /groups/:id/bans/:userId | Bane. | banMembers | 30 |
| DELETE | /groups/:id/bans/:userId | Desbane. | banMembers | 30 |
Cargos e permissões
| Método | Rota | O que faz | Permissão | Limite |
|---|---|---|---|---|
| POST | /groups/:id/roles | Cria cargo. | manageRoles | 30 |
| PATCH | /groups/:id/roles/:roleId | Edita cargo (mesmos campos). | manageRoles | 60 |
| DELETE | /groups/:id/roles/:roleId | Apaga cargo. | manageRoles | 30 |
| PUT | /groups/:id/roles/order | Reordena ({ ids }, do mais alto ao mais baixo). | manageRoles | 30 |
| PUT | /groups/:id/members/:userId/roles | Define os cargos de um membro. | manageRoles | 60 |
| PUT | /groups/:id/permissions | Permissões do @everyone (mescla). | manageRoles | 60 |
Convites
| Método | Rota | O que faz | Permissão | Limite |
|---|---|---|---|---|
| GET | /groups/:id/invites | Convites ativos. | createInvites ou manageGroup | 60 |
| POST | /groups/:id/invites | Cria convite. | createInvites | 20 |
| DELETE | /groups/:id/invites/:code | Revoga convite. | criador, ou manageGroup | 30 |
| GET | /invites/:code | Para onde o convite leva. Pública. | — | 60 |
| POST | /invites/:code/accept | Aceita o convite. Recusado para bots (403). | — | 20 |
Mensagens diretas
| Método | Rota | O que faz | Limite |
|---|---|---|---|
| GET | /dm | Conversas do bot. | 120 |
| GET | /dm/:userId?before= | Histórico com uma conta. | 120 |
| POST | /dm/:userId | Envia DM (bot: só para quem divide um grupo ou já escreveu). | 60 |
| POST | /dm/:userId/read | Marca como lida. | 120 |
| POST | /dm/:userId/typing | "Está digitando...". | 120 |
| POST | /dm/:userId/messages/:mid/reactions | Reage ({ emoji, on? }). | 120 |
| PATCH | /dm/:userId/messages/:mid | Edita o texto de uma DM do bot. | 60 |
| DELETE | /dm/:userId/messages/:mid | Apaga uma DM do bot, para os dois lados. | 60 |
| GET | /dm/settings | { readReceipts } da conta. | 60 |
| PUT | /dm/settings | Liga/desliga confirmações de leitura. | 30 |
Social
| Método | Rota | O que faz | Limite |
|---|---|---|---|
| GET | /social | Amigos, pedidos recebidos/enviados e bloqueados. | 120 |
| GET | /social/search?q= | Procura contas por nome (mín. 2 letras). | 60 |
| POST | /social/friends/:userId | Pede amizade. Recusado para bots e com bot como alvo (403). | 30 |
| POST | /social/friends/:userId/accept | Aceita um pedido. Recusado para bots (403). | 30 |
| DELETE | /social/friends/:userId | Desfaz amizade ou pedido. | 30 |
| POST | /social/blocks/:userId | Bloqueia. | 30 |
| DELETE | /social/blocks/:userId | Desbloqueia. | 30 |
Outros
| Método | Rota | O que faz | Limite |
|---|---|---|---|
| GET | /stats | { peopleOnline } nas salas ao vivo. Pública. | 60 |
| GET | /rooms | Salas ao vivo públicas agora (rooms), e as chamadas abertas de grupos públicos com gente (groupRooms, cada uma com group e channel — entra-se nelas pelo grupo, não pelo handle). Pública. | 60 |
| GET | /groups/public | Grupos públicos, paginados: ?q= busca, sort=online|members|recent, offset, limit (até 60). Responde { groups, total, hasMore }. Pública. | 120 |
| GET | /rooms/:handle/exists | Se uma sala ao vivo existe. Pública. | 60 |
| GET | /presence?ids=a,b,c | Presença de até 400 contas. Pública. | 120 |
| GET | /health | Se a API está no ar. Pública. | sem limite |
Conta
GET /auth/me
A conta dona do token. Primeira chamada de todo bot: confere o token e dá o id.
js
// 200
{
account: { id: "f3a9...", username: "musica_bot", displayName: "DJ do Grupo", bot: true, /* ... */ },
connections: { /* formas de login — vazio para bots */ }
}401 se o token for inválido; 503 com retryable: true se o servidor estiver iniciando. Veja o objeto Account.
PATCH /account/profile
| Campo | Regras |
|---|---|
displayName | 1 a 24 caracteres. |
bio | Até 500 caracteres; null apaga. |
avatar | Caminho de um avatar padrão ou da galeria, ou uma data URL (imagem própria); null remove. |
banner | Data URL; null remove. |
profileTheme | { from, to, angle } — degradê do cartão; null remove. |
song · songVolume | Link de vídeo do YouTube · volume 0–100. null remove a música. |
Para pessoas, a galeria é do Pro e o resto do Pro Max. Bots têm tudo, sem plano. Mande só o que for mudar. Detalhes em Perfil do bot.
GET /account/avatars
js
{
defaults: ["/assets/default_avatars/01.png", "/assets/default_avatars/02.png"],
gallery: ["/assets/avatars/01.png", /* ... */],
canUseGallery: true, // sempre true para bots
canUpload: true // true para bots, se o servidor aceita envio de imagens
}Rotas do dono do bot
/account/bots e /account/bots/:id são o que o portal do desenvolvedor usa. Exigem o token de sessão de uma pessoa (Bearer); com um token de bot respondem 401. Detalhes e formatos em Criando seu bot.
| Rota | Corpo | Resposta |
|---|---|---|
GET /account/bots | — | { bots, max } |
POST /account/bots | { username, displayName? } | { bot, token } |
GET /account/bots/:id | — | { bot, groups } |
PATCH /account/bots/:id | campos do PATCH /account/profile + public | { bot } |
POST /account/bots/:id/token | — | { token } — as conexões do token antigo fecham com 4004 |
DELETE /account/bots/:id | — | 204 — 409 se o bot é dono de algum grupo |
GET /users/:id
Aceita o @usuário (sem o @) ou o id. Pública.
js
{
account: { id, username, displayName, bio, avatarUrl, bannerUrl, flags, bot, createdAt, /* ... */ },
live: { room: "sala-do-joao", peopleCount: 12 } // ou null
}Grupos
GET /groups
js
{
groups: [
{
id: "k2x9d0a1b3", name: "Meu Grupo", iconUrl: null, flags: [],
role: "member", // "owner" | "admin" | "member"
memberCount: 42, onlineCount: 7,
unread: true, mentions: 1,
mutedChannels: ["c1"], // só se o bot silenciou alguma sala
voiceActivity: "screen", // só se alguém estiver numa sala de voz que o bot vê:
// "screen" (alguém transmitindo tela) > "camera" > "voice"
suspended: true // só se o grupo estiver suspenso
}
]
}GET /groups/:id
js
{
group: { // objeto Group
id, name, description, iconUrl, visibility, flags, ownerId,
permissions, // do @everyone
roles: [ /* Role, do mais alto ao mais baixo */ ],
memberCount, createdAt, /* ... */
},
categories: [ { id, name, position } ],
channels: [ // só as salas que o bot vê
{ id, kind: "text", name: "geral", categoryId: null, position: 0,
permissions: {}, roleOverrides: {}, unread: false, mentions: 0 }
],
voice: { /* channelId → participantes */ },
voiceRooms: { /* channelId → { music } */ },
memberRoles: { /* userId → [roleId] */ },
me: {
id, role, roleIds, rank, // rank: posição do cargo mais alto (-1 = dono)
permissions, // tudo o que O BOT pode, já calculado
notify: "mentions",
guest: false
},
chatAvailable: true
}404 se o bot não é membro (a API não revela se o grupo existe). 423 se o grupo está suspenso.
POST /groups
| Campo | Descrição |
|---|---|
name | Até 50 caracteres. |
visibility | "public" ou "private" (padrão). |
Uma conta pode ser dona de até 10 grupos. Resposta: { group }.
PATCH /groups/:id
{ name?, description? } — nome até 50, descrição até 200 caracteres. Resposta: { group }.
PUT /groups/:id/notify
{ level: "all" | "mentions" | "none" } — de quais mensagens o bot recebe group-notify. Padrão: "mentions".
TIP
Não afeta o group-message: o bot recebe todas as mensagens das salas que vê, qualquer que seja o nível.
PUT /groups/:id/channels/:cid/mute
{ muted: boolean } — silencia (ou reativa) uma sala para o bot. Numa sala silenciada, o bot não recebe group-notify, nem de menções, e as não lidas/menções dela não entram nos totais do grupo em GET /groups. A sala continua com os próprios unread/mentions em GET /groups/:id, que também passa a trazer muted: true nela. Resposta: { muted }. 404 se o bot não vê a sala.
POST /groups/:id/leave
Corpo {}. O dono não pode sair (transfira ou apague o grupo antes).
POST /groups/:id/join
Corpo {}. Só grupos públicos. Mesmos erros de aceitar convite. Resposta: { groupId }. Um bot recebe 403 com reason: "bot_self_join" — veja Colocando o bot num grupo.
POST /groups/:id/bots
Corpo { botId }. Adiciona um bot ao grupo. Exige a sessão de uma pessoa com manageGroup no grupo; um token de bot recebe 403. Um bot privado só pode ser adicionado pelo dono dele. O bot recebe group-added. Resposta: { groupId } (também se o bot já estava no grupo).
| Status | Motivo |
|---|---|
403 | Sem manageGroup, bot privado, bot banido do grupo ou do Go Live, grupo cheio, bot já em 10.000 grupos. |
404 | Grupo não encontrado (ou você não é membro), ou bot não encontrado. |
423 | Grupo suspenso. |
GET /bots/:id
Pública; a sessão (de pessoa) é opcional. Aceita o id ou o @usuário do bot.
js
{
bot: { id, username, displayName, avatarUrl, bannerUrl, bio, flags, profileTheme, groupCount, createdAt },
public: true, // qualquer pessoa que gerencia um grupo pode adicionar?
owner: false, // quem pergunta é o dono?
canInstall: true, // quem pergunta pode adicionar?
signedIn: true,
groups: [ { id, name, iconUrl, memberCount, member: false } ] // grupos que quem pergunta gerencia
}Salas
POST /groups/:id/channels
| Campo | Descrição |
|---|---|
kind | "text" (padrão) ou "voice". |
name | Até 32 caracteres. Salas de texto ficam em minúsculas. |
categoryId | Categoria onde criar, ou null. |
Até 50 salas por grupo. Resposta: { channel }.
PUT /groups/:id/channels/:cid/permissions
| Campo | Descrição |
|---|---|
roleId | O cargo a que as exceções se aplicam; omitido = @everyone. Só cargos abaixo do bot. |
permissions | { chave: true | false }. Chave omitida ou null = herda do grupo. |
Substitui todas as exceções daquele alvo na sala. Chaves válidas: as de general, text (salas de texto) ou voice (salas de voz) — veja Permissões.
Mensagens
GET /groups/:id/channels/:cid/messages
Query: before (ms, opcional). Até 50 mensagens anteriores a before, da mais antiga para a mais nova.
js
{
messages: [ /* GroupMessage */ ],
authors: { /* userId → GroupUser: autores e mencionados da página */ }
}Numa mensagem com @online, @offline ou @expr: em mentions, vem também pingedMe: boolean — se ela alcançou quem está lendo quando foi enviada (quem estava online naquele momento não dá para saber depois).
POST /groups/:id/channels/:cid/messages
| Campo | Tipo | Descrição |
|---|---|---|
text | string | Até 2000 caracteres. |
images | string[] | Até 3 data URLs (PNG, JPEG, WebP, GIF, AVIF); 5 MB cada, 8 MB no total. Exige sendImages. |
url | string | GIF do Giphy. Exige sendGifs. |
replyTo | objeto | { id, name, text?, kind?, images?, userId? }. userId notifica o autor. |
mentions | string[] | "@everyone" (exige mentionEveryone), "@role:<id>", "@online", "@offline" e "@expr:<expressão>" (combinações). Pessoas vão no texto como <@id>. |
nonce | string | 8–64 caracteres [A-Za-z0-9_-]. Repetir com o mesmo nonce em até 10 min devolve a mensagem já criada. |
embeds | objeto[] | Até 10 embeds no formato do Discord. Só bots. |
Pelo menos um de text, images, url, attachments, embeds. O text aceita markdown. Resposta: { message, author, nonce? }. Guia: Enviando mensagens.
PATCH /groups/:id/channels/:cid/messages/:mid
| Campo | Tipo | Descrição |
|---|---|---|
text | string | O texto novo. Mesmas regras do envio: até 2000 caracteres, pessoas como <@id>. |
mentions | string[] | Opcional. As mesmas entradas do envio. Quem @online/@offline/@expr: alcança é recalculado com quem está online agora. |
Só o autor edita, nem com manageMessages dá para editar a mensagem de outra pessoa. Imagens, reações, replyTo e ts ficam como estavam. Quem a mensagem menciona é recalculado a partir do texto novo, mas a edição não notifica ninguém. Resposta: { message }, com editedAt preenchido. Se o texto for igual ao atual, nada muda e editedAt não é marcado.
400com texto vazio numa mensagem sem imagens (para isso, apague a mensagem), ou numa mensagem de GIF.403se a mensagem não for do bot, ou se ele não tiver maissendMessagesna sala.
Todos que veem a sala recebem group-message-updated.
DELETE /groups/:id/channels/:cid/messages/:mid
Sem corpo. Resposta: { ok: true }. 403 se não for do bot e ele não tiver manageMessages.
GET /groups/:id/channels/:cid/mention-audience
Query: m, uma entrada de mentions ("@everyone", "@online", "@role:<id>", "@expr:…"). Quem ela avisaria se fosse enviada nesta sala agora, sem contar o próprio bot:
js
{ allowed: true, count: 12, online: 5 }allowed diz se o bot pode mandar essa menção aqui (a mesma regra do envio). 400 com uma entrada inválida ou um cargo que não existe.
POST /groups/:id/channels/:cid/messages/:mid/reactions
| Campo | Descrição |
|---|---|
emoji | Exatamente um emoji Unicode padrão. |
on | true (padrão) coloca; false tira. |
Resposta: { reactions: [ { emoji, users } ] }. Máx. 20 emoji diferentes por mensagem.
GET /groups/:id/channels/:cid/messages/:mid/reactions
| Parâmetro | Descrição |
|---|---|
emoji | O emoji (obrigatório). |
sort | recent (padrão, mais recentes primeiro), oldest ou name (alfabética). |
q | Só quem tem isso no nome ou no @usuário. |
after | O next da página anterior. |
limit | 1–100, padrão 50. |
Resposta: { people: [GroupUser], total, next } — total é quantos batem com a busca; next é null na última página.
POST /groups/:id/channels/:cid/typing
{ typing: true | false }. Resposta: { ok: true }.
Membros
GET /groups/:id/members
Sem query, a lista inteira:
js
{
members: [
{ id, name, username, avatarUrl, nameColor, flags, bot, guest,
role: "member", roleIds: ["r0l3..."], online: true, joinedAt: 1757000000000 }
]
}Em grupos grandes, peça fatias:
| Query | Devolve |
|---|---|
?online=1 | Todos os membros online. |
?online=0&limit=100&after=<id> | Uma página dos offline (máx. 200). Continue com o next da resposta. |
?q=texto | Membros cujo nome contém o texto (sem acento, padrão 20 resultados). |
&channel=<cid> | Combina com os de cima: só quem vê aquela sala. |
Com query, a resposta ganha total, online e (na paginação) next.
Cargos
POST /groups/:id/roles
| Campo | Descrição |
|---|---|
name | Até 32 caracteres. |
color | "#rrggbb" ou null. |
hoist | Mostrar separado na lista de membros. |
mentionable | Qualquer um pode mencioná-lo. |
permissions | { manage: {...}, general: {...}, text: {...}, voice: {...} } — só as que o bot tem são aceitas. |
O cargo novo entra no fim da lista (posição 1). Até 50 cargos por grupo. Resposta: { role }.
PUT /groups/:id/members/:userId/roles
{ roleIds: [...] } — a lista completa de cargos que a pessoa deve ter. Só cargos abaixo do bot mudam; os demais ficam como estavam. Resposta: { roleIds }.
Convites
POST /groups/:id/invites
| Campo | Descrição |
|---|---|
expiresIn | "30m", "1h", "6h", "1d", "7d" (padrão) ou "never". |
maxUses | Número de usos (1 a 10000), ou omitido para ilimitado. |
Resposta: { invite: { code, createdBy, createdAt, expiresAt, maxUses, uses } }. Link: https://golive.nemtudo.me/invite/<code>.
GET /invites/:code
js
{
invite: { code: "AbC12345", state: "ok", expiresAt: 1758300000000 }, // state: ok | expired | revoked | exhausted
group: { id, name, description, iconUrl, flags, memberCount, onlineCount },
member: false // se o bot já está no grupo
}POST /invites/:code/accept
Corpo {}. Resposta: { groupId } (também se já for membro).
Bots não aceitam convites: com um token de bot, a resposta é 403 com reason: "bot_self_join", e nenhum uso do convite é gasto. Quem gerencia o grupo adiciona o bot por POST /groups/:id/bots.
| Status | Motivo |
|---|---|
403 | Token de bot (bot_self_join), banido do grupo, grupo cheio, ou já em 100 grupos. |
404 | Convite inválido. |
410 | Expirado, revogado ou esgotado (state na resposta). |
423 | Grupo suspenso. |
Mensagens diretas
POST /dm/:userId
| Campo | Descrição |
|---|---|
text | Até 2000 caracteres. |
images | Até 3 data URLs, mesmas regras dos grupos. |
url | GIF do Giphy. |
replyTo | { id, name, text?, kind?, images? }. |
clientId | Um rótulo seu (1–64 [A-Za-z0-9_-]), devolvido no evento dm. |
Resposta: { message }. 404 User not found. também quando há bloqueio entre as contas. Um bot só puxa conversa com quem divide um grupo com ele ou já escreveu para ele — senão 403 com reason: "bot_dm_not_allowed". Guia: Mensagens diretas.
GET /dm/:userId responde { user, messages, seenTs } — seenTs é até quando a outra conta leu, ou null se um dos dois desligou as confirmações de leitura.
PATCH /dm/:userId/messages/:mid
Corpo: { text }, com as mesmas regras do envio. Só o autor edita. Imagens, reações, replyTo e ts ficam como estavam, e a edição não notifica ninguém. Resposta: { message }, com editedAt preenchido. Se o texto for igual ao atual, nada muda e editedAt não é marcado.
400com texto vazio numa mensagem sem imagens (para isso, apague a mensagem), ou numa mensagem de GIF.403se a mensagem não for do bot.404se a mensagem não for dessa conversa, ou se houver bloqueio entre as contas.
Os dois lados recebem dm-edited.
DELETE /dm/:userId/messages/:mid
Sem corpo. Apaga para os dois lados. Resposta: { ok: true }. 403 se a mensagem não for do bot; 404 como no PATCH. Os dois lados recebem dm-deleted.