GET
/mensagens/{id}Ver uma mensagem
mensagens:ler
Inclusive o status atual (pendente, enviada, entregue, lida, falhou).
GET /mensagens/{id}
curl "https://chat.forsi.com.br/api/v1/mensagens/4e8cb5d0-2d89-4fc2-93bb-c8e5e17d4629" \
-H "Authorization: Bearer $FORSI_CHAVE"const resposta = await fetch('https://chat.forsi.com.br/api/v1/mensagens/4e8cb5d0-2d89-4fc2-93bb-c8e5e17d4629', {
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/mensagens/4e8cb5d0-2d89-4fc2-93bb-c8e5e17d4629",
headers={
"Authorization": f"Bearer {os.environ['FORSI_CHAVE']}",
},
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
}
]
}
}Parâmetros no caminho#
iduuidobrigatórioNo caminho da URL.
Resposta#
200 com {"dados": ...}: Mensagem.
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 devolver22
tipo_invalidotipo deve ser texto, imagem, video, audio, documento ou modelo.texto_vazioMensagem de texto precisa de texto.texto_longoTexto longo demais (máximo de 4096 caracteres).midia_invalidaLink de mídia inválido: use https com um endereço público.midia_indisponivelO arquivo desta mídia está indisponível.midia_baixandoO download desta mídia está na fila. Tente novamente após Retry-After.janela_fechadaA janela de 24 horas desta conversa está fechada. Na API oficial do WhatsApp, só um modelo aprovado reabre a conversa.conta_restritaA Meta restringiu esta conta do WhatsApp por spam. Nada foi enviado: erro.ate diz até quando (erro.retry_after_s e o cabeçalho Retry-After, em segundos), erro.escopo o que está barrado e erro.motivo o código. Quem administra pode desligar a trava em Configurações > API.caixa_obrigatoriaA organização tem mais de um WhatsApp conectado: informe caixa_id (veja GET /me).caixa_sem_conexaoNenhum WhatsApp conectado nesta caixa.caixa_inexistenteCaixa não encontrada (veja GET /me).canal_sem_iniciarEste canal não permite começar conversa por telefone. Use uma caixa de WhatsApp.modelo_sem_api_oficialModelos só saem pela API oficial do WhatsApp. Conecte a API oficial nesta caixa.modelo_inexistenteModelo não encontrado nesta caixa (veja GET /modelos).telefone_invalidoTelefone inválido. Mande com DDI e DDD.conversa_inexistenteConversa não encontrada.mensagem_inexistenteMensagem não encontrada.canal_oficial_indisponivelcanal "oficial": a API oficial do WhatsApp não está conectada nesta caixa. Nada foi enviado pelo QR.canal_oficial_sem_grupocanal "oficial": a API oficial do WhatsApp não envia para grupo. Use "qr" ou omita o campo.canal_qr_indisponivelcanal "qr": o WhatsApp por QR não está conectado nesta caixa. Nada foi enviado pela API oficial.canal_qr_sem_modelocanal "qr": modelos só saem pela API oficial do WhatsApp. Use "oficial" ou omita o campo.canal_so_whatsappcanal "oficial"/"qr" só vale em caixa de WhatsApp. Omita o campo (ou use "auto").
Os erros que valem para qualquer rota (chave, limite, JSON) estão em Erros.