Single Product Template Message

POST Method

The Single Product Template Message API allows you to send an approved single-product message (SPM) template to a WhatsApp end-user.

Prerequisites

  1. Before you get started, Create an API Key. To view the API Key and the SID, see View API Key and SID.
    A prerequisite for using Kaleyra WhatsApp APIs is to have an active WhatsApp plan on Kaleyra platform.
  2. To set up a WhatsApp account on Kaleyra platform, see Manual Signup
    and Embedded Signup.
  3. An active WhatsApp for Business API plan that includes:
    • A WhatsApp business number.
    • An associated profile with the business number.
    • A WhatsApp verified and approved profile.
    • A WABA ID onboarded on Kaleyra WhatsApp API V2.

Base URL

https://<api_domain>/v2/<SID>

API Domain and Value

api_domainValue
IN podapi.in.kaleyra.io
SG Podapi.kaleyra.io
EU Podapi.eu.kaleyra.io
NA podapi.na.kaleyra.ai

API request to Send Single Product Template Message

To send an approved single-product message (SPM) template to a WhatsApp end-user, use the https://<api_domain>/v2/<sid>/whatsapp/<waba_id>/messages endpoint with the following request method:

Request Format

The following is the request format to send a single product template message:

curl -L -X POST \
  https://<api_domain>/v2/<sid>/whatsapp/<waba_id>/messages \
  -H 'Content-Type: application/json' \
  -H 'api-key: <api-key>' \
  -H 'cache-control: no-cache' \
  -d '{
  			"messaging_product": "<messaging_product>",
  			"recipient_type": "<recipient_type>",
  			"to": "<to>",
  			"type": "<type>",
  			"template": {
    			"name": "<name>",
    			"language": {
      			"policy": "<policy>",
      			"code": "<code>"
    			},
    			"components": [
      		{
        		"type": "header",
        		"parameters": [
          	{
            	"type": "product",
            	"product": {
            		"product_retailer_id": "<product_retailer_id>",
            		"catalog_id": "<catalog_id>"
            		}
          		}
        		]
      		},
     			{
        		"type": "body",
        		"parameters": [
          		{
          			<CARD_BODY_VARIABLE>,
          			<CARD_BODY_VARIABLE>
          			]
      				}
    				]
  				}
      },
    "extra_info": {
        "ref": "<ref>",
        "ref1": "<ref1>",
        "ref2": "<ref2>",
        "wa_source": "<wa_source>"
    }
}'

Sample Request Format

The following is the sample request format to send a single product template Message:

curl -L -X POST \
  https://api.in.kaleyra.io/v2/HXAP16XXXXXX97IN/whatsapp/1090xxxxxxxxxxxx/messages \
  -H 'Content-Type: application/json' \
  -H 'api-key: Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3' \
  -H 'cache-control: no-cache' \
  -d '{
  			"messaging_product": "whatsapp",
  			"recipient_type": "individual",
  			"to": "+16xxxxxx234",
  			"type": "template",
  			"template": {
    			"name": "abandoned_cart_offer",
    			"language": {
      			"policy": "deterministic",
      			"code": "en_US"
    			},
    			"components": [
      		{
        		"type": "header",
        		"parameters": [
          	{
            	"type": "product",
            	"product": {
              	"product_retailer_id": "nqrxxx03ez",
              	"catalog_id": "194XXXXXXXX3835"
            	}
          	}
        	]
      	},
      	{
        	"type": "body",
        	"parameters": [
          	{
            	"type": "text",
            	"text": "25OFF"
          	},
          	{
            	"type": "text",
            	"text": "25%"
          	}
        	]
      	}
    	]
  	}
	},
    "extra_info": {
        "ref": "customer1",
        "ref1": "marketing",
        "ref2": "dictionary",
        "wa_source": "api"
    }
}'

URL Parameters and Headers

The following is the list of parameters and headers to send the outgoing message request:

Parameter / HeadersData TypeDescriptionExampleMandatory?
sidStringAccount SID (Security Identifier).HXAP16XXXXXX97INYes
waba_idStringWhatsApp Business Account. For more information, see step 1 to step 3 of Adding a new WABA ID.1090xxxxxxxxxxxxYes
Content-TypeStringIndicates the format of the content the API will be processing.The only allowed value is application/json.Yes
api-keyStringAPI key generated from Kaleyra Platform account.Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3Yes

Following is the list of attributes to be used in the payload to send a single product template message:

ParameterData TypeDescriptionExampleMandatory?
messaging_productStringMessaging service used for the request.The only allowed value is WhatsAppYes
recipient_typeStringCurrently, you can only send messages to individuals. Default is individual.The only allowed value is individualNo
toStringWhatsApp end-user phone number. It should include country code prefix following E.164 format.+16xxxxxx234Yes
typeStringThe type of message you want to send. If omitted, defaults to text.The only allowed value is template for single product template message.Yes
templateJSON objectThis object will contain additional template details for pre-configured content and certain functionalities.See the specific table for details.No

The following table describes the different attributes used for the template JSON object:

ParameterData TypeDescriptionExampleMandatory?
nameStringTemplate name for which you want to know the WhatsApp template statuses. Maximum 512 characters is supported.abandoned_cart_offerYes
languageJSON ObjectThis object will contain additional language details for certain functionalities.See the specific table for details.No
componentsJSON ObjectThis object will contain additional components details for certain functionalities.See the specific table for details.No

The following table describes the different attributes used for the language JSON object:

ParameterData TypeDescriptionExampleMandatory?
policyStringThe language policy the message should follow.The only supported option is deterministic.Yes
codeStringTemplate language and locale code. For more information, see Supported Languages.en_USNo

The following table describes the different attributes used for the components JSON object:

ParameterData TypeDescriptionExampleMandatory?
typeStringDescribes the component type."header" or "body"Yes
parametersJSON ObjectArray of parameter objects with the content of the message.See the specific table for details.Yes

The following table describes the different attributes used for the header parameters JSON object:

ParameterData TypeDescriptionExampleMandatory?
typeStringThe type of header element.The only supported type value is "header".Yes
productJSON ObjectArray of product objects with the content of the message.See the specific table for details.Yes

The following table describes the different attributes used for the product JSON object:

ParameterData TypeDescriptionExampleMandatory?
product_retailer_idIntegerUnique identifier of the product in a catalog. To get the product_retailer_id from Meta, see Meta Commerce Manager.nqrxxx03ezYes
catalog_idStringA product’s unique identifier. Retrieve this ID using Commerce Manager.194XXXXXXXX3835Yes

The following table describes the different attributes used for the body parameters JSON object:

ParameterData TypeDescriptionExampleMandatory?
typeStringThe type of body element."body"Yes
parametersJSON ObjectArray of parameters objects with the content of the message.See the specific table for details.Yes

The following table describes the different attributes used for the parameters JSON object:

ParameterData TypeDescriptionExampleMandatory?
typeStringThe type of body element.The only supported type value is "text".No
textStringBody text value.25OFFNo

The following table describes the different attributes used for the extra_info JSON object:

Parameter

Data Type

Description

Example

Mandatory?

ref

String

Include any contextual information in this parameter you want to associate with the request. For Example, Name, Customer ID, and many more. Limit: The variable can be 255 characters long only. This parameter will be available in report and callback.

customer1

No

ref1

String

Include the contextual information in this parameter you want to associate with the request. For Example, Name, Customer ID, and many more. Limit: The variable can be 255 characters long only. This parameter will be available in report and callback.

marketing

No

ref2

String

Include the contextual information in this parameter you want to associate with the request. For Example, Name, Customer ID, and many more. Limit: The variable can be 255 characters long only. This parameter will be available in report and callback.

dictionary

No

wa_source

String

Indicates the source from where the API has been triggered. Supported values for wa_source are "api", "clevertap", "zoho", "webengage", "shopify", "leadsquared", "responsys", "braze", "hubspot", "salesforce", "zapier", "eloqua", and "moengage". Note: If the customer enters any value other than the above-specified values, the system will override it as the "API".

api

No

📘

Note:

In the case of ref, ref1, and ref2, if the length of the string exceeds 255 characters, it will be truncated.

Sample Success Response

The following success message appears with the status 202 Accepted:

202 Accepted 
{
"code":"WA202"
"message":"Request Accepted",
"data":{
  "message_id":"AXXXXXXXXXXXXXXXXXXX"
}
"error":{}
}

Sample Failure Response

The following are the failure responses:

401 Unauthorized
{
    "code": "RBC001",
    "message": "Incorrect SID or API key.",
    "data": [],
    "error": {
        "error": "Incorrect SID or API key."
    }
}
401 Unauthorized phone number
{
    "code": "WA401",
    "message": "Phone number is not present or does not belong to the account.",
    "data": {},
    "error": {
        "phone_number": "Phone number is not present or does not belong to the account."
    }
}
400 Incorrect payload
{
    "code": "WA400",
    "message": "Refer to correct payload format",
    "data": {},
    "error": {
        "payload": "Incorrect payload format"
    }
}
500 Internal Server Error
{
    "code": "WA500",
    "message": "Please try again later",
    "data": {},
    "error": {
        "error": "Internal server error"
    }
}
400 Low balance
{
    "code": "E110",
    "message": "Please check your balance, You have a low balance!",
    "data": {},
    "error": {
        "balance": "Please check your balance, You have a low balance!"
    }
}
401 Unauthorised Account type
{
    "code": "WA-401",
    "message": "API is not available for given customer.Please contact support for more info",
    "data": {},
    "error": {
        "account": "API is not available for given customer.Please contact support for more info"
    }
}
401 Unauthorized phone number version
{
    "code": "WA-401",
    "message": "The phone number you're using is associated with different Version of our WA API. Please use the appropriate endpoint.",
    "data": {},
    "error": {
        "phone_number": "The phone number you're using is associated with different Version of our WA API. Please use the appropriate endpoint."
    }
}




© 2025 Kaleyra Inc. All rights reserved.
Trademarks, logos and service marks displayed on this site are registered and unregistered trademarks of Kaleyra Inc.