Healthie · AsyncAPI Specification

Healthie GraphQL Subscriptions (WebSocket)

Version 2026-08-14

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.

View Spec View on GitHub API-FirstAppointmentsBillingCare PlansChartingClaimsClinicalDigital HealthEHREMRFormsGraphQLHealth TechHealthcareInsuranceIntakeOnline ProgramsPatient EngagementPatient PortalPractice ManagementProgramsSchedulingTelehealthWellnessWebhookAsyncAPIWebhooksEvents

Channels

GraphqlChannel
publish sendGraphqlChannelCommands
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
production ws.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
sandbox ws.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 Specification

Raw ↑
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.