Mensajes de texto plano de WhatsApp
El texto plano es el tipo de contenido libre más simple: un cuerpo sin adjunto y una vista previa opcional del primer enlace que contenga.
Enviar un mensaje de texto
Configura text.body:
const msg = await bird.whatsapp.send({
to: "+16505551234",
from: "+13124495648",
text: { body: "Your driver is 2 minutes away." },
});
console.log(msg.id, msg.status);msg = client.whatsapp.send(
to="+16505551234",
from_="+13124495648",
text={"body": "Your driver is 2 minutes away."},
)
print(msg.id, msg.status)package main
import (
"context"
"fmt"
"log"
"os"
bird "github.com/messagebird/bird-sdk-go"
"github.com/messagebird/bird-sdk-go/option"
)
func main() {
client, err := bird.NewClient(option.WithAPIKey(os.Getenv("BIRD_API_KEY")))
if err != nil {
log.Fatal(err)
}
msg, err := client.Whatsapp.Send(context.Background(), bird.WhatsappSendParams{
To: "+16505551234",
From: "+13124495648",
Text: &bird.WhatsAppTextSend{Body: "Your driver is 2 minutes away."},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(msg.Id, *msg.Status)
}$text = (new WhatsAppMessageSendRequestText())
->setBody('Your driver is 2 minutes away.');
$message = $bird->whatsapp->send(
to: '+16505551234',
from: '+13124495648',
text: $text,
);
echo $message->getId(), ' ', $message->getStatus();bird whatsapp send \
--from +13124495648 \
--text 'Your driver is 2 minutes away.' \
--to +16505551234{
"name": "whatsapp_send",
"arguments": {
"from": "+13124495648",
"text": {
"body": "Your driver is 2 minutes away."
},
"to": "+16505551234"
}
}curl -X POST "https://us1.platform.bird.com/v1/whatsapp/messages" \
-H "Authorization: Bearer $BIRD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+16505551234",
"from": "+13124495648",
"text": {
"body": "Your driver is 2 minutes away."
}
}'La forma completa añade preview_url junto con los campos que cualquier envío libre puede incluir:
Ejemplo de código
{
"to": "+16505551234",
"from": "+13124495648",
"text": {
"body": "Your order shipped: https://example.com/track/A1B2C3",
"preview_url": true
},
"in_reply_to_message_id": "wam_01kya19eknftrs2s6p82asmvnh",
"tags": [{ "name": "category", "value": "shipping" }],
"metadata": { "order_id": "A1B2C3" }
}from es obligatorio en cada mensaje de servicio: un número que tu espacio de trabajo posee, no uno gestionado por Bird. in_reply_to_message_id cita un mensaje anterior en la misma conversación; consulta Citar un mensaje para saber contra qué se resuelve y qué puede omitir.
Límites
| Campo | Límite | Aplicado por |
|---|---|---|
| body | 1 a 4096 caracteres | Bird, en la aceptación (422) |
| preview_url | booleano, por defecto false | N/A, informativo |
Un body compuesto solo de espacios en blanco pasa la validación propia del esquema minLength: 1, pero Bird lo detecta igualmente: un body que queda vacío tras recortar espacios se rechaza con 422 E15015 WhatsAppContentRequired. Un cuerpo de más de 4096 caracteres se rechaza con un 422 simple y sin código de catálogo dedicado.
Leer un mensaje de texto entrante
Un mensaje de texto entrante incluye el mismo campo text.body y nada más en ese tipo. Consulta Recibir mensajes de texto de WhatsApp para la lectura entrante completa, el payload whatsapp.received y qué tener en cuenta.
Límites y casos especiales
- La ventana de atención al cliente debe estar abierta. El texto plano es un mensaje de servicio, entregable solo dentro de una ventana abierta; consulta la ventana de atención al cliente del hub.
- preview_url solo afecta al primer enlace, y solo a lo que el cliente del destinatario muestra. Por defecto es false. Actívalo para previsualizar la primera URL en body; una URL posterior en el mismo cuerpo nunca recibe vista previa. Si el cliente del destinatario no puede obtener una vista previa de ese enlace, recurre silenciosamente a un enlace clicable sin formato. Nada en la lectura te indica si la vista previa se renderizó realmente.
- El markdown de WhatsApp es el renderizado del cliente del destinatario de body, no parte del contrato de API. Bird pasa body sin modificar; no valida, elimina ni codifica *bold*, _italic_, ~strikethrough~ ni el monoespaciado con triple acento grave. Que esos marcadores se rendericen depende enteramente del cliente que abre el mensaje.
- No se garantiza que un body entrante sea no vacío, a pesar de lo que indica el esquema de lectura. Meta puede reportar un mensaje entrante como "text": {} o con un body vacío, y Bird lo almacena tal cual en lugar de generar un marcador de posición. Esta es una brecha conocida y abierta: no escribas un consumidor que confíe en el required: body del esquema aquí.
Próximos pasos
- Mensajes de servicio de WhatsApp: la ventana de atención al cliente y el modelo que comparten todos los mensajes de servicio
- Enviar mensajes de WhatsApp: la envoltura de la solicitud, el modelo 202 y los reintentos seguros
- Mensajes interactivos: cuando quieres un toque en lugar de una respuesta escrita
Recursos relacionados
Continúa con la documentación, guías y ejemplos sobre este tema. Los recursos están en inglés.
Ver la guíaConnecting WhatsApp to Bird: from buying a number to a live channelComprender el conceptoWhat is the 24-hour customer service window on WhatsApp?Usar la herramientaWhatsApp message builderExplorar la funcionalidadWhatsApp
Prueba el ejercicio y obtén un resumen de implementación