API: Difference between revisions

From Resonite Wiki
Extend Users endpoint section
Add Messages endpoint and fix some formatting issues
Line 102: Line 102:
URL parameters:
URL parameters:


* '''compatibilityHash:''' The compatibility-hash sessions needs to have. A Resonite client can only join a session if this hash matches between client and server. (string, optional)
* '''compatibilityHash''': The compatibility-hash sessions needs to have. A Resonite client can only join a session if this hash matches between client and server. (string, optional)
* '''name''': The session name to search for. (string, optional)
* '''name''': The session name to search for. (string, optional)
* '''universeId''': The id of the universe sessions need to be a part of. (string, optional)
* '''universeId''': The id of the universe sessions need to be a part of. (string, optional)
Line 108: Line 108:
* '''hostId''': The id of the user currently hosting the session. (string, optional)
* '''hostId''': The id of the user currently hosting the session. (string, optional)
* '''minActiveUsers''': The minimum amount of active users a session needs to have. (integer, optional, default 0)
* '''minActiveUsers''': The minimum amount of active users a session needs to have. (integer, optional, default 0)
* '''includeEmptyHeadless''': Should empty headless servers be included in the results. (bool, optional, default false)
* '''includeEmptyHeadless''': Should empty headless servers be included in the results. (bool, optional, default <code>false</code>)


=== Users ===
=== Users ===
Line 119: Line 119:


URL parameters:
URL parameters:
* '''byUsername:''' Interpret the specified <code>{userId}</code> as a username instead. (bool, optional)
* '''byUsername''': Interpret the specified <code>{userId}</code> as a username instead. (bool, optional, default <code>false</code>)


==== <code>GET /users?name={partialUsername}</code> ====
==== <code>GET /users?name={partialUsername}</code> ====
Line 127: Line 127:
Does not requires authentication.
Does not requires authentication.


<code>GET /users/requestlostpassword</code>
==== <code>GET /users/requestlostpassword</code> ====
 
Request a password reset email for the specified <code>{emailAddress}</code>.
Request a password reset email for the specified <code>{emailAddress}</code>.


Line 137: Line 136:
   "email": "{emailAddress}"
   "email": "{emailAddress}"
}
}
</syntaxhighlight><code>GET /users/{userId}/funding/patreon</code>
</syntaxhighlight>


==== <code>GET /users/{userId}/funding/patreon</code> ====
Get patreon funding information for the specified <code>{userId}</code>.
Get patreon funding information for the specified <code>{userId}</code>.


Requires authentication. <code>{userId}</code> has to be your own.
Requires authentication. <code>{userId}</code> has to be your own.


<code>GET /users/{userId}/exitMessages</code>
==== <code>GET /users/{userId}/exitMessages</code> ====
Get the exit messages defined by the user with <code>{userId}</code>.
 
Requires authentication. <code>{userId}</code> has to be your own.


Get the exit messages defined by the user with <code>{userId}</code>.
=== Messages ===
 
==== <code>GET /users/{userId}/messages</code> ====
Get a list of all messages sent or received by <code>{userId}.</code>


Requires authentication. <code>{userId}</code> has to be your own.
Requires authentication. <code>{userId}</code> has to be your own.
URL parameters:
* '''maxItem''': The maximum number of messages to return. Note that if this is not set, every message ever received or sent by <code>{userId}</code> will be returned, which may take some time. (integer, optional)
* '''user''': Only include messages between <code>{user}</code> and <code>{userId}</code>. (string, optional)
* '''unread''': Only include unread messages. (bool, optional, default <code>false</code>)
* '''fromTime''': Only include messages that are after <code>fromTime</code>. This parameter needs to be formatted as an ISO8601 timestring. (string, optional)

Revision as of 11:56, 20 January 2024

Documentation for the Resonite API which can be used by external apps to communicate with Resonite.

This documentation is unofficial and incomplete and may break at any time.

The main API URL is https://api.resonite.com/

Authentication

Many endpoints of the Resonite API require authentication by means of an authorization token.

This token needs to be sent as a Authorization HTTP request header on endpoints that require it:

Authorization: res <user-id>:<token>

Note that user-id is not the same as your username. Migrated accounts may have user-ids that are similar to their username, but newly created accounts will get a random user-id assigned to them. User-ids always start with U-.


To get a token, send a POST request to https://api.resonite.com/userSessions with the following body:

{
    "username": "<username>",
    "authentication": {
        "$type" : "password",
        "password": "<password>"
    },
    "secretMachineId": "<secret-machine-id>",
    "rememberMe": true
}
  • username and password are your account credentials. DO NOT replace the "password" specifier in the "$type" field.
  • secretMachineId can be a random UUIDv4
  • The rememberMe flag determines how long the resulting token will be valid. If it is set to true, the token will be valid for 30 days.

This authentication request also needs additional headers:

UID: <uid>
TOTP: <totp>
  • UID should be a sha256 hash based on information about the hardware this request was sent from, so every device that connects to the API should have its own unique string that never changes. You can however just use any random sha256 hash if you do not want to generate it specifically for your hardware.
  • TOTP is a four number code generated by your two-factor authentication (2FA) application of choice and only needs to be sent if 2FA is enabled for your user account.

The API should respond with a JSON object containing information about the created user-session, most importantly the token used for authentication as well as your user-id.

SignalR

The Resonite API uses the SignalR protocol for server-driven notifications such as informing the client of new chat messages or status changes. Internally this is simply a WebSocket connection between the Resonite client and API SignalR Hub with some additional control messages. Most modern programming languages should have libraries for SignalR available, however if your language of choice does not, the protocol is well documented and can be easily emulated.

The hub address is https://api.resonite.com/hub, or if you're creating a WebSocket connection manually wss://api.resonite.com/hub.

To authenticate with the hub, the same authorization header as specified in Authentication is required.

Functions

The following server side functions are available:

SendMessage

MarkMessagesRead

BroadcastStatus

UpdateContact

ListenOnContact

ListenOnKey

RequestStatus

InitializeStatus

BroadcastSession

BroadcastSessionEnded

Events

The following events can be sent by the server (this list may be incomplete):

MessageSent

ReceiveMessage

MessagesRead

ReceiveSessionUpdate

RemoveSession

ReceiveStatusUpdate

Endpoints

Sessions

GET /sessions/{sessionId}

Returns the Session object for the session specified by {sessionId}, provided it is a publicly accessible session.

Does not require authentication.

GET /sessions

Returns a list of public sessions filtered by the given parameters.

Does not require authentication

URL parameters:

  • compatibilityHash: The compatibility-hash sessions needs to have. A Resonite client can only join a session if this hash matches between client and server. (string, optional)
  • name: The session name to search for. (string, optional)
  • universeId: The id of the universe sessions need to be a part of. (string, optional)
  • hostName: The name of the user currently hosting the session. (string, optional)
  • hostId: The id of the user currently hosting the session. (string, optional)
  • minActiveUsers: The minimum amount of active users a session needs to have. (integer, optional, default 0)
  • includeEmptyHeadless: Should empty headless servers be included in the results. (bool, optional, default false)

Users

GET /users/{userId}

Returns the User object for the specified {userId}.

Does not requires authentication, however when authenticated this endpoint will return additional information when {userId} is your own.

URL parameters:

  • byUsername: Interpret the specified {userId} as a username instead. (bool, optional, default false)

GET /users?name={partialUsername}

Returns a JSON array of User objects for the usernames matching the {partialUsername}.

Does not requires authentication.

GET /users/requestlostpassword

Request a password reset email for the specified {emailAddress}.

Does not require authentication.

Body:

{
  "email": "{emailAddress}"
}

GET /users/{userId}/funding/patreon

Get patreon funding information for the specified {userId}.

Requires authentication. {userId} has to be your own.

GET /users/{userId}/exitMessages

Get the exit messages defined by the user with {userId}.

Requires authentication. {userId} has to be your own.

Messages

GET /users/{userId}/messages

Get a list of all messages sent or received by {userId}.

Requires authentication. {userId} has to be your own. URL parameters:

  • maxItem: The maximum number of messages to return. Note that if this is not set, every message ever received or sent by {userId} will be returned, which may take some time. (integer, optional)
  • user: Only include messages between {user} and {userId}. (string, optional)
  • unread: Only include unread messages. (bool, optional, default false)
  • fromTime: Only include messages that are after fromTime. This parameter needs to be formatted as an ISO8601 timestring. (string, optional)