Skip to content

Media card carousel templates (create + send)

Released: August 30, 2026

You can now create and send WhatsApp media card carousel templates. A carousel is a single marketing template message accompanied by 2–10 swipeable product cards — each card has its own image or video header, an optional body text, and up to two buttons (quick reply, URL, or phone number).

Add a CAROUSEL component alongside the message BODY. Every card must share the same structure (same header format, same button types in the same order), and if any card has body text then all cards must.

Terminal window
curl -X POST "https://api.kirimdev.com/v1/106540352242922/templates" \
-H "Authorization: Bearer $KIRIM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "rare_succulents_carousel",
"language": "en_US",
"category": "MARKETING",
"components": [
{ "type": "BODY", "text": "Rare succulents for sale!" },
{
"type": "CAROUSEL",
"cards": [
{
"components": [
{ "type": "HEADER", "format": "IMAGE",
"example": { "header_url": ["https://cdn.example.com/aloe.jpg"] } },
{ "type": "BUTTONS", "buttons": [
{ "type": "QUICK_REPLY", "text": "Send more like this" },
{ "type": "URL", "text": "Shop", "url": "https://shop.example.com/aloe" }
] }
]
},
{
"components": [
{ "type": "HEADER", "format": "IMAGE",
"example": { "header_url": ["https://cdn.example.com/echeveria.jpg"] } },
{ "type": "BUTTONS", "buttons": [
{ "type": "QUICK_REPLY", "text": "Send more like this" },
{ "type": "URL", "text": "Shop", "url": "https://shop.example.com/echeveria" }
] }
]
}
]
}
]
}'

Provide each card header as example.header_url (a public https:// image/video URL) — Kirimdev uploads the sample to Meta for you and retains the URL so the template stays sendable. Carousels are MARKETING-only and cannot carry a top-level HEADER / FOOTER / BUTTONS (put those on the cards).

Send an approved carousel with a carousel component whose cards supply each card’s header asset (id or link) and any per-button values, keyed by card_index:

Terminal window
curl -X POST "https://api.kirimdev.com/v1/106540352242922/messages" \
-H "Authorization: Bearer $KIRIM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"messaging_product": "whatsapp",
"to": "+16505551234",
"type": "template",
"template": {
"name": "rare_succulents_carousel",
"language": { "code": "en_US" },
"components": [
{
"type": "carousel",
"cards": [
{ "card_index": 0, "components": [
{ "type": "header", "parameters": [{ "type": "image", "image": { "id": "1558081531584829" } }] },
{ "type": "button", "sub_type": "quick_reply", "index": 0, "parameters": [{ "type": "payload", "payload": "more-aloes" }] }
] },
{ "card_index": 1, "components": [
{ "type": "header", "parameters": [{ "type": "image", "image": { "link": "https://cdn.example.com/echeveria.jpg" } }] },
{ "type": "button", "sub_type": "quick_reply", "index": 0, "parameters": [{ "type": "payload", "payload": "more-echeverias" }] }
] }
]
}
]
}
}'

Both flows go through the existing templates.create() and messages.send() methods — the carousel shapes are now part of their types.

await kirim.phoneNumbers('106540352242922').templates.create({
name: 'rare_succulents_carousel',
category: 'MARKETING',
language: 'en_US',
components: [
{ type: 'BODY', text: 'Rare succulents for sale!' },
{
type: 'CAROUSEL',
cards: [
{ components: [
{ type: 'HEADER', format: 'IMAGE', example: { header_url: ['https://cdn.example.com/aloe.jpg'] } },
{ type: 'BUTTONS', buttons: [{ type: 'QUICK_REPLY', text: 'Send more like this' }] },
] },
{ components: [
{ type: 'HEADER', format: 'IMAGE', example: { header_url: ['https://cdn.example.com/echeveria.jpg'] } },
{ type: 'BUTTONS', buttons: [{ type: 'QUICK_REPLY', text: 'Send more like this' }] },
] },
],
},
],
})

The create_template and send_message MCP tools accept the same carousel shapes automatically — no new tools were added.