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
application/jsonattestation
refgames.cavu.defs#attestation
Required
No description available.
grant
refgames.cavu.defs#grant
Required
No description available.
Output
application/jsoncapabilities
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.
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"
}