If you needs to send utility-type notifications, you can now use the SMS+ API service provided by Crescnedo Lab to fulfill the need to send both WhatsApp messages and SMS.
# Feature Overview
- With SMS+ API, brands can integrate both WhatsApp messages and SMS delivery in one flow.
- When a WhatsApp message fails to deliver (for example, the user has blocked the brand account), the system will automatically fall back to SMS to ensure critical messages are delivered.
# Setup Guide
Follow the steps below to complete the setup and prepare your API requests.
Step 1. Confirm WhatsApp Template Information
To successfully send WhatsApp Utility messages, you must use or create a WhatsApp message template first.
Go to Meta Business Manager and choose either option:
- Use Meta’s default WhatsApp templates.
- Create your own template.
Note: Templates must pass Meta’s review before they can be used for real message delivery.
For detailed steps on creating templates, see: Tutorial|How to Create and Submit a WhatsApp Message Template
Step 2. Connect the WhatsApp Channel in MAAC
Log in to MAAC and complete the WhatsApp channel connection.
Guide: Tutorials|How to add a WhatsApp channel
Note: This article does not detail the connection procedure. Please complete the channel setup before making API calls.
Step 3. Retrieve the MAAC Open API Token
In the MAAC console, go to:
- Settings > API Settings > Get MAAC Open API Token
Step 4. Contact Crescnedo Lab to Enable SMS+ API Sending Permission
Contact your Customer Success Manager to enable the SMS+ API template permissions and confirm the template format.
Step 5. Upload Media via Graph API to Obtain a Media ID (Optional)
If your template uses media (image, video, or document), upload the file to the Graph API to obtain the corresponding Media ID.
Example: Upload a video
curl --location 'https://graph.facebook.com/v23.0/<WABA_ID>/media' \
--header 'Authorization: Bearer <ACCESS_TOKEN>' \
--form 'messaging_product="whatsapp"' \
--form 'file=@"/Users/george/Downloads/sample.mp4"' \
--form 'type="video/mp4"'Sample response:
{
"id": "1161533612549027"
}The returned id is the Media ID you can reference when sending the template.
Step 6. Send Messages According to the API Specification
After obtaining the API Token and completing the template setup, construct your API requests according to the specification.
API reference: MAAC Open API Documentation
Request Body Examples
Text Header
{
"pnp_setting_id": 1,
"data": {
"phone_number": "{{phone_number}}",
"pnp": {},
"sms": {},
"whatsapp": {
"template_name": "{{whatsapp_template_name_text}}",
"template_data": {
"header": {
"parameters": [
{
"type": "text",
"text": "header param"
}
]
},
"body": {
"parameters": [
"body param"
]
}
},
"language": "en"
}
}
}Image Header (using media ID)
{
"pnp_setting_id": 1,
"data": {
"phone_number": "{{phone_number}}",
"pnp": {},
"sms": {},
"whatsapp": {
"template_name": "image_template_1",
"template_data": {
"header": {
"parameters": [
{
"type": "image",
"media_id": "7*************"
}
]
},
"body": {
"parameters": ["body param"]
}
},
"language": "en"
}
}
}Image Header (using media url)
{
"pnp_setting_id": 1,
"data": {
"phone_number": "{{phone_number}}",
"pnp": {},
"sms": {},
"whatsapp": {
"template_name": "image_template_1",
"template_data": {
"header": {
"parameters": [
{
"type": "image",
"media_url": "https://i.imgur.com/xxxxx"
}
]
},
"body": {
"parameters": ["body param"]
}
},
"language": "en"
}
}
}
Video Header (using media ID)
{
"pnp_setting_id": 1,
"data": {
"phone_number": "{{phone_number}}",
"pnp": {},
"sms": {},
"whatsapp": {
"template_name": "video_template_1",
"template_data": {
"header": {
"parameters": [
{
"type": "video",
"media_id": "200000000000000"
}
]
},
"body": {
"parameters": ["body param"]
}
},
"language": "en"
}
}
}
Video Header (using media url)
{
"pnp_setting_id": 1,
"data": {
"phone_number": "{{phone_number}}",
"pnp": {},
"sms": {},
"whatsapp": {
"template_name": "video_template_1",
"template_data": {
"header": {
"parameters": [
{
"type": "video",
"media_url": "https://i.imgur.com/xxxxxxx.mp4"
}
]
},
"body": {
"parameters": ["body param"]
}
},
"language": "en"
}
}
}
Document Header (using media ID)
{
"pnp_setting_id": 1,
"data": {
"phone_number": "{{phone_number}}",
"pnp": {},
"sms": {},
"whatsapp": {
"template_name": "document_template_1",
"template_data": {
"header": {
"parameters": [
{
"type": "document",
"media_id": "1111111111111111",
"filename": "ex01.pdf"
}
]
},
"body": {
"parameters": ["body param"]
}
},
"language": "en"
}
}
}
Document Header (using media url)
{
"pnp_setting_id": 1,
"data": {
"phone_number": "{{phone_number}}",
"pnp": {},
"sms": {},
"whatsapp": {
"template_name": "document_template_1",
"template_data": {
"header": {
"parameters": [
{
"type": "document",
"media_url": "https://ex01.pdf",
"filename": "ex01.pdf"
}
]
},
"body": {
"parameters": ["body param"]
}
},
"language": "en"
}
}
}
Location Header
{
"pnp_setting_id": 1,
"data": {
"phone_number": "{{phone_number}}",
"pnp": {},
"sms": {},
"whatsapp": {
"template_name": "location_template_1",
"template_data": {
"header": {
"parameters": [
{
"type": "location",
"latitude": "25.00000000000000",
"longitude": "121.000000000",
"name": "Taipei City Government",
"address": "No.1, City Hall Rd., Xinyi District, Taipei City 110204, Taiwan"
}
]
},
"body": {
"parameters": ["body param"]
}
},
"language": "en"
}
}
}
📌 Important Note
- Each template must be approved by Meta before it can be sent.
- API delivery prioritizes WhatsApp. If WhatsApp cannot be delivered, you can choose to fall back to SMS.
How to Check SMS+ API Delivery Logs?
After you start sending messages via SMS+ API, you can verify successful sends or investigate failures by checking delivery logs in the console.
See: FAQ|How to Check SMS API Send Report, Delivery Status, and Failure Reasons
You can find:
- How to query successful and failed delivery records
- Common error codes and their corresponding solutions
If you need help enabling SMS+ API templates, running integration tests, or investigating delivery logs, please contact Crescnedo Lab’s support team.