10. Chats#
GET/v1/instances/{instanceId}/chats#
Lista chats da instância.
Auth: Todos autenticados
Superadmins resolvem o tenant pelo instanceId; se a instância não existir
ou estiver removida, a resposta e 404 INSTANCE_NOT_FOUND em vez de erro
interno de tenant.
Query Parameters:
| Parametro | Tipo | Padrão | Descricao |
|---|---|---|---|
page |
int | 1 | Página |
limit |
int | 20 | Itens por página (max 100) |
Resposta 200:
{
"data": [
{
"jid": "554137984905@s.whatsapp.net",
"name": "Joao",
"profile_pic_url": "https://media.catcher.one/.../avatars/554137984905.jpg",
"last_message": {
"id": "3EB0ABC123",
"content": "Ola!",
"type": "text",
"timestamp": "2026-03-07T12:00:00Z",
"from_me": false
}
}
],
"total": 25,
"page": 1,
"limit": 20
}
GET/v1/instances/{instanceId}/chats/{chatId}#
Retorna detalhes de um chat especifico, incluindo informações do contato.
Auth: Todos autenticados
Resposta 200:
{
"jid": "554137984905@s.whatsapp.net",
"name": "Joao Silva",
"is_group": false,
"pinned": false,
"archived": false,
"unread_count": 0,
"contact_info": {
"jid": "554137984905@s.whatsapp.net",
"push_name": "Joao Silva",
"business_name": "",
"full_name": "Joao Silva",
"first_name": "Joao",
"status": "Hey there!",
"picture_id": "122207890",
"picture_url": "https://media.catcher.one/.../avatars/554137984905.jpg"
}
}
Os campos do nivel raiz vem de ChatInfo; os nomes/avatar/status do contato ficam no objeto aninhado contact_info. description aparece no raiz apenas quando disponível.
GET/v1/instances/{instanceId}/chats/{chatId}/messages#
Lista mensagens de um chat com paginação.
Auth: Todos autenticados
Query Parameters:
| Parametro | Tipo | Padrão | Descricao |
|---|---|---|---|
page |
int | 1 | Página |
limit |
int | 20 | Itens por página (max 100) |
Resposta 200:
{
"data": [
{
"id": 1,
"instance_id": "84c2e480-...",
"direction": "inbound",
"remote_jid": "554137984905@s.whatsapp.net",
"message_type": "text",
"content": "Ola!",
"status": "delivered",
"whatsapp_id": "3EB0ABC123",
"created_at": "2026-03-07T12:00:00Z",
"updated_at": "2026-03-07T12:00:00Z",
"media_id": "",
"quoted_msg_id": "",
"queued_at": null,
"sent_at": "2026-03-07T12:00:01Z",
"delivered_at": "2026-03-07T12:00:02Z",
"read_at": null,
"failed_at": null,
"fail_reason": ""
}
],
"total": 50,
"page": 1,
"limit": 20
}
GET/v1/instances/{instanceId}/message/{messageId}#
Busca uma mensagem especifica pelo UUID do Catcher (elemento de message_ids nos eventos) ou pelo whatsapp_id (ID do WhatsApp, ex: 3EB0ABC123). A API tenta os dois campos automaticamente.
Retorna o estado final da mensagem no banco do Catcher — já aplicadas as edicoes (content reflete a última versão), revogacoes (status=deleted, is_deleted=true), e recibos (timestamps de delivered_at / read_at / played_at). Usar este endpoint e o caminho canonico para um consumidor reconstruir o estado atual de uma mensagem sem precisar agregar todos os eventos de webhook.
Auth: Todos autenticados
Parametros de URL:
| Parametro | Descricao |
|---|---|
instanceId |
ID da instância |
messageId |
UUID do Catcher (elemento de message_ids do evento) ou whatsapp_id (ex: 3EB0ABC123) |
Resposta 200:
{
"id": 42,
"external_id": "550e8400-e29b-41d4-a716-446655440000",
"message_id": "550e8400-e29b-41d4-a716-446655440000",
"whatsapp_id": "3EB0ABC123DEF456",
"instance_id": "84c2e480-...",
"direction": "inbound",
"remote_jid": "120363025555555555@g.us",
"chat": "120363025555555555@g.us",
"phone": "120363025555555555",
"is_group": true,
"is_deleted": false,
"sender_jid": "554137984905@s.whatsapp.net",
"message_type": "audio",
"content": "",
"status": "played",
"source": "phone",
"media_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"media": {
"id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"mime_type": "audio/ogg; codecs=opus",
"file_name": "voice.ogg",
"file_size": 34567,
"download_url": "/v1/instances/84c2e480-.../media/b2c3d4e5-...",
"info_url": "/v1/instances/84c2e480-.../media/b2c3d4e5-.../info",
"created_at": "2026-03-07T12:00:00Z"
},
"quoted_msg_id": "f1a2b3c4-d5e6-7890-abcd-ef1234567890",
"quoted_wa_msg_id": "3EB0AAA111BBB222",
"queued_at": null,
"sent_at": null,
"delivered_at": "2026-03-07T12:00:02Z",
"read_at": "2026-03-07T12:00:10Z",
"played_at": "2026-03-07T12:00:15Z",
"deleted_at": null,
"failed_at": null,
"fail_reason": "",
"created_at": "2026-03-07T12:00:00Z",
"updated_at": "2026-03-07T12:00:15Z"
}
Campos da resposta:
| Campo | Tipo | Descricao |
|---|---|---|
external_id / message_id |
string | UUID Catcher (v4). Identificador canonico estável — use este para correlacionar com eventos de webhook (no payload aparece como elemento de message_ids). external_id e o nome histórico; message_id e o alias retornado nesta resposta sincrona. |
whatsapp_id |
string | ID hex do WhatsApp. Util para cross-reference com logs do WhatsApp mas pode ser reciclado entre mensagens — não use como chave primaria |
instance_id |
string | Instância origem |
direction |
string | inbound ou outbound |
remote_jid / chat |
string | JID da conversa (DM: <phone>@s.whatsapp.net, grupo: <id>@g.us) |
phone |
string | Telefone extraido do chat (vazio em grupos) |
is_group |
bool | true se a conversa e um grupo |
is_deleted |
bool | true se a mensagem foi revogada (status=deleted) |
sender_jid |
string | JID de quem enviou (em grupos, diferente do chat; em DMs geralmente igual) |
message_type |
string | text, image, video, audio, document, sticker, location, contact, reaction, poll, template, forward, live_location |
content |
string | Conteúdo atual (já reflete edicoes). Para reactions contem o emoji |
status |
string | queued, sent, delivered, read, played, failed, deleted |
source |
string | api (enviado via Catcher), external (enviado por outro aparelho/WhatsApp Web), phone (recebido) |
media_id |
string | UUID da mídia anexa (quando houver) |
media |
object | Objeto inline com metadata completa da mídia (veja abaixo). Presente apenas quando ha mídia. Evita chamada extra |
quoted_msg_id |
string | UUID Catcher da mensagem sendo respondida. Vazio se a mensagem citada não estiver no banco do Catcher (ex: reply antigo) |
quoted_wa_msg_id |
string | Hex original do WhatsApp da mensagem citada (legado / cross-reference) |
queued_at / sent_at / delivered_at / read_at / played_at / failed_at / deleted_at |
datetime | Timestamps do ciclo de vida. played_at so para view-once/audio PTT |
fail_reason |
string | Mensagem de erro se status=failed |
created_at / updated_at |
datetime | Metadata do registro |
Objeto media inline:
| Campo | Tipo | Descricao |
|---|---|---|
id |
string | UUID da mídia |
mime_type |
string | MIME (ex: image/jpeg, audio/ogg; codecs=opus) |
file_name |
string | Nome original (se houver) |
file_size |
int | Tamanho em bytes |
download_url |
string | Path para baixar o binario (GET /v1/instances/{instanceId}/media/{mediaId}) |
info_url |
string | Path para o endpoint de metadata (GET /v1/instances/{instanceId}/media/{mediaId}/info) |
created_at |
datetime | Quando foi armazenada |
expires_at |
datetime | Opcional — TTL da mídia em S3 (null se permanente) |
Dica:
message_ide sempre o UUID Catcher — o mesmo que aparece emmessage_idsnos eventos de webhook.whatsapp_ide o hex do protocolo WhatsApp e pode ser reciclado apósdelete for everyone(lesson #22 no CLAUDE.md). Use sempremessage_idcomo chave primaria no seu banco.
Erros:
| Status | Descricao |
|---|---|
| 404 | Mensagem não encontrada para está instância |
POST/v1/instances/{instanceId}/chats/{chatId}/action#
Executa uma ação em um chat.
Auth: Todos autenticados
Request:
{
"action": "pin",
"duration": 604800
}
| Campo | Tipo | Obrigatório | Descricao |
|---|---|---|---|
action |
string | sim | Ação: archive, unarchive, pin, unpin, mute, unmute, clear |
duration |
int64 | não | Duração em segundos (para mute) |
Resposta 200:
{
"status": "applied",
"action": "pin",
"chat_id": "554137984905@s.whatsapp.net",
"instance_id": "84c2e480-..."
}
POST/v1/instances/{instanceId}/mark-read#
Marca mensagens como lidas.
Auth: Todos autenticados
Request:
{
"chat_jid": "554137984905@s.whatsapp.net",
"message_ids": ["3EB0ABC123", "3EB0DEF456"]
}
Ou para marcar todas:
{
"chat_jid": "554137984905@s.whatsapp.net",
"mark_all": true
}
| Campo | Tipo | Obrigatório | Descricao |
|---|---|---|---|
chat_jid |
string | sim | JID do chat |
message_ids |
[]string | não | IDs das mensagens a marcar |
mark_all |
bool | não | Marcar todas como lidas |
Resposta 200:
Quando mark_all = false (ou omitido):
{
"instance_id": "84c2e480-...",
"marked_read": 2
}
Quando mark_all = true:
{
"instance_id": "84c2e480-...",
"chat_jid": "554137984905@s.whatsapp.net",
"marked_all": true
}
POST/v1/instances/{instanceId}/mark-unread#
Marca uma conversa como não lida. O efeito e sincronizado com todos os dispositivos WhatsApp conectados (aparece o badge azul de "não lido").
Auth: Todos autenticados
Request:
{
"chat_jid": "554137984905@s.whatsapp.net"
}
| Campo | Tipo | Obrigatório | Descricao |
|---|---|---|---|
chat_jid |
string | sim | JID do chat a marcar como não lido |
Resposta 200:
{
"instance_id": "84c2e480-...",
"chat_jid": "554137984905@s.whatsapp.net",
"marked_unread": true
}