Enviar email desde plantilla
POST /notify/email-template toma la plantilla que ya guardó con nosotros y fusiona en ella las variables de una sola solicitud —un nombre, un monto, una fecha de vencimiento—, de modo que el HTML nunca vuelve a vivir dentro del código de su aplicación. Es el endpoint para equipos que envían la misma forma de mensaje cientos de veces al día con datos distintos cada vez.
El problema de tener HTML incrustado en el código
La mayoría de los equipos empieza concatenando cadenas de texto o inyectando datos en una plantilla en línea dentro de la propia aplicación, y funciona bien hasta que cambian tres cosas a la vez: el equipo de marketing quiere un pie de página nuevo, legal pide agregar un aviso, y un error de tipeo en la plantilla de confirmación de envío llega a producción porque nadie revisó ese texto. Guardar la plantilla de nuestro lado y llamarla por referencia saca el HTML por completo del pipeline de despliegue: un cambio de copy deja de requerir un cambio de código.
Cómo funciona la fusión en la práctica
Registra una plantilla una sola vez, con marcadores de posición dentro de ella, y luego llama a este endpoint con el identificador de la plantilla y un objeto plano de valores —customer_name, invoice_total, ship_date—, y el servicio completa los espacios y encola el envío. La llamada devuelve un task_id de inmediato; la fusión real y la entrega ocurren un momento después, con el resultado reportado mediante un webhook firmado o un enlace firmado válido por 24 horas.
Por qué la fusión de correo es más antigua de lo que parece
El mail-merge no es una idea nueva: es anterior a la web por décadas, y viene de las cartas modelo generadas a partir de un formato fijo y una lista de nombres. Lo que cambió es que la 'carta' ahora es HTML renderizado en decenas de clientes de correo inconsistentes entre sí, y la 'lista' es una llamada a una API disparada desde un checkout o un proceso de facturación en lugar de una hoja de cálculo. La mecánica es la misma; lo que se modernizó fue la tubería.
Consistencia a escala, sin revisión de diseño cada vez
Como el diseño vive en un solo lugar, cada factura, mensaje de bienvenida o actualización de envío se ve igual sin importar qué servicio de su sistema lo haya disparado. Esa consistencia importa más de lo que parece: un cliente que recibe tres correos visualmente distintos de la misma empresa en una semana empieza a sospechar que el tercero es un intento de phishing.
Su encaje dentro de flujos automatizados
Este endpoint combina naturalmente con cualquier sistema orientado a eventos —un consumidor de cola, un cron de facturación, un manejador de registros— porque quien llama solo necesita conocer el nombre de la plantilla y los datos, nunca el marcado. Una tarea fallida dispara tres reintentos automáticos y nunca se cobra, así que es seguro conectarla directo a flujos que corren sin supervisión.
Qué puede hacer con ella
Correos de factura recurrente
Un proceso de facturación fusiona el nombre del cliente, el monto y la fecha de vencimiento en una plantilla de factura guardada cada ciclo, sin que un desarrollador vuelva a tocar el diseño.
Secuencias de bienvenida
Un evento de registro dispara la plantilla de bienvenida con el nombre y los detalles del plan del usuario, manteniendo idéntico el correo de onboarding de la marca en cada camino de registro.
Actualizaciones de estado de envío
Un webhook de logística fusiona número de rastreo y transportista en la plantilla de envío en el momento en que un paquete cambia de estado.
Notificaciones en varios idiomas
El mismo evento llama a una plantilla guardada distinta según el idioma, manteniendo los nombres de las variables iguales mientras el texto y el diseño cambian según el idioma.
Preguntas frecuentes
¿Cómo registro una plantilla?
Guarda la plantilla con nosotros una sola vez, definiendo marcadores de posición dentro del HTML; después de eso, cada llamada a este endpoint solo referencia la plantilla y aporta los valores.
¿Hay una capa gratuita para probar plantillas?
No hay capa gratuita: las capas gratis se abusan y ralentizan a todos. El acceso funciona con un saldo prepago de ForHosting KIT: se recarga desde $10.00 (no caduca) y cada solicitud se cobra a su precio publicado, así que una llamada sin saldo devuelve HTTP 402. Sin suscripción, sin tokens ni créditos inventados, y una tarea fallida no se cobra.
¿Cuánto cuesta?
$0.002 por solicitud más $0.0035 por correo enviado, igual que un envío estándar: usar plantillas no agrega costo extra.
¿Puedo usar lógica condicional dentro de una plantilla?
La plantilla acepta marcadores de posición con nombre que se fusionan con los valores que envía; consulte la documentación de la plantilla para la sintaxis exacta admitida.
¿Qué pasa si omito una variable requerida?
La solicitud se valida antes de encolar el envío, así que una variable requerida faltante devuelve un error claro en vez de enviar un correo incompleto.
¿Cómo obtengo el resultado del envío?
La llamada devuelve un task_id de inmediato, y el resultado de la entrega llega por un webhook firmado o un enlace firmado válido por 24 horas.
¿Es distinto al endpoint de email simple?
Sí: el endpoint simple recibe el cuerpo completo en la solicitud, mientras que este referencia una plantilla guardada y solo envía las variables a fusionar en ella.
¿Puedo actualizar una plantilla sin redesplegar mi aplicación?
Esa es la ventaja principal: la plantilla vive de nuestro lado, así que editar su diseño o su texto nunca requiere un cambio de código ni un despliegue.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, y pronto desde nuestra app, el email y Telegram.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/notify/email-template \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"input":"…"}'const res = await fetch("https://api.kit.forhosting.com/notify/email-template", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"input": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/notify/email-template",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"input": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/notify/email-template", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"input":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"input":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/notify/email-template", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"input": "…"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "notify.email_template",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |