Lichess API

The Lichess API is a comprehensive REST and streaming API covering account, users, games, puzzles, teams, challenges, board and bot play, Arena and Swiss tournaments, simuls, studies, broadcasts, messaging, OAuth, FIDE data, opening explorer, tablebase, external engine, and cloud evaluation. The full OpenAPI 3.1 specification is published at github.com/lichess-org/api with 185 operations across 23 tags, and many endpoints stream responses as newline-delimited JSON (ND-JSON).

Lichess API is published by Lichess on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 15 machine-runnable capabilities that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko and 2 JSON Schema definitions.

Tagged areas include Chess, Games, Open Source, and REST. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, a JSON-LD context, 15 Naftiko capability specs, and 2 JSON Schemas.

Documentation

Specifications

Schemas & Data

Other Resources

🔗
JSONLD
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/json-ld/lichess-context.jsonld
🔗
SpectralRuleset
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/rules/lichess-rules.yml
🔗
NaftikoCapability
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/capabilities/account.yaml
🔗
NaftikoCapability
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/capabilities/users.yaml
🔗
NaftikoCapability
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/capabilities/games.yaml
🔗
NaftikoCapability
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/capabilities/puzzles.yaml
🔗
NaftikoCapability
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/capabilities/teams.yaml
🔗
NaftikoCapability
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/capabilities/board.yaml
🔗
NaftikoCapability
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/capabilities/bot.yaml
🔗
NaftikoCapability
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/capabilities/challenges.yaml
🔗
NaftikoCapability
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/capabilities/arena-tournaments.yaml
🔗
NaftikoCapability
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/capabilities/swiss-tournaments.yaml
🔗
NaftikoCapability
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/capabilities/studies.yaml
🔗
NaftikoCapability
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/capabilities/broadcasts.yaml
🔗
NaftikoCapability
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/capabilities/opening-explorer.yaml
🔗
NaftikoCapability
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/capabilities/tablebase.yaml
🔗
NaftikoCapability
https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/capabilities/external-engine.yaml

OpenAPI Specification

lichess-openapi.yml Raw ↑
openapi: 3.1.0
info:
  version: 2.0.144
  title: Lichess.org API reference
  contact:
    name: Lichess.org API
    url: https://lichess.org/api
    email: [email protected]
  x-logo:
    url: https://lichess1.org/assets/logo/lichess-pad12.svg
  license:
    name: AGPL-3.0-or-later
    url: https://www.gnu.org/licenses/agpl-3.0.txt
  description: |
    # Introduction
    Welcome to the reference for the Lichess API! Lichess is free/libre,
    open-source chess server powered by volunteers and donations.
    - Get help in the [Lichess Discord channel](https://discord.gg/lichess)
    - API demo app with OAuth2 login and gameplay: [source](https://github.com/lichess-org/api-demo) / [demo](https://lichess-org.github.io/api-demo/)
    - API UI app with OAuth2 login and endpoint forms: [source](https://github.com/lichess-org/api-ui) / [website](https://lichess.org/api/ui)
    - [Contribute to this documentation on Github](https://github.com/lichess-org/api)
    - Check out [Lichess widgets to embed in your website](https://lichess.org/developers)
    - [Download all Lichess rated games](https://database.lichess.org/)
    - [Download all Lichess puzzles with themes, ratings and votes](https://database.lichess.org/#puzzles)
    - [Download all evaluated positions](https://database.lichess.org/#evals)

    ## Endpoint
    All requests go to `https://lichess.org` (unless otherwise specified).

    ## Clients
    - [Python general API](https://github.com/lichess-org/berserk)
    - [MicroPython general API](https://github.com/mkomon/uberserk)
    - [Python general API - async](https://pypi.org/project/async-lichess-sdk)
    - [Python Lichess Bot](https://github.com/lichess-bot-devs/lichess-bot)
    - [Python Board API for Certabo](https://github.com/haklein/certabo-lichess)
    - [Java general API](https://github.com/tors42/chariot)
    - [JavaScript & TypeScript general API](https://github.com/devjiwonchoi/equine)
    - [LichessNET - C# API Wrapper](https://github.com/Rabergsel/LichessNET)
    - [.NET general API](https://github.com/Dblike/LichessSharp)

    ## Rate limiting
    All requests are rate limited using various strategies,
    to ensure the API remains responsive for everyone.
    Only make one request at a time.
    If you receive an HTTP response with a [429 status](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#429),
    you have exceded one of the rate limits.
    In most cases, waiting one minute before retrying will be sufficient, but some limits may require longer.
    Reduce your request frequency before retrying.

    ## Streaming with ND-JSON
    Some API endpoints stream their responses as [Newline Delimited JSON a.k.a. **nd-json**](https://github.com/ndjson/ndjson-spec), with one JSON object per line.

    Here's a [JavaScript utility function](https://gist.github.com/ornicar/a097406810939cf7be1df8ea30e94f3e) to help reading NDJSON streamed responses.

    ## Authentication
    ### Which authentication method is right for me?
    [Read about the Lichess API authentication methods and code examples](https://github.com/lichess-org/api/blob/master/example/README.md)

    ### Personal Access Token
    Personal API access tokens allow you to quickly interact with Lichess API without going through an OAuth flow.
    - [Generate a personal access token](https://lichess.org/account/oauth/token)
    - `curl https://lichess.org/api/account -H "Authorization: Bearer {token}"`
    - [NodeJS example](https://github.com/lichess-org/api/tree/master/example/oauth-personal-token)

    ### Token Security
    - Keep your tokens secret. Do not share them in public repositories or public forums.
    - Your tokens can be used to make your account perform arbitrary actions (within the limits of the tokens' scope). You remain responsible for all activities on your account.
    - Do not hardcode tokens in your application's code. Use environment variables or a secure storage and ensure they are not shipped/exposed to users. Be especially careful that they are not included in frontend bundles or apps that are shipped to users.
    - If you suspect a token has been compromised, revoke it immediately.

    To see your active tokens or revoke them, see [your Personal API access tokens](https://lichess.org/account/oauth/token).

    ### Authorization Code Flow with PKCE
    The authorization code flow with PKCE allows your users to **login with Lichess**.
    Lichess supports unregistered and public clients (no client authentication, choose any unique client id).
    The only accepted code challenge method is `S256`.
    Access tokens are long-lived (expect one year), unless they are revoked.
    Refresh tokens are not supported.

    See the [documentation for the OAuth endpoints](#tag/OAuth) or
    the [PKCE RFC](https://datatracker.ietf.org/doc/html/rfc7636#section-4) for a precise protocol description.

    - [Demo app](https://lichess-org.github.io/api-demo/)
    - [Minimal client-side example](https://github.com/lichess-org/api/tree/master/example/oauth-app)
    - [Flask/Python example](https://github.com/lakinwecker/lichess-oauth-flask)
    - [Java example](https://github.com/tors42/lichess-oauth-pkce-app)
    - [NodeJS Passport strategy to login with Lichess OAuth2](https://www.npmjs.com/package/passport-lichess)

    #### Real life examples
    - [PyChess](https://github.com/gbtami/pychess-variants) ([source code](https://github.com/gbtami/pychess-variants))
    - [Lichess4545](https://www.lichess4545.com/) ([source code](https://github.com/cyanfish/heltour))
    - [English Chess Federation](https://ecf.octoknight.com/)
    - [Rotherham Online Chess](https://rotherhamonlinechess.azurewebsites.net/tournaments)

    ### Token format
    Access tokens and authorization codes match `^[A-Za-z0-9_]+$`.
    The length of tokens can be increased without notice. Make sure your application can handle at least 512 characters.
    By convention tokens have a recognizable prefix, but do not rely on this.
servers:
  - url: https://lichess.org
  - url: https://lichess.dev
  - url: http://localhost:{port}
    variables:
      port:
        default: '8080'
  - url: http://l.org
tags:
  - name: Account
    description: |
      Read and write account information and preferences.
      <https://lichess.org/account/preferences/game-display>
  - name: Analysis
    description: |
      Access Lichess cloud evaluations database.
      <https://lichess.org/analysis>
  - name: Board
    description: |
      Play on Lichess with physical boards and third-party clients.
      Works with normal Lichess accounts. Engine play or assistance is [forbidden](https://lichess.org/page/fair-play).

      ### Features
      - [Stream incoming chess moves](#tag/board/GET/api/board/game/stream/{gameId})
      - [Play chess moves](#tag/board/POST/api/board/game/{gameId}/move/{move})
      - [Read](#tag/board/GET/api/board/game/stream/{gameId}) and [write](#tag/board/POST/api/board/game/{gameId}/chat) in the player and spectator chats
      - [Receive](#tag/board/GET/api/stream/event), [create](#tag/challenges/POST/api/challenge/{username}) and [accept](#tag/challenges/POST/api/challenge/{challengeId}/accept) (or [decline](#tag/challenges/POST/api/challenge/{challengeId}/decline)) challenges
      - [Abort](#tag/board/POST/api/board/game/{gameId}/abort) and [resign](#tag/board/POST/api/board/game/{gameId}/resign) games
      - Compatible with normal Lichess accounts

      ### Restrictions
      - Engine assistance, or any kind of outside help, is [forbidden](https://lichess.org/page/fair-play)
      - Time controls: [Rapid, Classical and Correspondence](https://lichess.org/faq#time-controls) only.
        For direct challenges, games vs AI, and bulk pairing, Blitz is also possible.

      ### Links
      - [Announcement](https://lichess.org/blog/XlRW5REAAB8AUJJ-/welcome-lichess-boards)
      - [Implementation example](https://github.com/lichess-org/api-demo) and [live demo](https://lichess-org.github.io/api-demo/)
      - [Certabo support](https://github.com/haklein/certabo-lichess)
      - [Lichs (play from command-line)](https://github.com/Cqsi/lichs)
      - [Lichess discord bot](https://top.gg/bot/707287095911120968)
      - [cli-chess](https://github.com/trevorbayless/cli-chess/)
      - [Blunderly 3D board](https://github.com/maurimo/blunderly)
      - Yours? Please make [an issue or pull request](https://github.com/lichess-org/api).
  - name: Bot
    description: |
      Play on Lichess as a bot. Allows engine play.
      Read the [blog post announcement of lichess bots](https://lichess.org/blog/WvDNticAAMu_mHKP/welcome-lichess-bots).

      Only works with [Bot accounts](#tag/bot/POST/api/bot/account/upgrade).

      ### Features
      - [Stream incoming chess moves](#tag/bot/GET/api/bot/game/stream/{gameId})
      - [Play chess moves](#tag/bot/POST/api/bot/game/{gameId}/move/{move})
      - [Read](#tag/bot/GET/api/bot/game/stream/{gameId}) and [write](#tag/bot/POST/api/bot/game/{gameId}/chat) in the player and spectator chats
      - [Receive](#tag/bot/GET/api/stream/event), [create](#tag/challenges/POST/api/challenge/{username}) and [accept](#tag/challenges/POST/api/challenge/{challengeId}/accept) (or [decline](#tag/challenges/POST/api/challenge/{challengeId}/decline)) challenges
      - [Abort](#tag/bot/POST/api/bot/game/{gameId}/abort) and [resign](#tag/bot/POST/api/bot/game/{gameId}/resign) games
      - Engine assistance is [allowed](https://lichess.org/page/fair-play)
      ### Restrictions
      - Bots can only play challenge games:  pools and tournaments are off-limits
      - Bots cannot play UltraBullet (¼+0) because it requires making too many requests. But 0+1 and ½+0 are allowed.
      - Bots must follow [Lichess TOS](https://lichess.org/terms-of-service) specifically Sandbagging, Constant Aborting, Boosting, etc
      - Bot devs are advised to make their Bots play casual only when testing their Bots logic and to avoid breaking Lichess TOS.
      ### Integrations
      - [Python3 lichess-bot](https://github.com/lichess-bot-devs/lichess-bot) (official)
      - [Python3 lichess UCI bot](https://github.com/Torom/BotLi)
      - [JavaScript bot-o-tron](https://github.com/tailuge/bot-o-tron)
      - [Golang lichess-bot](https://github.com/dolegi/lichess-bot)
      - [Electronic Chessboard](http://www.oliviermercier.com/res/projects/chessboard/)
      - Yours? Please make [an issue or pull request](https://github.com/lichess-org/api).
      ### Links
      - [Announcement](https://lichess.org/blog/WvDNticAAMu_mHKP/welcome-lichess-bots)
      - Join the [Lichess Bots team](https://lichess.org/team/lichess-bots) with your bot account
      - [Get help in the discord channel](https://discord.gg/quwueFd)
      - Watch [Lichess Bot TV](https://lichess.org/tv/bot)
  - name: Broadcasts
    description: |
      Relay chess events on Lichess.
      [Official broadcasts](https://lichess.org/broadcast) are maintained by Lichess,
      but you can [create your own broadcasts](https://lichess.org/broadcast/new) to cover any live game or chess event.
      You will need to publish PGN on a public URL so that Lichess can pull updates from it.
      Alternatively, you can push PGN updates to Lichess using [this API endpoint](#tag/broadcasts/POST/api/broadcast/round/{broadcastRoundId}/push).

      Broadcasts are organized in tournaments, which have several rounds, which have several games.
      You must first create a tournament, then you can add rounds to them.
  - name: Bulk pairings
    description: |
      Create many games for other players.

      These endpoints are intended for tournament organisers.
  - name: Challenges
    description: |
      Send and receive challenges to play.

      To create a lot of challenges, consider [bulk pairing](#tag/bulk-pairings/POST/api/bulk-pairing) instead.
  - name: External engine
    description: |
      **This API is in alpha and subject to change.**

      Use or provide external engine analysis.

      External engines can provide analysis on pages like the
      [analysis board](https://lichess.org/analysis), running as a service
      outside of the browser, or even on a different machine.
  - name: FIDE
    description: |
      FIDE players and federations from [their public download](https://ratings.fide.com/download_lists.phtml).

      <https://lichess.org/fide>
  - name: Games
    description: |
      Access games played on Lichess.
      <https://lichess.org/games>
  - name: Messaging
    description: |
      Private messages with other players.
      <https://lichess.org/inbox>
  - name: Opening Explorer
    description: |
      Lookup positions from the [Lichess opening explorer](https://lichess.org/analysis#explorer).

      Runs <https://github.com/lichess-org/lila-openingexplorer>.

      > [!important]
      > The hostname for these endpoints is `explorer.lichess.org` and not `lichess.org`.
  - name: Puzzles
    description: |
      Fetch and solve [puzzles](https://lichess.org/training), view your puzzle history and dashboard.

      Our collection of puzzles is in the public domain, you can [download it here](https://database.lichess.org/#puzzles).
      For a list of our [puzzle themes](https://lichess.org/training/themes) with their description, check out the [theme translation file](https://github.com/ornicar/lila/blob/master/translation/source/puzzleTheme.xml).
  - name: Relations
    description: |
      Access relations between users.
  - name: Simuls
    description: |
      Access simuls played on Lichess.
      <https://lichess.org/simul>
  - name: Studies
    description: |
      Access Lichess studies.
      <https://lichess.org/study>
  - name: Tablebase
    description: |
      Lookup positions from the [Lichess tablebase server](https://lichess.org/blog/W3WeMyQAACQAdfAL/7-piece-syzygy-tablebases-are-complete).

      > [!important]
      > The hostname for these endpoints is `tablebase.lichess.org` and not `lichess.org`.
  - name: Teams
    description: |
      Access and manage Lichess teams and their members.
      <https://lichess.org/team>
  - name: Tournaments (Arena)
    description: |
      Access Arena tournaments played on Lichess.
      [Official Arena tournaments](https://lichess.org/tournament) are maintained by Lichess,
      but you can [create your own Arena tournaments](https://lichess.org/tournament/new) as well.
  - name: Tournaments (Swiss)
    description: |
      Access Swiss tournaments played on Lichess.
      [Read more about Swiss tournaments.](https://lichess.org/swiss).
  - name: TV
    description: |
      Access Lichess TV channels and games.
      <https://lichess.org/tv> & <https://lichess.org/games>
  - name: Users
    description: |
      Access registered users on Lichess.
      <https://lichess.org/player>

      - Each user blog exposes an atom (RSS) feed, like <https://lichess.org/@/thibault/blog.atom>
      - User blogs mashup feed: https://lichess.org/blog/community.atom
      - User blogs mashup feed for a language: https://lichess.org/blog/community/fr.atom
  - name: OAuth
    description: |
      Obtaining and revoking OAuth tokens.

      [Read about the Lichess API authentication methods and code examples](https://github.com/lichess-org/api/blob/master/example/README.md).
paths:
  /api/users/status:
    get:
      operationId: apiUsersStatus
      summary: Get real-time users status
      description: |
        Read the `online`, `playing` and `streaming` flags of several users.
        This API is very fast and cheap on lichess side.
        So you can call it quite often (like once every 5 seconds).
        Use it to track players and know when they're connected on lichess and playing games.
      tags:
        - Users
      security: []
      parameters:
        - in: query
          name: ids
          required: true
          description: User IDs separated by commas. Up to 100 IDs.
          schema:
            type: string
          example: thibault,maia1,maia5
        - in: query
          name: withSignal
          required: false
          description: |
            Also return the network signal of the player, when available.
            It ranges from 1 (poor connection, lag > 500ms) to 4 (great connection, lag < 150ms)
            Defaults to `false` to preserve server resources.
          schema:
            type: boolean
          example: true
        - in: query
          name: withGameIds
          required: false
          description: |
            Also return the ID of the game being played, if any, for each player, in a `playingId` field.
            Defaults to `false` to preserve server resources.
          schema:
            type: boolean
          example: true
        - in: query
          name: withGameMetas
          required: false
          description: |
            Also return the id, time control and variant of the game being played, if any, for each player, in a `playing` field.
            Defaults to `false` to preserve server resources. Disables `withGameIds`.
          schema:
            type: boolean
          example: true
      responses:
        '200':
          description: The list of users and their respective statuses.
          headers:
            Access-Control-Allow-Origin:
              schema:
                type: string
                default: '''*'''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                    name:
                      type: string
                    flair:
                      $ref: '#/components/schemas/Flair'
                    title:
                      $ref: '#/components/schemas/Title'
                    online:
                      type: boolean
                    playing:
                      type: boolean
                    streaming:
                      type: boolean
                    patron:
                      $ref: '#/components/schemas/Patron'
                    patronColor:
                      $ref: '#/components/schemas/PatronColor'
                  required:
                    - id
                    - name
              examples:
                default:
                  $ref: '#/components/examples/users-getRealTimeUsersStatus.json'
  /api/player:
    get:
      operationId: player
      summary: Get all top 10
      tags:
        - Users
      security: []
      description: |
        Get the top 10 players for each speed and variant.
        See <https://lichess.org/player>.
      responses:
        '200':
          description: The list of variants with their respective top players.
          headers:
            Access-Control-Allow-Origin:
              schema:
                type: string
                default: '''*'''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Top10s'
              examples:
                default:
                  $ref: '#/components/examples/users-getAllTop10.json'
  /api/player/top/{nb}/{perfType}:
    get:
      operationId: playerTopNbPerfType
      summary: Get one leaderboard
      tags:
        - Users
      security: []
      description: |
        Get the leaderboard for a single speed or variant (a.k.a. `perfType`).
        There is no leaderboard for correspondence or puzzles.
        See <https://lichess.org/player/top/100/bullet>.
      parameters:
        - in: path
          name: nb
          description: How many users to fetch
          schema:
            type: integer
            minimum: 1
            maximum: 100
            example: 100
          required: true
        - in: path
          name: perfType
          description: The speed or variant
          schema:
            type: string
            example: bullet
            enum:
              - ultraBullet
              - bullet
              - blitz
              - rapid
              - classical
              - chess960
              - crazyhouse
              - antichess
              - atomic
              - horde
              - kingOfTheHill
              - racingKings
              - threeCheck
          required: true
      responses:
        '200':
          description: The list of top players for the variant.
          headers:
            Access-Control-Allow-Origin:
              schema:
                type: string
                default: '''*'''
          content:
            application/vnd.lichess.v3+json:
              schema:
                $ref: '#/components/schemas/Leaderboard'
              examples:
                default:
                  $ref: '#/components/examples/users-getOneLeaderboard.json'
  /api/user/{username}:
    get:
      operationId: apiUser
      summary: Get user public data
      description: |
        Read public data of a user.
      tags:
        - Users
      security:
        - OAuth2: []
      parameters:
        - in: path
          name: username
          schema:
            type: string
          required: true
        - in: query
          name: trophies
          description: Include user trophies
          schema:
            type: boolean
            default: false
        - in: query
          name: profile
          description: Include user profile data
          schema:
            type: boolean
            default: true
        - in: query
          name: rank
          description: Include global lichess ranking for each perf
          schema:
            type: boolean
            default: false
        - in: query
          name: fideId
          description: Include public FIDE ID if any
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: The information of the user.
          headers:
            Access-Control-Allow-Origin:
              schema:
                type: string
                default: '''*'''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserExtended'
              examples:
                default:
                  $ref: '#/components/examples/users-getUserPublicData.json'
  /api/user/{username}/rating-history:
    get:
      operationId: apiUserRatingHistory
      summary: Get rating history of a user
      description: |
        Read rating history of a user, for all perf types.
        There is at most one entry per day.
        Format of an entry is `[year, month, day, rating]`.
        `month` starts at zero (January).
      tags:
        - Users
      security: []
      parameters:
        - in: path
          name: username
          schema:
            type: string
          required: true
      responses:
        '200':
          description: The rating history of the user.
          headers:
            Access-Control-Allow-Origin:
              schema:
                type: string
                default: '''*'''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RatingHistory'
              examples:
                default:
                  $ref: '#/components/examples/users-getRatingHistoryOfAUser.json'
  /api/user/{username}/perf/{perf}:
    get:
      operationId: apiUserPerf
      summary: Get performance statistics of a user
      description: |
        Read performance statistics of a user, for a single performance.
        Similar to the [performance pages on the website](https://lichess.org/@/thibault/perf/bullet).
      tags:
        - Users
      security: []
      parameters:
        - in: path
          name: username
          schema:
            type: string
          required: true
        - in: path
          name: perf
          schema:
            $ref: '#/components/schemas/PerfType'
          required: true
      responses:
        '200':
          description: The performance statistics of the user
          headers:
            Access-Control-Allow-Origin:
              schema:
                type: string
                default: '''*'''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PerfStat'
              examples:
                default:
                  $ref: '#/components/examples/users-getPerformanceStatisticsOfAUser.json'
  /api/user/{username}/activity:
    get:
      operationId: apiUserActivity
      summary: Get user activity
      description: |
        Read data to generate the activity feed of a user.
      tags:
        - Users
      security: []
      parameters:
        - in: path
          name: username
          schema:
            type: string
          required: true
      responses:
        '200':
          description: The activity feed of the user.
          headers:
            Access-Control-Allow-Origin:
              schema:
                type: string
                default: '''*'''
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/UserActivity'
              examples:
                default:
                  $ref: '#/components/examples/users-getUserActivity.json'
  /api/puzzle/daily:
    get:
      operationId: apiPuzzleDaily
      summary: Get the daily puzzle
      description: |
        Get the daily Lichess puzzle in JSON format.
      tags:
        - Puzzles
      security: []
      responses:
        '200':
          description: The daily puzzle.
          headers:
            Access-Control-Allow-Origin:
              schema:
                type: string
                default: '''*'''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PuzzleAndGame'
              examples:
                default:
                  $ref: '#/components/examples/puzzles-getDailyPuzzle.json'
  /api/puzzle/{id}:
    get:
      operationId: apiPuzzleId
      summary: Get a puzzle by its ID
      description: Get a single Lichess puzzle in JSON format.
      tags:
        - Puzzles
      security: []
      parameters:
        - in: path
          name: id
          required: true
          description: The puzzle ID
          schema:
            type: string
      responses:
        '200':
          description: The requested puzzle.
          headers:
            Access-Control-Allow-Origin:
              schema:
                type: string
                default: '''*'''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PuzzleAndGame'
              examples:
                default:
                  $ref: '#/components/examples/puzzles-getPuzzleById.json'
  /api/puzzle/next:
    get:
      operationId: apiPuzzleNext
      summary: Get a new puzzle
      description: |
        Get a random Lichess puzzle in JSON format.

        If authenticated, only returns puzzles that the user has never seen before.

        **DO NOT** use this endpoint to enumerate puzzles for mass download. Instead, download the [full public puzzle database](https://database.lichess.org/#puzzles).
      tags:
        - Puzzles
      security:
        - OAuth2:
            - puzzle:read
      parameters:
        - in: query
          name: angle
          required: false
          description: |
            The theme or opening to filter puzzles with.

            Available themes are listed in [the lichess source code](https://github.com/ornicar/lila/blob/master/translation/source/puzzleTheme.xml) and [the lichess training themes hyperlinks](https://lichess.org/training/themes).
          schema:
            type: string
        - in: query
          name: difficulty
          required: false
          description: The desired puzzle difficulty, relative to the authenticated user puzzle rating, or 1500 if anonymous.
          schema:
            type: string
            enum:
              - easiest
              - easier
              - normal
              - harder
              - hardest
        - in: query
          name: color
          required: false
          description: The color to play. Better left empty to automatically get 50% white.
          schema:
            type: string
            enum:
              - white
              - black
      responses:
        '200':
          description: The requested puzzle.
          headers:
            Access-Control-Allow-Origin:
              schema:
                type: string
                default: '''*'''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PuzzleAndGame'
              examples:
                default:
                  $ref: '#/components/examples/puzzles-getNewPuzzle.json'
  /api/puzzle/batch/{angle}:
    get:
      operationId: apiPuzzleBatchSelect
      summary: Get multiple puzzles at once
      description: |
        Get a batch of random Lichess puzzles in JSON format.

        If authenticated, only returns puzzles that the user has never seen before.

        **DO NOT** use this endpoint to enumerate puzzles for mass download. Instead, download the [full public puzzle database](https://database.lichess.org/#puzzles).
      tags:
        - Puzzles
      security:
        - OAuth2:
            - puzzle:read
      parameters:
        - in: path
          name: angle
          schema:
            type: string
            example: mix
          required: true
          description: |
            The theme or opening to filter puzzles with. Recommended: `mix`.

            Available themes are listed in [the lichess source code](https://github.com/ornicar/lila/blob/master/translation/source/puzzleTheme.xml) and [the lichess training themes hyperlinks](https://lichess.org/training/themes).
        - in: query
          name: difficulty
          required: false
          description: The desired puzzle difficulty, relative to the authenticated user puzzle rating, or 1500 if anonymous.
          schema:
            type: string
            enum:
              - easiest
              - easier
              - normal
              - harder
              - hardest
        - in: query
          name: nb
          description: |
            How many puzzles to fetch. Just set it to `1` if you only need one puzzle.
          schema:
            type: integer
            minimum: 1
            maximum: 50
            example: 10
            default: 15
          required: false
        - in: query
          name: color
          required: false
          description: |
            The color to play. Better left empty to automatically get 50% white.
            Currently only works when `nb=1`.
          schema:
            type: string
            enum:
              - white
              - black
      responses:
        '200':
          description: The requested puzzles.
          headers:
            Access-Control-Allow-Origin:
              schema:
                type: string
                default: '''*'''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PuzzleBatchSelect'
              examples:
                default:
                  $ref: '#/components/examples/puzzles-getMultiplePuzzlesAtOnce.json'
    post:
      operationId: apiPuzzleBatchSolve
      summary: Solve multiple puzzles at once
      description: |
        Set puzzles as solved and update ratings.
      tags:
        - Puzzles
      security:
        - OAuth2:
            - puzzle:write
      parameters:
        - in: path
          name: angle
          schema:
            type: string
            example: mix
          required: true
          description: |
            The theme or opening of the solved puzzles.

            Available themes are listed in [the lichess source code](https://github.com/ornicar/lila/blob/master/translation/source/puzzleTheme.xml) and [the lichess training themes hyperlinks](https://lichess.org/training/themes).
        - in: query
          name: nb
          description: |
            When > 0, the response includes a new puzzle batch with that many puzzles.

            This is equivalent to calling [/api/puzzle/batch/{angle}](#tag/puzzles/GET/api/puzzle/batch/{angle}),
            and can sometimes save a request.
          schema:
            type: integer
            minimum: 0
            maximum: 50
    

# --- truncated at 32 KB (1095 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/lichess/refs/heads/main/openapi/lichess-openapi.yml