---
title: "Check account health"
method: GET
path: "/v1/accounts/{accountId}/health"
tags: ["Accounts"]
---

# Check account health

`GET /v1/accounts/{accountId}/health`

Returns detailed health info for a specific account including token status, permissions, and recommendations.

For WhatsApp accounts the response also includes `platformConnection`, a live probe of the
Meta link behind the channel (the same read as `GET /v1/whatsapp/number-info`). The OAuth
token can be perfectly valid while Meta refuses to serve the phone-number object (for
example after a phone-side coexistence disconnect), so `tokenStatus` alone is not a
liveness signal for WhatsApp. When the Meta link is dead, `platformConnection.status` is
`disconnected` and the overall `status` is `error`.

## Path parameters

- `accountId` string, required

## Response `200`

Account health details

- object
  - `accountId` string
  - `platform` string
  - `username` string
  - `displayName` string
  - `status` 'healthy' | 'warning' | 'error' — Overall health status
  - `tokenStatus` object
    - `valid` boolean — Whether the token is valid
    - `expiresAt` string, date-time
    - `expiresIn` string — Human-readable time until expiry
    - `needsRefresh` boolean — Whether token expires within 24 hours
  - `permissions` object
    - `posting` object[]
      - `scope` string
      - `granted` boolean
      - `required` boolean
    - `analytics` object[]
      - `scope` string
      - `granted` boolean
      - `required` boolean
    - `optional` object[]
      - `scope` string
      - `granted` boolean
      - `required` boolean
    - `canPost` boolean
    - `canFetchAnalytics` boolean
    - `missingRequired` string[]
  - `issues` string[] — List of issues found
  - `recommendations` string[] — Actionable recommendations to fix issues
  - `platformConnection` object — WhatsApp accounts only. Live probe of the Meta link behind the channel, performed at request time (the same read as GET /v1/whatsapp/number-info).
    - `status` 'connected' | 'disconnected' | 'unknown' — `connected` = Meta served the channel object. `disconnected` = Meta refused to serve it (Graph error 100, subcode 33), which is how a phone-side coexistence disconnect surfaces. `unknown` = the live read failed for another reason (timeout, transient Meta error), not evidence either way.
    - `checkedAt` string, date-time — When this live probe ran (always the current request; never cached)
    - `phoneStatus` string, nullable — Meta's own `status` field from the phone-number node (for example CONNECTED), when the object was readable
    - `metaError` object, nullable — Set only when status is `disconnected`
      - `code` integer — Meta Graph error code (100)
      - `subcode` integer — Meta Graph error subcode (33)
      - `message` string

## Other responses

- `400` — Invalid request
- `401` — Unauthorized
- `404` — Resource not found

---

[API](https://skmtc.net/zernio/apis/zernio-api.md) · [All operations](https://skmtc.net/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zernio/zernio-api/revisions/5d3a131531d9/schema)
