> ## Documentation Index
> Fetch the complete documentation index at: https://dev.docs.1to1ai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Enviar mensaje

> Envía un mensaje: texto, media, respuesta rápida o plantilla

<Info>
  **Endpoint** · `POST /conversation/actions`
</Info>

Envía un mensaje. Cada acción manda **un solo tipo de contenido**: texto, media, una respuesta rápida o una plantilla. Un texto, media o respuesta rápida puede además llevar una plantilla de *fallback* para cuando la ventana de 24h esté cerrada (ver abajo).

<Tabs>
  <Tab title="Texto">
    ```jsonc theme={null}
    {
      "type": "send_message",
      "body": "Hola 👋"
    }
    ```

    Texto plano, hasta 4096 caracteres.
  </Tab>

  <Tab title="Media">
    ```jsonc theme={null}
    {
      "type": "send_message",
      "file_uuid": "7b8a1c2d-3e4f-5678-90ab-cdef12345678",
      "body": "Tu comprobante 📄"
    }
    ```

    El `file_uuid` viene del flujo de [Subir multimedia](/es/action-groups/upload-media). El
    `body` es un caption opcional; el audio no admite caption.
  </Tab>

  <Tab title="Respuesta rápida">
    ```jsonc theme={null}
    {
      "type": "send_message",
      "quick_reply": { "name": "Bienvenida" }
    }
    ```

    Identifica la respuesta rápida por `name` (sin distinguir mayúsculas).
  </Tab>

  <Tab title="Plantilla">
    ```jsonc theme={null}
    {
      "type": "send_message",
      "template": {
        "name": "confirmacion_cita",
        "language": "es_MX",
        "body_variables": [{ "index": 1, "value": "Ana" }]
      }
    }
    ```

    `language` es **obligatorio** (formato Meta `lower_UPPER`, ej. `es_MX`). Para
    plantillas con header de media, ver [Subir multimedia](/es/action-groups/upload-media).
  </Tab>
</Tabs>

<Note>
  **Fallback de plantilla.** Un `send_message` de texto, media o respuesta rápida
  puede incluir además un `template` opcional: si al ejecutarse la [ventana de
  24h](/es/conversations) está **cerrada**, se envía la plantilla en vez del
  primario (fuera de la ventana solo se pueden enviar plantillas); si está
  abierta, se envía el primario. Sin `template`, un primario con la ventana
  cerrada falla con `WINDOW_CLOSED`.
</Note>

**Combinaciones válidas:**

| Combinación          | Campos                                                  | Qué se envía                                                         |
| -------------------- | ------------------------------------------------------- | -------------------------------------------------------------------- |
| Texto                | `body`                                                  | El texto (requiere ventana abierta)                                  |
| Media                | `file_uuid` + `body` opcional                           | La media con caption (requiere ventana abierta)                      |
| Respuesta rápida     | `quick_reply`                                           | La respuesta rápida (requiere ventana abierta)                       |
| Plantilla            | `template`                                              | La plantilla (también con la ventana cerrada)                        |
| Primario + plantilla | `body` \| `file_uuid` \| `quick_reply` **+** `template` | El primario si la ventana está abierta; la plantilla si está cerrada |

<CodeGroup>
  ```jsonc Texto + plantilla theme={null}
  {
    "type": "send_message",
    "body": "Hola 👋",
    "template": {
      "name": "recordatorio",
      "language": "es_MX"
    }
  }
  ```

  ```jsonc Media + plantilla theme={null}
  {
    "type": "send_message",
    "file_uuid": "7b8a1c2d-3e4f-5678-90ab-cdef12345678",
    "body": "Tu comprobante 📄",
    "template": {
      "name": "recordatorio",
      "language": "es_MX"
    }
  }
  ```

  ```jsonc Respuesta rápida + plantilla theme={null}
  {
    "type": "send_message",
    "quick_reply": { "name": "Bienvenida" },
    "template": {
      "name": "recordatorio",
      "language": "es_MX"
    }
  }
  ```
</CodeGroup>

La media de cada lado es independiente: la del primario en `file_uuid`, la del
header de la plantilla en `template.header.file_uuid`; la de una respuesta rápida
va configurada en la respuesta rápida misma.

En una lista, este objeto va en el array `actions` de un `POST /conversation/actions` — ver [Armar una lista de acciones](/es/action-groups/overview#armar-una-lista-de-acciones).

## Ejemplo ejecutable

Un `send_message` sobre una conversación identificada por teléfono y canal. Cada
acción manda **un solo tipo de contenido**; un primario (texto, media o quick
reply) puede además llevar una **plantilla de fallback** para cuando la ventana
de 24h esté cerrada.

### Request

<CodeGroup>
  ```bash Texto theme={null}
  curl -X POST "https://app.1to1.ai/api/v1/public/{slug}/conversation/actions" \
    -H "Authorization: Bearer sk_1to1_tu_api_key" \
    -H "Content-Type: application/json" \
    -d '{
      "conversation": {
        "phone": "+5215512345678",
        "channel": "ch_7A9K2M4Q"
      },
      "actions": [
        {
          "type": "send_message",
          "body": "Hola 👋, ¿en qué te puedo ayudar?"
        }
      ]
    }'
  ```

  ```bash Media theme={null}
  curl -X POST "https://app.1to1.ai/api/v1/public/{slug}/conversation/actions" \
    -H "Authorization: Bearer sk_1to1_tu_api_key" \
    -H "Content-Type: application/json" \
    -d '{
      "conversation": {
        "phone": "+5215512345678",
        "channel": "ch_7A9K2M4Q"
      },
      "actions": [
        {
          "type": "send_message",
          "file_uuid": "7b8a1c2d-3e4f-5678-90ab-cdef12345678",
          "body": "Tu comprobante 📄"
        }
      ]
    }'
  ```

  ```bash Respuesta rápida theme={null}
  curl -X POST "https://app.1to1.ai/api/v1/public/{slug}/conversation/actions" \
    -H "Authorization: Bearer sk_1to1_tu_api_key" \
    -H "Content-Type: application/json" \
    -d '{
      "conversation": {
        "phone": "+5215512345678",
        "channel": "ch_7A9K2M4Q"
      },
      "actions": [
        {
          "type": "send_message",
          "quick_reply": { "name": "Bienvenida" }
        }
      ]
    }'
  ```

  ```bash Plantilla theme={null}
  curl -X POST "https://app.1to1.ai/api/v1/public/{slug}/conversation/actions" \
    -H "Authorization: Bearer sk_1to1_tu_api_key" \
    -H "Content-Type: application/json" \
    -d '{
      "conversation": {
        "phone": "+5215512345678",
        "channel": "ch_7A9K2M4Q"
      },
      "actions": [
        {
          "type": "send_message",
          "template": {
            "name": "confirmacion_cita",
            "language": "es_MX",
            "body_variables": [{ "index": 1, "value": "Ana" }]
          }
        }
      ]
    }'
  ```

  ```bash Texto + plantilla de fallback theme={null}
  curl -X POST "https://app.1to1.ai/api/v1/public/{slug}/conversation/actions" \
    -H "Authorization: Bearer sk_1to1_tu_api_key" \
    -H "Content-Type: application/json" \
    -d '{
      "conversation": {
        "phone": "+5215512345678",
        "channel": "ch_7A9K2M4Q"
      },
      "actions": [
        {
          "type": "send_message",
          "body": "Hola 👋",
          "template": {
            "name": "recordatorio",
            "language": "es_MX"
          }
        }
      ]
    }'
  ```

  ```bash Respuesta rápida + plantilla de fallback theme={null}
  curl -X POST "https://app.1to1.ai/api/v1/public/{slug}/conversation/actions" \
    -H "Authorization: Bearer sk_1to1_tu_api_key" \
    -H "Content-Type: application/json" \
    -d '{
      "conversation": {
        "phone": "+5215512345678",
        "channel": "ch_7A9K2M4Q"
      },
      "actions": [
        {
          "type": "send_message",
          "quick_reply": { "name": "Bienvenida" },
          "template": {
            "name": "recordatorio",
            "language": "es_MX"
          }
        }
      ]
    }'
  ```
</CodeGroup>

### Respuesta

`202 Accepted` — el grupo se aceptó y corre en **background**. El resultado real
por acción no viaja en la respuesta (se consulta después — ver [Cómo se ejecuta](/es/action-groups/overview#cómo-se-ejecuta)).

```json theme={null}
{
  "status": "processing",
  "actions_accepted": 1
}
```

<ResponseField name="status" type="string">
  Siempre `processing`: confirma que el grupo fue aceptado y está en ejecución.
</ResponseField>

<ResponseField name="actions_accepted" type="integer">
  Cuántas acciones del array se **admitieron** para ejecución — no cuántas
  tuvieron éxito.
</ResponseField>
