Best-effort AsyncAPI 2.6 description of the Healthie **GraphQL subscription** surface — the real-time push channel, distinct from the outbound HTTP webhook surface described in `healthie-webhooks-asyncapi.yml`. Healthie delivers GraphQL subscriptions over a WebSocket connection using the **ActionCable** protocol via **AnyCable**. Healthie states explicitly that this differs from the Apollo WebSocket subprotocol and that Apollo's default subscription connection functionality cannot be used against this endpoint; a translation layer is described as "being evaluated" but is not shipped. Authentication is a `token` **query parameter** carrying the Healthie API key, because the WebSocket handshake has no header phase. The connection sequence is: open the socket -> receive a `welcome` frame and periodic `ping` frames -> generate a client-side channel ID -> send a `subscribe` command for `GraphqlChannel` with that ID -> send a `message` command carrying the stringified GraphQL subscription document. Results then arrive as `message` frames with a `result.data` payload. NOT AN OFFICIAL SPEC. Derived by API Evangelist from the public documentation at https://docs.gethealthie.com/guides/websockets-and-subscriptions/getting-started/ and from the six `Subscription` root fields in the Healthie GraphQL schema captured at `graphql/healthie-schema.graphql`. Healthie publishes no AsyncAPI of its own.
Send ActionCable commands to subscribe to the channel and register a GraphQL subscription.
The single ActionCable channel Healthie exposes. A client generates its own unique `channelId`, subscribes to `{"channel":"GraphqlChannel","channelId":""}`, then sends the GraphQL subscription document as a stringified `data` payload on a `message` command. All six GraphQL subscriptions below are multiplexed over this one channel; the subscription is selected by the document, not by the channel name.
Messages
✉
Welcome
Connection welcome
Sent by Healthie immediately after the socket opens.
✉
Ping
Keepalive ping
Periodic keepalive frame carrying a Unix timestamp.
✉
SubscribeCommand
Subscribe to GraphqlChannel
Registers the client-generated channel ID with the ActionCable server.
✉
MessageCommand
Register a GraphQL subscription
Carries the stringified GraphQL subscription document for the chosen channel ID.
✉
ConfirmSubscription
Subscription confirmed
✉
SubscriptionResult
GraphQL subscription result
A GraphQL execution result for one of the six Healthie subscriptions, wrapped in an ActionCable message envelope. `message.result.data` carries the subscription field named in the registered document.
Servers
wss
productionws.gethealthie.com/subscriptions
Production subscription endpoint. The API key is supplied as the `token` query parameter: `wss://ws.gethealthie.com/subscriptions?token=API_KEY_HERE`.
wss
sandboxws.staging.gethealthie.com/subscriptions
Sandbox subscription endpoint, paired with the sandbox GraphQL endpoint at https://staging-api.gethealthie.com/graphql. Fully isolated from production.
asyncapi: 2.6.0
info:
title: Healthie GraphQL Subscriptions (WebSocket)
version: '2026-08-14'
description: |
Best-effort AsyncAPI 2.6 description of the Healthie **GraphQL subscription** surface —
the real-time push channel, distinct from the outbound HTTP webhook surface described in
`healthie-webhooks-asyncapi.yml`.
Healthie delivers GraphQL subscriptions over a WebSocket connection using the
**ActionCable** protocol via **AnyCable**. Healthie states explicitly that this differs
from the Apollo WebSocket subprotocol and that Apollo's default subscription connection
functionality cannot be used against this endpoint; a translation layer is described as
"being evaluated" but is not shipped.
Authentication is a `token` **query parameter** carrying the Healthie API key, because
the WebSocket handshake has no header phase.
The connection sequence is: open the socket -> receive a `welcome` frame and periodic
`ping` frames -> generate a client-side channel ID -> send a `subscribe` command for
`GraphqlChannel` with that ID -> send a `message` command carrying the stringified
GraphQL subscription document. Results then arrive as `message` frames with a
`result.data` payload.
NOT AN OFFICIAL SPEC. Derived by API Evangelist from the public documentation at
https://docs.gethealthie.com/guides/websockets-and-subscriptions/getting-started/ and
from the six `Subscription` root fields in the Healthie GraphQL schema captured at
`graphql/healthie-schema.graphql`. Healthie publishes no AsyncAPI of its own.
contact:
name: Healthie Developer Documentation
url: https://docs.gethealthie.com/guides/websockets-and-subscriptions/getting-started/
license:
name: Proprietary — Healthie Terms of Use
url: https://www.gethealthie.com/terms
defaultContentType: application/json
servers:
production:
url: ws.gethealthie.com/subscriptions
protocol: wss
description: |
Production subscription endpoint. The API key is supplied as the `token` query
parameter: `wss://ws.gethealthie.com/subscriptions?token=API_KEY_HERE`.
security:
- apiKeyQuery: []
sandbox:
url: ws.staging.gethealthie.com/subscriptions
protocol: wss
description: |
Sandbox subscription endpoint, paired with the sandbox GraphQL endpoint at
https://staging-api.gethealthie.com/graphql. Fully isolated from production.
security:
- apiKeyQuery: []
channels:
GraphqlChannel:
description: |
The single ActionCable channel Healthie exposes. A client generates its own unique
`channelId`, subscribes to `{"channel":"GraphqlChannel","channelId":"<ID>"}`, then
sends the GraphQL subscription document as a stringified `data` payload on a
`message` command. All six GraphQL subscriptions below are multiplexed over this one
channel; the subscription is selected by the document, not by the channel name.
bindings:
ws:
bindingVersion: 0.1.0
method: GET
query:
type: object
properties:
token:
type: string
description: Healthie API key. Required — the WebSocket handshake carries no headers.
required:
- token
subscribe:
operationId: receiveGraphqlChannelFrames
summary: Receive connection lifecycle frames and subscription results from Healthie.
message:
oneOf:
- $ref: '#/components/messages/Welcome'
- $ref: '#/components/messages/Ping'
- $ref: '#/components/messages/ConfirmSubscription'
- $ref: '#/components/messages/SubscriptionResult'
publish:
operationId: sendGraphqlChannelCommands
summary: Send ActionCable commands to subscribe to the channel and register a GraphQL subscription.
message:
oneOf:
- $ref: '#/components/messages/SubscribeCommand'
- $ref: '#/components/messages/MessageCommand'
components:
securitySchemes:
apiKeyQuery:
type: httpApiKey
name: token
in: query
description: |
Healthie API key passed as a URL query parameter. Note the exposure consequence: a
long-lived PHI-scoped credential travels in a URL and can be captured by proxy and
connection logging in a way the header-based GraphQL path is not.
messages:
Welcome:
name: welcome
title: Connection welcome
summary: Sent by Healthie immediately after the socket opens.
contentType: application/json
payload:
type: object
properties:
type:
type: string
const: welcome
sid:
type: string
description: Server-assigned session identifier.
required:
- type
examples:
- payload:
type: welcome
sid: 0czVwnltbucBy23AanKFJ
Ping:
name: ping
title: Keepalive ping
summary: Periodic keepalive frame carrying a Unix timestamp.
contentType: application/json
payload:
type: object
properties:
type:
type: string
const: ping
message:
type: integer
description: Unix epoch seconds.
required:
- type
examples:
- payload:
type: ping
message: 1664558222
SubscribeCommand:
name: subscribe
title: Subscribe to GraphqlChannel
summary: Registers the client-generated channel ID with the ActionCable server.
contentType: application/json
payload:
type: object
properties:
command:
type: string
const: subscribe
identifier:
type: string
description: Stringified JSON, e.g. '{"channel":"GraphqlChannel","channelId":"1838f674dff"}'
required:
- command
- identifier
MessageCommand:
name: message
title: Register a GraphQL subscription
summary: Carries the stringified GraphQL subscription document for the chosen channel ID.
contentType: application/json
payload:
type: object
properties:
command:
type: string
const: message
identifier:
type: string
description: The same stringified channel identifier used on the subscribe command.
data:
type: string
description: The GraphQL subscription document, stringified.
required:
- command
- identifier
- data
ConfirmSubscription:
name: confirm_subscription
title: Subscription confirmed
contentType: application/json
payload:
type: object
properties:
type:
type: string
const: confirm_subscription
identifier:
type: string
SubscriptionResult:
name: subscription_result
title: GraphQL subscription result
summary: |
A GraphQL execution result for one of the six Healthie subscriptions, wrapped in an
ActionCable message envelope. `message.result.data` carries the subscription field
named in the registered document.
contentType: application/json
payload:
type: object
properties:
identifier:
type: string
message:
type: object
properties:
more:
type: boolean
description: Whether the subscription remains open.
result:
type: object
properties:
data:
type: object
description: |
Keyed by the subscription root field. One of:
conversationChangedSubscription, conversationMembershipAddedSubscription,
conversationMembershipUpdatedSubscription, formAnswerGroupModifiedSubscription,
noteAddedSubscription, userUpdatedSubscription.
schemas:
HealthieSubscriptions:
description: |
The six subscription root fields declared by the Healthie GraphQL schema, verified
verbatim in graphql/healthie-schema.graphql.
type: object
properties:
conversationChangedSubscription:
description: 'Argument: id. Returns Conversation.'
type: object
conversationMembershipAddedSubscription:
description: 'Argument: notesType. Returns ConversationMembership.'
type: object
conversationMembershipUpdatedSubscription:
description: 'Argument: notesType. Returns ConversationMembership.'
type: object
formAnswerGroupModifiedSubscription:
description: 'Argument: id. Returns FormAnswerGroup — fires when a charting note or intake
form submission changes.'
type: object
noteAddedSubscription:
description: 'Argument: conversationId. Returns Note — the canonical chat/messaging
subscription used by the Healthie Chat SDK.'
type: object
userUpdatedSubscription:
description: 'No arguments. Returns UserNotificationsCount.'
type: object
x-provenance:
generated: '2026-08-14'
method: derived
source:
- https://docs.gethealthie.com/guides/websockets-and-subscriptions/getting-started/
- https://docs.gethealthie.com/guides/websockets-and-subscriptions/setting-up-apollo-client/
- graphql/healthie-schema.graphql
official: false
note: >-
Healthie publishes no AsyncAPI. This document is an API Evangelist derivation from Healthie's own
published subscription documentation and its GraphQL schema; every subscription name, argument,
return type, server URL and frame shape above appears verbatim in one of those sources.
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.