Skip to main content
Beyond text and media, client.message.send accepts a family of typed interactive content objects. Each is discriminated by its type field.

Targeting a message

Reply / reaction / revoke / pin / keep / event-response all accept a WaMessageTargetInput: either a received message event passed verbatim (its key is used) or an explicit WaMessageKey:
The easiest path is to pass the event you already have β€” event.key is already a WaMessageKey:

Reactions

Pass an empty string as emoji to remove a previous reaction:

Polls

Options may be plain strings or { name } objects. Order matters β€” it is used for vote hashing.

Voting on a poll

Voting requires the original poll’s identity and its messageSecret (32 bytes from the poll’s messageContextInfo.messageSecret):
Incoming votes arrive as message_addon events once decrypted.

Editing a message

To edit, send the new content and pass editKey in the options. The original must be fromMe. You can pass the received message event verbatim, its key, or an explicit WaSendEditKey ({ id, participant?, timestampMs? }):
The new payload is wrapped in a MESSAGE_EDIT protocol message targeting editKey.id.

Revoking (delete for everyone)

Sender-vs-admin revoke is auto-detected from target.fromMe: false triggers an admin revoke. There is no subtype option to pass.

Pinning

Pins expire β€” pass durationSecs to override the default. wa-web offers three presets:
Default is 86_400 (24h). The TTL travels with the pin via messageContextInfo.messageAddOnDurationInSecs; without it receiving clients silently drop the pin, so the lib always stamps the default when you omit it. durationSecs is ignored on unpin.

Keep-in-chat

For disappearing-message chats, keep (or un-keep) a specific message:

Events

Create a calendar-style event message:

Responding to an event

Locations & contacts

There is no dedicated builder for static locations or contact cards yet β€” send them as a raw Proto.IMessage:
Last modified on June 3, 2026