Newsletter feature provides methods for managing WhatsApp newsletter channels, including creation, subscription management, reactions, and live updates. Newsletter operations use MEX (GraphQL) for metadata/management and IQ stanzas for message operations.
Newsletter message sending is handled by the unified client.send_message() method — see the Send API. Reactions remain on the Newsletter struct because they use a different stanza format.
Newsletter messages are plaintext — they are not encrypted with the Signal protocol.
Access
Access newsletter operations through the client:Methods
list_subscribed
List all newsletters the user is subscribed to.Vec<NewsletterMetadata>— List of subscribed newsletters
get_metadata
Fetch metadata for a newsletter by its JID.jid— Newsletter JID (server must benewsletter)
NewsletterMetadata— Full newsletter metadata
get_metadata_by_invite
Fetch metadata for a newsletter by its invite code.invite_code— Newsletter invite code string
NewsletterMetadata— Full newsletter metadata
create
Create a new newsletter.name— Newsletter namedescription— Optional description
NewsletterMetadata— Metadata of the newly created newsletter
join
Join (subscribe to) a newsletter.jid— Newsletter JID to join
NewsletterMetadata— Metadata with the viewer’s role set toSubscriber
leave
Leave (unsubscribe from) a newsletter.jid— Newsletter JID to leave
update
Update a newsletter’s name and/or description.jid— Newsletter JIDname— New name, orNoneto keep the current namedescription— New description, orNoneto keep the current description
NewsletterMetadata— Updated metadata
set_follower_mute
Mute or unmute a newsletter’s follower-activity notifications (WhatsApp Web’sMUTE_FOLLOWER_ACTIVITY). Sent via MEX as a user-setting update.
jid— Newsletter JIDmuted—truesilences notifications,falsere-enables them
set_admin_mute
Mute or unmute a newsletter’s admin-activity notifications (WhatsApp Web’sMUTE_ADMIN_ACTIVITY). Only meaningful for owners/admins.
jid— Newsletter JIDmuted—truesilences admin-activity notifications,falsere-enables them
The mute state is sent as
ON/OFF; the mute expiration is local database state and is never put on the wire, matching WhatsApp Web’s WAWebNewsletterUpdateUserSettingJob.Sending messages
Newsletter message sending is handled by the unifiedclient.send_message() method. See the Send API reference for full details.
type and mediatype stanza attributes inferred from the message content. Stanza-level <meta> nodes (for polls, events, etc.) are also included automatically, matching WhatsApp Web behavior.
Newsletter::send_message() was removed. Use client.send_message() instead — it accepts newsletter, group, and direct message JIDs.send_reaction
Send a reaction to a newsletter message.jid— Newsletter JIDserver_id— Server-assigned ID of the message to react toreaction— Emoji code (e.g.,"👍","❤️"), or empty string to remove
edit_message
Edit a previously-sent newsletter message. Channel messages are plaintext, so the edit is sent as a<message edit="1"> stanza with the new protobuf body — not through the E2E send path.
jid— Newsletter JID. Non-newsletter JIDs are rejected with an error; useClient::edit_messagefor DMs and groups.message_id— The target message’smessage_id(the wire stanza id, as returned bysend_messageor carried onNewsletterMessage). This is not theserver_idused by reactions. Empty IDs are rejected.new_content— Replacement message body. Typically awa::Message { conversation: Some(..), .. }for text edits.
revoke_message
Revoke (delete) a previously-sent newsletter message. Likeedit_message, this goes through the plaintext channel path, not the E2E send path.
jid— Newsletter JID. Non-newsletter JIDs are rejected; useClient::revoke_messagefor DMs and groups.message_id— The target message’smessage_id(wire stanza id, notserver_id). Empty IDs are rejected.
Newsletter JIDs are now also rejected at the root of the E2E send path. If your code accidentally routes a channel JID through
send_message_impl, pin_message, or the standard edit_message / revoke_message on Client, you get an error that names the mis-route instead of a malformed encrypted fan-out.get_messages
Fetch message history from a newsletter.jid— Newsletter JIDcount— Maximum number of messages to returnbefore— If set, return messages before thisserver_id(for pagination)
Vec<NewsletterMessage>— List of newsletter messages
subscribe_live_updates
Subscribe to live updates for a newsletter (reaction counts, message changes).jid— Newsletter JID
u64— Subscription duration in seconds (typically 300)
Event::NewsletterLiveUpdate events with updated reaction counts. You need to re-subscribe periodically when the duration expires.
Example:
Types
NewsletterMetadata
Metadata for a newsletter channel. ImplementsPartialEq and Eq for direct comparison.
NewsletterVerification
NewsletterState
NewsletterRole
The viewer’s role in a newsletter.#[non_exhaustive], so match statements should include a wildcard arm to handle future variants.
NewsletterMessage
A message from a newsletter’s history.NewsletterMessageType
The type of a newsletter message. Uses aStringEnum for type-safe wire-protocol mapping. Implements PartialEq and Eq.
as_str()- Returns the wire-protocol string representationFrom<&str>- Parse from wire string, unknown values becomeOther(String)
NewsletterReactionCount
A reaction count on a newsletter message.Error handling
All newsletter methods returnResult<T, NewsletterError>: