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

# Editar bot

> Edita parcialmente un bot de Typebot existente (solo los campos enviados cambian)

**Auth:** `TokenAccount` o `TokenInstance` • **Rate limit:** `Global` (100/min) • **Idempotente:** sí

## Descripción

Edita un bot de Typebot existente de la instancia. La edición es **parcial**: solo los campos que envías cambian; los que omites **mantienen su valor actual**. Identifica el bot con `botId` (obtenido en [`GET /api/typebot/list/:instance`](/es/api/typebot/list)). Con cada cambio, RyzeAPI activa la integración de la instancia.

<Note>
  Para **crear** un bot nuevo usa [`POST /api/typebot/set/:instance`](/es/api/typebot/set). Este endpoint solo edita bots ya existentes.
</Note>

<Note>
  **Prioridad de trigger**, cuando varias reglas pueden coincidir con el mismo mensaje, gana la más específica:

  ```
  equals > startsWith / endsWith > contains > regex > all
  ```

  **Unicidad**, cada instancia puede tener solo **un** bot `all` habilitado; los bots `keyword` son únicos por combinación de `(triggerOperator, triggerValue)`. Un cambio que provoque un conflicto devuelve `400`.
</Note>

## Ejemplo

Editando solo dos campos (`enabled` y `expireMinutes`); el resto del bot se mantiene igual:

<CodeGroup>
  ```bash cURL theme={null}
  curl -X PATCH "https://ryzeapi.cloud/api/typebot/update/suporte" \
    -H "token: $Token_Account" \
    -H "Content-Type: application/json" \
    -d '{
      "botId":         "8f3a1c2e-...-b7d9",
      "enabled":       false,
      "expireMinutes": 60
    }'
  ```

  ```javascript JavaScript theme={null}
  await fetch("https://ryzeapi.cloud/api/typebot/update/suporte", {
    method: "PATCH",
    headers: {
      "token":        process.env.Token_Account,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      botId:         "8f3a1c2e-...-b7d9",
      enabled:       false,
      expireMinutes: 60
    })
  });
  ```

  ```python Python theme={null}
  import os, requests

  requests.patch(
      "https://ryzeapi.cloud/api/typebot/update/suporte",
      headers={
          "token":        os.environ["Token_Account"],
          "Content-Type": "application/json"
      },
      json={
          "botId":         "8f3a1c2e-...-b7d9",
          "enabled":       False,
          "expireMinutes": 60
      }
  )
  ```

  ```go Go theme={null}
  package main

  import (
      "net/http"
      "os"
      "strings"
  )

  func main() {
      body := strings.NewReader(`{
          "botId":         "8f3a1c2e-...-b7d9",
          "enabled":       false,
          "expireMinutes": 60
      }`)
      req, _ := http.NewRequest("PATCH", "https://ryzeapi.cloud/api/typebot/update/suporte", body)
      req.Header.Set("token", os.Getenv("Token_Account"))
      req.Header.Set("Content-Type", "application/json")
      http.DefaultClient.Do(req)
  }
  ```
</CodeGroup>

<Tip>
  Envía solo el `botId` + los campos que quieres cambiar. Para cambiar un bot de `keyword` a `all` (o viceversa), envía `triggerType` junto con los campos de trigger correspondientes.
</Tip>

## Respuesta exitosa

```json 200 OK theme={null}
{
  "success": true,
  "message": "typebot bot updated",
  "bot": {
    "id": "8f3a1c2e-...-b7d9",
    "instance_id": "...",
    "enabled": false,
    "description": "Bot de orçamento",
    "typebot_url": "https://typebot.co/meu-bot-abc123",
    "trigger_type": "keyword",
    "trigger_operator": "contains",
    "trigger_value": "orçamento",
    "expire_minutes": 60,
    "expire_message": "Sessão encerrada por inatividade.",
    "keyword_finish": "sair",
    "finish_message": "Até logo! 👋",
    "typing_delay_ms": 1500,
    "stop_bot_from_me": true,
    "debounce_seconds": 6,
    "ignore_groups": true,
    "no_start_from_me": false,
    "keep_open": false,
    "active_sessions": 2,
    "last_activity_at": "2026-07-27T13:58:40Z",
    "created_at": "2026-07-20T09:12:00Z",
    "updated_at": "2026-07-27T14:05:22Z"
  }
}
```

| Campo     | Descripción                                                                                                     |
| --------- | --------------------------------------------------------------------------------------------------------------- |
| `success` | `true` cuando la operación tuvo éxito.                                                                          |
| `message` | Mensaje fijo de confirmación: `typebot bot updated`.                                                            |
| `bot`     | El bot ya actualizado, con todos sus campos. Consulta la lista completa en [listar bots](/es/api/typebot/list). |

## Parámetros de ruta

<ParamField path="instance" type="string" required>
  Nombre de la instancia (p. ej., `suporte`).
</ParamField>

## Cabeceras

<ParamField header="token" type="string" required>
  `TokenAccount` o `TokenInstance`.
</ParamField>

<ParamField header="Content-Type" type="string" required>
  `application/json`
</ParamField>

## Cuerpo de la solicitud

<ParamField body="botId" type="string" required>
  UUID del bot a editar, obtenido en [`GET /api/typebot/list/:instance`](/es/api/typebot/list).
</ParamField>

<ParamField body="typebotUrl" type="string">
  URL del Typebot **publicado** (viewer). Debe ser una URL válida. La `/` final se elimina.
</ParamField>

<ParamField body="triggerType" type="string">
  Cómo se acciona el bot: `all` o `keyword`. Si lo cambias a `keyword`, envía también `triggerOperator` + `triggerValue`.
</ParamField>

<ParamField body="triggerOperator" type="string">
  Operador del trigger: `contains`, `equals`, `startsWith`, `endsWith`, `regex`. Requerido si `triggerType` pasa a `keyword`.
</ParamField>

<ParamField body="triggerValue" type="string">
  Palabra o expresión del trigger. Requerida si `triggerType` pasa a `keyword`.
</ParamField>

<ParamField body="enabled" type="boolean">
  Si el bot está activo en el enrutamiento.
</ParamField>

<ParamField body="description" type="string">
  Etiqueta del bot en el panel (p. ej., `"Bot de orçamento"`).
</ParamField>

<ParamField body="expireMinutes" type="integer">
  Expira la sesión por inactividad tras N minutos. `0` = nunca expira.
</ParamField>

<ParamField body="expireMessage" type="string">
  Mensaje enviado al usuario cuando la sesión expira.
</ParamField>

<ParamField body="keywordFinish" type="string">
  Palabra que, enviada por el usuario, finaliza el bot de inmediato (p. ej., `"sair"`).
</ParamField>

<ParamField body="finishMessage" type="string">
  Despedida enviada cuando el bot se finaliza por la `keywordFinish`.
</ParamField>

<ParamField body="typingDelayMs" type="integer">
  Delay del indicador "escribiendo..." antes de cada respuesta, en milisegundos.
</ParamField>

<ParamField body="stopBotFromMe" type="boolean">
  Si es `true`, el bot se pausa en esa conversación cuando tú (el operador) respondes manualmente.
</ParamField>

<ParamField body="debounceSeconds" type="integer">
  Agrupa los fragmentos enviados por el cliente durante N segundos antes de procesar.
</ParamField>

<ParamField body="ignoreGroups" type="boolean">
  Si es `true`, los mensajes de grupo no accionan el bot.
</ParamField>

<ParamField body="noStartFromMe" type="boolean" default="false">
  Si es `true`, el bot no inicia solo cuando **tú** empezaste la conversación. Cuando envías el primer mensaje y el contacto responde, el bot no se dispara. La ventana de reactivación reutiliza `expireMinutes` (contada desde tu primer mensaje; `0` = permanente).
</ParamField>

<ParamField body="keepOpen" type="boolean" default="false">
  Si es `true`, al terminar el flujo la conversación permanece abierta en lugar de cerrarse. El bot permanece en silencio (no reinicia) y la sesión solo se cierra por `keywordFinish` o manualmente, apareciendo con estado `held`.
</ParamField>

## Errores

| HTTP | `error.message`                                                               | Causa                                                                                             |
| :--: | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
|  400 | `invalid body: ...`                                                           | Body malformado, `botId` ausente, `typebotUrl` inválida o `triggerType` fuera de `all`/`keyword`. |
|  400 | `triggerOperator and triggerValue are required when triggerType is 'keyword'` | Se cambió a `triggerType: "keyword"` sin operador/valor.                                          |
|  400 | `this instance already has an enabled 'all' trigger bot`                      | El cambio dejaría dos bots `all` habilitados (unicidad).                                          |
|  400 | `another enabled bot already uses this trigger operator+value`                | El cambio colisiona con otro bot `keyword` habilitado con el mismo `(operator, value)`.           |
|  404 | `instance not found`                                                          | La instancia no existe en RyzeAPI.                                                                |
|  404 | `bot not found for this instance`                                             | El `botId` indicado no existe en esta instancia.                                                  |
|  500 | `update bot: ...` / `activate typebot integration: ...`                       | Fallo de persistencia local o en la (re)activación de la integración.                             |
|  503 | `integration gateway not configured`                                          | Servicio de integración no disponible en el servidor.                                             |

### Ejemplo de payload de error

`botId` inexistente en la instancia:

```json theme={null}
{
  "success": false,
  "error": {
    "message": "bot not found for this instance"
  }
}
```

## Siguiente

<CardGroup cols={2}>
  <Card title="Listar bots" icon="list" href="/es/api/typebot/list">
    Descubre el `botId` a editar con `GET /api/typebot/list/:instance`.
  </Card>

  <Card title="Crear bot" icon="robot" href="/es/api/typebot/set">
    Registra un bot nuevo con `POST /api/typebot/set/:instance`.
  </Card>
</CardGroup>
