> ## 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 um bot do Typebot existente na instância

**Auth:** `TokenAccount` ou `TokenInstance` • **Rate-limit:** `Global` (100/min) • **Idempotente:** sim

## Descrição

Edita um bot do Typebot **já existente**, identificado pelo `botId`. A edição é **parcial**: só os campos enviados no body são alterados; os demais **mantêm o valor atual**. A cada mudança a RyzeAPI (re)ativa a integração da instância.

<Note>
  Para **criar** um bot novo use [`POST /api/typebot/set/:instance`](/pt/api/typebot/set). Este endpoint só edita bots existentes, se o `botId` não pertencer à instância, retorna **`404`** `bot not found for this instance`.
</Note>

<Warning>
  **Prioridade e unicidade** continuam valendo: alterar `enabled`, `triggerType` ou `(triggerOperator, triggerValue)` de um bot pode conflitar com outro bot já habilitado (um único bot `all`; `keyword` únicos por `(operator, value)`), devolvendo `400`. A `typebotUrl`, se enviada, deve apontar para um Typebot **publicado** (viewer); o `/` final é removido.
</Warning>

## Exemplo

Editando **apenas** `enabled` e `expireMinutes` (os demais campos permanecem como estavam):

<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>
  Envie apenas os campos que quer mudar. Para trocar o gatilho de um bot, por exemplo, basta enviar `botId` + `triggerType` (e `triggerOperator`/`triggerValue`, se `keyword`); o resto do bot fica intacto.
</Tip>

## Resposta de sucesso

```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-27T11:58:03Z",
    "created_at": "2026-07-20T09:00:00Z",
    "updated_at": "2026-07-27T12:00:00Z"
  }
}
```

| Campo     | Descrição                                                                                          |
| --------- | -------------------------------------------------------------------------------------------------- |
| `success` | `true` em caso de sucesso.                                                                         |
| `message` | Mensagem fixa de confirmação (`typebot bot updated`).                                              |
| `bot`     | O bot com o estado **já atualizado**. Veja todos os campos em [listar bots](/pt/api/typebot/list). |

## Parâmetros de rota

<ParamField path="instance" type="string" required>
  Nome da instância (ex.: `suporte`).
</ParamField>

## Headers

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

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

## Request body

<ParamField body="botId" type="string" required>
  UUID do bot a editar, obtido em [`GET /api/typebot/list/:instance`](/pt/api/typebot/list). Único campo obrigatório.
</ParamField>

<ParamField body="typebotUrl" type="string">
  URL do Typebot **publicado** (viewer). Precisa ser uma URL válida. O `/` final é removido.
</ParamField>

<ParamField body="triggerType" type="string">
  Como o bot é acionado: `all` ou `keyword`. Ao mudar para `keyword`, envie também `triggerOperator` + `triggerValue`.
</ParamField>

<ParamField body="triggerOperator" type="string">
  Operador do gatilho: `contains`, `equals`, `startsWith`, `endsWith`, `regex`. **Obrigatório se** `triggerType` for `keyword`.
</ParamField>

<ParamField body="triggerValue" type="string">
  Palavra ou expressão do gatilho. **Obrigatória se** `triggerType` for `keyword`.
</ParamField>

<ParamField body="enabled" type="boolean">
  Ativa ou desativa o bot no roteamento.
</ParamField>

<ParamField body="description" type="string">
  Rótulo do bot no painel.
</ParamField>

<ParamField body="expireMinutes" type="integer">
  Expira a sessão por inatividade após N minutos. `0` = nunca expira.
</ParamField>

<ParamField body="expireMessage" type="string">
  Mensagem enviada ao usuário quando a sessão expira.
</ParamField>

<ParamField body="keywordFinish" type="string">
  Palavra que, enviada pelo usuário, finaliza o bot imediatamente.
</ParamField>

<ParamField body="finishMessage" type="string">
  Despedida enviada quando o bot é finalizado pela `keywordFinish`.
</ParamField>

<ParamField body="typingDelayMs" type="integer">
  Delay do indicador "digitando..." antes de cada resposta, em milissegundos.
</ParamField>

<ParamField body="stopBotFromMe" type="boolean">
  Se `true`, o bot é pausado naquela conversa quando o operador responde manualmente.
</ParamField>

<ParamField body="debounceSeconds" type="integer">
  Junta fragmentos enviados pelo cliente por N segundos antes de processar.
</ParamField>

<ParamField body="ignoreGroups" type="boolean">
  Se `true`, mensagens de grupo não acionam o bot.
</ParamField>

<ParamField body="noStartFromMe" type="boolean" default="false">
  Se `true`, o bot não inicia sozinho quando **você** começou a conversa. Quando você envia a primeira mensagem e o contato responde, o bot não dispara. A janela de reativação reaproveita `expireMinutes` (contada a partir da sua primeira mensagem; `0` = permanente).
</ParamField>

<ParamField body="keepOpen" type="boolean" default="false">
  Se `true`, ao terminar o fluxo a conversa fica aberta em vez de encerrar. O bot fica em silêncio (não reinicia) e a sessão só encerra pela `keywordFinish` ou manualmente, aparecendo com status `held`.
</ParamField>

## Erros

| HTTP | `error.message`                                                               | Causa                                                                                             |
| :--: | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
|  400 | `invalid body: ...`                                                           | Body malformado, `botId` ausente, `typebotUrl` inválida ou `triggerType` fora de `all`/`keyword`. |
|  400 | `triggerOperator and triggerValue are required when triggerType is 'keyword'` | Mudança para `keyword` sem operador/valor.                                                        |
|  400 | `this instance already has an enabled 'all' trigger bot`                      | A edição habilitaria um segundo bot `all` (unicidade).                                            |
|  400 | `another enabled bot already uses this trigger operator+value`                | A edição colidiria com outro bot `keyword` habilitado com o mesmo `(operator, value)`.            |
|  404 | `instance not found`                                                          | Instância não existe na RyzeAPI.                                                                  |
|  404 | `bot not found for this instance`                                             | O `botId` informado não existe nesta instância.                                                   |
|  500 | `update bot: ...`                                                             | Falha de persistência local ou na (re)ativação da integração.                                     |
|  503 | `integration gateway not configured`                                          | Serviço de integração indisponível no servidor.                                                   |

### Exemplo de payload de erro

`botId` inexistente na instância:

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

## Próximo

<CardGroup cols={2}>
  <Card title="Listar bots" icon="list" href="/pt/api/typebot/list">
    Confira o estado atualizado dos bots da instância.
  </Card>

  <Card title="Cadastrar bot" icon="robot" href="/pt/api/typebot/set">
    Crie um bot novo com `POST /api/typebot/set/:instance`.
  </Card>

  <Card title="Sessões ao vivo" icon="comments" href="/pt/api/typebot/sessions">
    Liste e controle as conversas em andamento do bot.
  </Card>

  <Card title="Remover bot" icon="trash" href="/pt/api/typebot/delete">
    Remova um bot (ou todos) com `DELETE /api/typebot/delete/:instance`.
  </Card>
</CardGroup>
