GET
/conversas/{id}/mensagensMensagens de uma conversa
mensagens:lerpaginada
Da mais nova para a mais antiga. Notas internas da equipe não aparecem.
GET /conversas/{id}/mensagens
curl "https://chat.forsi.com.br/api/v1/conversas/495a7cae-128c-4b66-adbc-807b3959c129/mensagens?limite=50" \
-H "Authorization: Bearer $FORSI_CHAVE"const resposta = await fetch('https://chat.forsi.com.br/api/v1/conversas/495a7cae-128c-4b66-adbc-807b3959c129/mensagens?limite=50', {
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);import os
import requests
resposta = requests.get(
"https://chat.forsi.com.br/api/v1/conversas/495a7cae-128c-4b66-adbc-807b3959c129/mensagens",
headers={
"Authorization": f"Bearer {os.environ['FORSI_CHAVE']}",
},
params={
"limite": "50",
},
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
{
"dados": [
{
"id": "4e8cb5d0-2d89-4fc2-93bb-c8e5e17d4629",
"conversa_id": "495a7cae-128c-4b66-adbc-807b3959c129",
"direcao": "entrada",
"tipo": "texto",
"texto": "Oi, queria remarcar minha consulta",
"estado": "pendente",
"erro": "Connection timed out",
"autor_tipo": "contato",
"responde_a_id": "ad52f13b-411d-4526-9d07-91f222c74891",
"id_whatsapp": "wamid.HBgNNTUzMTk4ODg4Nzc3NxUCABEYEjQ",
"enviada_em": "2026-10-04T13:05:12.481Z",
"criado_em": "2026-10-04T13:05:12.481Z",
"editada_em": "2026-10-04T13:05:12.481Z",
"apagada_em": "2026-10-04T13:05:12.481Z",
"pela_api": {"chave_id":"71c5c606-a9d7-4270-8891-45d783aa9b71"},
"modelo": "texto",
"midia": [
{
"id": "94ac725d-5a70-40b2-8fa6-cdd23a32ac85",
"mime": "image/jpeg",
"nome_arquivo": "foto.jpg",
"tamanho": 48213,
"duracao_s": 1.5
}
]
}
],
"proximo": "1791205512481_3791c08d-72dd-4002-89ff-1e14a11c07e5"
}Parâmetros no caminho#
iduuidobrigatórioNo caminho da URL.
Parâmetros de consulta#
limiteintegeropcionalItens por página (1 a 100, padrão 50).
cursorstringopcionalValor de
proximoda página anterior.- até 80 caracteres
Resposta#
200 com {"dados": ...}: uma lista de Mensagem, paginada por cursor (como paginar).
iduuidopcional—conversa_iduuidopcional—direcao"entrada" | "saida"opcional—tipostringopcional- ex.: texto
textostringopcional—estado"pendente" | "enviando" | "enviada" | "entregue" | "lida" | "tocada" | "falhou" | "recebida" | "nao_confirmado"opcionalnao_confirmado: a conexão caiu durante o envio e o WhatsApp não confirmou; a mensagem pode ter chegado. Não é reenviada sozinha.
errostringopcional—autor_tipo"contato" | "usuario" | "agente" | "sistema" | "celular"opcional—responde_a_iduuidopcional—id_whatsappstringopcional—enviada_emdata e hora ISO 8601opcional—criado_emdata e hora ISO 8601opcional—editada_emdata e hora ISO 8601opcional—apagada_emdata e hora ISO 8601opcional—pela_apiobjectopcional—pela_api.chave_iduuidopcional—modelostringopcionalNome do modelo, quando tipo = modelo.
midialista de objectopcional—midia[].iduuidopcional—midia[].mimestringopcional—midia[].nome_arquivostringopcional—midia[].tamanhointegeropcional—midia[].duracao_snumberopcional—
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. |
| 404 | Não existe nesta organização. |
| 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 devolver2
conversa_inexistenteConversa não encontrada.cursor_invalidoCursor inválido. Use o valor de "proximo" da página anterior.
Os erros que valem para qualquer rota (chave, limite, JSON) estão em Erros.