# GET /regras-comentario — Listar regras de comentário

- URL: `GET https://chat.forsi.com.br/api/v1/regras-comentario`
- Acesso: escopo `automacoes:ler` · módulos do plano: API + Automações
- Sucesso: `200`, `{"dados": ...}` com lista de `RegraComentario` (paginada por cursor)
- Página: https://docs.forsi.com.br/api/automacoes/listar-regras-comentario (Markdown: https://docs.forsi.com.br/api/automacoes/listar-regras-comentario.md)

Regras que respondem comentários do Instagram, paginado por cursor. Filtre por conta, publicação, estado ou `tipo` (`comum` ou `seguir`). Regras `seguir` trazem o bloco `seguir` completo e `estatisticas`.

**Parâmetros de consulta (query string)**

| Campo | Tipo | Obrigatório | Notas |
| --- | --- | --- | --- |
| `conexao_id` | uuid | não | Só as regras desta conta do Instagram. |
| `post_id` | string | não | Só as regras desta publicação. |
| `ativo` | "true" \| "false" | não | true ou false. |
| `tipo` | "comum" \| "seguir" | não | Só as regras deste tipo: `comum` ou `seguir`. |
| `limite` | integer | não | Itens por página (1 a 100, padrão 50). |
| `cursor` | string | não | O valor de `proximo` da página anterior. até 80 caracteres |

**Exemplo (curl)**

```bash
curl "https://chat.forsi.com.br/api/v1/regras-comentario?conexao_id=54b27747-86c2-455a-91a4-c0c02d0bd891&ativo=true" \
  -H "Authorization: Bearer $FORSI_CHAVE"
```

**JavaScript (fetch)**

```js
const resposta = await fetch('https://chat.forsi.com.br/api/v1/regras-comentario?conexao_id=54b27747-86c2-455a-91a4-c0c02d0bd891&ativo=true', {
  headers: {
    Authorization: `Bearer ${process.env.FORSI_CHAVE}`,
  },
});
const json = await resposta.json();
if (!resposta.ok) throw new Error(`${resposta.status} ${json.erro.codigo}: ${json.erro.mensagem}`);
console.log(json.dados);
```

**Python (requests)**

```python
import os
import requests

resposta = requests.get(
    "https://chat.forsi.com.br/api/v1/regras-comentario",
    headers={
        "Authorization": f"Bearer {os.environ['FORSI_CHAVE']}",
    },
    params={
        "conexao_id": "54b27747-86c2-455a-91a4-c0c02d0bd891",
        "ativo": "true",
    },
    timeout=30,
)
corpo = resposta.json()
if not resposta.ok:
    raise RuntimeError(f"{resposta.status_code} {corpo['erro']['codigo']}: {corpo['erro']['mensagem']}")
print(corpo["dados"])
```

**Resposta `200` (exemplo)**

```json
{
  "dados": [
    {
      "id": "cc23f373-2c83-42d6-83a7-c4e00ac10c39",
      "nome": "Maria Souza",
      "ativo": true,
      "conexao_id": "11908b04-f817-4068-afa6-896d3e1b7265",
      "post_id": "texto",
      "palavras": ["texto"],
      "modo": "contem",
      "qualquer_comentario": false,
      "automacao_id": "b6b1fba7-e2a3-4922-a365-70584a78e091",
      "automacao": "texto",
      "responder_publico": "texto",
      "resposta_privada": "texto",
      "respostas_publicas": ["texto"],
      "ocultar_apos": false,
      "botoes": ["texto"],
      "botoes_detalhe": [{"titulo":"Consulta de retorno","url":"https://seu-sistema.com.br/webhooks/forsi"}],
      "tipo": "comum",
      "seguir": {
        "botao_receber": "texto",
        "texto_nao_segue": "texto",
        "botao_estou_seguindo": "texto",
        "texto_ainda_nao_segue": "texto",
        "texto_ja_segue": "texto",
        "texto_seguiu_depois": "texto",
        "conteudo": {
          "texto": "Oi, queria remarcar minha consulta",
          "botao": {"titulo":"Consulta de retorno","url":"https://seu-sistema.com.br/webhooks/forsi"}
        },
        "max_tentativas": 12,
        "texto_limite": "texto",
        "se_nao_verificar": "enviar"
      },
      "estatisticas": {"pediram":12,"entregues":42,"ja_seguiam":12,"seguiram_depois":12,"aguardando":12},
      "atualizado_em": "2026-10-04T13:05:12.481Z",
      "execucoes_7d": 12,
      "ultima_em": "2026-10-04T13:05:12.481Z"
    }
  ],
  "proximo": "1791205512481_3791c08d-72dd-4002-89ff-1e14a11c07e5"
}
```

**Campos de `RegraComentario`**

| Campo | Tipo | Obrigatório | Notas |
| --- | --- | --- | --- |
| `id` | uuid | não |  |
| `nome` | string | não |  |
| `ativo` | boolean | não |  |
| `conexao_id` | uuid | não |  |
| `post_id` | string ou null | não |  |
| `palavras` | lista de string | não |  |
| `modo` | "contem" \| "igual" | não |  |
| `qualquer_comentario` | boolean | não |  |
| `automacao_id` | uuid ou null | não |  |
| `automacao` | string ou null | não | Nome da automação. |
| `responder_publico` | string ou null | não |  |
| `resposta_privada` | string ou null | não |  |
| `respostas_publicas` | lista de string | não |  |
| `ocultar_apos` | boolean | não |  |
| `botoes` | lista de string | não |  |
| `botoes_detalhe` | lista de object | não | Os mesmos botões com o link: `url` não aparece no botão que só devolve o toque. |
| `botoes_detalhe[].titulo` | string | não |  |
| `botoes_detalhe[].url` | string | não |  |
| `tipo` | "comum" \| "seguir" | não | `comum` ou `seguir` ("Seguir para receber"). Regras antigas são `comum`. |
| `seguir` | object ou null | não | Só no tipo `seguir`: completo, com os padrões aplicados. Não aparece no tipo `comum`; dentro dele, `conteudo.botao`, `max_tentativas` e `texto_limite` também não aparecem enquanto forem null. |
| `seguir.botao_receber` | string | não | Botão da mensagem do comentário (1 a 20). Padrão: "Quero receber". |
| `seguir.texto_nao_segue` | string | não | Para quem ainda não segue (1 a 640). |
| `seguir.botao_estou_seguindo` | string | não | Botão para avisar que passou a seguir (1 a 20). Padrão: "Estou seguindo". |
| `seguir.texto_ainda_nao_segue` | string | não | Quando toca em "Estou seguindo" e ainda não segue (1 a 640). |
| `seguir.texto_ja_segue` | string | não | Antes do conteúdo, para quem já seguia (0 a 640; "" = não envia). |
| `seguir.texto_seguiu_depois` | string | não | Antes do conteúdo, para quem acabou de seguir (0 a 640; "" = não envia). |
| `seguir.conteudo` | object | não | O que é entregue. |
| `seguir.max_tentativas` | integer ou null | não | null = confere até seguir (no máximo 50 vezes). mín. 1 |
| `seguir.texto_limite` | string ou null | não | Enviada uma vez quando as tentativas acabam (1 a 640). |
| `seguir.se_nao_verificar` | "enviar" \| "pedir_de_novo" | não | Quando a Meta não deixa conferir. Padrão: `enviar`. |
| `estatisticas` | object ou null | não | Só no tipo `seguir`. Contagem desde que a regra existe. |
| `estatisticas.pediram` | integer | não | Pessoas que receberam o botão. |
| `estatisticas.entregues` | integer | não | Pessoas que receberam o conteúdo. |
| `estatisticas.ja_seguiam` | integer | não | Já seguiam ao pedir. |
| `estatisticas.seguiram_depois` | integer | não | Passaram a seguir depois de pedir. |
| `estatisticas.aguardando` | integer | não | Ainda esperando tocar ou seguir. |
| `atualizado_em` | data e hora ISO 8601 | não |  |
| `execucoes_7d` | integer | não | Disparos nos últimos 7 dias. |
| `ultima_em` | data e hora ISO 8601 ou null | não |  |

**Erros**

- `401`: Chave ausente ou inválida (resposta igual para qualquer motivo).
- `403`: Plano sem API, escopo insuficiente ou https/origem recusados.
- `422`: Dados inválidos ou regra de negócio (ex.: janela_fechada; conta_restrita = a Meta restringiu a conta por spam: erro traz os campos de RestricaoMeta, como ate, escopo, motivo e retry_after_s).
- `429`: Limite de requisições. Veja Retry-After.
- Códigos comuns aqui: `regra_inexistente`, `regra_conexao_invalida`, `regra_sem_palavras`, `regra_modo_invalido`, `regra_sem_acao`, `regra_texto_longo`, `regra_variantes_demais`, `regra_extra_sem_publico`, `regra_automacao_invalida`, `regra_automacao_sem_privada`, `regra_botao_longo`, `regra_botao_repetido`, `regra_botao_url_invalida`, `regra_botoes_demais`, `regra_botoes_invalidos`, `regra_botoes_sem_privada`, `recurso_desligado`, `seguir_invalido`, `limite_de_regras`.

---

Página: https://docs.forsi.com.br/api/automacoes/listar-regras-comentario · Índice: https://docs.forsi.com.br/llms.txt · Tudo num arquivo: https://docs.forsi.com.br/llms-full.txt
