/regras-comentarioCriar regra de comentário
Nasce desligada, a menos que mande ativo: true. Informe post_id: sem ele a regra vale para todas as publicações. A primeira regra que combinar com o comentário vale. Até 200 regras por organização (422 limite_de_regras). Com tipo: "seguir" ("Seguir para receber") a pessoa precisa seguir a conta para receber o conteúdo: mande resposta_privada e seguir.conteudo.texto; o resto de seguir tem padrão (422 seguir_invalido se algum campo passar do limite). Sem tipo, a regra é comum. qualquer_comentario, botoes (inclusive botões de link) e tipo: "seguir" dão 403 recurso_desligado se não estiverem liberados. Mande Idempotency-Key para repetir com segurança.
POST /regras-comentario
curl -X POST "https://chat.forsi.com.br/api/v1/regras-comentario" \
-H "Authorization: Bearer $FORSI_CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: pedido-4821" \
-d '{
"nome": "Quero o preço",
"conexao_id": "54b27747-86c2-455a-91a4-c0c02d0bd891",
"post_id": "17912345678901234",
"palavras": ["preço","valor"],
"modo": "contem",
"responder_publico": "Te mandei os detalhes no direct!",
"resposta_privada": "Oi! Aqui estão os valores e como agendar.",
"botoes": [
"Falar com atendente",
{"titulo":"Agendar","url":"https://exemplo.com.br/agendar"}
],
"ativo": true
}'const resposta = await fetch('https://chat.forsi.com.br/api/v1/regras-comentario', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.FORSI_CHAVE}`,
'Content-Type': 'application/json',
'Idempotency-Key': 'pedido-4821',
},
body: JSON.stringify({
"nome": "Quero o preço",
"conexao_id": "54b27747-86c2-455a-91a4-c0c02d0bd891",
"post_id": "17912345678901234",
"palavras": ["preço","valor"],
"modo": "contem",
"responder_publico": "Te mandei os detalhes no direct!",
"resposta_privada": "Oi! Aqui estão os valores e como agendar.",
"botoes": [
"Falar com atendente",
{"titulo":"Agendar","url":"https://exemplo.com.br/agendar"}
],
"ativo": true
}),
});
const json = await resposta.json();
if (!resposta.ok) throw new Error(`${resposta.status} ${json.erro.codigo}: ${json.erro.mensagem}`);
console.log(json.dados);import os
import requests
resposta = requests.post(
"https://chat.forsi.com.br/api/v1/regras-comentario",
headers={
"Authorization": f"Bearer {os.environ['FORSI_CHAVE']}",
"Idempotency-Key": "pedido-4821",
},
json={
"nome": "Quero o preço",
"conexao_id": "54b27747-86c2-455a-91a4-c0c02d0bd891",
"post_id": "17912345678901234",
"palavras": ["preço", "valor"],
"modo": "contem",
"responder_publico": "Te mandei os detalhes no direct!",
"resposta_privada": "Oi! Aqui estão os valores e como agendar.",
"botoes": [
"Falar com atendente",
{
"titulo": "Agendar",
"url": "https://exemplo.com.br/agendar",
},
],
"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"]){
"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"
}
}Corpo da requisição#
JSON. Mande com Content-Type: application/json.
nomestringobrigatórioNome da regra, só para você identificar.
- até 80 caracteres
conexao_iduuidobrigatórioConta do Instagram (GET /instagram/contas).
post_idstring ou nullopcionalId da publicação. null = vale para qualquer publicação (não recomendado: responde em todos os posts).
palavraslista de stringopcionalAté 30 palavras. Vazio só com
qualquer_comentario: true.modo"contem" | "igual"opcionalcontem: o comentário tem a palavra.igual: o comentário é só a palavra.qualquer_comentariobooleanopcionaltrue = dispara em qualquer comentário, sem palavras. Precisa estar liberado na organização.
responder_publicostring ou nullopcionalResposta pública ao comentário (até 2200 caracteres).
respostas_publicaslista de stringopcionalVariações da resposta pública (até 5), sorteadas a cada comentário. Precisa de
responder_publico.ocultar_aposbooleanopcionalOculta o comentário depois de responder. Precisa de
responder_publico.resposta_privadastring ou nullopcionalMensagem direta enviada a quem comentou (até 1000 caracteres).
automacao_iduuid ou nullopcionalAutomação a iniciar com a resposta privada (GET /automacoes?gatilho=comentario). Precisa de
resposta_privada.botoeslista de string ou objectopcionalAté 3 botões na mensagem direta. Cada botão é um texto (devolve o toque) ou
{ titulo, url? }; comurl(https) abre o link. Se a Meta recusar os botões nessa resposta, a mensagem sai só com texto e os links entram no fim do texto. Precisa deresposta_privadae de estar liberado na organização.ativobooleanopcionalLiga ou desliga a regra. Ao criar, o padrão é false.
tipo"comum" | "seguir"opcionalcomum(padrão): responde e manda a mensagem.seguir: o conteúdo só é entregue a quem segue a conta; vejaseguir. No tiposeguirnão useautomacao_idnembotoes.seguirobjectopcionalConfiguração do tipo
seguir. Campos omitidos usam o padrão. Sóconteudo.textoé obrigatório. Precisa deresposta_privada(até 640 caracteres) e estar liberado na organização (403recurso_desligado).seguir.botao_receberstringopcionalTexto do botão que vai junto da mensagem do comentário. 1 a 20 caracteres, sem variáveis (o banco recusa "{"). Padrão: "Quero receber".
seguir.texto_nao_seguestringopcionalMensagem para quem pediu e ainda não segue a conta. 1 a 640 caracteres. Padrão: "Para receber, é só seguir o perfil @{conta} e depois tocar em "Estou seguindo".". Aceita {nome}, {usuario} e {conta}.
seguir.botao_estou_seguindostringopcionalTexto do botão para avisar que passou a seguir. 1 a 20 caracteres, sem variáveis (o banco recusa "{"). Padrão: "Estou seguindo".
seguir.texto_ainda_nao_seguestringopcionalMensagem quando a pessoa toca em "Estou seguindo" e ainda não segue. 1 a 640 caracteres. Padrão: "Ainda não apareceu que você segue @{conta}. Siga o perfil e toque de novo em "Estou seguindo".". Aceita {nome}, {usuario} e {conta}.
seguir.texto_ja_seguestringopcionalMensagem antes do conteúdo para quem já seguia. 0 a 640 caracteres. Padrão: "Que bom ter você por aqui! Aqui está o que você pediu:". Vazio ("") = não envia este texto, só o conteúdo. Aceita {nome}, {usuario} e {conta}.
seguir.texto_seguiu_depoisstringopcionalMensagem antes do conteúdo para quem acabou de seguir. 0 a 640 caracteres. Padrão: "Obrigado por seguir! Aqui está o que você pediu:". Vazio ("") = não envia este texto, só o conteúdo. Aceita {nome}, {usuario} e {conta}.
seguir.conteudoobjectobrigatórioO que é entregue quando a pessoa segue: texto e, se quiser, um botão de link. Obrigatório para o tipo
seguir.seguir.max_tentativasinteger ou nullopcionalQuantas vezes conferir se a pessoa passou a seguir (1 a 50). Padrão: null = confere até seguir, no máximo 50 vezes.
seguir.texto_limitestring ou nullopcional—seguir.se_nao_verificar"enviar" | "pedir_de_novo"opcionalSe a Meta não deixar conferir:
enviar(padrão) entrega o conteúdo assim mesmo;pedir_de_novopede para seguir outra vez.
Resposta#
201 com {"dados": ...}: RegraComentario.
iduuidopcional—nomestringopcional—ativobooleanopcional—conexao_iduuidopcional—post_idstring ou nullopcional—palavraslista de stringopcional—modo"contem" | "igual"opcional—qualquer_comentariobooleanopcional—automacao_iduuid ou nullopcional—automacaostring ou nullopcionalNome da automação.
responder_publicostring ou nullopcional—resposta_privadastring ou nullopcional—respostas_publicaslista de stringopcional—ocultar_aposbooleanopcional—botoeslista de stringopcional—botoes_detalhelista de objectopcionalOs mesmos botões com o link:
urlnão aparece no botão que só devolve o toque.botoes_detalhe[].titulostringopcional—botoes_detalhe[].urlstringopcional—tipo"comum" | "seguir"opcionalcomumouseguir("Seguir para receber"). Regras antigas sãocomum.seguirobject ou nullopcionalSó no tipo
seguir: completo, com os padrões aplicados. Não aparece no tipocomum; dentro dele,conteudo.botao,max_tentativasetexto_limitetambém não aparecem enquanto forem null.seguir.botao_receberstringopcionalBotão da mensagem do comentário (1 a 20). Padrão: "Quero receber".
seguir.texto_nao_seguestringopcionalPara quem ainda não segue (1 a 640).
seguir.botao_estou_seguindostringopcionalBotão para avisar que passou a seguir (1 a 20). Padrão: "Estou seguindo".
seguir.texto_ainda_nao_seguestringopcionalQuando toca em "Estou seguindo" e ainda não segue (1 a 640).
seguir.texto_ja_seguestringopcionalAntes do conteúdo, para quem já seguia (0 a 640; "" = não envia).
seguir.texto_seguiu_depoisstringopcionalAntes do conteúdo, para quem acabou de seguir (0 a 640; "" = não envia).
seguir.conteudoobjectopcionalO que é entregue.
seguir.max_tentativasinteger ou nullopcionalnull = confere até seguir (no máximo 50 vezes).
- mín. 1
seguir.texto_limitestring ou nullopcionalEnviada uma vez quando as tentativas acabam (1 a 640).
seguir.se_nao_verificar"enviar" | "pedir_de_novo"opcionalQuando a Meta não deixa conferir. Padrão:
enviar.estatisticasobject ou nullopcionalSó no tipo
seguir. Contagem desde que a regra existe.estatisticas.pediramintegeropcionalPessoas que receberam o botão.
estatisticas.entreguesintegeropcionalPessoas que receberam o conteúdo.
estatisticas.ja_seguiamintegeropcionalJá seguiam ao pedir.
estatisticas.seguiram_depoisintegeropcionalPassaram a seguir depois de pedir.
estatisticas.aguardandointegeropcionalAinda esperando tocar ou seguir.
atualizado_emdata e hora ISO 8601opcional—execucoes_7dintegeropcionalDisparos nos últimos 7 dias.
ultima_emdata e hora ISO 8601 ou nullopcional—
Erros#
Todo erro vem como {"erro": {"codigo", "mensagem"}}. Trate pelo codigo: ele não muda.
| Status | Quando |
|---|---|
| 401 | Chave ausente ou inválida (resposta igual para qualquer motivo). |
| 403 | Plano sem API, escopo insuficiente ou https/origem recusados. |
| 409 | Conflito (repetido, Idempotency-Key com outro corpo). |
| 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 de erro que esta área pode devolver19
regra_inexistenteRegra de comentário não encontrada (veja GET /regras-comentario).regra_conexao_invalidaconexao_id precisa ser uma conta do Instagram conectada por login (veja GET /instagram/contas).regra_sem_palavrasInforme de 1 a 30 palavras, ou use qualquer_comentario: true.regra_modo_invalidomodo deve ser contem ou igual.regra_sem_acaoA regra precisa de uma resposta pública ou de uma resposta privada.regra_texto_longoTexto longo demais: resposta pública até 2200 caracteres e resposta privada até 1000.regra_variantes_demaisNo máximo 5 respostas_publicas.regra_extra_sem_publicorespostas_publicas e ocultar_apos só valem com responder_publico preenchido.regra_automacao_invalidaautomacao_id não é uma automação desta organização (veja GET /automacoes?gatilho=comentario).regra_automacao_sem_privadaPara ligar uma automação, preencha resposta_privada.regra_botao_longoCada botão tem no máximo 20 caracteres.regra_botao_repetidoBotões repetidos. Cada botão deve ser diferente.regra_botao_url_invalidaA url do botão deve ser um link https:// válido, com até 2000 caracteres.regra_botoes_demaisNo máximo 3 botões.regra_botoes_invalidosbotoes deve ser uma lista de textos ou de objetos { titulo, url }.regra_botoes_sem_privadaPara ter botões, preencha resposta_privada.recurso_desligadoEste recurso não está liberado para a sua organização.seguir_invalidoAlgum campo de `seguir` é inválido. A mensagem diz qual: textos de 1 a 640 caracteres (os de "já segue" e "seguiu depois" podem ser vazios), botões de 1 a 20 e sem `{` (botão não troca variáveis), cada texto até 900 bytes (emoji e acento contam mais), sem caractere de controle ou invisível, `max_tentativas` de 1 a 50 e link do conteúdo em https.limite_de_regrasLimite de 200 regras de comentário por organização. Apague alguma para criar outra.
Os erros que valem para qualquer rota (chave, limite, JSON) estão em Erros.