A record of a user's attempt at solving an org.lichess.puzzle. Ranked attempts carry a detached signature (sig) from the service proving the submitted moves were judged server-side. Rating is not part of the record: it is each scoring service's (appview's) own business.
tid
Timestamp-based ID
Properties
createdAt
string
datetime
Required
client-declared timestamp when this attempt record was created.
fen
string
Optional
The FEN of the puzzle's starting position (position before the opponent's setup move). Advisory context denormalized from the puzzle; derivable from puzzleId and not covered by sig.
maxLength: 128 bytesmode
string
Optional
Whether this attempt was played for rating and should be counted towards the user's rating.
casual, rankedcasualnonce
string
Optional
Idempotency key echoed back by submitAttempt (the challenge's jti). Uniquely identifies the issued challenge, so duplicate records for one attempt can be detected. Covered by sig.
maxLength: 64 bytesplayerMoves
string
Required
the moves played by the solver during the attempt, in the same notation as the puzzle's solution moves. For ranked attempts this must be the line submitted to submitAttempt verbatim: it is covered by sig.
puzzleId
string
Required
Lichess puzzle ID.
maxLength: 32 bytesservice
string
did
Required
DID of the puzzle/scoring service that issued this puzzle and owns the rating it affects. This is traditionally a did:web of the web server, not a user's identity. Needed to be able to find the puzzle
sig
string
Optional
base64url (unpadded) detached signature by the service proving it judged playerMoves against the puzzle's solution with the given solved result. Signs the canonical DAG-CBOR encoding of an org.lichess.puzzle.defs#resultAttestation rebuilt from this record's fields — see that def for the exact verification recipe. Present only when the attempt was rated (ranked and not flagged).
maxLength: 128 bytessolved
boolean
Required
Whether the puzzle was solved. Advisory (client-claimed) unless sig is present, in which case it is the server-judged result and covered by the signature.
View raw schema
{
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"puzzleId",
"service",
"solved",
"playerMoves",
"createdAt"
],
"properties": {
"fen": {
"type": "string",
"maxLength": 128,
"description": "The FEN of the puzzle's starting position (position before the opponent's setup move). Advisory context denormalized from the puzzle; derivable from puzzleId and not covered by sig."
},
"sig": {
"type": "string",
"maxLength": 128,
"description": "base64url (unpadded) detached signature by the service proving it judged playerMoves against the puzzle's solution with the given solved result. Signs the canonical DAG-CBOR encoding of an org.lichess.puzzle.defs#resultAttestation rebuilt from this record's fields — see that def for the exact verification recipe. Present only when the attempt was rated (ranked and not flagged)."
},
"mode": {
"type": "string",
"default": "casual",
"description": "Whether this attempt was played for rating and should be counted towards the user's rating.",
"knownValues": [
"casual",
"ranked"
]
},
"nonce": {
"type": "string",
"maxLength": 64,
"description": "Idempotency key echoed back by submitAttempt (the challenge's jti). Uniquely identifies the issued challenge, so duplicate records for one attempt can be detected. Covered by sig."
},
"solved": {
"type": "boolean",
"description": "Whether the puzzle was solved. Advisory (client-claimed) unless sig is present, in which case it is the server-judged result and covered by the signature."
},
"service": {
"type": "string",
"format": "did",
"description": "DID of the puzzle/scoring service that issued this puzzle and owns the rating it affects. This is traditionally a did:web of the web server, not a user's identity. Needed to be able to find the puzzle"
},
"puzzleId": {
"type": "string",
"maxLength": 32,
"description": "Lichess puzzle ID."
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "client-declared timestamp when this attempt record was created."
},
"playerMoves": {
"type": "string",
"description": "the moves played by the solver during the attempt, in the same notation as the puzzle's solution moves. For ranked attempts this must be the line submitted to submitAttempt verbatim: it is covered by sig."
}
}
},
"description": "A record of a user's attempt at solving an org.lichess.puzzle. Ranked attempts carry a detached signature (sig) from the service proving the submitted moves were judged server-side. Rating is not part of the record: it is each scoring service's (appview's) own business."
}