Skip to content
RSXDocs
RSX · API · Reference

link v1

Device identity for RSX Link: enrolling an installation with your RSX ID approval and a key it holds, listing your devices, and revoking them.

Current
Base URL
https://api.rsx.group/link/v1
Self-grantable scopes
None. Every endpoint here needs a key issued by a platform admin.
Machine readable
openapi.json
01

enrolments

3 operations under /link/v1/enrolments.

POST/link/v1/enrolments/add

Open an enrolment for a device key

Called by a Link agent that is not yet a device. No credential: the gateway limits this route per address, and requires an Idempotency-Key; retrying with the same key and body after a lost response returns the original.

Returns the enrolment, its userCode and approvalUriComplete for the person, and secret, shown once. The secret authenticates enrolments/get, enrolments/remove and devices/add for this enrolment only.

Scope
link:enrolments:add Admin-issued keys only.
Idempotency
Requires an Idempotency-Key header. Reusing the key within 24 hours returns the original response instead of creating a second record.

Request bodyapplication/json

Request body of addEnrolment

  • protocolrequired
    Type
    integer
    Description
    Must be 1.
  • keyAlgorithmrequired
    Type
    string
    Description
    one of "ES256"
  • publicKeyrequired
    Type
    string
    Description
    The device's P-256 public key, SPKI DER encoded, base64url without padding.80 to 200 characters · matches ^[A-Za-z0-9_-]+$
  • platformrequired
    Type
    string
    Description
    One of: windows, linux, android.up to 32 characters
  • displayName
    Type
    string
    Description
    1 to 64 characters
  • platformVersion
    Type
    string
    Description
    1 to 64 characters
  • agentVersion
    Type
    string
    Description
    1 to 32 characters

Response 200Enrolment opened

Response of addEnrolment

  • datarequired
    Type
    LinkEnrolmentCreated
    Description
  • enrolmentrequired
    Type
    LinkEnrolment
    Description
  • secretrequired
    Type
    string
    Description
    The enrolment secret, shown once. Send it as Authorization: Bearer to enrolments/get, enrolments/remove and devices/add.

Errors

Each is an RFC 7807 problem document whose type URL is a page in the error reference.

  • 400Unsupported protocol or platform, an invalid public key, or a malformed request
  • 409The key is already an active device, or belonged to a revoked one

Example

curl
curl -X POST https://api.rsx.group/link/v1/enrolments/add \
  -H "Authorization: Bearer rsx_live_..." \
  -H "Idempotency-Key: 5b8f2d1a-0c7e-4b1f-9a6d-3e2f1c0b9a8d" \
  -H "Content-Type: application/json" \
  -d '{
  "protocol": 1,
  "keyAlgorithm": "ES256",
  "publicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEyVDx2fAX3rA6m0EIUzBBWkA4zG6-n9t9Sb8c2X5wXn0q2xvGQaU2C9Uw8Yw4rX4n2m4R3x8Gm8fGJf9k5Yy3sA",
  "platform": "windows",
  "displayName": "Ada'\''s desktop",
  "platformVersion": "Windows 11 Pro 24H2",
  "agentVersion": "0.2.0"
}'
200 response
{
  "data": {
    "enrolment": {
      "id": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
      "state": "pending",
      "userCode": "BCDF-GHJK",
      "approvalUri": "https://id.rsx.group/link",
      "approvalUriComplete": "https://id.rsx.group/link?code=BCDF-GHJK",
      "keyFingerprint": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs",
      "createdAt": "2026-10-13T12:00:00.000Z",
      "expiresAt": "2026-10-13T12:00:00.000Z",
      "pollIntervalSeconds": 5,
      "challenge": null,
      "deviceId": null
    },
    "secret": "rsx_lke_Zm9vYmFyYmF6cXV4cXV1eGNvcmdlZ3JhdWx0Z2FycGx5"
  }
}
GET/link/v1/enrolments/get

Poll an enrolment

Authenticated with the enrolment secret as Authorization: Bearer rsx_lke_…. Poll every pollIntervalSeconds. Every state is a 200; challenge is set only while approved, and deviceId once consumed.

Scope
link:enrolments:get Admin-issued keys only.

Query parameters

Query parameters of getEnrolment

  • idrequired
    Type
    string, uuid
    Description

Response 200Enrolment

Response of getEnrolment

  • datarequired
    Type
    LinkEnrolment
    Description
  • idrequired
    Type
    string, uuid
    Description
  • staterequired
    Type
    string
    Description
    one of "pending", "approved", "denied", "consumed", "expired", "cancelled"
  • userCoderequired
    Type
    string
    Description
    matches ^[A-Z]{4}-[A-Z]{4}$
  • approvalUrirequired
    Type
    string, uri
    Description
  • approvalUriCompleterequired
    Type
    string, uri
    Description
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • createdAtrequired
    Type
    string, date-time
    Description
  • expiresAtrequired
    Type
    string, date-time
    Description
  • pollIntervalSecondsrequired
    Type
    integer
    Description
  • challengerequired
    Type
    string, or null
    Description
    Set only while approved: sign it into the enrolment proof and call devices/add.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • deviceIdrequired
    Type
    string, uuid, or null
    Description
    Set once consumed.

Errors

Each is an RFC 7807 problem document whose type URL is a page in the error reference.

  • 400Malformed request
  • 404No such enrolment for this secret

Example

curl
curl "https://api.rsx.group/link/v1/enrolments/get?id=0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f" \
  -H "Authorization: Bearer rsx_live_..."
200 response
{
  "data": {
    "id": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
    "state": "pending",
    "userCode": "BCDF-GHJK",
    "approvalUri": "https://id.rsx.group/link",
    "approvalUriComplete": "https://id.rsx.group/link?code=BCDF-GHJK",
    "keyFingerprint": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs",
    "createdAt": "2026-10-13T12:00:00.000Z",
    "expiresAt": "2026-10-13T12:00:00.000Z",
    "pollIntervalSeconds": 5,
    "challenge": null,
    "deviceId": null
  }
}
POST/link/v1/enrolments/remove

Cancel an enrolment

Authenticated with the enrolment secret. Cancels a pending or approved enrolment. Repeatable: an enrolment that has already ended is returned as it is, except one that already created a device.

Scope
link:enrolments:remove Admin-issued keys only.

Request bodyapplication/json

Request body of removeEnrolment

  • idrequired
    Type
    string, uuid
    Description

Response 200Enrolment, cancelled or already ended

Response of removeEnrolment

  • datarequired
    Type
    LinkEnrolment
    Description
  • idrequired
    Type
    string, uuid
    Description
  • staterequired
    Type
    string
    Description
    one of "pending", "approved", "denied", "consumed", "expired", "cancelled"
  • userCoderequired
    Type
    string
    Description
    matches ^[A-Z]{4}-[A-Z]{4}$
  • approvalUrirequired
    Type
    string, uri
    Description
  • approvalUriCompleterequired
    Type
    string, uri
    Description
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • createdAtrequired
    Type
    string, date-time
    Description
  • expiresAtrequired
    Type
    string, date-time
    Description
  • pollIntervalSecondsrequired
    Type
    integer
    Description
  • challengerequired
    Type
    string, or null
    Description
    Set only while approved: sign it into the enrolment proof and call devices/add.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • deviceIdrequired
    Type
    string, uuid, or null
    Description
    Set once consumed.

Errors

Each is an RFC 7807 problem document whose type URL is a page in the error reference.

  • 400Malformed request
  • 404No such enrolment for this secret
  • 409The enrolment already created a device

Example

curl
curl -X POST https://api.rsx.group/link/v1/enrolments/remove \
  -H "Authorization: Bearer rsx_live_..." \
  -H "Content-Type: application/json" \
  -d '{
  "id": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f"
}'
200 response
{
  "data": {
    "id": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
    "state": "pending",
    "userCode": "BCDF-GHJK",
    "approvalUri": "https://id.rsx.group/link",
    "approvalUriComplete": "https://id.rsx.group/link?code=BCDF-GHJK",
    "keyFingerprint": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs",
    "createdAt": "2026-10-13T12:00:00.000Z",
    "expiresAt": "2026-10-13T12:00:00.000Z",
    "pollIntervalSeconds": 5,
    "challenge": null,
    "deviceId": null
  }
}
02

devices

5 operations under /link/v1/devices.

POST/link/v1/devices/add

Complete an approved enrolment

Called by the agent once enrolments/get reports approved. Authenticated with the enrolment secret, and proven with a signature by the enrolling key over the enrolment proof (docs/specs/link.md §6.3):

RSX-LINK-V1-ENROLMENT-PROOF\n{enrolmentId}\n{keyFingerprint}\n{challenge}

Creates the device exactly once. Requires an Idempotency-Key; after a lost response, retry with the same key, or read deviceId from enrolments/get. Five failed proofs cancel the enrolment.

Scope
link:devices:add Admin-issued keys only.
Idempotency
Requires an Idempotency-Key header. Reusing the key within 24 hours returns the original response instead of creating a second record.

Request bodyapplication/json

Request body of addDevice

  • enrolmentIdrequired
    Type
    string, uuid
    Description
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • signaturerequired
    Type
    string
    Description
    ECDSA P-256 SHA-256 signature as raw r||s (64 bytes), base64url without padding.1 to 200 characters · matches ^[A-Za-z0-9_-]+$

Response 200Device enrolled

Response of addDevice

Errors

Each is an RFC 7807 problem document whose type URL is a page in the error reference.

  • 400Malformed request
  • 401The signature did not verify
  • 403The enrolment was denied
  • 404No such enrolment for this secret
  • 409Not yet approved, already completed, the key is already a device, or the account has too many devices
  • 410The enrolment expired or was cancelled

Example

curl
curl -X POST https://api.rsx.group/link/v1/devices/add \
  -H "Authorization: Bearer rsx_live_..." \
  -H "Idempotency-Key: 5b8f2d1a-0c7e-4b1f-9a6d-3e2f1c0b9a8d" \
  -H "Content-Type: application/json" \
  -d '{
  "enrolmentId": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
  "keyFingerprint": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs",
  "signature": "q1Vf3n0dJpZx0Vb6q2HcX9yXjXcVv8bN1rQ8eYc5wD4w6s3VtJxk2nB0eQ7pY5uR9sT3vW1xZ2aB4cD6eF8gH0"
}'
200 response
{
  "data": {
    "device": {
      "id": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
      "displayName": "Ada's desktop",
      "platform": "windows",
      "platformVersion": "Windows 11 Pro 24H2",
      "agentVersion": "0.2.0",
      "keyAlgorithm": "ES256",
      "keyFingerprint": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs",
      "status": "active",
      "createdAt": "2026-10-13T12:00:00.000Z",
      "lastAuthorisedAt": null,
      "revokedAt": null,
      "revokedReason": null
    }
  }
}
GET/link/v1/devices/list

List your devices

Your devices, newest first. status filters; the default is every device, revoked included.

Scope
link:devices:list Admin-issued keys only.

Query parameters

Query parameters of listDevices

  • status
    Type
    string
    Description
    one of "active", "revoked", "all" · default "all"
  • cursor
    Type
    string
    Description
    up to 200 characters
  • limit
    Type
    integer
    Description
    1 to 100 · default 50

Response 200Devices

Response of listDevices

  • datarequired
    Type
    array of LinkDevice
    Description
  • idrequired
    Type
    string, uuid
    Description
  • displayNamerequired
    Type
    string
    Description
    1 to 64 characters
  • platformrequired
    Type
    string
    Description
    one of "windows", "linux", "android"
  • platformVersionrequired
    Type
    string, or null
    Description
  • agentVersionrequired
    Type
    string, or null
    Description
  • keyAlgorithmrequired
    Type
    string
    Description
    one of "ES256"
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • statusrequired
    Type
    string
    Description
    one of "active", "revoked"
  • createdAtrequired
    Type
    string, date-time
    Description
  • lastAuthorisedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedReasonrequired
    Type
    string, or null
    Description
    one of "owner"
  • metarequired
    Type
    LinkPageMeta
    Description
  • cursorrequired
    Type
    string, or null
    Description

Errors

Each is an RFC 7807 problem document whose type URL is a page in the error reference.

  • 400The request did not match the endpoint's schema
  • 401Missing or invalid RSX ID token, a token issued to another application, or a platform API key
  • 403Sign-in is not configured

Example

curl
curl "https://api.rsx.group/link/v1/devices/list" \
  -H "Authorization: Bearer rsx_live_..."
200 response
{
  "data": [
    {
      "id": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
      "displayName": "Ada's desktop",
      "platform": "windows",
      "platformVersion": "Windows 11 Pro 24H2",
      "agentVersion": "0.2.0",
      "keyAlgorithm": "ES256",
      "keyFingerprint": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs",
      "status": "active",
      "createdAt": "2026-10-13T12:00:00.000Z",
      "lastAuthorisedAt": null,
      "revokedAt": null,
      "revokedReason": null
    }
  ],
  "meta": {
    "cursor": null
  }
}
GET/link/v1/devices/get

Fetch one of your devices

Scope
link:devices:get Admin-issued keys only.

Query parameters

Query parameters of getDevice

  • idrequired
    Type
    string, uuid
    Description

Response 200Device

Response of getDevice

  • datarequired
    Type
    LinkDevice
    Description
  • idrequired
    Type
    string, uuid
    Description
  • displayNamerequired
    Type
    string
    Description
    1 to 64 characters
  • platformrequired
    Type
    string
    Description
    one of "windows", "linux", "android"
  • platformVersionrequired
    Type
    string, or null
    Description
  • agentVersionrequired
    Type
    string, or null
    Description
  • keyAlgorithmrequired
    Type
    string
    Description
    one of "ES256"
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • statusrequired
    Type
    string
    Description
    one of "active", "revoked"
  • createdAtrequired
    Type
    string, date-time
    Description
  • lastAuthorisedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedReasonrequired
    Type
    string, or null
    Description
    one of "owner"

Errors

Each is an RFC 7807 problem document whose type URL is a page in the error reference.

  • 400The request did not match the endpoint's schema
  • 401Missing or invalid RSX ID token, a token issued to another application, or a platform API key
  • 403Sign-in is not configured
  • 404No such device on your account

Example

curl
curl "https://api.rsx.group/link/v1/devices/get?id=0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f" \
  -H "Authorization: Bearer rsx_live_..."
200 response
{
  "data": {
    "id": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
    "displayName": "Ada's desktop",
    "platform": "windows",
    "platformVersion": "Windows 11 Pro 24H2",
    "agentVersion": "0.2.0",
    "keyAlgorithm": "ES256",
    "keyFingerprint": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs",
    "status": "active",
    "createdAt": "2026-10-13T12:00:00.000Z",
    "lastAuthorisedAt": null,
    "revokedAt": null,
    "revokedReason": null
  }
}
POST/link/v1/devices/update

Rename one of your devices

The display name is the only thing a person may change about a device.

Scope
link:devices:update Admin-issued keys only.

Request bodyapplication/json

Request body of updateDevice

  • idrequired
    Type
    string, uuid
    Description
  • displayNamerequired
    Type
    string
    Description
    1 to 64 characters

Response 200Device

Response of updateDevice

  • datarequired
    Type
    LinkDevice
    Description
  • idrequired
    Type
    string, uuid
    Description
  • displayNamerequired
    Type
    string
    Description
    1 to 64 characters
  • platformrequired
    Type
    string
    Description
    one of "windows", "linux", "android"
  • platformVersionrequired
    Type
    string, or null
    Description
  • agentVersionrequired
    Type
    string, or null
    Description
  • keyAlgorithmrequired
    Type
    string
    Description
    one of "ES256"
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • statusrequired
    Type
    string
    Description
    one of "active", "revoked"
  • createdAtrequired
    Type
    string, date-time
    Description
  • lastAuthorisedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedReasonrequired
    Type
    string, or null
    Description
    one of "owner"

Errors

Each is an RFC 7807 problem document whose type URL is a page in the error reference.

  • 400The request did not match the endpoint's schema
  • 401Missing or invalid RSX ID token, a token issued to another application, or a platform API key
  • 403Sign-in is not configured
  • 404No such device on your account

Example

curl
curl -X POST https://api.rsx.group/link/v1/devices/update \
  -H "Authorization: Bearer rsx_live_..." \
  -H "Content-Type: application/json" \
  -d '{
  "id": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
  "displayName": "Ada'\''s desktop"
}'
200 response
{
  "data": {
    "id": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
    "displayName": "Ada's desktop",
    "platform": "windows",
    "platformVersion": "Windows 11 Pro 24H2",
    "agentVersion": "0.2.0",
    "keyAlgorithm": "ES256",
    "keyFingerprint": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs",
    "status": "active",
    "createdAt": "2026-10-13T12:00:00.000Z",
    "lastAuthorisedAt": null,
    "revokedAt": null,
    "revokedReason": null
  }
}
POST/link/v1/devices/remove

Revoke one of your devices

Irreversible. From the moment this returns, the device can obtain no session and every session it holds is refused with link-device-revoked. Its key can never be enrolled again. Repeatable: revoking a revoked device returns it unchanged.

Scope
link:devices:remove Admin-issued keys only.

Request bodyapplication/json

Request body of removeDevice

  • idrequired
    Type
    string, uuid
    Description

Response 200Device, revoked

Response of removeDevice

  • datarequired
    Type
    LinkDevice
    Description
  • idrequired
    Type
    string, uuid
    Description
  • displayNamerequired
    Type
    string
    Description
    1 to 64 characters
  • platformrequired
    Type
    string
    Description
    one of "windows", "linux", "android"
  • platformVersionrequired
    Type
    string, or null
    Description
  • agentVersionrequired
    Type
    string, or null
    Description
  • keyAlgorithmrequired
    Type
    string
    Description
    one of "ES256"
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • statusrequired
    Type
    string
    Description
    one of "active", "revoked"
  • createdAtrequired
    Type
    string, date-time
    Description
  • lastAuthorisedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedReasonrequired
    Type
    string, or null
    Description
    one of "owner"

Errors

Each is an RFC 7807 problem document whose type URL is a page in the error reference.

  • 400The request did not match the endpoint's schema
  • 401Missing or invalid RSX ID token, a token issued to another application, or a platform API key
  • 403Sign-in is not configured
  • 404No such device on your account

Example

curl
curl -X POST https://api.rsx.group/link/v1/devices/remove \
  -H "Authorization: Bearer rsx_live_..." \
  -H "Content-Type: application/json" \
  -d '{
  "id": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f"
}'
200 response
{
  "data": {
    "id": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
    "displayName": "Ada's desktop",
    "platform": "windows",
    "platformVersion": "Windows 11 Pro 24H2",
    "agentVersion": "0.2.0",
    "keyAlgorithm": "ES256",
    "keyFingerprint": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs",
    "status": "active",
    "createdAt": "2026-10-13T12:00:00.000Z",
    "lastAuthorisedAt": null,
    "revokedAt": null,
    "revokedReason": null
  }
}
03

sessions

3 operations under /link/v1/sessions.

POST/link/v1/challenges/add

Get a challenge to sign for a device session

No credential: a challenge is worthless without the device's key. Valid for 60 seconds and one attempt. Requires an Idempotency-Key. Issued for a revoked device too, so that the device learns it was revoked only after proving it holds the key (sessions/add).

Scope
link:challenges:add Admin-issued keys only.
Idempotency
Requires an Idempotency-Key header. Reusing the key within 24 hours returns the original response instead of creating a second record.

Request bodyapplication/json

Request body of addChallenge

  • deviceIdrequired
    Type
    string, uuid
    Description

Response 200Challenge

Response of addChallenge

  • datarequired
    Type
    LinkChallenge
    Description
  • idrequired
    Type
    string, uuid
    Description
  • challengerequired
    Type
    string
    Description
    43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • expiresAtrequired
    Type
    string, date-time
    Description

Errors

Each is an RFC 7807 problem document whose type URL is a page in the error reference.

  • 400Malformed request
  • 404No such device

Example

curl
curl -X POST https://api.rsx.group/link/v1/challenges/add \
  -H "Authorization: Bearer rsx_live_..." \
  -H "Idempotency-Key: 5b8f2d1a-0c7e-4b1f-9a6d-3e2f1c0b9a8d" \
  -H "Content-Type: application/json" \
  -d '{
  "deviceId": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f"
}'
200 response
{
  "data": {
    "id": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
    "challenge": "3q2-7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
    "expiresAt": "2026-10-13T12:00:00.000Z"
  }
}
POST/link/v1/sessions/add

Exchange a signed challenge for a device session

The device signs the session proof (docs/specs/link.md §6.3) with its enrolled key:

RSX-LINK-V1-SESSION-PROOF\n{deviceId}\n{keyFingerprint}\n{challengeId}\n{challenge}

Returns a 15-minute session token, shown once, which is checked against the device on every use. The challenge is consumed by any attempt. Requires an Idempotency-Key.

Scope
link:sessions:add Admin-issued keys only.
Idempotency
Requires an Idempotency-Key header. Reusing the key within 24 hours returns the original response instead of creating a second record.

Request bodyapplication/json

Request body of addSession

  • protocolrequired
    Type
    integer
    Description
  • deviceIdrequired
    Type
    string, uuid
    Description
  • challengeIdrequired
    Type
    string, uuid
    Description
  • signaturerequired
    Type
    string
    Description
    ECDSA P-256 SHA-256 signature as raw r||s (64 bytes), base64url without padding.1 to 200 characters · matches ^[A-Za-z0-9_-]+$

Response 200Device session

Response of addSession

  • datarequired
    Type
    LinkSessionCreated
    Description
  • tokenrequired
    Type
    string
    Description
    The device session, shown once. Send it as Authorization: Bearer on device-authorised calls.
  • tokenTyperequired
    Type
    string
    Description
    one of "Bearer"
  • expiresAtrequired
    Type
    string, date-time
    Description
  • expiresInrequired
    Type
    integer
    Description
  • devicerequired
    Type
    LinkDevice
    Description

Errors

Each is an RFC 7807 problem document whose type URL is a page in the error reference.

  • 400Unsupported protocol, or a malformed request
  • 401The challenge is unusable, or the signature did not verify
  • 403The device is revoked, or its owner's account is not active
  • 503RSX ID could not confirm the account; retry

Example

curl
curl -X POST https://api.rsx.group/link/v1/sessions/add \
  -H "Authorization: Bearer rsx_live_..." \
  -H "Idempotency-Key: 5b8f2d1a-0c7e-4b1f-9a6d-3e2f1c0b9a8d" \
  -H "Content-Type: application/json" \
  -d '{
  "protocol": 1,
  "deviceId": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
  "challengeId": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
  "signature": "q1Vf3n0dJpZx0Vb6q2HcX9yXjXcVv8bN1rQ8eYc5wD4w6s3VtJxk2nB0eQ7pY5uR9sT3vW1xZ2aB4cD6eF8gH0"
}'
200 response
{
  "data": {
    "token": "rsx_lks_c2Vzc2lvbnRva2VudmFsdWVub3RyZWFsYXRhbGxvaw",
    "tokenType": "Bearer",
    "expiresAt": "2026-10-13T12:00:00.000Z",
    "expiresIn": 900,
    "device": {
      "id": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
      "displayName": "Ada's desktop",
      "platform": "windows",
      "platformVersion": "Windows 11 Pro 24H2",
      "agentVersion": "0.2.0",
      "keyAlgorithm": "ES256",
      "keyFingerprint": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs",
      "status": "active",
      "createdAt": "2026-10-13T12:00:00.000Z",
      "lastAuthorisedAt": null,
      "revokedAt": null,
      "revokedReason": null
    }
  }
}
GET/link/v1/sessions/get

Check the current device session

Authenticated with the device session as Authorization: Bearer rsx_lks_…. The device-authorised call of B02: it answers only while the session is unexpired and the device is active, and reports a revoked device as link-device-revoked from the moment the revocation commits.

Scope
link:sessions:get Admin-issued keys only.

Response 200The session and its device

Response of getSession

  • datarequired
    Type
    LinkSession
    Description
  • deviceIdrequired
    Type
    string, uuid
    Description
  • expiresAtrequired
    Type
    string, date-time
    Description
  • devicerequired
    Type
    LinkDevice
    Description

Errors

Each is an RFC 7807 problem document whose type URL is a page in the error reference.

  • 401The session is missing, unknown or expired
  • 403The device is revoked

Example

curl
curl "https://api.rsx.group/link/v1/sessions/get" \
  -H "Authorization: Bearer rsx_live_..."
200 response
{
  "data": {
    "deviceId": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
    "expiresAt": "2026-10-13T12:00:00.000Z",
    "device": {
      "id": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
      "displayName": "Ada's desktop",
      "platform": "windows",
      "platformVersion": "Windows 11 Pro 24H2",
      "agentVersion": "0.2.0",
      "keyAlgorithm": "ES256",
      "keyFingerprint": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs",
      "status": "active",
      "createdAt": "2026-10-13T12:00:00.000Z",
      "lastAuthorisedAt": null,
      "revokedAt": null,
      "revokedReason": null
    }
  }
}
04

approvals

2 operations under /link/v1/approvals.

GET/link/v1/approvals/get

Look up a device waiting for your approval

The person's view of a pending enrolment, by the code the device shows: what is asking, from where, and until when. Only live enrolments, and only ones nobody else has approved.

Scope
link:approvals:get Admin-issued keys only.

Query parameters

Query parameters of getApproval

  • coderequired
    Type
    string
    Description
    The code shown by the device. Case and hyphens are ignored.8 to 16 characters

Response 200The enrolment awaiting a decision

Response of getApproval

  • datarequired
    Type
    LinkApproval
    Description
  • enrolmentIdrequired
    Type
    string, uuid
    Description
  • userCoderequired
    Type
    string
    Description
    matches ^[A-Z]{4}-[A-Z]{4}$
  • staterequired
    Type
    string
    Description
    one of "pending", "approved", "denied"
  • createdAtrequired
    Type
    string, date-time
    Description
  • expiresAtrequired
    Type
    string, date-time
    Description
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • requestCountryrequired
    Type
    string, or null
    Description
    Where the enrolment was opened from, by the edge's estimate.
  • devicerequired
    Type
    object
    Description
  • displayNamerequired
    Type
    string
    Description
  • platformrequired
    Type
    string
    Description
    one of "windows", "linux", "android"
  • platformVersionrequired
    Type
    string, or null
    Description
  • agentVersionrequired
    Type
    string, or null
    Description

Errors

Each is an RFC 7807 problem document whose type URL is a page in the error reference.

  • 400The request did not match the endpoint's schema
  • 401Missing or invalid RSX ID token, a token issued to another application, or a platform API key
  • 403Sign-in is not configured
  • 404No live enrolment with that code

Example

curl
curl "https://api.rsx.group/link/v1/approvals/get?code=BCDF-GHJK" \
  -H "Authorization: Bearer rsx_live_..."
200 response
{
  "data": {
    "enrolmentId": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
    "userCode": "BCDF-GHJK",
    "state": "pending",
    "createdAt": "2026-10-13T12:00:00.000Z",
    "expiresAt": "2026-10-13T12:00:00.000Z",
    "keyFingerprint": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs",
    "requestCountry": "GB",
    "device": {
      "displayName": "Ada's desktop",
      "platform": "windows",
      "platformVersion": "string",
      "agentVersion": "string"
    }
  }
}
POST/link/v1/approvals/update

Approve or deny a device

Both the code and the enrolment id are required, so the decision applies to exactly the request the person was shown. Approving makes the caller the device's owner once the device completes enrolment; it is idempotent for the approver. Denying is allowed while pending, and by the approver until the device completes.

Scope
link:approvals:update Admin-issued keys only.

Request bodyapplication/json

Request body of updateApproval

  • enrolmentIdrequired
    Type
    string, uuid
    Description
  • coderequired
    Type
    string
    Description
    The code shown by the device. Case and hyphens are ignored.8 to 16 characters
  • decisionrequired
    Type
    string
    Description
    one of "approve", "deny"
  • displayName
    Type
    string
    Description
    Name the device as it will appear in your list. Defaults to the name the device proposed.1 to 64 characters

Response 200The decision

Response of updateApproval

  • datarequired
    Type
    LinkApproval
    Description
  • enrolmentIdrequired
    Type
    string, uuid
    Description
  • userCoderequired
    Type
    string
    Description
    matches ^[A-Z]{4}-[A-Z]{4}$
  • staterequired
    Type
    string
    Description
    one of "pending", "approved", "denied"
  • createdAtrequired
    Type
    string, date-time
    Description
  • expiresAtrequired
    Type
    string, date-time
    Description
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • requestCountryrequired
    Type
    string, or null
    Description
    Where the enrolment was opened from, by the edge's estimate.
  • devicerequired
    Type
    object
    Description
  • displayNamerequired
    Type
    string
    Description
  • platformrequired
    Type
    string
    Description
    one of "windows", "linux", "android"
  • platformVersionrequired
    Type
    string, or null
    Description
  • agentVersionrequired
    Type
    string, or null
    Description

Errors

Each is an RFC 7807 problem document whose type URL is a page in the error reference.

  • 400The request did not match the endpoint's schema
  • 401Missing or invalid RSX ID token, a token issued to another application, or a platform API key
  • 403Sign-in is not configured, or the account is not active
  • 404No live enrolment with that code and id
  • 409Already decided by someone else, the key is already a device, or too many devices
  • 503RSX ID could not confirm the account; nothing was changed

Example

curl
curl -X POST https://api.rsx.group/link/v1/approvals/update \
  -H "Authorization: Bearer rsx_live_..." \
  -H "Content-Type: application/json" \
  -d '{
  "enrolmentId": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
  "code": "BCDF-GHJK",
  "decision": "approve",
  "displayName": "Ada'\''s desktop"
}'
200 response
{
  "data": {
    "enrolmentId": "0199d6a1-3b2c-7d4e-8f50-6a7b8c9d0e1f",
    "userCode": "BCDF-GHJK",
    "state": "pending",
    "createdAt": "2026-10-13T12:00:00.000Z",
    "expiresAt": "2026-10-13T12:00:00.000Z",
    "keyFingerprint": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs",
    "requestCountry": "GB",
    "device": {
      "displayName": "Ada's desktop",
      "platform": "windows",
      "platformVersion": "string",
      "agentVersion": "string"
    }
  }
}
05

Schemas

Every named shape in this reference, as the operations above refer to it.

LinkEnrolment

LinkEnrolment

  • idrequired
    Type
    string, uuid
    Description
  • staterequired
    Type
    string
    Description
    one of "pending", "approved", "denied", "consumed", "expired", "cancelled"
  • userCoderequired
    Type
    string
    Description
    matches ^[A-Z]{4}-[A-Z]{4}$
  • approvalUrirequired
    Type
    string, uri
    Description
  • approvalUriCompleterequired
    Type
    string, uri
    Description
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • createdAtrequired
    Type
    string, date-time
    Description
  • expiresAtrequired
    Type
    string, date-time
    Description
  • pollIntervalSecondsrequired
    Type
    integer
    Description
  • challengerequired
    Type
    string, or null
    Description
    Set only while approved: sign it into the enrolment proof and call devices/add.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • deviceIdrequired
    Type
    string, uuid, or null
    Description
    Set once consumed.

LinkEnrolmentCreated

LinkEnrolmentCreated

  • enrolmentrequired
    Type
    LinkEnrolment
    Description
  • idrequired
    Type
    string, uuid
    Description
  • staterequired
    Type
    string
    Description
    one of "pending", "approved", "denied", "consumed", "expired", "cancelled"
  • userCoderequired
    Type
    string
    Description
    matches ^[A-Z]{4}-[A-Z]{4}$
  • approvalUrirequired
    Type
    string, uri
    Description
  • approvalUriCompleterequired
    Type
    string, uri
    Description
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • createdAtrequired
    Type
    string, date-time
    Description
  • expiresAtrequired
    Type
    string, date-time
    Description
  • pollIntervalSecondsrequired
    Type
    integer
    Description
  • challengerequired
    Type
    string, or null
    Description
    Set only while approved: sign it into the enrolment proof and call devices/add.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • deviceIdrequired
    Type
    string, uuid, or null
    Description
    Set once consumed.
  • secretrequired
    Type
    string
    Description
    The enrolment secret, shown once. Send it as Authorization: Bearer to enrolments/get, enrolments/remove and devices/add.

Problem

Problem

  • typerequired
    Type
    string
    Description
  • titlerequired
    Type
    string
    Description
  • statusrequired
    Type
    integer
    Description
  • detail
    Type
    string
    Description
  • instance
    Type
    string
    Description
  • requestId
    Type
    string
    Description

LinkCreateEnrolment

LinkCreateEnrolment

  • protocolrequired
    Type
    integer
    Description
    Must be 1.
  • keyAlgorithmrequired
    Type
    string
    Description
    one of "ES256"
  • publicKeyrequired
    Type
    string
    Description
    The device's P-256 public key, SPKI DER encoded, base64url without padding.80 to 200 characters · matches ^[A-Za-z0-9_-]+$
  • platformrequired
    Type
    string
    Description
    One of: windows, linux, android.up to 32 characters
  • displayName
    Type
    string
    Description
    1 to 64 characters
  • platformVersion
    Type
    string
    Description
    1 to 64 characters
  • agentVersion
    Type
    string
    Description
    1 to 32 characters

LinkRemoveEnrolment

LinkRemoveEnrolment

  • idrequired
    Type
    string, uuid
    Description

LinkDevice

LinkDevice

  • idrequired
    Type
    string, uuid
    Description
  • displayNamerequired
    Type
    string
    Description
    1 to 64 characters
  • platformrequired
    Type
    string
    Description
    one of "windows", "linux", "android"
  • platformVersionrequired
    Type
    string, or null
    Description
  • agentVersionrequired
    Type
    string, or null
    Description
  • keyAlgorithmrequired
    Type
    string
    Description
    one of "ES256"
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • statusrequired
    Type
    string
    Description
    one of "active", "revoked"
  • createdAtrequired
    Type
    string, date-time
    Description
  • lastAuthorisedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedReasonrequired
    Type
    string, or null
    Description
    one of "owner"

LinkDeviceCreated

LinkDeviceCreated

  • devicerequired
    Type
    LinkDevice
    Description
  • idrequired
    Type
    string, uuid
    Description
  • displayNamerequired
    Type
    string
    Description
    1 to 64 characters
  • platformrequired
    Type
    string
    Description
    one of "windows", "linux", "android"
  • platformVersionrequired
    Type
    string, or null
    Description
  • agentVersionrequired
    Type
    string, or null
    Description
  • keyAlgorithmrequired
    Type
    string
    Description
    one of "ES256"
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • statusrequired
    Type
    string
    Description
    one of "active", "revoked"
  • createdAtrequired
    Type
    string, date-time
    Description
  • lastAuthorisedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedReasonrequired
    Type
    string, or null
    Description
    one of "owner"

LinkCreateDevice

LinkCreateDevice

  • enrolmentIdrequired
    Type
    string, uuid
    Description
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • signaturerequired
    Type
    string
    Description
    ECDSA P-256 SHA-256 signature as raw r||s (64 bytes), base64url without padding.1 to 200 characters · matches ^[A-Za-z0-9_-]+$

LinkChallenge

LinkChallenge

  • idrequired
    Type
    string, uuid
    Description
  • challengerequired
    Type
    string
    Description
    43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • expiresAtrequired
    Type
    string, date-time
    Description

LinkCreateChallenge

LinkCreateChallenge

  • deviceIdrequired
    Type
    string, uuid
    Description

LinkSessionCreated

LinkSessionCreated

  • tokenrequired
    Type
    string
    Description
    The device session, shown once. Send it as Authorization: Bearer on device-authorised calls.
  • tokenTyperequired
    Type
    string
    Description
    one of "Bearer"
  • expiresAtrequired
    Type
    string, date-time
    Description
  • expiresInrequired
    Type
    integer
    Description
  • devicerequired
    Type
    LinkDevice
    Description
  • idrequired
    Type
    string, uuid
    Description
  • displayNamerequired
    Type
    string
    Description
    1 to 64 characters
  • platformrequired
    Type
    string
    Description
    one of "windows", "linux", "android"
  • platformVersionrequired
    Type
    string, or null
    Description
  • agentVersionrequired
    Type
    string, or null
    Description
  • keyAlgorithmrequired
    Type
    string
    Description
    one of "ES256"
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • statusrequired
    Type
    string
    Description
    one of "active", "revoked"
  • createdAtrequired
    Type
    string, date-time
    Description
  • lastAuthorisedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedReasonrequired
    Type
    string, or null
    Description
    one of "owner"

LinkCreateSession

LinkCreateSession

  • protocolrequired
    Type
    integer
    Description
  • deviceIdrequired
    Type
    string, uuid
    Description
  • challengeIdrequired
    Type
    string, uuid
    Description
  • signaturerequired
    Type
    string
    Description
    ECDSA P-256 SHA-256 signature as raw r||s (64 bytes), base64url without padding.1 to 200 characters · matches ^[A-Za-z0-9_-]+$

LinkSession

LinkSession

  • deviceIdrequired
    Type
    string, uuid
    Description
  • expiresAtrequired
    Type
    string, date-time
    Description
  • devicerequired
    Type
    LinkDevice
    Description
  • idrequired
    Type
    string, uuid
    Description
  • displayNamerequired
    Type
    string
    Description
    1 to 64 characters
  • platformrequired
    Type
    string
    Description
    one of "windows", "linux", "android"
  • platformVersionrequired
    Type
    string, or null
    Description
  • agentVersionrequired
    Type
    string, or null
    Description
  • keyAlgorithmrequired
    Type
    string
    Description
    one of "ES256"
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • statusrequired
    Type
    string
    Description
    one of "active", "revoked"
  • createdAtrequired
    Type
    string, date-time
    Description
  • lastAuthorisedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedAtrequired
    Type
    string, date-time, or null
    Description
  • revokedReasonrequired
    Type
    string, or null
    Description
    one of "owner"

LinkApproval

LinkApproval

  • enrolmentIdrequired
    Type
    string, uuid
    Description
  • userCoderequired
    Type
    string
    Description
    matches ^[A-Z]{4}-[A-Z]{4}$
  • staterequired
    Type
    string
    Description
    one of "pending", "approved", "denied"
  • createdAtrequired
    Type
    string, date-time
    Description
  • expiresAtrequired
    Type
    string, date-time
    Description
  • keyFingerprintrequired
    Type
    string
    Description
    RFC 7638 JWK thumbprint (SHA-256) of the device public key, base64url.43 to 43 characters · matches ^[A-Za-z0-9_-]+$
  • requestCountryrequired
    Type
    string, or null
    Description
    Where the enrolment was opened from, by the edge's estimate.
  • devicerequired
    Type
    object
    Description
  • displayNamerequired
    Type
    string
    Description
  • platformrequired
    Type
    string
    Description
    one of "windows", "linux", "android"
  • platformVersionrequired
    Type
    string, or null
    Description
  • agentVersionrequired
    Type
    string, or null
    Description

LinkUpdateApproval

LinkUpdateApproval

  • enrolmentIdrequired
    Type
    string, uuid
    Description
  • coderequired
    Type
    string
    Description
    The code shown by the device. Case and hyphens are ignored.8 to 16 characters
  • decisionrequired
    Type
    string
    Description
    one of "approve", "deny"
  • displayName
    Type
    string
    Description
    Name the device as it will appear in your list. Defaults to the name the device proposed.1 to 64 characters

LinkPageMeta

LinkPageMeta

  • cursorrequired
    Type
    string, or null
    Description

LinkUpdateDevice

LinkUpdateDevice

  • idrequired
    Type
    string, uuid
    Description
  • displayNamerequired
    Type
    string
    Description
    1 to 64 characters

LinkRemoveDevice

LinkRemoveDevice

  • idrequired
    Type
    string, uuid
    Description