games.cavu.bindSession

chris.pardy.family

Documentation

Served by the game host named in a grant's hostService. The game server presents the grant and its attestation with a DPoP proof (DPoP header, ES256). The host verifies the attestation against the launch service's key, checks the grant is unexpired and names this host, checks `jkt` matches the proof key, consumes the nonce (which it minted for `player`), and binds a session to that key. Later calls (getCapabilities, com.atproto.repo.putRecord, ...) carry `Authorization: DPoP <session>` plus a fresh proof.

main procedure

Served by the game host named in a grant's hostService. The game server presents the grant and its attestation with a DPoP proof (DPoP header, ES256). The host verifies the attestation against the launch service's key, checks the grant is unexpired and names this host, checks `jkt` matches the proof key, consumes the nonce (which it minted for `player`), and binds a session to that key. Later calls (getCapabilities, com.atproto.repo.putRecord, ...) carry `Authorization: DPoP <session>` plus a fresh proof.

Input

Encodingapplication/json

Output

Encodingapplication/json
capabilities array Required

No description available.

expiresAt stringdatetime Required

Session lifetime, independent of (and longer than) the grant's.

handle stringhandle Optional

An AT Protocol handle (e.g., alice.bsky.social).

player stringdid Required

A decentralized identifier (DID).

presence boolean Optional

The player chose (at this host) to show what they're playing: the session may keep their games.atmosphere.status record (rkey 'self') naming this game's games.atmosphere.define record, and its capabilities include that write. Checked against the player's current choice on every write.

session string Required

Opaque session token; only usable with the bound DPoP key.

Errors

AuthRequired Missing or invalid DPoP proof.
InvalidGrant Bad attestation, wrong host, or unknown launch service key.
GrantExpired
NonceUsed
KeyMismatch The DPoP key's thumbprint is not the grant's jkt.
PlayerSignedOut The host no longer holds a session for the grant's player.
Try It

Requests are sent directly from your browser. Some servers may block requests due to CORS.

Base URL for XRPC calls (e.g., https://bsky.social)
Enter valid JSON for the request body
View raw schema
{
  "description": "Served by the game host named in a grant's hostService. The game server presents the grant and its attestation with a DPoP proof (DPoP header, ES256). The host verifies the attestation against the launch service's key, checks the grant is unexpired and names this host, checks `jkt` matches the proof key, consumes the nonce (which it minted for `player`), and binds a session to that key. Later calls (getCapabilities, com.atproto.repo.putRecord, ...) carry `Authorization: DPoP <session>` plus a fresh proof.",
  "errors": [
    {
      "description": "Missing or invalid DPoP proof.",
      "name": "AuthRequired"
    },
    {
      "description": "Bad attestation, wrong host, or unknown launch service key.",
      "name": "InvalidGrant"
    },
    {
      "name": "GrantExpired"
    },
    {
      "name": "NonceUsed"
    },
    {
      "description": "The DPoP key's thumbprint is not the grant's jkt.",
      "name": "KeyMismatch"
    },
    {
      "description": "The host no longer holds a session for the grant's player.",
      "name": "PlayerSignedOut"
    }
  ],
  "input": {
    "encoding": "application/json",
    "schema": {
      "properties": {
        "attestation": {
          "ref": "games.cavu.defs#attestation",
          "type": "ref"
        },
        "grant": {
          "ref": "games.cavu.defs#grant",
          "type": "ref"
        }
      },
      "required": [
        "grant",
        "attestation"
      ],
      "type": "object"
    }
  },
  "output": {
    "encoding": "application/json",
    "schema": {
      "properties": {
        "capabilities": {
          "items": {
            "ref": "games.cavu.defs#capability",
            "type": "ref"
          },
          "type": "array"
        },
        "expiresAt": {
          "description": "Session lifetime, independent of (and longer than) the grant's.",
          "format": "datetime",
          "type": "string"
        },
        "handle": {
          "format": "handle",
          "type": "string"
        },
        "player": {
          "format": "did",
          "type": "string"
        },
        "presence": {
          "description": "The player chose (at this host) to show what they're playing: the session may keep their games.atmosphere.status record (rkey 'self') naming this game's games.atmosphere.define record, and its capabilities include that write. Checked against the player's current choice on every write.",
          "type": "boolean"
        },
        "session": {
          "description": "Opaque session token; only usable with the bound DPoP key.",
          "maxLength": 256,
          "type": "string"
        }
      },
      "required": [
        "session",
        "player",
        "expiresAt",
        "capabilities"
      ],
      "type": "object"
    }
  },
  "type": "procedure"
}

Lexicon Garden

@