> ## 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.

# Canales

> Lista los canales del negocio y su clave pública

<Info>
  **Endpoint** · `GET /channels`
</Info>

<Note>
  Endpoint de **solo consulta**: devuelve información y no modifica nada. No se manda dentro del array `actions` — se llama directo.
</Note>

Devuelve los canales activos del negocio, cada uno con su **clave pública** (`key`, con prefijo `ch_`). Esa clave es el dato que más vas a usar de toda la API: el campo `channel` de la referencia de conversación es **obligatorio en todas las acciones** de `POST /conversation/actions`, y también se acepta como filtro opcional en varios endpoints de consulta.

Empieza por esta página: lista los canales una vez, guarda la clave del canal con el que vas a trabajar y reutilízala en cada request. También puedes copiarla del dashboard en **Configuración → Canales**, campo **Clave de canal**.

**Parámetros**

* Este endpoint **no acepta parámetros de consulta**. Devuelve la lista completa, sin paginar.
* `{slug}` — identificador del negocio en la ruta (**obligatorio**).
* `Authorization: Bearer <clave>` — cabecera de autenticación (**obligatoria**).

### Respuesta

```json theme={null}
{
  "data": [
    {
      "key": "ch_7A9K2M4Q",
      "name": "WhatsApp Ventas",
      "type": "whatsapp",
      "is_tester": false
    },
    {
      "key": "ch_3F5T8B1Z",
      "name": "WhatsApp Pruebas",
      "type": "whatsapp",
      "is_tester": true
    }
  ]
}
```

<ResponseField name="data" type="array" required>
  Lista completa de canales activos. Los canales eliminados no aparecen.
</ResponseField>

<ResponseField name="data[].key" type="string" required>
  Clave pública del canal (`ch_...`). Es el valor que se pasa como `channel`.
</ResponseField>

<ResponseField name="data[].name" type="string" required>
  Nombre del canal tal como se ve en el dashboard.
</ResponseField>

<ResponseField name="data[].type" type="string" required>
  Tipo de canal, por ejemplo `whatsapp`.
</ResponseField>

<ResponseField name="data[].is_tester" type="boolean" required>
  `true` si es el canal de pruebas del negocio. Útil para no mandar tráfico real a un canal de test.
</ResponseField>

### Ejemplo

Es una lectura: el `GET` no crea, no modifica ni borra nada. Su único efecto es darte la clave que después vas a poner en `channel` al ejecutar una acción.

```bash theme={null}
curl -X GET "https://app.1to1.ai/api/v1/public/{slug}/channels" \
  -H "Authorization: Bearer sk_1to1_tu_api_key"
```

Con la clave en mano, ya puedes identificar una conversación en cualquier acción:

```jsonc theme={null}
{
  "conversation": {
    "phone": "+5215512345678",
    "channel": "ch_7A9K2M4Q"
  },
  "actions": [{ "type": "mark_resolved" }]
}
```

**Errores**

| Código HTTP | Código                    | Cuándo ocurre                                                 |
| ----------- | ------------------------- | ------------------------------------------------------------- |
| `401`       | `INVALID_API_TOKEN`       | Clave ausente, mal formada o no válida.                       |
| `403`       | `TOKEN_BUSINESS_MISMATCH` | El `{slug}` de la ruta no corresponde al negocio de la clave. |
| `429`       | `RATE_LIMIT_EXCEEDED`     | Límite de peticiones excedido. Reintenta según `Retry-After`. |
| `500`       | `UNKNOWN_ERROR`           | Error inesperado del servidor.                                |

Detalle completo en [Errores](/es/errors).

Una clave de canal inexistente no falla aquí, sino en el request que la usa: la acción responde `404` (`CHANNEL_NOT_FOUND`). Para ver dónde entra `channel` dentro de un grupo de acciones, ver [Acciones — Resumen](/es/action-groups/overview); para el orden de resolución de una conversación, ver [Identificar una conversación](/es/conversations).
