Quote the message you are answering
Pass reply_to with the ChatRail id of any message in the same chat — one you sent or one you received. WhatsApp shows it quoted above yours. The target must already have reached WhatsApp, and it must be in the same chat; otherwise the send is refused with field: reply_to rather than delivered unquoted.
curl https://www.chatrail.dev/v1/messages/text \
-H "Authorization: Bearer $CHATRAIL_API_KEY" -H "Content-Type: application/json" \
-d '{
"connection": "sales",
"to": "+447700900123",
"body": "Yes — viewing is at 3pm on Saturday.",
"reply_to": "019bf4a1-0000-7000-8000-00000000c0de"
}'Mention people, or everyone in a group
mentions takes phone numbers, or "all" in a group. WhatsApp only highlights a mention where the text says @ and the number's digits, so each number must appear in the body that way — a mention the body does not name is refused, because it would be delivered invisibly. Mentions work on text messages.
curl https://www.chatrail.dev/v1/messages/text \
-H "Authorization: Bearer $CHATRAIL_API_KEY" -H "Content-Type: application/json" \
-d '{
"connection": "ops",
"to": { "group": "120363000000000001" },
"body": "@447700900123 can you cover the 2pm handover?",
"mentions": ["+447700900123"]
}'link_preview turns the preview card for the first link on or off; omit it for WhatsApp's default.
Polls
A poll replaces the body: send poll with a question and 2–12 distinct options. Votes arrive as poll.vote webhooks — one vote per person, updated when they change their mind — and GET /v1/messages/{id} returns the running count per option under poll.results.
curl https://www.chatrail.dev/v1/messages/text \
-H "Authorization: Bearer $CHATRAIL_API_KEY" -H "Content-Type: application/json" \
-d '{
"connection": "sales",
"to": "+447700900123",
"poll": {
"question": "Which viewing slot suits you?",
"options": ["Sat 10:00", "Sat 14:00", "Sun 11:00"],
"multiple_answers": false
}
}'Contact cards
contact sends a card WhatsApp renders with a Message button. Like a poll, it carries no body. Polls and contact cards need a plan that includes media.
{
"connection": "sales",
"to": "+447700900123",
"contact": { "name": "Ada, Riverside Lettings", "phone": "+447700900456" }
}