---
title: "Send- and receive-side health for this connection"
method: GET
path: "/connections/{phoneNumber}/health"
tags: ["Connections"]
---

# Send- and receive-side health for this connection

`GET /connections/{phoneNumber}/health`

## Request

- Base URL: `http://localhost:3025`
- URL: `http://localhost:3025/connections/{phoneNumber}/health`
- Auth: API key in header `x-api-key`

Whether this connection is actually able to send and to receive, which POST /connections cannot tell you: that path only does a presence update, which does not touch the keystore and therefore passes while sends are wedged. `sendState` is `unknown` when no send has been observed yet — a connection nobody writes to can be stalled and still look perfect, so this never claims health it has not seen. `receiveState` is `stalled` when the socket has been open for 2 minutes and WhatsApp has not finished delivering the queue it held for this device: the socket sends, but no messages or receipts arrive. The API does not recreate the socket on its own for that state.

## Path parameters

- `phoneNumber` string, required

## Response `200`

Send- and receive-side health snapshot

- object
  - `data` object
    - `connected` boolean
    - `sendState` 'unknown' | 'ok' | 'degraded' | 'stalled': 'unknown' means no send has been observed on this connection yet
    - `receiveState` 'pending' | 'ok' | 'stalled': 'pending' until WhatsApp finishes delivering the offline queue to the current socket (receivedPendingNotifications), 'ok' once it has, 'stalled' when the socket has been open for 2 minutes without it. 'pending' while the socket is not open.
    - `openForMs` integer, nullable: How long the current socket has been open; null when it is not open. Resets when the socket is replaced.
    - `consecutiveSendTimeouts` integer
    - `lastTrafficAgoMs` integer, nullable: Age of the last message-level traffic, inbound or outbound. Stays fresh on inbound traffic alone, so it does NOT prove sending works.
    - `lastSendCompletedAgoMs` integer, nullable: Age of the last send that completed, i.e. the keystore mutex was free
    - `lastOutgoingAckAgoMs` integer, nullable: Age of the last WhatsApp acknowledgement of one of our messages — the only end-to-end proof that sending works

## Other responses

- `403`: Forbidden — the API key does not own this connection. Returned when a connection is bound to a different API key.
- `404`: Phone number not connected
- `421`: Misdirected Request — in cluster mode, this instance does not own the connection. The owning instance id is in the x-baileys-owner header; a proxy re-routes the request there. Not returned for the explicit-takeover routes: POST /connections/{phoneNumber}, /import-session and /restart.

## Changes

- **2026-11-05** `322af11b310e`: 2 info
  - added the optional property `data/openForMs` to the response with the `200` status
  - added the optional property `data/receiveState` to the response with the `200` status
- **2026-08-23** `5299037901a9`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/fazer-ai/apis/fazer-ai-baileys-api/changes/connections/:phoneNumber/health/get.md)

---

[API](https://skmtc.dev/fazer-ai/apis/fazer-ai-baileys-api.md) - [All operations](https://skmtc.dev/fazer-ai/apis/fazer-ai-baileys-api/llms.txt) - [OpenAPI document](https://skmtc.dev/fazer-ai/apis/fazer-ai-baileys-api/revisions/322af11b310e?raw)
