Skip to main content
POST
/
v1
/
bots
/
{botId}
/
messages
curl --request POST \
  --url https://api.jelou.ai/v1/bots/BOT_ID/messages \
  --header 'Authorization: Basic <Base64Encoded clientId:clientSecret>' \
  --header 'Content-Type: application/json' \
  --data '{
    "type": "CAROUSEL",
    "userId": "USER_ID",
    "text": "Check out our latest offers",
    "parameters": {
      "cards": [
        {
          "card_index": 0,
          "type": "cta_url",
          "header": {
            "type": "image",
            "image": { "link": "https://example.com/image1.png" }
          },
          "body": { "text": "Exclusive deal #1" },
          "action": {
            "name": "cta_url",
            "parameters": {
              "display_text": "Shop now",
              "url": "https://shop.example.com/deal1"
            }
          }
        },
        {
          "card_index": 1,
          "type": "cta_url",
          "header": {
            "type": "image",
            "image": { "link": "https://example.com/image2.png" }
          },
          "body": { "text": "Exclusive deal #2" },
          "action": {
            "name": "cta_url",
            "parameters": {
              "display_text": "Shop now",
              "url": "https://shop.example.com/deal2"
            }
          }
        }
      ]
    }
  }'
{
  "success": true,
  "messageId": "msg_123456789"
}
curl --request POST \
  --url https://api.jelou.ai/v1/bots/BOT_ID/messages \
  --header 'Authorization: Basic <Base64Encoded clientId:clientSecret>' \
  --header 'Content-Type: application/json' \
  --data '{
    "type": "CAROUSEL",
    "userId": "USER_ID",
    "text": "Check out our latest offers",
    "parameters": {
      "cards": [
        {
          "card_index": 0,
          "type": "cta_url",
          "header": {
            "type": "image",
            "image": { "link": "https://example.com/image1.png" }
          },
          "body": { "text": "Exclusive deal #1" },
          "action": {
            "name": "cta_url",
            "parameters": {
              "display_text": "Shop now",
              "url": "https://shop.example.com/deal1"
            }
          }
        },
        {
          "card_index": 1,
          "type": "cta_url",
          "header": {
            "type": "image",
            "image": { "link": "https://example.com/image2.png" }
          },
          "body": { "text": "Exclusive deal #2" },
          "action": {
            "name": "cta_url",
            "parameters": {
              "display_text": "Shop now",
              "url": "https://shop.example.com/deal2"
            }
          }
        }
      ]
    }
  }'

Card structure

FieldTypeDescription
card_indexnumberCard position (zero-based).
typestringOptional. Include it only when the action is cta_url. Omit it for cards with quick_reply buttons.
header.typestringimage or video.
header.image.link / header.video.linkstringPublic URL of the header media.
body.textstringCard body text.
actionobjectAction triggered when the card is interacted with.

Card with quick reply buttons

Do not include the type field at the card level when using quick_reply buttons. It must only be set when the action is cta_url. Including it on cards with quick_reply causes Meta to reject the message with a 400/500 error.
{
  "card_index": 0,
  "header": {
    "type": "image",
    "image": { "link": "https://example.com/image.png" }
  },
  "body": { "text": "Are you interested in this offer?" },
  "action": {
    "buttons": [
      {
        "type": "quick_reply",
        "quick_reply": {
          "title": "Yes, buy",
          "payload": { "option": "buy" }
        }
      },
      {
        "type": "quick_reply",
        "quick_reply": {
          "title": "No, thanks",
          "payload": { "option": "skip" }
        }
      }
    ]
  }
}

quick_reply button fields

FieldTypeDescription
quick_reply.titlestringVisible button text (max. 20 characters).
quick_reply.payloadobject | stringInformation you receive in the webhook when the user selects the button. Useful to identify which card was chosen.
quick_reply.idstringOptional. If not provided, the system generates a UUID automatically.

Restrictions

  • Cards: minimum 1, maximum 10 per carousel.
  • Header: only image or video are supported.
  • Compatible providers: WhatsApp Cloud API and Gupshup CAPI.
This is an interactive carousel sent inside an active WhatsApp session. It does not require an HSM template approved by Meta.

Use Cases

  • Product catalogs with CTA to the store
  • Plan or service comparisons
  • Multiple promotions with purchase buttons
  • Quick selection between options with associated image

Authorizations

Authorization
string
header
required

Basic authentication using Base64 encoded clientId:clientSecret

Path Parameters

botId
string
required

The unique identifier of the bot

Body

application/json

Message payload. The structure varies based on the message type.

type
enum<string>
required

Type of message to send

Available options:
text
Example:

"text"

userId
string
required

Unique identifier of the user receiving the message

Example:

"USER_ID"

text
string
required

Text content of the message

Example:

"Hello, this is a text message"

botId
string

Unique identifier of the bot sending the message

Example:

"BOT_ID"

Response

Message sent successfully

success
boolean
Example:

true

messageId
string
Example:

"msg_123456789"