API reference
Templates
Submit templates for Meta's review, track their status, sync them.
Submit a template for Meta review#
POST/waba-connections/{wabaConnectionId}/templates
- Authentication
- API key (Bearer pk_…), or console session (Bearer ses_… with the X-Environment-Id header)
- Required scope
templates:manage
Parameters
| Name | Location | Type | Description |
|---|---|---|---|
wabaConnectionIdrequired | path | string | WhatsApp connection ID (the id field returned by a business's list of accounts). |
Request body (JSON)
| Field | Type | Description | |
|---|---|---|---|
name | string | required | Template name: lowercase letters, digits and underscores (e.g. appointment_reminder). |
language | string | required | Language code: fr, en, en_US… |
category | string | required | Meta category: MARKETING, UTILITY or AUTHENTICATION. It determines pricing at Meta.Values: MARKETING, UTILITY, AUTHENTICATION |
components | string[] | required | Components in Meta format |
Example
curl -X POST "$INBOX_API/waba-connections/WABA_CONNECTION_ID/templates" \
-H "Authorization: Bearer $INBOX_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "appointment_reminder",
"language": "en",
"category": "UTILITY",
"components": [
{
"type": "BODY",
"text": "Hello {{1}}, your appointment is confirmed for {{2}}.",
"example": {
"body_text": [
[
"Awa",
"November 14 at 10 am"
]
]
}
}
]
}'const res = await fetch(`${process.env.INBOX_API}/waba-connections/WABA_CONNECTION_ID/templates`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INBOX_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"name": "appointment_reminder",
"language": "en",
"category": "UTILITY",
"components": [
{
"type": "BODY",
"text": "Hello {{1}}, your appointment is confirmed for {{2}}.",
"example": {
"body_text": [
[
"Awa",
"November 14 at 10 am"
]
]
}
}
]
}),
});
const data = await res.json();import os
import requests
res = requests.post(
f"{os.environ['INBOX_API']}/waba-connections/WABA_CONNECTION_ID/templates",
headers={
"Authorization": f"Bearer {os.environ['INBOX_KEY']}",
},
json={
"name": "appointment_reminder",
"language": "en",
"category": "UTILITY",
"components": [
{
"type": "BODY",
"text": "Hello {{1}}, your appointment is confirmed for {{2}}.",
"example": {
"body_text": [
[
"Awa",
"November 14 at 10 am",
],
],
},
},
],
},
)
print(res.json())<?php
$ch = curl_init(getenv('INBOX_API') . '/waba-connections/WABA_CONNECTION_ID/templates');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('INBOX_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'name' => 'appointment_reminder',
'language' => 'en',
'category' => 'UTILITY',
'components' => [
[
'type' => 'BODY',
'text' => 'Hello {{1}}, your appointment is confirmed for {{2}}.',
'example' => [
'body_text' => [
[
'Awa',
'November 14 at 10 am',
],
],
],
],
],
]),
]);
$data = json_decode(curl_exec($ch), true);{
"id": "ff532b8f-2956-4f04-851f-db09d5eefbd4",
"name": "appointment_reminder",
"language": "en",
"category": "UTILITY",
"status": "pending",
"usable": false,
"rejectionReason": null,
"components": [
{
"type": "BODY",
"text": "Hello {{1}}, your appointment is confirmed for {{2}}.",
"example": {
"body_text": [
[
"Awa",
"November 14 at 10 am"
]
]
}
}
],
"updatedAt": "2026-11-12T08:33:45.595Z"
}The WhatsApp account's templates and their review status#
GET/waba-connections/{wabaConnectionId}/templates
- Authentication
- API key (Bearer pk_…), or console session (Bearer ses_… with the X-Environment-Id header)
- Required scope
templates:manage
Parameters
| Name | Location | Type | Description |
|---|---|---|---|
wabaConnectionIdrequired | path | string | WhatsApp connection ID (the id field returned by a business's list of accounts). |
Example
curl "$INBOX_API/waba-connections/WABA_CONNECTION_ID/templates" \
-H "Authorization: Bearer $INBOX_KEY"const res = await fetch(`${process.env.INBOX_API}/waba-connections/WABA_CONNECTION_ID/templates`, {
headers: {
Authorization: `Bearer ${process.env.INBOX_KEY}`,
},
});
const data = await res.json();import os
import requests
res = requests.get(
f"{os.environ['INBOX_API']}/waba-connections/WABA_CONNECTION_ID/templates",
headers={
"Authorization": f"Bearer {os.environ['INBOX_KEY']}",
},
)
print(res.json())<?php
$ch = curl_init(getenv('INBOX_API') . '/waba-connections/WABA_CONNECTION_ID/templates');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('INBOX_KEY'),
],
]);
$data = json_decode(curl_exec($ch), true);[
{
"id": "ff532b8f-2956-4f04-851f-db09d5eefbd4",
"name": "appointment_reminder",
"language": "en",
"category": "UTILITY",
"status": "approved",
"usable": true,
"rejectionReason": null,
"components": [
{
"text": "Hello {{1}}, your appointment is confirmed for {{2}}.",
"type": "BODY"
}
],
"updatedAt": "2026-11-12T08:33:45.640Z"
}
]Sync statuses from Meta#
POST/waba-connections/{wabaConnectionId}/templates/sync
- Authentication
- API key (Bearer pk_…), or console session (Bearer ses_… with the X-Environment-Id header)
- Required scope
templates:manage
Parameters
| Name | Location | Type | Description |
|---|---|---|---|
wabaConnectionIdrequired | path | string | WhatsApp connection ID (the id field returned by a business's list of accounts). |
Example
curl -X POST "$INBOX_API/waba-connections/WABA_CONNECTION_ID/templates/sync" \
-H "Authorization: Bearer $INBOX_KEY"const res = await fetch(`${process.env.INBOX_API}/waba-connections/WABA_CONNECTION_ID/templates/sync`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INBOX_KEY}`,
},
});
const data = await res.json();import os
import requests
res = requests.post(
f"{os.environ['INBOX_API']}/waba-connections/WABA_CONNECTION_ID/templates/sync",
headers={
"Authorization": f"Bearer {os.environ['INBOX_KEY']}",
},
)
print(res.json())<?php
$ch = curl_init(getenv('INBOX_API') . '/waba-connections/WABA_CONNECTION_ID/templates/sync');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('INBOX_KEY'),
],
]);
$data = json_decode(curl_exec($ch), true);[
{
"id": "ff532b8f-2956-4f04-851f-db09d5eefbd4",
"name": "appointment_reminder",
"language": "en",
"category": "UTILITY",
"status": "approved",
"usable": true,
"rejectionReason": null,
"components": [
{
"text": "Hello {{1}}, your appointment is confirmed for {{2}}.",
"type": "BODY"
}
],
"updatedAt": "2026-11-12T08:33:45.640Z"
}
]Delete a template (all its languages)#
DELETE/waba-connections/{wabaConnectionId}/templates/{name}
- Authentication
- API key (Bearer pk_…), or console session (Bearer ses_… with the X-Environment-Id header)
- Required scope
templates:manage
Parameters
| Name | Location | Type | Description |
|---|---|---|---|
wabaConnectionIdrequired | path | string | WhatsApp connection ID (the id field returned by a business's list of accounts). |
namerequired | path | string | Template name (all of its languages are affected). |
Example
curl -X DELETE "$INBOX_API/waba-connections/WABA_CONNECTION_ID/templates/NAME" \
-H "Authorization: Bearer $INBOX_KEY"const res = await fetch(`${process.env.INBOX_API}/waba-connections/WABA_CONNECTION_ID/templates/NAME`, {
method: "DELETE",
headers: {
Authorization: `Bearer ${process.env.INBOX_KEY}`,
},
});
const data = res.status;import os
import requests
res = requests.delete(
f"{os.environ['INBOX_API']}/waba-connections/WABA_CONNECTION_ID/templates/NAME",
headers={
"Authorization": f"Bearer {os.environ['INBOX_KEY']}",
},
)
print(res.status_code)<?php
$ch = curl_init(getenv('INBOX_API') . '/waba-connections/WABA_CONNECTION_ID/templates/NAME');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('INBOX_KEY'),
],
]);
curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE);(no content)