WhatsApp Interactive Messages API
Send reply buttons, link and call buttons, list menus and product carousels from your own WhatsApp number. One sendMessage endpoint, no template approval — the customer's choice comes back to your webhook.
- reply buttons
- URL & call buttons
- list messages
- carousels

Every interactive format in one endpoint
Choose the type field and the button kind — the rest of the request stays the same.
-
buttons · id
Reply buttons
Quick answers such as Confirm or Cancel. The button id comes back so your code knows what was chosen.
-
buttons · url
Link buttons
Open a tracking page, a payment link or your website with one tap.
-
buttons · phoneNumber
Call buttons
Let the customer call your support line directly from the message.
-
buttons · code
Copy-code buttons
Share a coupon or verification code the customer can copy in one tap.
-
type: list
List messages
A menu button that opens sections and rows — ideal for support menus and appointment slots.
-
type: carousel
Carousels
Up to 10 swipeable cards, each with media and up to 5 buttons, for products and offers.
Buttons with media, title and footer
Add an image or video, a title, a body and a footer, then mix reply, link, call and copy-code buttons in the same message.
- ✓Reply buttons return their id to your webhook
- ✓Link and call buttons work without extra setup
- ✓Copy-code buttons for coupons and one-time codes
List menus for many options
When three buttons are not enough, send a list. The customer opens it with your button text and picks one row from your sections.
- ✓Group rows into titled sections
- ✓Each row has a title, description and rowId
- ✓Great for support menus, branches and time slots
Swipeable product cards
Show several products or offers side by side. Each card has its own media, text and buttons.
- ✓Up to 10 cards per carousel
- ✓Up to 5 buttons per card
- ✓Media is required on every card
Same endpoint, different type
Buttons, lists and carousels are all sent with POST /sendMessage. Only the type field and its options change.
- ✓Works from cURL, Node.js, Python, PHP and any HTTP client
- ✓No template review, send right away
curl -X POST "https://api.maytapi.com/api/$PID/$PHONE_ID/sendMessage" \
-H "x-maytapi-key: $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"to_number": "1415xxxxx67@c.us",
"type": "buttons",
"title": "Your order #10482",
"message": "Your order is ready to ship. Please confirm the delivery address.",
"footer": "Maytapi Store",
"media": "https://example.com/order.jpg",
"buttons": [
{
"id": "confirm",
"text": "Confirm"
},
{
"url": "https://example.com/track/10482",
"text": "Track order"
},
{
"phoneNumber": "1415xxxxx67",
"text": "Call us"
}
]
}'curl -X POST "https://api.maytapi.com/api/$PID/$PHONE_ID/sendMessage" \
-H "x-maytapi-key: $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"to_number": "1415xxxxx67@c.us",
"type": "buttons",
"message": "Here is 10% off your next order.",
"buttons": [
{
"code": "WELCOME10",
"text": "Copy code"
}
]
}'curl -X POST "https://api.maytapi.com/api/$PID/$PHONE_ID/sendMessage" \
-H "x-maytapi-key: $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"to_number": "1415xxxxx67@c.us",
"type": "list",
"title": "How can we help?",
"message": "Choose a topic and we will connect you to the right team.",
"footer": "Support",
"button_text": "See options",
"sections": [
{
"title": "Support topics",
"rows": [
{
"rowId": "status",
"title": "Order status",
"description": "Track a recent order"
},
{
"rowId": "returns",
"title": "Returns",
"description": "Start a return or exchange"
}
]
}
]
}'curl -X POST "https://api.maytapi.com/api/$PID/$PHONE_ID/sendMessage" \
-H "x-maytapi-key: $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"to_number": "1415xxxxx67@c.us",
"type": "carousel",
"message": "New arrivals this week",
"cards": [
{
"title": "Classic sneaker",
"body": "Sizes 38–45",
"media": "https://example.com/sneaker.jpg",
"buttons": [
{
"id": "add_sneaker",
"text": "Add to cart"
},
{
"url": "https://example.com/sneaker",
"text": "Details"
}
]
},
{
"title": "Canvas backpack",
"body": "Free shipping",
"media": "https://example.com/backpack.jpg",
"buttons": [
{
"id": "add_backpack",
"text": "Add to cart"
},
{
"url": "https://example.com/backpack",
"text": "Details"
}
]
}
]
}'Where interactive messages work best
-
Order confirmation
Confirm, change or cancel an order with one tap instead of a typed reply.
-
Appointment reminders
Send a reminder with Confirm and Reschedule buttons and update your calendar from the webhook.
-
Support menus
Route customers to the right team with a list message before an agent joins.
-
Product showcases
Present new products in a carousel with add-to-cart and details buttons.
-
Coupons and codes
Deliver discount or verification codes with a copy-code button.
-
Chatbot flows
Guide bot conversations with buttons so answers stay structured.
Interactive messages FAQ
Ask our support team anything over WhatsApp. Average response time is under 24 hours.
Help center →Do I need template approval to send buttons?
No. Maytapi sends interactive messages from your own number over WhatsApp Web, so there is no Meta template review. You can send them right away.
Which button types are supported?
Reply buttons with an id, link buttons with a url, call buttons with a phoneNumber and copy-code buttons with a code. Title, footer and media are optional.
How many cards can a carousel have?
Up to 10 cards per carousel. Each card needs media and can have up to 5 buttons.
How do I know which button the customer tapped?
The customer's choice arrives at your webhook like any incoming message, so your code can react to it immediately.
Can I add an image to a buttons message?
Yes. Add a media URL to the request and the image or video is shown above the message body.

Get your key, send your first message in ten minutes
No approval, no templates, no card. Every endpoint is open for three days.