curl --request POST \
--url https://api-prod.studio.getsupervisor.ai/v1/message-templates \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"channel": "whatsapp",
"name": "promo_verano",
"body": "Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo.",
"metadata": {
"category": "marketing",
"language": "es_MX",
"footer": "Responde STOP para no recibir más mensajes."
}
}
'import requests
url = "https://api-prod.studio.getsupervisor.ai/v1/message-templates"
payload = {
"channel": "whatsapp",
"name": "promo_verano",
"body": "Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo.",
"metadata": {
"category": "marketing",
"language": "es_MX",
"footer": "Responde STOP para no recibir más mensajes."
}
}
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({
channel: 'whatsapp',
name: 'promo_verano',
body: JSON.stringify('Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo.'),
metadata: {
category: 'marketing',
language: 'es_MX',
footer: 'Responde STOP para no recibir más mensajes.'
}
})
};
fetch('https://api-prod.studio.getsupervisor.ai/v1/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://api-prod.studio.getsupervisor.ai/v1/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([
'channel' => 'whatsapp',
'name' => 'promo_verano',
'body' => 'Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo.',
'metadata' => [
'category' => 'marketing',
'language' => 'es_MX',
'footer' => 'Responde STOP para no recibir más mensajes.'
]
]),
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-prod.studio.getsupervisor.ai/v1/message-templates"
payload := strings.NewReader("{\n \"channel\": \"whatsapp\",\n \"name\": \"promo_verano\",\n \"body\": \"Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo.\",\n \"metadata\": {\n \"category\": \"marketing\",\n \"language\": \"es_MX\",\n \"footer\": \"Responde STOP para no recibir más mensajes.\"\n }\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://api-prod.studio.getsupervisor.ai/v1/message-templates")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"channel\": \"whatsapp\",\n \"name\": \"promo_verano\",\n \"body\": \"Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo.\",\n \"metadata\": {\n \"category\": \"marketing\",\n \"language\": \"es_MX\",\n \"footer\": \"Responde STOP para no recibir más mensajes.\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-prod.studio.getsupervisor.ai/v1/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 \"channel\": \"whatsapp\",\n \"name\": \"promo_verano\",\n \"body\": \"Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo.\",\n \"metadata\": {\n \"category\": \"marketing\",\n \"language\": \"es_MX\",\n \"footer\": \"Responde STOP para no recibir más mensajes.\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "abc123",
"channel": "whatsapp",
"name": "promo_verano",
"category": "marketing",
"status": "pending",
"language": "es_MX",
"body": "Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo."
}{
"code": "WHATSAPP_TEMPLATE_INVALID_NAME",
"message": "Template name is invalid after normalization"
}{
"code": "WHATSAPP_CREDENTIALS_NOT_CONFIGURED",
"message": "WhatsApp credentials not configured for this workspace"
}Crear un message template
Crea un nuevo message template en Kapso usando variables nombradas (parameter_format: NAMED).
Las variables se declaran por nombre en el body, ej. {{nombre}}, y no requieren orden.
Si el workspace no tiene credenciales Kapso devuelve 409.
curl --request POST \
--url https://api-prod.studio.getsupervisor.ai/v1/message-templates \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"channel": "whatsapp",
"name": "promo_verano",
"body": "Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo.",
"metadata": {
"category": "marketing",
"language": "es_MX",
"footer": "Responde STOP para no recibir más mensajes."
}
}
'import requests
url = "https://api-prod.studio.getsupervisor.ai/v1/message-templates"
payload = {
"channel": "whatsapp",
"name": "promo_verano",
"body": "Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo.",
"metadata": {
"category": "marketing",
"language": "es_MX",
"footer": "Responde STOP para no recibir más mensajes."
}
}
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({
channel: 'whatsapp',
name: 'promo_verano',
body: JSON.stringify('Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo.'),
metadata: {
category: 'marketing',
language: 'es_MX',
footer: 'Responde STOP para no recibir más mensajes.'
}
})
};
fetch('https://api-prod.studio.getsupervisor.ai/v1/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://api-prod.studio.getsupervisor.ai/v1/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([
'channel' => 'whatsapp',
'name' => 'promo_verano',
'body' => 'Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo.',
'metadata' => [
'category' => 'marketing',
'language' => 'es_MX',
'footer' => 'Responde STOP para no recibir más mensajes.'
]
]),
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-prod.studio.getsupervisor.ai/v1/message-templates"
payload := strings.NewReader("{\n \"channel\": \"whatsapp\",\n \"name\": \"promo_verano\",\n \"body\": \"Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo.\",\n \"metadata\": {\n \"category\": \"marketing\",\n \"language\": \"es_MX\",\n \"footer\": \"Responde STOP para no recibir más mensajes.\"\n }\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://api-prod.studio.getsupervisor.ai/v1/message-templates")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"channel\": \"whatsapp\",\n \"name\": \"promo_verano\",\n \"body\": \"Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo.\",\n \"metadata\": {\n \"category\": \"marketing\",\n \"language\": \"es_MX\",\n \"footer\": \"Responde STOP para no recibir más mensajes.\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-prod.studio.getsupervisor.ai/v1/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 \"channel\": \"whatsapp\",\n \"name\": \"promo_verano\",\n \"body\": \"Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo.\",\n \"metadata\": {\n \"category\": \"marketing\",\n \"language\": \"es_MX\",\n \"footer\": \"Responde STOP para no recibir más mensajes.\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "abc123",
"channel": "whatsapp",
"name": "promo_verano",
"category": "marketing",
"status": "pending",
"language": "es_MX",
"body": "Hola {{nombre}}, tu descuento del {{porcentaje}}% ya está activo."
}{
"code": "WHATSAPP_TEMPLATE_INVALID_NAME",
"message": "Template name is invalid after normalization"
}{
"code": "WHATSAPP_CREDENTIALS_NOT_CONFIGURED",
"message": "WhatsApp credentials not configured for this workspace"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Identificador del workspace multi-tenant. Obligatorio al autenticar con Authorization: Bearer, donde su ausencia devuelve 400 Workspace context is required. Con x-api-key es opcional: la llave ya identifica a su workspace y lo que mandes aquí se ignora.
Body
Payload para crear un nuevo message template en Kapso.
Canal de mensajería. Actualmente solo whatsapp.
whatsapp Nombre del template. Se normaliza a snake_case antes de enviarse a Kapso.
1 - 512Cuerpo del mensaje. Las variables se nombran en snake_case minúscula, ej. {{nombre}}; no requieren orden.
1 - 1024Metadatos específicos de WhatsApp para la creación del template.
Show child attributes
Show child attributes
Response
Template creado en Kapso
Representación de un message template registrado en Kapso.
Identificador del template en Kapso.
Canal de mensajería del template.
whatsapp Nombre normalizado del template (snake_case, solo letras, números y guiones bajos).
Categoría del template según la clasificación de WhatsApp Business API.
utility, marketing, authentication Estado de aprobación del template (ej. approved, pending, rejected).
Código de idioma del template (ej. es_MX, es_ES).
Texto del cuerpo del template. Las variables se representan con nombre, ej. {{nombre}}.
