---
title: "[BETA] read cached presence for a chat without subscribing"
method: POST
path: "/instances/{id}/client/action/get-chat-presence-snapshot"
tags: ["chat"]
---

# \[BETA\] read cached presence for a chat without subscribing

`POST /instances/{id}/client/action/get-chat-presence-snapshot`

## Request

- Base URL: `https://waapi.app/api/v1`
- URL: `https://waapi.app/api/v1/instances/{id}/client/action/get-chat-presence-snapshot`
- Auth: HTTP bearer

Returns the locally cached presence for a chat without triggering a new subscription. Returns null if the chat has never been subscribed (via get-chat-presence) during the current session. Use get-chat-presence instead if you want to enable continuous tracking. Note: This endpoint is currently in beta and may change without notice.

## Path parameters

- `id` integer, required

## Request body

- object
  - `chatId` string, required: Chat ID <countrycode_short><usernumber>@c.us or @g.us for groups

## Response `200`

Request reached the instance. `data.status` reports whether the action was carried out; on error `data` carries `message` and `explanation`. Payload: Cached presence (may be null).

- object
  - `data` union: The action's outcome. `status: success` carries the payload; `status: error` is an `actionError`.
    - object
      - `status` 'success', required: Whether the instance carried the action out — the authoritative field. In this branch it is always `success`; when the instance refused the action the whole `data` object is an `actionError` with `status: error`, `message` and `explanation`.
      - `instanceId` union
        - integer
        - string
      - `data` object
        - `presence` ChatPresence: Presence state of a chat. Returned by get-chat-presence action and included in presence_update webhook events. Null fields carry semantic meaning — read the field descriptions before interpreting them.
          - `id` string: Serialized chat id this presence refers to.
          - `isGroup` boolean: Whether this presence refers to a group chat.
          - `isOnline` boolean: Whether the contact (or any group member) is currently online. For groups this is an aggregate across all members.
          - `chatstate` 'available' | 'typing' | 'recording_audio' | 'unavailable', nullable: Current typing/recording state. Null for group chats — use typingParticipants and recordingParticipants instead. The service auto-reverts typing/recording to available/unavailable after ~25 seconds of inactivity, which produces a second presence_update event.
          - `lastSeen` integer, nullable: Unix timestamp (seconds) of when the contact was last seen. Only populated when chatstate is 'unavailable' AND deny is false. Null in all other cases — do not interpret null as 'never seen'.
          - `deny` boolean: True when the peer has explicitly blocked last-seen visibility for this account. Typing/online state may still be visible — deny only affects lastSeen.
          - `typingParticipants` string[]: Group chats only. Serialized JIDs of members currently typing. Empty for 1:1 chats.
          - `recordingParticipants` string[]: Group chats only. Serialized JIDs of members currently recording audio. Empty for 1:1 chats.
          - `hasData` boolean: False means subscription is active but the service has not yet pushed any state. Do NOT interpret hasData:false as 'offline' — it means 'unknown'.
          - `isSubscribed` boolean: Whether this chat is currently subscribed to presence updates.
    - ActionError: Shape of `data` when the instance refused the action. HTTP status is still 200 and the outer `status` is still `success`.
      - `status` 'error', required
      - `message` string
      - `explanation` string
      - `instanceId` union
        - integer
        - string
  - `links` object
    - `self` string
  - `status` 'success' | 'error': Whether the request reached the instance. `success` here does **not** mean the action was carried out — that is reported by `data.status`, which is the authoritative one. A malformed input arrives as `status: success` with `data.status: error`.

## Other responses

- `401`: Unauthorized — invalid or missing bearer token
- `403`: Forbidden — insufficient permissions or account blocked
- `404`: Not found — instance does not exist or does not belong to you
- `409`: Conflict — instance is not ready
- `422`: Validation error — invalid or missing request parameters
- `429`: Too many requests — rate limit exceeded

---

[API](https://skmtc.dev/waapi/apis/waapi-api-2.md) · [All operations](https://skmtc.dev/waapi/apis/waapi-api-2/llms.txt) · [OpenAPI document](https://skmtc.dev/waapi/apis/waapi-api-2/revisions/490302f75576?raw)
