Use this guide when you want to send anything that is not primarily a media upload: text, quoted replies, reactions, polls, forwards, and control messages.

Quick start

Send a plain text message with BaileysEx.send_message/4.

All outbound send examples on this page assume the connection was started with connect/2 with the default Signal credentials in auth state, or override the repository explicitly with :signal_repository or :signal_repository_adapter.

{:ok, _sent} =
  BaileysEx.send_message(connection, "15551234567@s.whatsapp.net", %{text: "Hello from BaileysEx"})

Options

These options matter most for everyday message sending:

  • quoted: reply to a previous message in the same chat
  • mentions: mention one or more user JIDs in a text message
  • link_preview: supply preview metadata yourself for a URL
  • message_id_fun: override message-id generation when you need deterministic ids in tests

→ See Message Types Reference for the complete payload catalog.

Common patterns

Send a quoted reply

{:ok, _sent} =
  BaileysEx.send_message(connection, incoming.key.remote_jid, %{
    text: "Replying to your message",
    quoted: incoming
  })

Edit a previously sent text message

{:ok, _sent} =
  BaileysEx.send_message(connection, "15551234567@s.whatsapp.net", %{
    edit: %{id: "3EB0OLD", remote_jid: "15551234567@s.whatsapp.net", from_me: true},
    text: "Updated text"
  })

React to a message

{:ok, _sent} =
  BaileysEx.send_message(connection, incoming.key.remote_jid, %{
    react: %{key: incoming.key, text: "👍"}
  })

Create a poll

{:ok, _sent} =
  BaileysEx.send_message(connection, "15551234567@s.whatsapp.net", %{
    poll: %{name: "Lunch?", values: ["Yes", "No"], selectable_count: 1}
  })

Forward or revoke a message

{:ok, _forwarded} =
  BaileysEx.send_message(connection, "15551234567@s.whatsapp.net", %{forward: original_message})

{:ok, _revoked} =
  BaileysEx.send_message(connection, "15551234567@s.whatsapp.net", %{delete: original_message.key})

Limitations

  • The public facade sends message payloads that BaileysEx.Message.Builder supports today. It does not add a second abstraction layer over the builder.
  • Outbound interactive templates are not covered by the top-level facade. The currently supported reply payloads are listed in the message-types reference.
  • If you pass an invalid JID, BaileysEx.send_message/4 returns {:error, :invalid_jid}.
  • If the auth state does not include signed_identity_key, signed_pre_key, and registration_id, and you do not override the repository explicitly, BaileysEx.send_message/4 returns {:error, :signal_repository_not_ready}.

See also: