Criar template
Cria um novo template de mensagem para a instância.
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"
}Autorizações
Your Pilot Status API key (ps_...). Evolution GO also accepts Authorization: Bearer <key>.
Parâmetros de caminho
O nome de exibição do número no painel do Pilot Status.
Corpo
Nome único do template (minúsculas, underscores).
"order_confirmation"
Categoria do template: AUTHENTICATION, MARKETING ou UTILITY.
"UTILITY"
Código de idioma/localidade (ex.: pt_BR, en_US).
"pt_BR"
Objetos de componente do template (cabeçalho, corpo, rodapé, botões).
[
{
"type": "BODY",
"text": "Ola {{1}}, seu pedido {{2}} foi confirmado."
}
]
Permite que a Meta reatribua a categoria durante a revisão.
true
URL notificada sobre mudanças de status do template.
"https://example.com/webhooks/template-status"
Resposta
Sucesso — corpo de resposta nativo do provedor.
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.
Esta página foi útil?
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"
}