| scheduled_messagesA | Send, list, edit, cancel, or look up the status of WhatsApp messages.
Available actions: send: send a message now (or schedule for later via send_at). Use
text for plain text, media_url (+ optional media_caption) for
image/video/document, or poll: {question, options, allow_multiple?}
for a WhatsApp poll. The three are mutually exclusive. get: retrieve a single message by id list: list messages, newest first (offset pagination via limit/skip).
Optionally filter by chat_id (recipient JID) and/or status — use
status: 'pending' to see queued, not-yet-sent messages. update: edit a pending message that hasn't dispatched yet. Accepts
text, media_url, media_caption, send_at (any subset). cancel: cancel a pending message that hasn't dispatched yet. ack: batch lookup of delivery + read acknowledgements for up to 200 message keys
Identifier model (important for chaining send → ack): id is the internal Blueticks message id, returned by send and
accepted by get/update/cancel. Use it to look up message status.
waMessageKey is the WhatsApp wire message key, populated by the
engine once the message is dispatched. Use its _serialized form for
ack here and for every chats per-message endpoint. It is null on a
freshly-pending message — call get after status advances to obtain it.
Examples: send: 'message 972544325389@c.us — your appointment is tomorrow at 10am' get: 'what's the status of message msg_abc?' list: 'show me my scheduled messages' (status: 'pending') update: 'reschedule msg_abc to send tomorrow at 5pm' cancel: 'cancel my scheduled message msg_abc' ack: 'were these 3 messages read?' (message_keys come from get/list)
|
| chatsA | Read or send WhatsApp messages inside chats on the connected engine.
Available actions: list: list chats, newest message first (offset pagination via limit/skip) search: list chats matching a name/keyword query.
Archived chats are excluded by default — pass include_archive=true
to find an archived chat (e.g. to get its chat_id before unarchive). get: retrieve a single chat by chat_id (e.g. 972544325389@c.us) list_messages: list messages inside a chat mark_read: mark all messages in a chat as read archive: archive a chat (hide it from the main chat list) unarchive: unarchive a chat (restore it to the main chat list) get_media: download media bytes for one message by its wire key —
returns url/data_base64 + mimetype/filename + original_quality flag
(false when WA returned a preview rather than the original;
currently only happens for own-sent newsletter media). get_participants: list the members of a group chat load_more_history: request OLDER history for ONE specific chat
(chat_id) from the phone, so a subsequent list_messages can page
further back. Each call pulls one page; call it again to go deeper.
Use it whenever a chat's loaded messages don't reach far enough
back for what you need.
Paced and limited: one request per chat at a time, WA-paced — a call
while that chat's request is in flight or cooling down returns
added:0 (not an error); wait and retry. While the initial sync is
still running the call throws a not_connected error. After repeated
unanswered requests WhatsApp history requests pause: the result's
error starts "cooling_down:" and says how long to wait — retry
after that, don't treat it as "no history".
canLoadMore:false = history is genuinely exhausted — stop paging.
A chat with no messages AND no chat activity on the engine (e.g. a
saved contact whose conversation WhatsApp's first sync never
delivered: get returns it with lastMessageAt null) has nothing
to page back from, so added stays 0. Once one message is sent or
received in that chat, its older history can be requested. send_message_text: send a text message NOW (fire-and-forget).
Body: {chat_id, type: "text", text} send_message_media: send an image/video/audio/document NOW.
Body: {chat_id, type: "media", media: {url, kind?, caption?, filename?}} send_message_poll: send a poll NOW.
Body: {chat_id, type: "poll", poll: {question, options[2..12], allow_multiple?}}
type is derived automatically from the action ("text"/"media"/"poll"),
so you don't need to send it; include it only if you want to be explicit. send_message_* is for IMMEDIATE delivery into a chat — use the
scheduled_messages tool's send action to schedule a future send (with
send_at) or to keep the message in a queue you can edit/cancel before
dispatch. Examples: |
| contactsA | Read WhatsApp contacts known to the connected engine.
Available actions: list: list contacts, optionally filtered by query (offset pagination via limit/skip) common_groups: list the groups the connected account shares with a contact
(WhatsApp's "groups in common"). chat_id is the contact JID (e.g. 12345@c.us).
Examples: |
| groupsA | Create and manage WhatsApp groups via the connected engine.
Available actions: list: list groups the engine sees (offset pagination; optional name query) get: retrieve a group by group_id (e.g. 972...-1597620113@g.us); set include_participants for the member list inline create: create a new group with a name and a list of participant phone numbers update: rename a group or change its admin/messaging settings leave: cancel the authenticated user's membership. NOTE: WhatsApp has no "destroy group" — the group continues for any remaining members; only your membership ends.
Notes: Newly-created groups default to admins-only-post (announce=true) and admins-only-edit (restrict=true) — that's WAWeb's default. To open posting/editing to all members, follow create with update settings={announce:false, restrict:false}. participant_count includes the creator/owner. Inviting your own phone number deduplicates into the owner slot rather than adding a separate participant. create always returns participants[] inline so you can confirm membership immediately.
Examples: list: 'show me my groups' get: 'fetch group 972...-1597620113@g.us' create: 'create a group called Crew with +972544325389 and +1234567890' update: 'rename group g@g.us to Sales Team' leave: 'leave group g@g.us'
|
| audiencesA | Reusable contact lists used as targets for messages and campaigns.
Available actions: list: list audiences create: create a new audience by name get / update / delete: standard CRUD on an audience append_contacts: add contacts (to + optional variables) to an audience update_contact / remove_contact: edit or remove a single contact within an audience
Phone format: to must be in international format (e.g. +14155551234). JID form (12345@c.us) is rejected here.
Variables: each key on variables becomes a {key} token usable in campaign templates (case-insensitive).
Custom tokens override built-ins: setting variables.firstName='Doug' makes {firstName} resolve to Doug instead of the WA profile name.
Built-ins always available even without variables: whatsappname, displayname, phone, mobile. Examples: create: 'create an audience called Leads' append_contacts: 'add +972544325389 to the Leads audience with firstName=Doug, product=Premium'
|
| campaignsA | Schedule audiences for paced bulk delivery, with pause/resume/cancel controls.
Available actions: list: list campaigns create: schedule a campaign against an audience (name + audience_id + optional text/media_url/media_caption/on_missing_variable) get: retrieve a campaign by id pause / resume / cancel: control a running campaign
Templates: text supports per-contact substitution using SINGLE-brace tokens — Hi {firstName}, your {product} is renewing.
Resolution is case-insensitive. Built-ins always available: {whatsappname}, {displayname}, {phone}, {mobile}.
Custom tokens come from audiences.append_contacts variables (the property name becomes the token).
on_missing_variable=fail (default) rejects at create time if any contact lacks a referenced token; skip accepts and leaves {token} literal in unresolved sends. Examples: create: 'campaign called Summer Promo targeting the Leads audience with text "Hi {firstName}, your {product} is renewing"' pause: 'pause campaign 6a37b9a44919fa7098017a65'
|
| webhooksB | Register URLs to receive HTTPS POSTs on Blueticks events.
Available actions: Examples: |
| engineA | Inspect the WhatsApp engine(s) connected to this account.
Available actions: status: returns the connected engines as an array — one entry per online
engine, each with {id, type, connected, state, stream, hasSynced}. An
empty array means no engine is currently connected (not an error).
Examples: |
| utilsA | Local helpers that don't require a backend call.
Available actions: Examples: |