Real Time API
=============
.. warning::
This document describes an API that is in the early stages of being
documented and refined for public use. Details may change, and your systems
may break in the future.
In addition to the `HTTP API `_
Hypothesis has a WebSocket-based API that allows developers to receive near
real-time notifications of annotation events.
Overview
--------
To use the Real Time API, you should open a WebSocket connection to the
following endpoint::
wss://hypothes.is/ws
Communication with this endpoint consists of JSON-encoded messages sent from
client to server and vice versa.
Authorization
-------------
Clients that are only interested in receiving notifications about public
annotations on a page do not need to authenticate. Clients that want to receive
notifications about all updates relevant to a particular user must
authenticate.
Server-side clients can authenticate to the Real Time API by providing an access
token in an Authorization header::
Authorization: Bearer
Browser-based clients are not able to set this header due to limitations of the
the browser's ``WebSocket`` API. Instead they can authenticate by setting an
``access_token`` query parameter in the URL when connecting::
var socket = new WebSocket(`wss://hypothes.is/ws?access_token=${token}`)
Server messages
---------------
Each messages from the server will be either an :term:`event` or a
:term:`reply`:
.. glossary::
event
An event is sent to clients as a result of an action taken elsewhere in
the system. For example: if an annotation is made which matches one of the
client's subscriptions, the client will receive an event message. All
event messages have a ``type`` field.
reply
A reply is sent in response to a message sent by the client. All replies
have an ``ok`` field which indicates whether the server successfully
processed the client's message, and a ``reply_to`` field which indicates
which client message the server is responding to.
Clients should ignore events with types that they do not recognise, as this will
allow us to add new events in future without breaking your client.
.. note::
We will add documentation for specific event types as we upgrade the
protocol.
Sending messages
----------------
All messages sent to the server must have a numeric ID which is unique for the
connection. The ID should be sent with the message in the ``id`` field. In
addition, every message sent to the server must have a valid ``type`` field. See
below for the different types of message you can send.
.. contents:: Message types
:local:
:depth: 1
``ping``
~~~~~~~~
To verify that the connection is still open, clients can (and are encouraged to)
send a "ping" message:
.. code-block:: json
{
"id": 123,
"type": "ping"
}
The server replies with a ``pong`` message:
.. code-block:: json
{
"ok": true,
"reply_to": 123,
"type": "pong"
}
``whoami``
~~~~~~~~~~
Primarily for debugging purposes, you can send the server a "who am I?" message
to check whether you have authenticated correctly to the WebSocket.
.. code-block:: json
{
"id": 123,
"type": "whoami"
}
The server will respond with a ``whoyouare`` message:
.. code-block:: json
{
"ok": true,
"reply_to": 123,
"type": "whoyouare",
"userid": "acct:joe.bloggs@hypothes.is"
}