Mensagens ricas

Embeds, botões, menus de seleção e Components V2.

Embeds, botões, menus de seleção e Components V2 seguem o formato do Discord, com as diferenças marcadas como [NEX]. Envie pelas rotas de Mensagens ou como resposta de interação.

Dica
Use o @nex/bot-sdk para montar esses objetos com builders em vez de JSON à mão.

Embeds

CampoRegra
typeSó "rich" (ou ausente).
title256 caracteres
description4096 caracteres
url, image.url, thumbnail.urlhttp(s), até 2048 caracteres
colorInteiro de 0 a 16777215 (0xFFFFFF)
timestampData válida (ISO 8601)
footertext obrigatório (2048) e icon_url
authorname obrigatório (256), url, icon_url
fieldsAté 25. name (256) e value (1024) não vazios, inline opcional
TotalAté 10 embeds e 6000 caracteres somando todos
Atenção
Qualquer chave fora dessa lista (ex.: video, provider) responde 400.
Embed
{
  "embeds": [{
    "title": "Status do servidor",
    "description": "Tudo **normal**.",
    "color": 5763719,
    "fields": [{ "name": "Uptime", "value": "99,9%", "inline": true }],
    "footer": { "text": "Atualizado agora" },
    "timestamp": "2026-10-05T14:00:00Z"
  }]
}

Componentes

Na raiz só entram Action Rows (type: 1). Cada linha tem até 5 botões ou 1 menu de seleção. No máximo 40 componentes por mensagem, contando todos os níveis.

typeComponenteCampos
1Action Rowcomponents[]
2Buttonstyle 1–5, label (1–80) e/ou emoji, custom_id (1–100) ou url no estilo 5, disabled
3String Selectcustom_id, placeholder (150), min_values/max_values (até 25), options 1–25 de { label, value, description?, default? }
5 / 6 / 8User / Role / Channel SelectComo o String Select, sem options. Channel aceita channel_types: text, voice, forum

Estilos de botão: 1 Primary, 2 Secondary, 3 Success, 4 Danger, 5 Link. Botão de link abre a URL direto e nunca gera interação.

Botões e menu
{
  "content": "Escolha:",
  "components": [
    { "type": 1, "components": [
      { "type": 2, "style": 1, "label": "Continuar", "custom_id": "continuar" },
      { "type": 2, "style": 5, "label": "Site", "url": "https://nexapp.online" }
    ]},
    { "type": 1, "components": [
      { "type": 3, "custom_id": "modo", "options": [
        { "label": "Normal", "value": "normal" },
        { "label": "Repetir", "value": "loop" }
      ]}
    ]}
  ]
}

Components V2

Com flags: 32768 a mensagem inteira vira componentes: content e embeds devem estar vazios.

typeComponenteRegras
17ContainerRaiz. 1–10 filhos dos tipos 9, 10, 12, 13 e 14.
9SectionDentro de Container. 1–3 Text Display + accessory obrigatório (Button ou Thumbnail).
10Text Displaycontent em Markdown, 1–4000. Raiz ou Container.
11ThumbnailSó como accessory de Section. media.url, description (1024), spoiler.
12Media Gallery1–10 itens com media.url. Raiz ou Container.
13Filefile.url. Raiz ou Container.
14SeparatorSem campos. Raiz ou Container.
1Action RowSó na raiz (fora do Container).
[NEX]
Ainda não há upload de arquivos para bots: o componente File aceita qualquer URL, mas não existe rota para hospedar o arquivo. Tipos 7, 19, 21, 22 e 23 ainda não são suportados.
Components V2
{
  "flags": 32768,
  "components": [
    { "type": 17, "components": [
      { "type": 10, "content": "# Bem-vindo!\nMensagem feita só de componentes." },
      { "type": 12, "items": [{ "media": { "url": "https://exemplo.com/banner.png" } }] }
    ]},
    { "type": 1, "components": [
      { "type": 2, "style": 3, "label": "Dizer oi", "custom_id": "oi" }
    ]}
  ]
}

Cliques

Quando alguém clica num botão ou escolhe num menu, o NEX valida (mensagem e componente existem na versão atual, componente habilitado, app com o intent interactions.receive, pessoa com VER_CANAL) e entrega uma interação kind: "component" para o seu bot. Responda como em Interações.

Atenção
Cliques só funcionam em mensagens do canal principal (não em threads). Se você editar a mensagem e remover o componente, cliques antigos recebem 409.