Create template
Creates a new message template for the instance.
curl --request POST \
--url https://pilotstatus.com.br/api/layer/evolution-v2/template/create/{instance} \
--header 'Content-Type: application/json' \
--header 'apikey: <api-key>' \
--data '
{
"name": "order_confirmation",
"category": "UTILITY",
"language": "pt_BR",
"components": [
{
"type": "BODY",
"text": "Ola {{1}}, seu pedido {{2}} foi confirmado."
}
],
"allowCategoryChange": true,
"webhookUrl": "https://example.com/webhooks/template-status"
}
'import requests
url = "https://pilotstatus.com.br/api/layer/evolution-v2/template/create/{instance}"
payload = {
"name": "order_confirmation",
"category": "UTILITY",
"language": "pt_BR",
"components": [
{
"type": "BODY",
"text": "Ola {{1}}, seu pedido {{2}} foi confirmado."
}
],
"allowCategoryChange": True,
"webhookUrl": "https://example.com/webhooks/template-status"
}
headers = {
"apikey": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {apikey: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'order_confirmation',
category: 'UTILITY',
language: 'pt_BR',
components: [{type: 'BODY', text: 'Ola {{1}}, seu pedido {{2}} foi confirmado.'}],
allowCategoryChange: true,
webhookUrl: 'https://example.com/webhooks/template-status'
})
};
fetch('https://pilotstatus.com.br/api/layer/evolution-v2/template/create/{instance}', 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://pilotstatus.com.br/api/layer/evolution-v2/template/create/{instance}",
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' => 'order_confirmation',
'category' => 'UTILITY',
'language' => 'pt_BR',
'components' => [
[
'type' => 'BODY',
'text' => 'Ola {{1}}, seu pedido {{2}} foi confirmado.'
]
],
'allowCategoryChange' => true,
'webhookUrl' => 'https://example.com/webhooks/template-status'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"apikey: <api-key>"
],
]);
$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://pilotstatus.com.br/api/layer/evolution-v2/template/create/{instance}"
payload := strings.NewReader("{\n \"name\": \"order_confirmation\",\n \"category\": \"UTILITY\",\n \"language\": \"pt_BR\",\n \"components\": [\n {\n \"type\": \"BODY\",\n \"text\": \"Ola {{1}}, seu pedido {{2}} foi confirmado.\"\n }\n ],\n \"allowCategoryChange\": true,\n \"webhookUrl\": \"https://example.com/webhooks/template-status\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("apikey", "<api-key>")
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://pilotstatus.com.br/api/layer/evolution-v2/template/create/{instance}")
.header("apikey", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"order_confirmation\",\n \"category\": \"UTILITY\",\n \"language\": \"pt_BR\",\n \"components\": [\n {\n \"type\": \"BODY\",\n \"text\": \"Ola {{1}}, seu pedido {{2}} foi confirmado.\"\n }\n ],\n \"allowCategoryChange\": true,\n \"webhookUrl\": \"https://example.com/webhooks/template-status\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pilotstatus.com.br/api/layer/evolution-v2/template/create/{instance}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["apikey"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"order_confirmation\",\n \"category\": \"UTILITY\",\n \"language\": \"pt_BR\",\n \"components\": [\n {\n \"type\": \"BODY\",\n \"text\": \"Ola {{1}}, seu pedido {{2}} foi confirmado.\"\n }\n ],\n \"allowCategoryChange\": true,\n \"webhookUrl\": \"https://example.com/webhooks/template-status\"\n}"
response = http.request(request)
puts response.read_body{
"id": "clv8k2p9x0001qz9m3n4b5c6d",
"templateId": "1234567890123456",
"name": "order_confirmation",
"template": {
"id": "1234567890123456",
"status": "PENDING",
"category": "UTILITY"
},
"webhookUrl": "https://example.com/webhooks/templates",
"createdAt": "2026-07-10T12:34:56.000Z",
"updatedAt": "2026-07-10T12:34:56.000Z",
"instanceId": "b1f2c3d4-e5f6-7890-ab12-cd34ef567890"
}{
"status": 400,
"error": "Bad Request",
"message": "Invalid payload"
}Authorizations
Your Pilot Status API key (ps_...). Evolution GO also accepts Authorization: Bearer <key>.
Path Parameters
The number's display name in the Pilot Status dashboard.
Body
Unique template name (lowercase, underscores).
"order_confirmation"
Template category: AUTHENTICATION, MARKETING, or UTILITY.
"UTILITY"
Language/locale code (e.g. pt_BR, en_US).
"pt_BR"
Template component objects (header, body, footer, buttons).
[
{
"type": "BODY",
"text": "Ola {{1}}, seu pedido {{2}} foi confirmado."
}
]
Allow Meta to reassign the category during review.
true
URL notified about template status changes.
"https://example.com/webhooks/template-status"
Response
Success — provider-native response body.
The persisted template record. Evolution registers the template on the WhatsApp Business (Meta) API and stores the returned metadata locally, returning the saved DB row.
Internal Evolution record id (cuid).
Meta message template id (HSM id) returned by the WhatsApp Business API.
Template name.
Raw response object returned by the Meta message_templates create call.
Show child attributes
Show child attributes
Id of the instance that owns the template.
Optional webhook URL associated with the template.
Creation timestamp.
Last update timestamp.
Was this page helpful?
curl --request POST \
--url https://pilotstatus.com.br/api/layer/evolution-v2/template/create/{instance} \
--header 'Content-Type: application/json' \
--header 'apikey: <api-key>' \
--data '
{
"name": "order_confirmation",
"category": "UTILITY",
"language": "pt_BR",
"components": [
{
"type": "BODY",
"text": "Ola {{1}}, seu pedido {{2}} foi confirmado."
}
],
"allowCategoryChange": true,
"webhookUrl": "https://example.com/webhooks/template-status"
}
'import requests
url = "https://pilotstatus.com.br/api/layer/evolution-v2/template/create/{instance}"
payload = {
"name": "order_confirmation",
"category": "UTILITY",
"language": "pt_BR",
"components": [
{
"type": "BODY",
"text": "Ola {{1}}, seu pedido {{2}} foi confirmado."
}
],
"allowCategoryChange": True,
"webhookUrl": "https://example.com/webhooks/template-status"
}
headers = {
"apikey": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {apikey: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'order_confirmation',
category: 'UTILITY',
language: 'pt_BR',
components: [{type: 'BODY', text: 'Ola {{1}}, seu pedido {{2}} foi confirmado.'}],
allowCategoryChange: true,
webhookUrl: 'https://example.com/webhooks/template-status'
})
};
fetch('https://pilotstatus.com.br/api/layer/evolution-v2/template/create/{instance}', 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://pilotstatus.com.br/api/layer/evolution-v2/template/create/{instance}",
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' => 'order_confirmation',
'category' => 'UTILITY',
'language' => 'pt_BR',
'components' => [
[
'type' => 'BODY',
'text' => 'Ola {{1}}, seu pedido {{2}} foi confirmado.'
]
],
'allowCategoryChange' => true,
'webhookUrl' => 'https://example.com/webhooks/template-status'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"apikey: <api-key>"
],
]);
$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://pilotstatus.com.br/api/layer/evolution-v2/template/create/{instance}"
payload := strings.NewReader("{\n \"name\": \"order_confirmation\",\n \"category\": \"UTILITY\",\n \"language\": \"pt_BR\",\n \"components\": [\n {\n \"type\": \"BODY\",\n \"text\": \"Ola {{1}}, seu pedido {{2}} foi confirmado.\"\n }\n ],\n \"allowCategoryChange\": true,\n \"webhookUrl\": \"https://example.com/webhooks/template-status\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("apikey", "<api-key>")
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://pilotstatus.com.br/api/layer/evolution-v2/template/create/{instance}")
.header("apikey", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"order_confirmation\",\n \"category\": \"UTILITY\",\n \"language\": \"pt_BR\",\n \"components\": [\n {\n \"type\": \"BODY\",\n \"text\": \"Ola {{1}}, seu pedido {{2}} foi confirmado.\"\n }\n ],\n \"allowCategoryChange\": true,\n \"webhookUrl\": \"https://example.com/webhooks/template-status\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pilotstatus.com.br/api/layer/evolution-v2/template/create/{instance}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["apikey"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"order_confirmation\",\n \"category\": \"UTILITY\",\n \"language\": \"pt_BR\",\n \"components\": [\n {\n \"type\": \"BODY\",\n \"text\": \"Ola {{1}}, seu pedido {{2}} foi confirmado.\"\n }\n ],\n \"allowCategoryChange\": true,\n \"webhookUrl\": \"https://example.com/webhooks/template-status\"\n}"
response = http.request(request)
puts response.read_body{
"id": "clv8k2p9x0001qz9m3n4b5c6d",
"templateId": "1234567890123456",
"name": "order_confirmation",
"template": {
"id": "1234567890123456",
"status": "PENDING",
"category": "UTILITY"
},
"webhookUrl": "https://example.com/webhooks/templates",
"createdAt": "2026-07-10T12:34:56.000Z",
"updatedAt": "2026-07-10T12:34:56.000Z",
"instanceId": "b1f2c3d4-e5f6-7890-ab12-cd34ef567890"
}{
"status": 400,
"error": "Bad Request",
"message": "Invalid payload"
}