---
title: "Embeds no Discord com discord.js: como montar mensagens formatadas"
description: "Aprenda a criar embeds no discord.js v14 com EmbedBuilder: cor, autor, imagem, campos, rodapé e timestamp, os limites de tamanho e como editar um embed."
url: "https://streethosting.com.br/guias/bots-discord/bot-discord-embeds-mensagens-formatadas"
category: "bots-discord"
slug: "bot-discord-embeds-mensagens-formatadas"
datePublished: "2026-11-13"
dateModified: "2026-11-13"
author: "Equipe StreetHosting"
difficulty: "iniciante"
language: "pt-BR"
keywords:
  - "embed discord.js"
  - "EmbedBuilder discord.js v14"
  - "mensagem embed bot discord"
  - "limite de caracteres embed discord"
  - "editar embed discord.js"
---

# Embeds no Discord: como montar mensagens formatadas com discord.js

O embed é o cartão colorido que dá cara profissional às mensagens do bot. Veja como montar um do zero, quais são os limites oficiais, o que o markdown aceita lá dentro e como editar um embed que já foi enviado.

> **Resposta rápida**
>
> No discord.js v14 você monta o embed com `new EmbedBuilder()`, encadeia `setTitle`, `setColor`, `setDescription` e `addFields` e envia com `{ embeds: [embed] }`. Fique dentro dos limites: título de 256 caracteres, descrição de 4096, 25 campos e 6000 caracteres somados na mensagem.

## Seu primeiro embed

Embed é um bloco de conteúdo com barra colorida na lateral, que o Discord desenha abaixo (ou no lugar) do texto da mensagem. Ele serve para avisos, perfis, painéis de status, regras e qualquer coisa que precise de mais organização do que uma linha solta. Só bots e webhooks conseguem enviar embeds, por isso ele também ajuda a deixar claro que a mensagem veio de um sistema.

Vamos montar um comando que mostra informações do servidor. Supondo que o comando `/servidor` já esteja registrado (se ainda não, veja [como criar slash commands](https://streethosting.com.br/guias/bots-discord/criar-bot-discord-slash-commands)), o tratamento fica assim:

```
const { EmbedBuilder, Colors } = require('discord.js');

client.on('interactionCreate', async (interaction) => {
  if (!interaction.isChatInputCommand()) return;
  if (interaction.commandName !== 'servidor') return;

  const embed = new EmbedBuilder()
    .setColor(Colors.Blurple)
    .setTitle('Informações do servidor')
    .setDescription('Resumo rápido de **' + interaction.guild.name + '**.');

  await interaction.reply({ embeds: [embed] });
});
```

A cor aceita as constantes de `Colors`, um número hexadecimal como `0xff7a00` ou uma string como `'#ff7a00'`. Se você não definir cor, o Discord usa uma barra cinza escura.

> **Atenção**
>
> O bot precisa da permissão **Inserir links** (Embed Links) no canal. Sem ela a mensagem chega só com o texto, ou não chega, e o embed some sem aviso claro. Confira também se o cargo do bot não está bloqueado no canal por uma permissão específica.

## Autor, thumbnail, imagem, rodapé e timestamp

Além de título e descrição, o embed tem cinco áreas que dão acabamento. Cada uma tem um método próprio:

- **Autor:** `setAuthor` mostra uma linha pequena no topo, com nome, ícone e, se quiser, um link.
- **Thumbnail:** `setThumbnail` coloca uma imagem pequena no canto superior direito. É o lugar ideal para avatar ou logotipo.
- **Imagem:** `setImage` exibe uma imagem grande, na largura do embed, abaixo do conteúdo.
- **Rodapé:** `setFooter` aceita um texto e um ícone pequeno.
- **Timestamp:** `setTimestamp` mostra data e hora ao lado do rodapé. Sem argumento usa o momento atual, e o Discord converte para o fuso de quem está lendo.

```
const embed = new EmbedBuilder()
  .setColor(0xff7a00)
  .setAuthor({
    name: interaction.user.username,
    iconURL: interaction.user.displayAvatarURL(),
  })
  .setTitle('Atualização da semana')
  .setURL('https://exemplo.com.br/novidades')
  .setDescription('Resumo das mudanças que entraram no servidor.')
  .setThumbnail(interaction.guild.iconURL())
  .setImage('https://exemplo.com.br/banner.png')
  .setFooter({
    text: 'Equipe do servidor',
    iconURL: interaction.client.user.displayAvatarURL(),
  })
  .setTimestamp();
```

O `setURL` transforma o título em link clicável. As URLs de imagem precisam ser endereços públicos com http ou https. Se o Discord não conseguir baixar a imagem, ela simplesmente não aparece. Para usar um arquivo do disco do bot, envie como anexo e referencie com `attachment://`:

```
const { AttachmentBuilder } = require('discord.js');

const arquivo = new AttachmentBuilder('./assets/banner.png');
const embed = new EmbedBuilder()
  .setTitle('Banner local')
  .setImage('attachment://banner.png');

await interaction.reply({ embeds: [embed], files: [arquivo] });
```

> **Dica**
>
> Use `interaction.guild.iconURL()` sabendo que, se o servidor não tem ícone, o retorno é `null`. O `setThumbnail` aceita esse valor e o embed sai sem miniatura. Se quiser sempre uma imagem, passe uma reserva: `interaction.guild.iconURL() ?? 'https://exemplo.com.br/logo.png'`.

## Campos e colunas inline

Campos são pares de nome e valor, ótimos para dados curtos e repetitivos. Com `inline: true` o Discord coloca até três campos lado a lado, como colunas. Sem essa opção cada campo ocupa uma linha inteira.

```
const guild = interaction.guild;

const embed = new EmbedBuilder()
  .setColor(Colors.Green)
  .setTitle('Informações do servidor')
  .addFields(
    { name: 'Membros', value: String(guild.memberCount), inline: true },
    { name: 'Canais', value: String(guild.channels.cache.size), inline: true },
    { name: 'Cargos', value: String(guild.roles.cache.size), inline: true },
    {
      name: 'Criado em',
      value: '<t:' + Math.floor(guild.createdTimestamp / 1000) + ':D>',
    },
  );
```

O valor de um campo precisa ser uma string, por isso o `String()` nos números. Nome ou valor vazio gera erro. Se precisar de um espaço em branco proposital, use um caractere invisível como `'\u200b'`. O trecho `<t:123456:D>` é um timestamp do Discord: ele mostra a data formatada no fuso e no idioma de cada leitor. O sufixo `:R` mostra tempo relativo, como "há 3 dias".

Para montar campos a partir de uma lista (ranking, produtos, regras), gere o array com `map` e passe com spread em `addFields(...lista)`. Lembre que o teto é de 25 campos por embed. Acima disso, divida em páginas ou em vários embeds.

## Limites oficiais de tamanho

O Discord rejeita a mensagem inteira se qualquer um destes limites for ultrapassado, e o erro só aparece em tempo de execução, quando a API responde. Vale conhecer a tabela antes de montar embeds com texto vindo de usuário ou de banco de dados.

| Parte do embed | Limite |
| --- | --- |
| Título | 256 caracteres |
| Descrição | 4096 caracteres |
| Campos por embed | 25 |
| Nome de um campo | 256 caracteres |
| Valor de um campo | 1024 caracteres |
| Texto do rodapé | 2048 caracteres |
| Nome do autor | 256 caracteres |
| Soma de todos os textos (todos os embeds da mensagem) | 6000 caracteres |
| Embeds por mensagem | 10 |

A soma de 6000 conta título, descrição, nome e valor dos campos, texto do rodapé e nome do autor, somando todos os embeds da mesma mensagem. É o limite que mais pega de surpresa: uma descrição de 4000 caracteres com dois campos grandes já estoura.

Quando o conteúdo vem de fora, corte antes de enviar. Uma função pequena resolve:

```
function cortar(texto, max) {
  if (texto.length <= max) return texto;
  return texto.slice(0, max - 3) + '...';
}

const embed = new EmbedBuilder()
  .setTitle(cortar(titulo, 256))
  .setDescription(cortar(descricao, 4000));
```

Cortar a descrição em 4000, e não em 4096, deixa uma folga para campos e rodapé dentro da soma de 6000. Para conferir o total antes de enviar, some o tamanho dos textos do JSON do embed:

```
function tamanhoTotal(embed) {
  const d = embed.toJSON();
  let total = (d.title?.length ?? 0)
    + (d.description?.length ?? 0)
    + (d.footer?.text.length ?? 0)
    + (d.author?.name.length ?? 0);
  for (const campo of d.fields ?? []) {
    total += campo.name.length + campo.value.length;
  }
  return total;
}
```

Se o texto é naturalmente longo, como uma lista de regras, é melhor dividir em vários embeds na mesma mensagem (até 10) ou em páginas com botões, que você aprende em [botões e menus interativos](https://streethosting.com.br/guias/bots-discord/bot-discord-botoes-menus-interativos).

## Markdown dentro do embed

Dentro do embed o Discord entende a maior parte do markdown das mensagens comuns, mas nem todos os lugares aceitam tudo. A regra prática:

- **Descrição e valor de campo:** aceitam negrito, itálico, sublinhado, tachado, código em linha, bloco de código, citação e links com texto, no formato `[texto](https://...)`. Menções e timestamps do Discord também são renderizados.
- **Rodapé e nome do autor:** mostram só texto simples. Um asterisco ali aparece como asterisco.
- **Título e nome de campo:** link com texto não funciona. Para linkar o título use `setURL`.
- **Menções:** aparecem formatadas, mas não notificam ninguém. Para avisar de fato, mande a menção em `content`.

```
const embed = new EmbedBuilder()
  .setTitle('Regras rápidas')
  .setDescription(
    '**Respeite** todo mundo.\n' +
    '~~Spam~~ não é permitido.\n' +
    '> Dúvidas? Fale com <@&ID_DO_CARGO_STAFF>.\n\n' +
    'Leia também o [guia completo](https://exemplo.com.br/regras).'
  )
  .addFields({
    name: 'Comando útil',
    value: 'Use `/ajuda` para ver tudo.',
  });

await interaction.reply({
  content: '<@' + interaction.user.id + '>',
  embeds: [embed],
});
```

Em uma string comum do JavaScript, o `\n` vira quebra de linha. As crases do código em linha entram normalmente, desde que a string use aspas simples ou duplas. Só em template literal elas precisariam de barra invertida.

## Editar um embed existente

Painéis de status, votações e tickets mudam depois de enviados. Os embeds que chegam em `message.embeds` são somente leitura, então o caminho é criar um builder a partir deles, alterar e reenviar:

```
// Em um canal, buscando a mensagem pelo ID
const canal = await client.channels.fetch('ID_DO_CANAL');
const mensagem = await canal.messages.fetch('ID_DA_MENSAGEM');

const embedNovo = EmbedBuilder.from(mensagem.embeds[0])
  .setColor(Colors.Red)
  .setTitle('Servidor em manutenção')
  .setTimestamp();

await mensagem.edit({ embeds: [embedNovo] });
```

O `EmbedBuilder.from` mantém tudo o que você não mexeu, então dá para trocar só a cor ou só um campo. Para alterar um campo específico use `spliceFields(indice, 1, novoCampo)`. Dentro de uma resposta a botão ou menu, o atalho é `interaction.update({ embeds: [embedNovo] })`, que edita a mensagem onde o clique aconteceu, sem precisar buscar nada.

> **Atenção**
>
> Só dá para editar mensagens enviadas pelo próprio bot. Se a edição vai acontecer muito (um painel que atualiza a cada minuto, por exemplo), espace as chamadas: editar a mesma mensagem em excesso esbarra no limite de requisições da API.

## Onde deixar o bot rodando

Embeds são leves, então o bot que só envia mensagens formatadas cabe em qualquer plano. Na [hospedagem de bots da StreetHosting](https://streethosting.com.br/bots) você sobe o projeto em Node.js em um container com painel, e o plano Discord Essential, de R$ 9,99 por mês, traz 1 GB de RAM, 0,5 vCPU, 2 GB de NVMe e até 2 bots. Se quiser entender como manter o processo no ar o tempo todo, leia [hospedagem de bot Discord 24/7](https://streethosting.com.br/guias/bots-discord/hospedagem-bot-discord-24-7).

## Perguntas frequentes

### Qual é o limite de caracteres de um embed no Discord?

O título aceita 256 caracteres, a descrição 4096, o nome de um campo 256, o valor de um campo 1024, o texto do rodapé 2048 e o nome do autor 256. Um embed pode ter até 25 campos. A soma de todos esses textos, em todos os embeds da mesma mensagem, não pode passar de 6000 caracteres, e cada mensagem aceita no máximo 10 embeds.

### Por que meu embed não aparece no canal?

As causas mais comuns são o bot sem a permissão Inserir links (Embed Links) no canal, um embed totalmente vazio ou um valor acima dos limites, que faz a API recusar a mensagem. Leia o erro no console: o Discord informa qual campo passou do limite.

### Menções dentro do embed notificam a pessoa?

Não. A menção aparece formatada, mas só a parte de texto da mensagem (o campo content) dispara a notificação. Se precisar avisar alguém, mande a menção em content e o resto no embed.

### Como editar um embed que o bot já enviou?

Pegue a mensagem, crie um builder a partir do embed antigo com EmbedBuilder.from(message.embeds[0]), altere o que quiser e chame message.edit({ embeds: [novo] }). Em respostas de botão, interaction.update faz o mesmo na mensagem do clique.

### Posso usar uma imagem do computador dentro do embed?

Sim. Envie o arquivo como anexo com AttachmentBuilder e aponte o embed para ele usando o endereço attachment://nome-do-arquivo.png. Também funciona com qualquer URL pública de imagem, sem anexo.

## Guias relacionados

- [Como criar bot Discord com slash commands](https://streethosting.com.br/guias/bots-discord/criar-bot-discord-slash-commands.md)
- [Botões e menus de seleção no bot Discord com discord.js v14](https://streethosting.com.br/guias/bots-discord/bot-discord-botoes-menus-interativos.md)
- [Sistema de sugestões no Discord com votação, aprovação e thread](https://streethosting.com.br/guias/bots-discord/bot-discord-sistema-sugestoes.md)
- [Enquete no Discord com bot: enquete nativa, reações ou botões](https://streethosting.com.br/guias/bots-discord/bot-discord-enquetes-votacao.md)
- [Hospedagem de bot Discord 24/7 no Brasil](https://streethosting.com.br/guias/bots-discord/hospedagem-bot-discord-24-7.md)

## Produtos citados

- https://streethosting.com.br/bots

## Dados estruturados

```json
[
  {
    "@context": "https://schema.org",
    "@type": [
      "Article",
      "TechArticle"
    ],
    "headline": "Embeds no Discord: como montar mensagens formatadas com discord.js",
    "name": "Embeds no Discord com discord.js: como montar mensagens formatadas",
    "abstract": "O embed é o cartão colorido que dá cara profissional às mensagens do bot. Veja como montar um do zero, quais são os limites oficiais, o que o markdown aceita lá dentro e como editar um embed que já foi enviado.",
    "description": "Aprenda a criar embeds no discord.js v14 com EmbedBuilder: cor, autor, imagem, campos, rodapé e timestamp, os limites de tamanho e como editar um embed.",
    "datePublished": "2026-11-13",
    "dateModified": "2026-11-13",
    "author": {
      "@type": "Organization",
      "name": "Equipe StreetHosting"
    },
    "publisher": {
      "@type": "Organization",
      "name": "StreetHosting",
      "url": "https://streethosting.com.br"
    },
    "inLanguage": "pt-BR",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://streethosting.com.br/guias/bots-discord/bot-discord-embeds-mensagens-formatadas"
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "Qual é o limite de caracteres de um embed no Discord?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "O título aceita 256 caracteres, a descrição 4096, o nome de um campo 256, o valor de um campo 1024, o texto do rodapé 2048 e o nome do autor 256. Um embed pode ter até 25 campos. A soma de todos esses textos, em todos os embeds da mesma mensagem, não pode passar de 6000 caracteres, e cada mensagem aceita no máximo 10 embeds."
        }
      },
      {
        "@type": "Question",
        "name": "Por que meu embed não aparece no canal?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "As causas mais comuns são o bot sem a permissão Inserir links (Embed Links) no canal, um embed totalmente vazio ou um valor acima dos limites, que faz a API recusar a mensagem. Leia o erro no console: o Discord informa qual campo passou do limite."
        }
      },
      {
        "@type": "Question",
        "name": "Menções dentro do embed notificam a pessoa?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Não. A menção aparece formatada, mas só a parte de texto da mensagem (o campo content) dispara a notificação. Se precisar avisar alguém, mande a menção em content e o resto no embed."
        }
      },
      {
        "@type": "Question",
        "name": "Como editar um embed que o bot já enviou?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Pegue a mensagem, crie um builder a partir do embed antigo com EmbedBuilder.from(message.embeds[0]), altere o que quiser e chame message.edit({ embeds: [novo] }). Em respostas de botão, interaction.update faz o mesmo na mensagem do clique."
        }
      },
      {
        "@type": "Question",
        "name": "Posso usar uma imagem do computador dentro do embed?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Sim. Envie o arquivo como anexo com AttachmentBuilder e aponte o embed para ele usando o endereço attachment://nome-do-arquivo.png. Também funciona com qualquer URL pública de imagem, sem anexo."
        }
      }
    ]
  }
]
```
