# 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`:

**TypeScript**

```typescript
const msg = await bird.whatsapp.send({
  to: "+16505551234",
  from: "+13124495648",
  text: { body: "Your driver is 2 minutes away." },
});
console.log(msg.id, msg.status);
```

Examples: [TypeScript](/es-es/documentacion/guides/whatsapp/message-types/plain-text.ts.md) · [Python](/es-es/documentacion/guides/whatsapp/message-types/plain-text.py.md) · [Go](/es-es/documentacion/guides/whatsapp/message-types/plain-text.go.md) · [PHP](/es-es/documentacion/guides/whatsapp/message-types/plain-text.php.md) · [CLI](/es-es/documentacion/guides/whatsapp/message-types/plain-text.cli.md) · [MCP](/es-es/documentacion/guides/whatsapp/message-types/plain-text.mcp.md) · [cURL](/es-es/documentacion/guides/whatsapp/message-types/plain-text.curl.md)

La forma completa añade `preview_url` junto con los campos que cualquier envío libre puede incluir:

```json
{
  "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](/docs/guides/whatsapp/sending-whatsapp#quoting-a-message) 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`](/docs/api/errors/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](/docs/guides/whatsapp/receiving-whatsapp/plain-text) 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](/docs/guides/whatsapp/message-types#the-customer-service-window) 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](/docs/guides/whatsapp/message-types): la ventana de atención al cliente y el modelo que comparten todos los mensajes de servicio
- [Enviar mensajes de WhatsApp](/docs/guides/whatsapp/sending-whatsapp): la envoltura de la solicitud, el modelo `202` y los reintentos seguros
- [Mensajes interactivos](/docs/guides/whatsapp/message-types/interactive): cuando quieres un toque en lugar de una respuesta escrita

## Related resources

- [Connecting WhatsApp to Bird: from buying a number to a live channel](/learn/whatsapp/connecting-whatsapp-to-bird) (video)
- [What is the 24-hour customer service window on WhatsApp?](/explained/whatsapp/what-is-the-24-hour-customer-service-window) (answer)
- [WhatsApp message builder](/tools/whatsapp-message-builder) (tool)
- [WhatsApp](/products/whatsapp) (product)

[Get an implementation brief](/learn/workspace?topic=whatsapp)
