Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Ring Server API Specification

Authentication/Authorization

API requests are authenticated and authorized via pre-shared API keys

API Base

The base URL is /api

Server Information

GET /manifest

Retrieve the canonical manifest for the ring.

Validation

POST /member/validate

Performs validation checks for the given site. Takes the site’s manifest/signature as a body.

Returns a JSON object containing the validation status.

{ "result": "success" }

Standing

POST /member/standing

url: https://bobsawesomesite.com

Queries the ring for standing data. Returns a JSON object containing standing, vote breakdown, and anonymized descriptions.

{
  "standing": "Good"`
  "vote_split": {
    "good": 2,
    "bad": 0,
    "neutral": 1
  },
  "descriptions": [
    "Nice stuff here!",
    "Could be easier to read",
    "I like this site a lot"
  ]
}

Member Management

POST /member/invite/redeem

Redeems an invite code with data from the invitee to create a new Member record.

{
  "invite_code": "random-invite-code",
  "site_url": "https://example.com"
  "url": "https://alice-zone.net",
  "name": "Alice's Zone",
  "description": "A to Z Cryptography",
  "public_signing_key": "swfQMCUcf2fLEF6vfGCSnRBJTUiuRILYNmoZRnIdh0E="
}

Returns key data for the ring to the requester, upon join.

POST /member/rotate

Rotates a member’s public key. The request contains the URL, old key, the new key, and a signature of the request payload.

JSON body:

{
  "request": {
    "new_key": "some_base64==",
    "old_key": "some_base64==",
    "member_url": "https://alice-zone.net"
  },
  "signature": "more_base64=="
}

If rotation successul, returns:

{
  "result": "success"
}

POST /member/unenroll

Unenroll from a ring. The body is the member URL, and a signature of that payload.

{
  "request": {
    "member_url": "https://bobsawesomesite.com"
  },
  "signature": "base64_signature_of_request"
}

Success returns:

{
  "status": "unenrolled"
}