curl --request PUT \
--url https://api.omni.z-api.io/whatsapp/businesses/{wabaId}/templates/{templateId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "actualizacion_pedido_v1",
"category": "UTILITY",
"language": "es_ES",
"components": [
{
"type": "BODY",
"text": "Hola {{1}}, tu pedido {{2}} se ha actualizado a {{3}}.",
"example": {
"body_text": [
[
"Ana",
"PED-1024",
"em transporte"
]
]
}
}
]
}
'import requests
url = "https://api.omni.z-api.io/whatsapp/businesses/{wabaId}/templates/{templateId}"
payload = {
"name": "actualizacion_pedido_v1",
"category": "UTILITY",
"language": "es_ES",
"components": [
{
"type": "BODY",
"text": "Hola {{1}}, tu pedido {{2}} se ha actualizado a {{3}}.",
"example": { "body_text": [["Ana", "PED-1024", "em transporte"]] }
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'actualizacion_pedido_v1',
category: 'UTILITY',
language: 'es_ES',
components: [
{
type: 'BODY',
text: 'Hola {{1}}, tu pedido {{2}} se ha actualizado a {{3}}.',
example: {body_text: [['Ana', 'PED-1024', 'em transporte']]}
}
]
})
};
fetch('https://api.omni.z-api.io/whatsapp/businesses/{wabaId}/templates/{templateId}', 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://api.omni.z-api.io/whatsapp/businesses/{wabaId}/templates/{templateId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'actualizacion_pedido_v1',
'category' => 'UTILITY',
'language' => 'es_ES',
'components' => [
[
'type' => 'BODY',
'text' => 'Hola {{1}}, tu pedido {{2}} se ha actualizado a {{3}}.',
'example' => [
'body_text' => [
[
'Ana',
'PED-1024',
'em transporte'
]
]
]
]
]
]),
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://api.omni.z-api.io/whatsapp/businesses/{wabaId}/templates/{templateId}"
payload := strings.NewReader("{\n \"name\": \"actualizacion_pedido_v1\",\n \"category\": \"UTILITY\",\n \"language\": \"es_ES\",\n \"components\": [\n {\n \"type\": \"BODY\",\n \"text\": \"Hola {{1}}, tu pedido {{2}} se ha actualizado a {{3}}.\",\n \"example\": {\n \"body_text\": [\n [\n \"Ana\",\n \"PED-1024\",\n \"em transporte\"\n ]\n ]\n }\n }\n ]\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.omni.z-api.io/whatsapp/businesses/{wabaId}/templates/{templateId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"actualizacion_pedido_v1\",\n \"category\": \"UTILITY\",\n \"language\": \"es_ES\",\n \"components\": [\n {\n \"type\": \"BODY\",\n \"text\": \"Hola {{1}}, tu pedido {{2}} se ha actualizado a {{3}}.\",\n \"example\": {\n \"body_text\": [\n [\n \"Ana\",\n \"PED-1024\",\n \"em transporte\"\n ]\n ]\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.omni.z-api.io/whatsapp/businesses/{wabaId}/templates/{templateId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"actualizacion_pedido_v1\",\n \"category\": \"UTILITY\",\n \"language\": \"es_ES\",\n \"components\": [\n {\n \"type\": \"BODY\",\n \"text\": \"Hola {{1}}, tu pedido {{2}} se ha actualizado a {{3}}.\",\n \"example\": {\n \"body_text\": [\n [\n \"Ana\",\n \"PED-1024\",\n \"em transporte\"\n ]\n ]\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true
}{
"error": {
"timestamp": "2026-10-19T12:00:00Z",
"status": 422,
"errors": [
{
"description": "",
"name": "META_WHATSAPP_ERROR",
"message": "Tu mensaje no se puede enviar porque incluye contenido que otras personas en Facebook denunciaron como abusivo.",
"code": "368"
}
]
}
}{
"error": 401,
"message": "Unauthorized"
}{
"error": {
"errors": [
{
"code": "100",
"name": "META_WHATSAPP_ERROR",
"subCode": "2388024",
"message": "Invalid parameter",
"description": "There is already Portuguese (BR) content for this template. You can create a new template and try again."
}
]
}
}{
"error": "integration_unavailable",
"message": "The operation could not be completed right now. Try again in a few moments."
}{
"error": "outcome_unknown",
"message": "The operation did not finish in time and may still be completed. Check the result before trying again."
}Actualizar plantilla
Actualiza una plantilla existente y reenvíala a aprobación
curl --request PUT \
--url https://api.omni.z-api.io/whatsapp/businesses/{wabaId}/templates/{templateId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "actualizacion_pedido_v1",
"category": "UTILITY",
"language": "es_ES",
"components": [
{
"type": "BODY",
"text": "Hola {{1}}, tu pedido {{2}} se ha actualizado a {{3}}.",
"example": {
"body_text": [
[
"Ana",
"PED-1024",
"em transporte"
]
]
}
}
]
}
'import requests
url = "https://api.omni.z-api.io/whatsapp/businesses/{wabaId}/templates/{templateId}"
payload = {
"name": "actualizacion_pedido_v1",
"category": "UTILITY",
"language": "es_ES",
"components": [
{
"type": "BODY",
"text": "Hola {{1}}, tu pedido {{2}} se ha actualizado a {{3}}.",
"example": { "body_text": [["Ana", "PED-1024", "em transporte"]] }
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'actualizacion_pedido_v1',
category: 'UTILITY',
language: 'es_ES',
components: [
{
type: 'BODY',
text: 'Hola {{1}}, tu pedido {{2}} se ha actualizado a {{3}}.',
example: {body_text: [['Ana', 'PED-1024', 'em transporte']]}
}
]
})
};
fetch('https://api.omni.z-api.io/whatsapp/businesses/{wabaId}/templates/{templateId}', 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://api.omni.z-api.io/whatsapp/businesses/{wabaId}/templates/{templateId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'actualizacion_pedido_v1',
'category' => 'UTILITY',
'language' => 'es_ES',
'components' => [
[
'type' => 'BODY',
'text' => 'Hola {{1}}, tu pedido {{2}} se ha actualizado a {{3}}.',
'example' => [
'body_text' => [
[
'Ana',
'PED-1024',
'em transporte'
]
]
]
]
]
]),
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://api.omni.z-api.io/whatsapp/businesses/{wabaId}/templates/{templateId}"
payload := strings.NewReader("{\n \"name\": \"actualizacion_pedido_v1\",\n \"category\": \"UTILITY\",\n \"language\": \"es_ES\",\n \"components\": [\n {\n \"type\": \"BODY\",\n \"text\": \"Hola {{1}}, tu pedido {{2}} se ha actualizado a {{3}}.\",\n \"example\": {\n \"body_text\": [\n [\n \"Ana\",\n \"PED-1024\",\n \"em transporte\"\n ]\n ]\n }\n }\n ]\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.omni.z-api.io/whatsapp/businesses/{wabaId}/templates/{templateId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"actualizacion_pedido_v1\",\n \"category\": \"UTILITY\",\n \"language\": \"es_ES\",\n \"components\": [\n {\n \"type\": \"BODY\",\n \"text\": \"Hola {{1}}, tu pedido {{2}} se ha actualizado a {{3}}.\",\n \"example\": {\n \"body_text\": [\n [\n \"Ana\",\n \"PED-1024\",\n \"em transporte\"\n ]\n ]\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.omni.z-api.io/whatsapp/businesses/{wabaId}/templates/{templateId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"actualizacion_pedido_v1\",\n \"category\": \"UTILITY\",\n \"language\": \"es_ES\",\n \"components\": [\n {\n \"type\": \"BODY\",\n \"text\": \"Hola {{1}}, tu pedido {{2}} se ha actualizado a {{3}}.\",\n \"example\": {\n \"body_text\": [\n [\n \"Ana\",\n \"PED-1024\",\n \"em transporte\"\n ]\n ]\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true
}{
"error": {
"timestamp": "2026-10-19T12:00:00Z",
"status": 422,
"errors": [
{
"description": "",
"name": "META_WHATSAPP_ERROR",
"message": "Tu mensaje no se puede enviar porque incluye contenido que otras personas en Facebook denunciaron como abusivo.",
"code": "368"
}
]
}
}{
"error": 401,
"message": "Unauthorized"
}{
"error": {
"errors": [
{
"code": "100",
"name": "META_WHATSAPP_ERROR",
"subCode": "2388024",
"message": "Invalid parameter",
"description": "There is already Portuguese (BR) content for this template. You can create a new template and try again."
}
]
}
}{
"error": "integration_unavailable",
"message": "The operation could not be completed right now. Try again in a few moments."
}{
"error": "outcome_unknown",
"message": "The operation did not finish in time and may still be completed. Check the result before trying again."
}Conceptos
Actualiza una plantilla existente y la reenvía a la aprobación de Meta. El body es el mismo que se utiliza al crear la plantilla.PENDING hasta que Meta la revise de nuevo.templateId se obtiene a través del endpoint Listar plantillas.Autorizaciones
Secret Key generada en el panel de Seguridad de Omni Z-API
Parámetros de ruta
ID de la WABA (obtenido con Listar WABAs)
"428083093730937"
ID de la plantilla (obtenido con Listar plantillas)
"1900296177408890"
Cuerpo
Nombre de la plantilla: minúsculas, números y guion bajo. No se puede cambiar después de creada.
512^[a-z0-9_]+$Varios tipos tienen categoría fija. Ver "Tipos de plantilla".
UTILITY, MARKETING, AUTHENTICATION Idioma en el formato de Meta, como pt_BR o en_US.
Sintaxis de las variables. Nombrado es el formato actual de Meta.
NAMED, POSITIONAL Validez del envío en segundos. Rango por categoría: autenticación 30 a 900, marketing 43200 a 2592000, utility 30 a 43200. El valor -1 es un atajo de 30 días.
Permite que Meta recategorice la plantilla en la revisión.
Nombre del modelo en la biblioteca de Meta. Ver "Template Library".
Ajustes de cuerpo que acepta el modelo de la biblioteca.
Show child attributes
Show child attributes
Datos de los botones del modelo de la biblioteca.
Show child attributes
Show child attributes
Cada ítem es un componente, identificado por el campo type. Los campos de abajo pertenecen a un type específico, y lo que acepta cada tipo de plantilla está en "Tipos de plantilla".
Show child attributes
Show child attributes
Respuesta
Plantilla editada correctamente
Indica si la operación se realizó correctamente