Signal · AsyncAPI Specification

Signal Server Real-Time Events

Version 2.0

The Signal Server real-time messaging interface provides WebSocket connections for persistent, bidirectional communication between Signal clients and the server. When a client has an active WebSocket connection, encrypted messages are delivered in real-time through that connection. For offline clients, the server sends push notifications via APNs (Apple) or FCM (Google) to alert the client to connect and retrieve pending messages. The WebSocket protocol also supports keepalive pings, provisioning of new linked devices, and contact discovery operations.

View Spec View on GitHub EncryptionMessagingSecurityCryptographyOpen SourcePrivacyAsyncAPIWebhooksEvents

Channels

/v1/websocket
publish receiveMessages
Receive real-time messages from the server
The primary authenticated WebSocket channel for real-time message delivery, receipt confirmations, and typing indicators. Clients maintain a persistent connection on this channel to receive encrypted messages as they arrive. The server uses a request-response framing protocol over the WebSocket where both sides can initiate requests.
/v1/websocket/provisioning
publish receiveProvisioningMessages
Receive provisioning messages during device linking
The provisioning WebSocket channel used during the device linking flow. A new device connects to this channel and receives a provisioning UUID. The primary device then sends an encrypted provisioning message containing the account identity key and other credentials needed to complete the linking process.
/push/apns
publish sendApnsPush
Send push notification to iOS device
Apple Push Notification Service channel for delivering push notifications to iOS devices when they are not connected via WebSocket. Notifications alert the device to connect to the server and retrieve pending messages.
/push/fcm
publish sendFcmPush
Send push notification to Android device
Firebase Cloud Messaging channel for delivering push notifications to Android devices when they are not connected via WebSocket. Notifications alert the device to connect and retrieve pending messages.

Messages

MessageEnvelope
Encrypted Message Envelope
An encrypted message envelope containing a Signal Protocol message.
ReceiptMessage
Delivery or Read Receipt
A receipt message confirming delivery or read status of a previously sent message.
TypingIndicator
Typing Indicator
A typing indicator showing that a contact is currently composing a message.
StorySendMessage
Story Send Message
A message containing a story post sent by a contact.
WebSocketRequestMessage
WebSocket Request
A request message sent over the WebSocket connection using the Signal WebSocket framing protocol.
WebSocketResponseMessage
WebSocket Response
A response message sent over the WebSocket connection acknowledging a previous request.
ProvisioningUUID
Provisioning UUID Assignment
The server assigns a provisioning UUID to a new device during the device linking process.
ProvisioningMessage
Encrypted Provisioning Message
An encrypted provisioning message from the primary device containing account credentials for the new linked device.
PushNotification
Push Notification
A push notification sent to an offline device to alert it of pending messages.

Servers

wss
production wss://chat.signal.org/v1/websocket/
Signal production WebSocket server for authenticated real-time messaging. Clients establish a persistent WebSocket connection after authentication to receive messages in real-time.
wss
provisioning wss://chat.signal.org/v1/websocket/provisioning/
Signal provisioning WebSocket server used during the device linking process. New devices connect to receive provisioning messages from the primary device.

AsyncAPI Specification

Raw ↑
asyncapi: 2.6.0
info:
  title: Signal Server Real-Time Events
  description: >-
    The Signal Server real-time messaging interface provides WebSocket
    connections for persistent, bidirectional communication between Signal
    clients and the server. When a client has an active WebSocket connection,
    encrypted messages are delivered in real-time through that connection.
    For offline clients, the server sends push notifications via APNs (Apple)
    or FCM (Google) to alert the client to connect and retrieve pending
    messages. The WebSocket protocol also supports keepalive pings,
    provisioning of new linked devices, and contact discovery operations.
  version: '2.0'
  contact:
    name: Signal Support
    url: https://support.signal.org/
  license:
    name: AGPL-3.0
    url: https://github.com/signalapp/Signal-Server/blob/main/LICENSE
servers:
  production:
    url: wss://chat.signal.org/v1/websocket/
    protocol: wss
    description: >-
      Signal production WebSocket server for authenticated real-time
      messaging. Clients establish a persistent WebSocket connection after
      authentication to receive messages in real-time.
    security:
      - basicAuth: []
  provisioning:
    url: wss://chat.signal.org/v1/websocket/provisioning/
    protocol: wss
    description: >-
      Signal provisioning WebSocket server used during the device linking
      process. New devices connect to receive provisioning messages from
      the primary device.
channels:
  /v1/websocket:
    description: >-
      The primary authenticated WebSocket channel for real-time message
      delivery, receipt confirmations, and typing indicators. Clients
      maintain a persistent connection on this channel to receive encrypted
      messages as they arrive. The server uses a request-response framing
      protocol over the WebSocket where both sides can initiate requests.
    publish:
      operationId: receiveMessages
      summary: Receive real-time messages from the server
      description: >-
        The server pushes encrypted message envelopes to connected clients
        through this channel. Each message includes the envelope type,
        encrypted content, sender information (when not using sealed
        sender), timestamp, and the server delivery timestamp. Clients must
        acknowledge receipt of each message.
      message:
        oneOf:
          - $ref: '#/components/messages/MessageEnvelope'
          - $ref: '#/components/messages/ReceiptMessage'
          - $ref: '#/components/messages/TypingIndicator'
          - $ref: '#/components/messages/StorySendMessage'
    subscribe:
      operationId: sendWebSocketRequest
      summary: Send requests over the WebSocket channel
      description: >-
        Clients can send requests over the WebSocket channel, including
        message acknowledgements, keepalive pings, and REST-like requests
        that are framed as WebSocket messages.
      message:
        oneOf:
          - $ref: '#/components/messages/WebSocketRequestMessage'
          - $ref: '#/components/messages/WebSocketResponseMessage'
  /v1/websocket/provisioning:
    description: >-
      The provisioning WebSocket channel used during the device linking
      flow. A new device connects to this channel and receives a
      provisioning UUID. The primary device then sends an encrypted
      provisioning message containing the account identity key and other
      credentials needed to complete the linking process.
    publish:
      operationId: receiveProvisioningMessages
      summary: Receive provisioning messages during device linking
      description: >-
        The server sends provisioning messages to new devices during the
        linking process. This includes the provisioning UUID assignment
        and the encrypted provisioning message from the primary device.
      message:
        oneOf:
          - $ref: '#/components/messages/ProvisioningUUID'
          - $ref: '#/components/messages/ProvisioningMessage'
  /push/apns:
    description: >-
      Apple Push Notification Service channel for delivering push
      notifications to iOS devices when they are not connected via
      WebSocket. Notifications alert the device to connect to the server
      and retrieve pending messages.
    publish:
      operationId: sendApnsPush
      summary: Send push notification to iOS device
      description: >-
        The server sends a silent or alert push notification to an iOS
        device via APNs when it has pending messages and no active
        WebSocket connection.
      message:
        $ref: '#/components/messages/PushNotification'
  /push/fcm:
    description: >-
      Firebase Cloud Messaging channel for delivering push notifications
      to Android devices when they are not connected via WebSocket.
      Notifications alert the device to connect and retrieve pending
      messages.
    publish:
      operationId: sendFcmPush
      summary: Send push notification to Android device
      description: >-
        The server sends a data-only push notification to an Android
        device via FCM when it has pending messages and no active
        WebSocket connection.
      message:
        $ref: '#/components/messages/PushNotification'
components:
  securitySchemes:
    basicAuth:
      type: httpBasic
      description: >-
        HTTP Basic authentication using the account UUID and password,
        passed as query parameters during WebSocket upgrade.
  messages:
    MessageEnvelope:
      name: MessageEnvelope
      title: Encrypted Message Envelope
      summary: >-
        An encrypted message envelope containing a Signal Protocol message.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/Envelope'
    ReceiptMessage:
      name: ReceiptMessage
      title: Delivery or Read Receipt
      summary: >-
        A receipt message confirming delivery or read status of a
        previously sent message.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/Receipt'
    TypingIndicator:
      name: TypingIndicator
      title: Typing Indicator
      summary: >-
        A typing indicator showing that a contact is currently composing a
        message.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/TypingEvent'
    StorySendMessage:
      name: StorySendMessage
      title: Story Send Message
      summary: >-
        A message containing a story post sent by a contact.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/StorySend'
    WebSocketRequestMessage:
      name: WebSocketRequestMessage
      title: WebSocket Request
      summary: >-
        A request message sent over the WebSocket connection using the
        Signal WebSocket framing protocol.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/WebSocketRequest'
    WebSocketResponseMessage:
      name: WebSocketResponseMessage
      title: WebSocket Response
      summary: >-
        A response message sent over the WebSocket connection acknowledging
        a previous request.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/WebSocketResponse'
    ProvisioningUUID:
      name: ProvisioningUUID
      title: Provisioning UUID Assignment
      summary: >-
        The server assigns a provisioning UUID to a new device during the
        device linking process.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/ProvisioningUUIDPayload'
    ProvisioningMessage:
      name: ProvisioningMessage
      title: Encrypted Provisioning Message
      summary: >-
        An encrypted provisioning message from the primary device
        containing account credentials for the new linked device.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/ProvisioningMessagePayload'
    PushNotification:
      name: PushNotification
      title: Push Notification
      summary: >-
        A push notification sent to an offline device to alert it of
        pending messages.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/PushNotificationPayload'
  schemas:
    Envelope:
      type: object
      description: >-
        A Signal Protocol message envelope containing encrypted content
        and delivery metadata.
      properties:
        type:
          type: integer
          description: >-
            The envelope type. 1 for ciphertext, 3 for prekey bundle
            message, 6 for plaintext content, 7 for unidentified sender.
          enum:
            - 1
            - 3
            - 6
            - 7
        sourceUuid:
          type: string
          format: uuid
          description: >-
            The sender's account UUID. Absent for sealed sender messages.
        sourceDevice:
          type: integer
          description: >-
            The sender's device identifier. Absent for sealed sender
            messages.
        timestamp:
          type: integer
          format: int64
          description: >-
            The client-side timestamp in milliseconds when the message was
            sent.
        serverTimestamp:
          type: integer
          format: int64
          description: >-
            The server-side timestamp in milliseconds when the message was
            received.
        serverDeliveredTimestamp:
          type: integer
          format: int64
          description: >-
            The server-side timestamp in milliseconds when the message was
            delivered to this device.
        content:
          type: string
          description: >-
            The Base64-encoded encrypted message content.
        serverGuid:
          type: string
          format: uuid
          description: >-
            A server-assigned unique identifier for this message delivery.
        destinationUuid:
          type: string
          format: uuid
          description: >-
            The recipient's account UUID.
        urgent:
          type: boolean
          description: >-
            Whether this message is flagged as urgent.
        story:
          type: boolean
          description: >-
            Whether this message is a story message.
        reportSpamToken:
          type: string
          description: >-
            A token for spam reporting, included in sealed sender messages.
    Receipt:
      type: object
      description: >-
        A delivery or read receipt for one or more messages.
      properties:
        type:
          type: string
          description: >-
            The receipt type.
          enum:
            - DELIVERY
            - READ
        timestamps:
          type: array
          description: >-
            The timestamps of the messages being acknowledged.
          items:
            type: integer
            format: int64
    TypingEvent:
      type: object
      description: >-
        A typing indicator event.
      properties:
        action:
          type: string
          description: >-
            Whether typing has started or stopped.
          enum:
            - STARTED
            - STOPPED
        timestamp:
          type: integer
          format: int64
          description: >-
            The client timestamp of the typing event.
        groupId:
          type: string
          description: >-
            The Base64-encoded group identifier if typing in a group
            conversation.
    StorySend:
      type: object
      description: >-
        A story message sent to contacts or groups.
      properties:
        content:
          type: string
          description: >-
            The Base64-encoded encrypted story content.
        timestamp:
          type: integer
          format: int64
          description: >-
            The client timestamp of the story message.
        allowsReplies:
          type: boolean
          description: >-
            Whether replies are permitted on this story.
    WebSocketRequest:
      type: object
      description: >-
        A request message in the Signal WebSocket framing protocol.
      properties:
        id:
          type: integer
          format: int64
          description: >-
            The request identifier for correlating responses.
        verb:
          type: string
          description: >-
            The HTTP method (GET, PUT, POST, DELETE).
        path:
          type: string
          description: >-
            The request path, corresponding to a REST API endpoint.
        body:
          type: string
          description: >-
            The Base64-encoded request body.
        headers:
          type: array
          description: >-
            HTTP headers for the request.
          items:
            type: string
    WebSocketResponse:
      type: object
      description: >-
        A response message in the Signal WebSocket framing protocol.
      properties:
        id:
          type: integer
          format: int64
          description: >-
            The request identifier being responded to.
        status:
          type: integer
          description: >-
            The HTTP status code of the response.
        message:
          type: string
          description: >-
            The status message.
        body:
          type: string
          description: >-
            The Base64-encoded response body.
        headers:
          type: array
          description: >-
            HTTP headers for the response.
          items:
            type: string
    ProvisioningUUIDPayload:
      type: object
      description: >-
        A provisioning UUID assignment sent to a new device during linking.
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            The provisioning UUID assigned to the new device.
    ProvisioningMessagePayload:
      type: object
      description: >-
        An encrypted provisioning message containing account credentials.
      properties:
        body:
          type: string
          description: >-
            The Base64-encoded encrypted provisioning message from the
            primary device.
    PushNotificationPayload:
      type: object
      description: >-
        A push notification payload sent to offline devices.
      properties:
        type:
          type: string
          description: >-
            The notification type identifier.
          enum:
            - notification
            - challenge
            - rateLimitChallenge
        data:
          type: object
          description: >-
            Additional data included in the push notification.
          properties:
            urgent:
              type: boolean
              description: >-
                Whether the notification is for an urgent message.