curl --request POST \
--url https://take.app/api/v2/message_templates \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"body": "<string>",
"language": "<string>",
"header": "<string>",
"header_image_url": "<string>",
"footer": "<string>",
"buttons": [
{
"text": "<string>",
"url": "<string>",
"phone_number": "<string>"
}
],
"parameter_examples": {}
}
'import requests
url = "https://take.app/api/v2/message_templates"
payload = {
"name": "<string>",
"body": "<string>",
"language": "<string>",
"header": "<string>",
"header_image_url": "<string>",
"footer": "<string>",
"buttons": [
{
"text": "<string>",
"url": "<string>",
"phone_number": "<string>"
}
],
"parameter_examples": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
body: JSON.stringify('<string>'),
language: '<string>',
header: '<string>',
header_image_url: '<string>',
footer: '<string>',
buttons: [{text: '<string>', url: '<string>', phone_number: '<string>'}],
parameter_examples: {}
})
};
fetch('https://take.app/api/v2/message_templates', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://take.app/api/v2/message_templates",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'body' => '<string>',
'language' => '<string>',
'header' => '<string>',
'header_image_url' => '<string>',
'footer' => '<string>',
'buttons' => [
[
'text' => '<string>',
'url' => '<string>',
'phone_number' => '<string>'
]
],
'parameter_examples' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://take.app/api/v2/message_templates"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"body\": \"<string>\",\n \"language\": \"<string>\",\n \"header\": \"<string>\",\n \"header_image_url\": \"<string>\",\n \"footer\": \"<string>\",\n \"buttons\": [\n {\n \"text\": \"<string>\",\n \"url\": \"<string>\",\n \"phone_number\": \"<string>\"\n }\n ],\n \"parameter_examples\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://take.app/api/v2/message_templates")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"body\": \"<string>\",\n \"language\": \"<string>\",\n \"header\": \"<string>\",\n \"header_image_url\": \"<string>\",\n \"footer\": \"<string>\",\n \"buttons\": [\n {\n \"text\": \"<string>\",\n \"url\": \"<string>\",\n \"phone_number\": \"<string>\"\n }\n ],\n \"parameter_examples\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://take.app/api/v2/message_templates")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"body\": \"<string>\",\n \"language\": \"<string>\",\n \"header\": \"<string>\",\n \"header_image_url\": \"<string>\",\n \"footer\": \"<string>\",\n \"buttons\": [\n {\n \"text\": \"<string>\",\n \"url\": \"<string>\",\n \"phone_number\": \"<string>\"\n }\n ],\n \"parameter_examples\": {}\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"object": "message_template",
"name": "<string>",
"status": "APPROVED",
"category": "MARKETING",
"language": "<string>",
"header": "<string>",
"header_image_url": "<string>",
"body": "<string>",
"footer": "<string>",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "<string>",
"url": "<string>",
"phone_number": "<string>"
}
],
"parameters": [
"<string>"
],
"rejected_reason": "<string>"
}{
"error": {
"type": "invalid_request_error",
"code": "<string>",
"message": "<string>",
"request_id": "<string>",
"param": "<string>"
}
}Create message template
Submits a new WhatsApp message template to Meta for review. The template comes back PENDING and becomes sendable once Meta approves it, which usually takes a few minutes.
curl --request POST \
--url https://take.app/api/v2/message_templates \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"body": "<string>",
"language": "<string>",
"header": "<string>",
"header_image_url": "<string>",
"footer": "<string>",
"buttons": [
{
"text": "<string>",
"url": "<string>",
"phone_number": "<string>"
}
],
"parameter_examples": {}
}
'import requests
url = "https://take.app/api/v2/message_templates"
payload = {
"name": "<string>",
"body": "<string>",
"language": "<string>",
"header": "<string>",
"header_image_url": "<string>",
"footer": "<string>",
"buttons": [
{
"text": "<string>",
"url": "<string>",
"phone_number": "<string>"
}
],
"parameter_examples": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
body: JSON.stringify('<string>'),
language: '<string>',
header: '<string>',
header_image_url: '<string>',
footer: '<string>',
buttons: [{text: '<string>', url: '<string>', phone_number: '<string>'}],
parameter_examples: {}
})
};
fetch('https://take.app/api/v2/message_templates', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://take.app/api/v2/message_templates",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'body' => '<string>',
'language' => '<string>',
'header' => '<string>',
'header_image_url' => '<string>',
'footer' => '<string>',
'buttons' => [
[
'text' => '<string>',
'url' => '<string>',
'phone_number' => '<string>'
]
],
'parameter_examples' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://take.app/api/v2/message_templates"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"body\": \"<string>\",\n \"language\": \"<string>\",\n \"header\": \"<string>\",\n \"header_image_url\": \"<string>\",\n \"footer\": \"<string>\",\n \"buttons\": [\n {\n \"text\": \"<string>\",\n \"url\": \"<string>\",\n \"phone_number\": \"<string>\"\n }\n ],\n \"parameter_examples\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://take.app/api/v2/message_templates")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"body\": \"<string>\",\n \"language\": \"<string>\",\n \"header\": \"<string>\",\n \"header_image_url\": \"<string>\",\n \"footer\": \"<string>\",\n \"buttons\": [\n {\n \"text\": \"<string>\",\n \"url\": \"<string>\",\n \"phone_number\": \"<string>\"\n }\n ],\n \"parameter_examples\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://take.app/api/v2/message_templates")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"body\": \"<string>\",\n \"language\": \"<string>\",\n \"header\": \"<string>\",\n \"header_image_url\": \"<string>\",\n \"footer\": \"<string>\",\n \"buttons\": [\n {\n \"text\": \"<string>\",\n \"url\": \"<string>\",\n \"phone_number\": \"<string>\"\n }\n ],\n \"parameter_examples\": {}\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"object": "message_template",
"name": "<string>",
"status": "APPROVED",
"category": "MARKETING",
"language": "<string>",
"header": "<string>",
"header_image_url": "<string>",
"body": "<string>",
"footer": "<string>",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "<string>",
"url": "<string>",
"phone_number": "<string>"
}
],
"parameters": [
"<string>"
],
"rejected_reason": "<string>"
}{
"error": {
"type": "invalid_request_error",
"code": "<string>",
"message": "<string>",
"request_id": "<string>",
"param": "<string>"
}
}Authorizations
Merchant API V2 token. Pass as Authorization: Bearer <token>.
Body
Unique template name, e.g. "spring_sale_2026".
1 - 512^[a-z0-9_]+$MARKETING for promotions, UTILITY for transactional follow-ups. Meta may re-categorize on review.
MARKETING, UTILITY Message body. Use {{variable_name}} for values filled in at send time.
1 - 1024Defaults to the store's template language.
Optional text header, max 60 characters. No variables.
60Optional image header. Publicly reachable HTTPS JPEG or PNG URL, 5MB or smaller. Cannot be combined with header.
Optional footer, max 60 characters. No variables.
603Show child attributes
Show child attributes
Sample value per body variable, e.g. { "customer_name": "Ada" }. Meta reviewers read these, so realistic values approve faster.
Show child attributes
Show child attributes
Response
Message template
message_template Meta review status. Only APPROVED templates can be sent.
APPROVED, IN_APPEAL, PENDING, REJECTED, PENDING_DELETION, DELETED, DISABLED, PAUSED, LIMIT_EXCEEDED MARKETING, UTILITY, AUTHENTICATION Show child attributes
Show child attributes
Named body variables this template expects, e.g. ["customer_name"]. Pass them as parameters when sending.