Beyond plain text and media, SocialMate can send polls, location pins and contact cards, quote any message as a threaded reply, and use the three conversational signals that make an automated number feel human: emoji reactions, read receipts and the typing indicator.
What costs what
| Capability | Tier | Uses your send budget? |
|---|---|---|
| Text send | Free | Yes |
Quoted reply (replyTo) |
Free | Yes — it is a message |
| Emoji reaction | Free | No |
| Mark as read (blue ticks) | Free | No |
| Typing indicator | Free | No |
| Media, poll, location, contact card | Pro | Yes |
Reactions, read receipts and the typing indicator produce no chat bubble, and they can only target a conversation you are already in — so they cannot be used for cold outreach. They run on a separate signal rate limit (20/min on Free, 60/min on Pro), never consume your daily message allowance, and never raise your anti-ban risk score. If you exceed the signal limit you get a 429 with reason: "signal_rate_limit", which leaves your message budget untouched.
Quoting a message
Add replyTo — the id of the message you want to quote — to any send:
POST /v1/accounts/{id}/messages
{ "chatId": "15551234567", "text": "On it!", "replyTo": "3EB0..." }
If the quoted message can’t be found, the send still goes out — just without the quote.
Reacting
POST /v1/accounts/{id}/messages/{messageId}/reaction
{ "chatId": "15551234567", "emoji": "👍" }
WhatsApp allows one reaction per person per message, so sending a new emoji replaces your previous one. Send "emoji": "" to remove it. Reactions from other people (and the echo of your own) arrive on the message.reaction webhook, where removed: true tells you a reaction was withdrawn.
Polls
POST /v1/accounts/{id}/messages
{ "chatId": "15551234567",
"poll": { "name": "Which day works?", "options": ["Mon", "Tue", "Wed"], "selectableCount": 1 } }
2–12 options. Votes arrive on the poll.vote webhook with the option labels (not indices) and a running tally. Only polls you sent can have their votes decrypted — a poll someone else created is unreadable, because the decryption key is generated by the sender.
Polls, not buttons. Interactive buttons and list menus are deprecated on the WhatsApp Web protocol and SocialMate deliberately doesn’t ship them — they may render but fail to work. A poll is the reliable way to offer tappable choices.
Locations and contact cards
{ "location": { "latitude": 30.0444, "longitude": 31.2357, "name": "Cairo", "address": "Cairo, Egypt" } }
{ "contacts": [ { "fullName": "Jane Doe", "phone": "15551230000", "organization": "Acme" } ] }
Contact cards are sent as vCard 3.0; the phone becomes the tappable number the recipient can save or message.
Rich content isn’t auto-queued. If anti-ban blocks a poll, location or contact-card send, you get 429 with queueable: false on every tier. The smart queue stores one text body and one media path, so it has nowhere to put a poll’s options or a pin’s coordinates. Retry after retryAfterMs. Text and URL-based media still auto-queue on Pro.
Building an AI agent? There is a ready-made system prompt that teaches an agent this exact cadence — mark read, recall the thread, show typing, then react or reply. See the agent system prompt. The MCP server serves it natively as socialmate_human_agent.
Typing indicator & read receipts
POST /v1/accounts/{id}/presence { "chatId": "…", "state": "composing" }
POST /v1/accounts/{id}/messages/read { "chatId": "…" }
Show composing while your agent is thinking, then send the reply. WhatsApp expires the indicator after about 10 seconds, so refresh it if you need it held longer; paused clears it. Omit messageIds when marking read to acknowledge everything unread in the chat.