Message Types Reference

Copy Markdown View Source

This page lists the content maps the public facade accepts for BaileysEx.send_message/4, plus the download helpers for inbound media.

Text and reply content

%{text: binary()}

  • Type: map()
  • Default: required for plain text
  • Example:
%{text: "Hello from Elixir"}

Sends a plain text message. Add quoted: or mentions: when you need reply context.

quoted: message

  • Type: map()
  • Default: optional
  • Example:
%{text: "Replying", quoted: incoming}

Adds WhatsApp reply context from a previously received or sent message.

mentions: [jid]

  • Type: list()
  • Default: []
  • Example:
%{text: "Hi @team", mentions: ["15551234567@s.whatsapp.net"]}

Adds mentioned JIDs to a text message.

  • Type: map()
  • Default: optional
  • Example:
%{
  text: "https://example.com",
  link_preview: %{title: "Example", description: "Preview body"}
}

Supplies preview metadata explicitly instead of relying on automatic detection.

Media content

%{image: {:file, path} | {:binary, binary} | path}

  • Type: map()
  • Default: optional
  • Example:
%{image: {:file, "priv/photos/launch.jpg"}, caption: "Launch"}

Sends an image. Common companion keys are caption: and mimetype:.

%{video: ...}

  • Type: map()
  • Default: optional
  • Example:
%{video: {:file, "priv/video/demo.mp4"}, caption: "Demo", gif_playback: true}

Sends a video or GIF-style looping video.

%{audio: ...}

  • Type: map()
  • Default: optional
  • Example:
%{audio: {:file, "priv/audio/note.ogg"}, ptt: true, mimetype: "audio/ogg"}

Sends audio. Add ptt: true for voice-note behavior.

%{document: ...}

  • Type: map()
  • Default: optional
  • Example:
%{
  document: {:file, "priv/spec.pdf"},
  file_name: "spec.pdf",
  mimetype: "application/pdf",
  caption: "Current API spec"
}

Sends a document. file_name: controls the visible file name.

%{sticker: ...}

  • Type: map()
  • Default: optional
  • Example:
%{sticker: {:file, "priv/stickers/launch.webp"}, is_animated: false}

Sends a sticker. The default mimetype is image/webp.

Media input forms

  • Type: {:file, String.t()} | {:binary, binary()} | String.t()

  • Default: path strings must exist on disk
  • Example:
%{image: {:binary, File.read!("priv/photos/launch.jpg")}}

BaileysEx accepts a tagged file path, raw binary, or a direct file-system path string.

Reactions, polls, and controls

%{react: %{key: key, text: emoji}}

  • Type: map()
  • Default: optional
  • Example:
%{react: %{key: incoming.key, text: "🔥"}}

Reacts to an existing message.

%{poll: %{name: binary(), values: [binary()]}}

  • Type: map()
  • Default: optional
  • Example:
%{poll: %{name: "Lunch?", values: ["Yes", "No"], selectable_count: 1}}

Creates a poll. selectable_count: controls how many answers can be selected.

%{delete: key}

  • Type: map()
  • Default: optional
  • Example:
%{delete: incoming.key}

Revokes a previously sent message.

%{forward: message}

  • Type: map()
  • Default: optional
  • Example:
%{forward: original_message}

Forwards an existing message.

%{disappearing_messages_in_chat: boolean() | integer()}

  • Type: map()
  • Default: optional
  • Example:
%{disappearing_messages_in_chat: true}

Updates disappearing-message settings for the chat.

%{pin: %{key: key, type: :pin | :unpin, time: seconds}}

  • Type: map()
  • Default: optional
  • Example:
%{pin: %{key: incoming.key, type: :pin, time: 86_400}}

Pins or unpins a message for the chat.

%{limit_sharing: boolean()}

  • Type: map()
  • Default: optional
  • Example:
%{limit_sharing: true}

Sends the Baileys-compatible LIMIT_SHARING protocol message for the chat. BaileysEx fills the matching trigger, timestamp, and initiated_by_me fields automatically.

Contacts, location, events, and replies

%{contacts: %{display_name: binary(), contacts: [contact]}}

  • Type: map()
  • Default: optional
  • Example:
%{
  contacts: %{
    display_name: "Support",
    contacts: [%{display_name: "Support", vcard: "BEGIN:VCARD\nEND:VCARD"}]
  }
}

Sends one contact or a contact array.

%{location: %{latitude: float(), longitude: float()}}

  • Type: map()
  • Default: optional
  • Example:
%{location: %{latitude: 37.78, longitude: -122.41, name: "HQ"}}

Sends a static location.

%{live_location: %{latitude: float(), longitude: float()}}

  • Type: map()
  • Default: optional
  • Example:
%{live_location: %{latitude: 37.78, longitude: -122.41, sequence_number: 1}}

Sends a live-location payload.

%{group_invite: %{group_jid: jid, invite_code: binary()}}

  • Type: map()
  • Default: optional
  • Example:
%{
  group_invite: %{
    group_jid: "120363001234567890@g.us",
    invite_code: "ABCD1234",
    group_name: "Launch Team"
  }
}

Sends a group invite message.

%{product: %{...}}

  • Type: map()
  • Default: optional
  • Example:
%{
  product: %{
    product_id: "sku-1",
    title: "Sticker Pack",
    currency_code: "USD",
    price_amount_1000: 2_500_000,
    business_owner_jid: "15550001111@s.whatsapp.net"
  }
}

Sends a product share card.

%{button_reply: %{display_text: binary(), id: binary()}}

  • Type: map()
  • Default: optional
  • Example:
%{button_reply: %{display_text: "Yes", id: "confirm"}}

Builds a reply payload for button-based interactions.

%{list_reply: %{title: binary(), row_id: binary()}}

  • Type: map()
  • Default: optional
  • Example:
%{list_reply: %{title: "Standard", row_id: "standard"}}

Builds a reply payload for list-based interactions.

%{share_phone_number: true} and %{request_phone_number: true}

  • Type: map()
  • Default: optional
  • Example:
%{request_phone_number: true}

Use these to request a phone number or share your own number.

%{event: %{name: binary(), start_time: DateTime.t() | integer()}}

  • Type: map()
  • Default: optional
  • Example:
%{
  event: %{
    name: "Launch review",
    description: "Final check-in",
    start_time: DateTime.utc_now()
  }
}

Builds an event message, optionally with an embedded location.

%{edit: key, text: binary()}

  • Type: map()
  • Default: optional
  • Example:
%{
  edit: %{id: "3EB0OLD", remote_jid: "15551234567@s.whatsapp.net", from_me: true},
  text: "Updated text"
}

Edits an existing text message.

%{view_once: true, ...}

  • Type: map()
  • Default: optional
  • Example:
%{view_once: true, image: {:file, "priv/photos/launch.jpg"}}

Wraps the inner content in a view-once container.

Inbound media download helpers

BaileysEx.download_media/2

  • Type: map() -> {:ok, binary()} | {:error, term()}

  • Default: downloads to memory
  • Example:
{:ok, binary} = BaileysEx.download_media(image_message)

Use this when the media is small enough to keep in memory.

BaileysEx.download_media_to_file/3

  • Type: map(), Path.t() -> {:ok, Path.t()} | {:error, term()}

  • Default: streams directly to disk
  • Example:
{:ok, path} = BaileysEx.download_media_to_file(image_message, "tmp/photo.jpg")

Use this when you want lower memory usage or a file on disk.