{
  "components" : {
    "schemas" : {
      "ActiveHintDto" : {
        "nullable" : false,
        "properties" : {
          "cells" : {
            "items" : {
              "$ref" : "#/components/schemas/CellDto"
            },
            "nullable" : false,
            "type" : "array"
          },
          "kind" : {
            "enum" : [ "WORD_HINT", "TWO_LETTERS", "REVEAL_WORD" ],
            "nullable" : false,
            "type" : "string"
          },
          "word" : {
            "nullable" : true,
            "type" : "string"
          }
        },
        "required" : [ "cells", "kind" ],
        "type" : "object"
      },
      "ActiveMatchResponse" : {
        "nullable" : false,
        "properties" : {
          "match" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/MatchDto"
            } ]
          }
        },
        "type" : "object"
      },
      "ApiErrorResponse" : {
        "nullable" : false,
        "properties" : {
          "code" : {
            "nullable" : false,
            "type" : "string"
          },
          "message" : {
            "nullable" : false,
            "type" : "string"
          },
          "round_time" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/RoundTimeDto"
            } ]
          }
        },
        "required" : [ "code", "message" ],
        "type" : "object"
      },
      "AuthRequest" : {
        "nullable" : false,
        "properties" : {
          "api_key" : {
            "nullable" : false,
            "type" : "string"
          },
          "device_id" : {
            "nullable" : false,
            "type" : "string"
          },
          "nickname" : {
            "nullable" : false,
            "type" : "string"
          },
          "tasks" : {
            "items" : {
              "$ref" : "#/components/schemas/TaskProgress"
            },
            "nullable" : false,
            "type" : "array"
          },
          "user_id" : {
            "nullable" : false,
            "type" : "string"
          }
        },
        "required" : [ "api_key", "device_id", "nickname", "tasks", "user_id" ],
        "type" : "object"
      },
      "AuthResponse" : {
        "nullable" : false,
        "properties" : {
          "session_id" : {
            "nullable" : false,
            "type" : "string"
          }
        },
        "required" : [ "session_id" ],
        "type" : "object"
      },
      "BestResult" : {
        "nullable" : false,
        "properties" : {
          "achieved_at" : {
            "example" : "2026-09-16T09:12:29.544507632Z",
            "format" : "date-time",
            "nullable" : false,
            "type" : "string"
          },
          "score" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          }
        },
        "required" : [ "achieved_at", "score" ],
        "type" : "object"
      },
      "BonusCellDto" : {
        "nullable" : false,
        "properties" : {
          "col" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "multiplier" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "row" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          }
        },
        "required" : [ "col", "multiplier", "row" ],
        "type" : "object"
      },
      "CellDto" : {
        "nullable" : false,
        "properties" : {
          "col" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "row" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          }
        },
        "required" : [ "col", "row" ],
        "type" : "object"
      },
      "DictionaryEntryDto" : {
        "nullable" : false,
        "properties" : {
          "found" : {
            "nullable" : false,
            "type" : "boolean"
          },
          "opened_at" : {
            "example" : "2026-09-16T09:12:29.544507632Z",
            "format" : "date-time",
            "nullable" : true,
            "type" : "string"
          },
          "term" : {
            "nullable" : false,
            "type" : "string"
          },
          "term_id" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          }
        },
        "required" : [ "found", "term", "term_id" ],
        "type" : "object"
      },
      "DictionaryResponse" : {
        "nullable" : false,
        "properties" : {
          "terms" : {
            "items" : {
              "$ref" : "#/components/schemas/DictionaryEntryDto"
            },
            "nullable" : false,
            "type" : "array"
          },
          "total_terms" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          }
        },
        "required" : [ "terms", "total_terms" ],
        "type" : "object"
      },
      "DictionaryTermDto" : {
        "nullable" : false,
        "properties" : {
          "explanation" : {
            "nullable" : false,
            "type" : "string"
          },
          "opened_at" : {
            "example" : "2026-09-16T09:12:29.544507632Z",
            "format" : "date-time",
            "nullable" : false,
            "type" : "string"
          },
          "term" : {
            "nullable" : false,
            "type" : "string"
          },
          "term_id" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          }
        },
        "required" : [ "explanation", "opened_at", "term", "term_id" ],
        "type" : "object"
      },
      "FinancialTermResultDto" : {
        "nullable" : false,
        "properties" : {
          "explanation" : {
            "nullable" : false,
            "type" : "string"
          },
          "found" : {
            "nullable" : false,
            "type" : "boolean"
          },
          "word" : {
            "nullable" : false,
            "type" : "string"
          }
        },
        "required" : [ "explanation", "found", "word" ],
        "type" : "object"
      },
      "FinishRequest" : {
        "nullable" : false,
        "properties" : {
          "round_scores" : {
            "items" : {
              "format" : "int32",
              "nullable" : false,
              "type" : "integer"
            },
            "nullable" : true,
            "type" : "array"
          }
        },
        "type" : "object"
      },
      "FinishResponse" : {
        "nullable" : false,
        "properties" : {
          "best_result" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/BestResult"
            } ]
          },
          "coins_earned" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "completion_reason" : {
            "enum" : [ "normal", "player_exit", "resume_timeout" ],
            "nullable" : false,
            "type" : "string"
          },
          "financial_term" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/FinancialTermResultDto"
            } ]
          },
          "is_new_record" : {
            "nullable" : false,
            "type" : "boolean"
          },
          "match_id" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "round_scores" : {
            "items" : {
              "format" : "int32",
              "nullable" : false,
              "type" : "integer"
            },
            "nullable" : false,
            "type" : "array"
          },
          "subquest_result" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/SubquestResultDto"
            } ]
          },
          "total_score" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "words_found" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          }
        },
        "required" : [ "coins_earned", "completion_reason", "is_new_record", "match_id", "round_scores", "total_score", "words_found" ],
        "type" : "object"
      },
      "FoundWordDto" : {
        "nullable" : false,
        "properties" : {
          "is_financial_word" : {
            "nullable" : false,
            "type" : "boolean"
          },
          "score" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "word" : {
            "nullable" : false,
            "type" : "string"
          }
        },
        "required" : [ "is_financial_word", "score", "word" ],
        "type" : "object"
      },
      "FreeHintRequest" : {
        "nullable" : false,
        "properties" : {
          "request_id" : {
            "maxLength" : 96,
            "nullable" : false,
            "type" : "string"
          }
        },
        "required" : [ "request_id" ],
        "type" : "object"
      },
      "FreeHintResponse" : {
        "nullable" : false,
        "properties" : {
          "cells" : {
            "items" : {
              "$ref" : "#/components/schemas/CellDto"
            },
            "nullable" : false,
            "type" : "array"
          },
          "request_id" : {
            "nullable" : false,
            "type" : "string"
          },
          "round_time" : {
            "$ref" : "#/components/schemas/RoundTimeDto"
          }
        },
        "required" : [ "cells", "request_id", "round_time" ],
        "type" : "object"
      },
      "HealthStatus" : {
        "nullable" : false,
        "properties" : {
          "status" : {
            "nullable" : false,
            "type" : "string"
          }
        },
        "required" : [ "status" ],
        "type" : "object"
      },
      "HintUseCountDto" : {
        "nullable" : false,
        "properties" : {
          "kind" : {
            "enum" : [ "WORD_HINT", "TWO_LETTERS", "REVEAL_WORD" ],
            "nullable" : false,
            "type" : "string"
          },
          "used" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          }
        },
        "required" : [ "kind", "used" ],
        "type" : "object"
      },
      "HintUseRequest" : {
        "nullable" : false,
        "properties" : {
          "kind" : {
            "enum" : [ "WORD_HINT", "TWO_LETTERS", "REVEAL_WORD" ],
            "nullable" : false,
            "type" : "string"
          },
          "request_id" : {
            "nullable" : false,
            "type" : "string"
          }
        },
        "required" : [ "kind", "request_id" ],
        "type" : "object"
      },
      "HintUseResponse" : {
        "nullable" : false,
        "properties" : {
          "cells" : {
            "items" : {
              "$ref" : "#/components/schemas/CellDto"
            },
            "nullable" : false,
            "type" : "array"
          },
          "remaining" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "request_id" : {
            "nullable" : false,
            "type" : "string"
          },
          "round_time" : {
            "$ref" : "#/components/schemas/RoundTimeDto"
          },
          "uses_in_match" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "word" : {
            "nullable" : true,
            "type" : "string"
          }
        },
        "required" : [ "cells", "remaining", "request_id", "round_time", "uses_in_match" ],
        "type" : "object"
      },
      "MatchDto" : {
        "nullable" : false,
        "properties" : {
          "coins_earned" : {
            "format" : "int32",
            "nullable" : true,
            "type" : "integer"
          },
          "completion_reason" : {
            "enum" : [ "normal", "player_exit", "resume_timeout" ],
            "nullable" : true,
            "type" : "string"
          },
          "created_at" : {
            "example" : "2026-09-16T09:12:29.544507632Z",
            "format" : "date-time",
            "nullable" : false,
            "type" : "string"
          },
          "current_round_index" : {
            "format" : "int32",
            "nullable" : true,
            "type" : "integer"
          },
          "deadline" : {
            "example" : "2026-09-16T09:12:29.544507632Z",
            "format" : "date-time",
            "nullable" : false,
            "type" : "string"
          },
          "finished_at" : {
            "example" : "2026-09-16T09:12:29.544507632Z",
            "format" : "date-time",
            "nullable" : true,
            "type" : "string"
          },
          "match_id" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "phase" : {
            "enum" : [ "awaiting_first_round", "round_active", "between_rounds" ],
            "nullable" : true,
            "type" : "string"
          },
          "resume_time" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/RoundTimeDto"
            } ]
          },
          "round_scores" : {
            "items" : {
              "format" : "int32",
              "nullable" : false,
              "type" : "integer"
            },
            "nullable" : true,
            "type" : "array"
          },
          "round_time" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/RoundTimeDto"
            } ]
          },
          "rounds" : {
            "items" : {
              "$ref" : "#/components/schemas/RoundDto"
            },
            "nullable" : false,
            "type" : "array"
          },
          "status" : {
            "enum" : [ "active", "finished" ],
            "nullable" : false,
            "type" : "string"
          },
          "subquest_result" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/SubquestResultDto"
            } ]
          },
          "total_score" : {
            "format" : "int32",
            "nullable" : true,
            "type" : "integer"
          }
        },
        "required" : [ "created_at", "deadline", "match_id", "rounds", "status" ],
        "type" : "object"
      },
      "PlayerExternalTaskClaimResponse" : {
        "nullable" : false,
        "properties" : {
          "applied_amount" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "claimed_at" : {
            "example" : "2026-09-16T09:12:29.544507632Z",
            "format" : "date-time",
            "nullable" : false,
            "type" : "string"
          },
          "coins_after" : {
            "format" : "int32",
            "nullable" : true,
            "type" : "integer"
          },
          "energy_after" : {
            "format" : "int32",
            "nullable" : true,
            "type" : "integer"
          },
          "energy_max_after" : {
            "format" : "int32",
            "nullable" : true,
            "type" : "integer"
          },
          "reward_amount" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "reward_kind" : {
            "enum" : [ "COINS", "ENERGY" ],
            "nullable" : false,
            "type" : "string"
          },
          "state" : {
            "enum" : [ "AVAILABLE", "IN_PROGRESS", "COMPLETED", "CLAIMED", "EXPIRED" ],
            "nullable" : false,
            "type" : "string"
          },
          "task_id" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          }
        },
        "required" : [ "applied_amount", "claimed_at", "reward_amount", "reward_kind", "state", "task_id" ],
        "type" : "object"
      },
      "PlayerExternalTaskDto" : {
        "nullable" : false,
        "properties" : {
          "action" : {
            "enum" : [ "START", "WAIT", "CLAIM", "NONE" ],
            "nullable" : false,
            "type" : "string"
          },
          "action_url" : {
            "nullable" : true,
            "type" : "string"
          },
          "available_until" : {
            "example" : "2026-09-16T09:12:29.544507632Z",
            "format" : "date-time",
            "nullable" : true,
            "type" : "string"
          },
          "claim_mode" : {
            "enum" : [ "AUTOMATIC", "MANUAL" ],
            "nullable" : false,
            "type" : "string"
          },
          "claimed_at" : {
            "example" : "2026-09-16T09:12:29.544507632Z",
            "format" : "date-time",
            "nullable" : true,
            "type" : "string"
          },
          "code" : {
            "nullable" : false,
            "type" : "string"
          },
          "completed_at" : {
            "example" : "2026-09-16T09:12:29.544507632Z",
            "format" : "date-time",
            "nullable" : true,
            "type" : "string"
          },
          "description" : {
            "nullable" : false,
            "type" : "string"
          },
          "display_order" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "id" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "kind" : {
            "nullable" : false,
            "type" : "string"
          },
          "progress" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "reward_amount" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "reward_applied_amount" : {
            "format" : "int32",
            "nullable" : true,
            "type" : "integer"
          },
          "reward_kind" : {
            "enum" : [ "COINS", "ENERGY" ],
            "nullable" : false,
            "type" : "string"
          },
          "state" : {
            "enum" : [ "AVAILABLE", "IN_PROGRESS", "COMPLETED", "CLAIMED", "EXPIRED" ],
            "nullable" : false,
            "type" : "string"
          },
          "target_progress" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "title" : {
            "nullable" : false,
            "type" : "string"
          }
        },
        "required" : [ "action", "claim_mode", "code", "description", "display_order", "id", "kind", "progress", "reward_amount", "reward_kind", "state", "target_progress", "title" ],
        "type" : "object"
      },
      "PlayerExternalTasksResponse" : {
        "nullable" : false,
        "properties" : {
          "tasks" : {
            "items" : {
              "$ref" : "#/components/schemas/PlayerExternalTaskDto"
            },
            "nullable" : false,
            "type" : "array"
          }
        },
        "required" : [ "tasks" ],
        "type" : "object"
      },
      "PlayerShopProductDto" : {
        "nullable" : false,
        "properties" : {
          "daily_purchase_limit" : {
            "format" : "int32",
            "nullable" : true,
            "type" : "integer"
          },
          "daily_purchases_remaining" : {
            "format" : "int32",
            "nullable" : true,
            "type" : "integer"
          },
          "display_order" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "grant_quantity" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "id" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "kind" : {
            "enum" : [ "WORD_HINT", "TWO_LETTERS", "REVEAL_WORD", "ENERGY" ],
            "nullable" : false,
            "type" : "string"
          },
          "name" : {
            "nullable" : false,
            "type" : "string"
          },
          "owned_quantity" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "price_coins" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "purpose" : {
            "nullable" : false,
            "type" : "string"
          },
          "storage_limit" : {
            "format" : "int32",
            "nullable" : true,
            "type" : "integer"
          }
        },
        "required" : [ "display_order", "grant_quantity", "id", "kind", "name", "owned_quantity", "price_coins", "purpose" ],
        "type" : "object"
      },
      "PlayerShopPurchaseRequest" : {
        "nullable" : false,
        "properties" : {
          "request_id" : {
            "nullable" : false,
            "type" : "string"
          }
        },
        "required" : [ "request_id" ],
        "type" : "object"
      },
      "PlayerShopPurchaseResponse" : {
        "nullable" : false,
        "properties" : {
          "coins" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "energy" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "energy_max" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "kind" : {
            "enum" : [ "WORD_HINT", "TWO_LETTERS", "REVEAL_WORD", "ENERGY" ],
            "nullable" : false,
            "type" : "string"
          },
          "owned_quantity" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "product_id" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "purchase_id" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          }
        },
        "required" : [ "coins", "energy", "energy_max", "kind", "owned_quantity", "product_id", "purchase_id" ],
        "type" : "object"
      },
      "PlayerShopResponse" : {
        "nullable" : false,
        "properties" : {
          "coins" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "energy" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "energy_max" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "products" : {
            "items" : {
              "$ref" : "#/components/schemas/PlayerShopProductDto"
            },
            "nullable" : false,
            "type" : "array"
          }
        },
        "required" : [ "coins", "energy", "energy_max", "products" ],
        "type" : "object"
      },
      "RoundDto" : {
        "nullable" : false,
        "properties" : {
          "board" : {
            "items" : {
              "nullable" : false,
              "type" : "string"
            },
            "nullable" : false,
            "type" : "array"
          },
          "board_size" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "bonus_cells" : {
            "items" : {
              "$ref" : "#/components/schemas/BonusCellDto"
            },
            "nullable" : false,
            "type" : "array"
          },
          "duration_seconds" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "has_financial_word" : {
            "nullable" : false,
            "type" : "boolean"
          },
          "index" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "subquest" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/SubquestStateDto"
            } ]
          }
        },
        "required" : [ "board", "board_size", "bonus_cells", "duration_seconds", "has_financial_word", "index" ],
        "type" : "object"
      },
      "RoundStartResponse" : {
        "nullable" : false,
        "properties" : {
          "active_hints" : {
            "items" : {
              "$ref" : "#/components/schemas/ActiveHintDto"
            },
            "nullable" : false,
            "type" : "array"
          },
          "expires_at" : {
            "example" : "2026-09-16T09:12:29.544507632Z",
            "format" : "date-time",
            "nullable" : false,
            "type" : "string"
          },
          "found_words" : {
            "items" : {
              "$ref" : "#/components/schemas/FoundWordDto"
            },
            "nullable" : false,
            "type" : "array"
          },
          "has_unfound_words" : {
            "nullable" : false,
            "type" : "boolean"
          },
          "hint_uses" : {
            "items" : {
              "$ref" : "#/components/schemas/HintUseCountDto"
            },
            "nullable" : false,
            "type" : "array"
          },
          "round_index" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "round_score" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "round_time" : {
            "$ref" : "#/components/schemas/RoundTimeDto"
          },
          "seconds_left" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "started_at" : {
            "example" : "2026-09-16T09:12:29.544507632Z",
            "format" : "date-time",
            "nullable" : false,
            "type" : "string"
          },
          "subquest" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/SubquestStateDto"
            } ]
          }
        },
        "required" : [ "active_hints", "expires_at", "found_words", "has_unfound_words", "hint_uses", "round_index", "round_score", "round_time", "seconds_left", "started_at" ],
        "type" : "object"
      },
      "RoundTimeDto" : {
        "nullable" : false,
        "properties" : {
          "expires_at" : {
            "example" : "2026-09-16T09:12:29.544507632Z",
            "format" : "date-time",
            "nullable" : false,
            "type" : "string"
          },
          "remaining_ms" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "server_time" : {
            "example" : "2026-09-16T09:12:29.544507632Z",
            "format" : "date-time",
            "nullable" : false,
            "type" : "string"
          }
        },
        "required" : [ "expires_at", "remaining_ms", "server_time" ],
        "type" : "object"
      },
      "SubquestResultDto" : {
        "nullable" : false,
        "properties" : {
          "id" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "kind" : {
            "enum" : [ "FIND_WORDS", "FIND_LONG_WORDS", "FIND_THEME_WORDS" ],
            "nullable" : false,
            "type" : "string"
          },
          "progress" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "reward_coins" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "state" : {
            "enum" : [ "completed", "not_completed" ],
            "nullable" : false,
            "type" : "string"
          },
          "target" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "text" : {
            "nullable" : false,
            "type" : "string"
          }
        },
        "required" : [ "id", "kind", "progress", "reward_coins", "state", "target", "text" ],
        "type" : "object"
      },
      "SubquestStateDto" : {
        "nullable" : false,
        "properties" : {
          "id" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "kind" : {
            "enum" : [ "FIND_WORDS", "FIND_LONG_WORDS", "FIND_THEME_WORDS" ],
            "nullable" : false,
            "type" : "string"
          },
          "progress" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "reward_coins" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "state" : {
            "enum" : [ "in_progress", "completed" ],
            "nullable" : false,
            "type" : "string"
          },
          "target" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "text" : {
            "nullable" : false,
            "type" : "string"
          }
        },
        "required" : [ "id", "kind", "progress", "reward_coins", "state", "target", "text" ],
        "type" : "object"
      },
      "TaskProgress" : {
        "nullable" : false,
        "properties" : {
          "coins" : {
            "format" : "int32",
            "nullable" : true,
            "type" : "integer"
          },
          "event_id" : {
            "nullable" : true,
            "type" : "string"
          },
          "id" : {
            "nullable" : false,
            "type" : "string"
          },
          "progress" : {
            "format" : "int32",
            "nullable" : true,
            "type" : "integer"
          }
        },
        "required" : [ "id" ],
        "type" : "object"
      },
      "UserInfoResponse" : {
        "nullable" : false,
        "properties" : {
          "best_result" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/BestResult"
            } ]
          },
          "coins" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "energy" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "energy_max" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "energy_restore_interval" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "energy_restore_timer" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "game_start_energy" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "nickname" : {
            "nullable" : false,
            "type" : "string"
          }
        },
        "required" : [ "coins", "energy", "energy_max", "energy_restore_interval", "energy_restore_timer", "game_start_energy", "nickname" ],
        "type" : "object"
      },
      "WordCheckRequest" : {
        "nullable" : false,
        "properties" : {
          "path" : {
            "items" : {
              "$ref" : "#/components/schemas/CellDto"
            },
            "nullable" : false,
            "type" : "array",
            "maxItems" : 36
          },
          "request_id" : {
            "maxLength" : 128,
            "nullable" : true,
            "type" : "string"
          },
          "word" : {
            "maxLength" : 36,
            "nullable" : false,
            "type" : "string"
          }
        },
        "required" : [ "path", "word" ],
        "type" : "object"
      },
      "WordCheckResponse" : {
        "nullable" : false,
        "properties" : {
          "has_unfound_words" : {
            "nullable" : false,
            "type" : "boolean"
          },
          "is_financial_word" : {
            "nullable" : false,
            "type" : "boolean"
          },
          "multiplier" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "request_id" : {
            "nullable" : true,
            "type" : "string"
          },
          "round_score" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "round_time" : {
            "$ref" : "#/components/schemas/RoundTimeDto"
          },
          "round_words_found" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "score" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "status" : {
            "enum" : [ "accepted", "unknown_word", "already_found" ],
            "nullable" : false,
            "type" : "string"
          },
          "subquest" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/SubquestStateDto"
            } ]
          },
          "word" : {
            "nullable" : false,
            "type" : "string"
          }
        },
        "required" : [ "has_unfound_words", "is_financial_word", "multiplier", "round_score", "round_time", "round_words_found", "score", "status", "word" ],
        "type" : "object"
      }
    },
    "securitySchemes" : {
      "SessionAuth" : {
        "in" : "header",
        "name" : "Session-ID",
        "type" : "apiKey"
      }
    }
  },
  "info" : {
    "description" : "«Слово за слово» — игровой бэкенд",
    "title" : "AlphaWords API",
    "version" : "dev"
  },
  "openapi" : "3.0.0",
  "paths" : {
    "/health" : {
      "get" : {
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/HealthStatus"
                }
              }
            },
            "description" : "OK"
          }
        },
        "summary" : "Проверка живости сервиса",
        "tags" : [ "System" ]
      }
    },
    "/auth" : {
      "post" : {
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/AuthRequest"
              }
            }
          }
        },
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_api_key",
                  "message" : "Server API key is invalid"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "400" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "validation_error",
                  "message" : "Malformed request body: field 'user_id' is missing or has a wrong type"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Bad Request"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/AuthResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "summary" : "Создать пользовательскую сессию (межсерверный вызов Alfa-Capital)",
        "tags" : [ "Auth" ]
      }
    },
    "/user/info" : {
      "get" : {
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "503" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "settings_unavailable",
                  "message" : "Game settings are not usable: word_scores must cover every length in 3..8 without gaps"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Service Unavailable"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/UserInfoResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Данные главного экрана игрока",
        "tags" : [ "User" ]
      }
    },
    "/user/matches" : {
      "post" : {
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "409" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "insufficient_energy",
                  "message" : "Not enough energy to start a match"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Conflict"
          },
          "503" : {
            "content" : {
              "application/json" : {
                "examples" : {
                  "Example 0" : {
                    "value" : {
                      "code" : "board_generation_failed",
                      "message" : "Could not build a playing field right now"
                    }
                  },
                  "Example 1" : {
                    "value" : {
                      "code" : "financial_term_unavailable",
                      "message" : "No playable financial term is available right now"
                    }
                  },
                  "Example 2" : {
                    "value" : {
                      "code" : "subquest_unavailable",
                      "message" : "No satisfiable sub-quest is available right now"
                    }
                  },
                  "Example 3" : {
                    "value" : {
                      "code" : "settings_unavailable",
                      "message" : "Game settings are not usable: word_scores must cover every length in 3..8 without gaps"
                    }
                  }
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Service Unavailable"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MatchDto"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Старт партии — списывает энергию, отдаёт 3 тестовых раунда",
        "tags" : [ "Match" ]
      },
      "get" : {
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ActiveMatchResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Активная партия игрока или её отсутствие",
        "tags" : [ "Match" ]
      }
    },
    "/user/matches/{id}" : {
      "get" : {
        "parameters" : [ {
          "deprecated" : false,
          "description" : "match id",
          "explode" : false,
          "in" : "path",
          "name" : "id",
          "required" : true,
          "schema" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        } ],
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "404" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "match_not_found",
                  "message" : "Match not found"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Not Found"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MatchDto"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Загрузка партии по id",
        "tags" : [ "Match" ]
      }
    },
    "/user/matches/{id}/abandon" : {
      "post" : {
        "description" : "Завершает партию без возврата энергии и без учёта результата в рейтинге. Уже найденный финансовый термин сохраняется, но награда за подзадание не начисляется. Повторный вызов идемпотентен.",
        "parameters" : [ {
          "deprecated" : false,
          "description" : "match id",
          "explode" : false,
          "in" : "path",
          "name" : "id",
          "required" : true,
          "schema" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        } ],
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "404" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "match_not_found",
                  "message" : "Match not found"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Not Found"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MatchDto"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Подтверждённый выход из партии",
        "tags" : [ "Match" ]
      }
    },
    "/user/matches/{id}/finish" : {
      "post" : {
        "description" : "Итог считает сервер по принятым словам (ТЗ 16.3). Поле round_scores в теле необязательно и ни на что не влияет: сервер лишь сверит его со своим подсчётом. Тело при этом обязательно — пустой объект {} подходит. Ответ раскрывает финансовое слово, его объяснение и признак нахождения (ТЗ 5.11 / 10.1). До окончания третьего раунда и окна доставки последнего слова сервер отвечает match_not_ready.",
        "parameters" : [ {
          "deprecated" : false,
          "description" : "match id",
          "explode" : false,
          "in" : "path",
          "name" : "id",
          "required" : true,
          "schema" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/FinishRequest"
              }
            }
          }
        },
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "404" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "match_not_found",
                  "message" : "Match not found"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Not Found"
          },
          "400" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "validation_error",
                  "message" : "Malformed request body: field 'round_scores' has a wrong type"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Bad Request"
          },
          "409" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "match_not_ready",
                  "message" : "The match can be finished only after the final round has ended"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Conflict"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/FinishResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Завершение партии — идемпотентно, обновляет рекорд",
        "tags" : [ "Match" ]
      }
    },
    "/user/matches/{id}/rounds/{index}" : {
      "get" : {
        "description" : "Без побочных эффектов возвращает серверный таймер, счёт, найденные слова и подсказки. Не запускает раунд: если окно ещё не было открыто через start, отвечает round_not_active.",
        "parameters" : [ {
          "deprecated" : false,
          "description" : "match id",
          "explode" : false,
          "in" : "path",
          "name" : "id",
          "required" : true,
          "schema" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        }, {
          "deprecated" : false,
          "description" : "round number, 1..3",
          "explode" : false,
          "in" : "path",
          "name" : "index",
          "required" : true,
          "schema" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        } ],
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "404" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "match_not_found",
                  "message" : "Match not found"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Not Found"
          },
          "400" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "validation_error",
                  "message" : "round index must be 1..3, got 4"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Bad Request"
          },
          "409" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "round_not_active",
                  "message" : "Round 2 has not been started"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Conflict"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RoundStartResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Текущее состояние уже запущенного раунда",
        "tags" : [ "Match" ]
      }
    },
    "/user/matches/{id}/rounds/{index}/hints" : {
      "post" : {
        "description" : "Идемпотентно по request_id в пределах партии. Сервер сам выбирает ещё не найденное слово и раскрывает только данные выбранного вида.",
        "parameters" : [ {
          "deprecated" : false,
          "description" : "match id",
          "explode" : false,
          "in" : "path",
          "name" : "id",
          "required" : true,
          "schema" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        }, {
          "deprecated" : false,
          "description" : "round number, 1..3",
          "explode" : false,
          "in" : "path",
          "name" : "index",
          "required" : true,
          "schema" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/HintUseRequest"
              }
            }
          }
        },
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "404" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "match_not_found",
                  "message" : "Match not found"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Not Found"
          },
          "400" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "validation_error",
                  "message" : "request_id must not be blank"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Bad Request"
          },
          "409" : {
            "content" : {
              "application/json" : {
                "examples" : {
                  "Example 0" : {
                    "value" : {
                      "code" : "round_not_active",
                      "message" : "Round 2 has not been started"
                    }
                  },
                  "Example 1" : {
                    "value" : {
                      "code" : "round_expired",
                      "message" : "This round has already ended"
                    }
                  },
                  "Example 2" : {
                    "value" : {
                      "code" : "hint_not_owned",
                      "message" : "No owned hint of this kind is available"
                    }
                  },
                  "Example 3" : {
                    "value" : {
                      "code" : "hint_unavailable",
                      "message" : "No unfound word is available for a hint"
                    }
                  },
                  "Example 4" : {
                    "value" : {
                      "code" : "hint_request_conflict",
                      "message" : "This request_id was already used for another hint request"
                    }
                  }
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Conflict"
          },
          "503" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "settings_unavailable",
                  "message" : "Game settings are not usable: word_scores must cover every length in 3..8 without gaps"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Service Unavailable"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/HintUseResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Применение подсказки",
        "tags" : [ "Match" ]
      }
    },
    "/user/matches/{id}/rounds/{index}/free-hints" : {
      "post" : {
        "description" : "Идемпотентно по request_id. Сервер не выдаёт подсказку раньше чем через 10 секунд после старта раунда, принятого слова или прошлой выдачи и блокирует её, пока активна платная подсказка. Ненайденная цель повторяется; ответ раскрывает первые три клетки, две для слова длиной три буквы или целиком слово из двух букв.",
        "parameters" : [ {
          "deprecated" : false,
          "description" : "match id",
          "explode" : false,
          "in" : "path",
          "name" : "id",
          "required" : true,
          "schema" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        }, {
          "deprecated" : false,
          "description" : "round number, 1..3",
          "explode" : false,
          "in" : "path",
          "name" : "index",
          "required" : true,
          "schema" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/FreeHintRequest"
              }
            }
          }
        },
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "404" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "match_not_found",
                  "message" : "Match not found"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Not Found"
          },
          "400" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "validation_error",
                  "message" : "request_id must not be blank"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Bad Request"
          },
          "409" : {
            "content" : {
              "application/json" : {
                "examples" : {
                  "Example 0" : {
                    "value" : {
                      "code" : "round_not_active",
                      "message" : "Round 2 has not been started"
                    }
                  },
                  "Example 1" : {
                    "value" : {
                      "code" : "round_expired",
                      "message" : "This round has already ended"
                    }
                  },
                  "Example 2" : {
                    "value" : {
                      "code" : "hint_unavailable",
                      "message" : "No unfound word is available for a hint"
                    }
                  },
                  "Example 3" : {
                    "value" : {
                      "code" : "hint_request_conflict",
                      "message" : "This request_id was already used for another hint request"
                    }
                  },
                  "Example 4" : {
                    "value" : {
                      "code" : "free_hint_not_ready",
                      "message" : "The free hint cooldown has not elapsed or a paid hint is still active"
                    }
                  }
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Conflict"
          },
          "503" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "settings_unavailable",
                  "message" : "Game settings are not usable: word_scores must cover every length in 3..8 without gaps"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Service Unavailable"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/FreeHintResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Бесплатная подсказка после паузы",
        "tags" : [ "Match" ]
      }
    },
    "/user/matches/{id}/rounds/{index}/start" : {
      "post" : {
        "description" : "Вызывается в момент появления игрового поля (ТЗ 5.2). Идемпотентен: повторный вызов возвращает то же окно и не продлевает его (ТЗ 5.6). Для проверки после разрыва связи используйте GET этого раунда: он не может открыть следующее окно.",
        "parameters" : [ {
          "deprecated" : false,
          "description" : "match id",
          "explode" : false,
          "in" : "path",
          "name" : "id",
          "required" : true,
          "schema" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        }, {
          "deprecated" : false,
          "description" : "round number, 1..3",
          "explode" : false,
          "in" : "path",
          "name" : "index",
          "required" : true,
          "schema" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        } ],
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "404" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "match_not_found",
                  "message" : "Match not found"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Not Found"
          },
          "400" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "validation_error",
                  "message" : "round index must be 1..3, got 4"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Bad Request"
          },
          "409" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "round_not_active",
                  "message" : "Round 2 cannot start while round 1 is still running"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Conflict"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RoundStartResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Старт раунда — запускает серверный таймер",
        "tags" : [ "Match" ]
      }
    },
    "/user/matches/{id}/rounds/{index}/words" : {
      "post" : {
        "description" : "Отправляется, когда игрок отпускает палец (ТЗ 5.5). Слово идёт вместе с траекторией — по ней сервер проверяет смежность клеток и отсутствие повторов (ТЗ 5.4) и считает множители. Отказ по существу игры (нет такого слова, уже найдено) — это 200 со статусом в теле, а не ошибка. Необязательный request_id дедуплицирует запись этого действия в истории партии.",
        "parameters" : [ {
          "deprecated" : false,
          "description" : "match id",
          "explode" : false,
          "in" : "path",
          "name" : "id",
          "required" : true,
          "schema" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        }, {
          "deprecated" : false,
          "description" : "round number, 1..3",
          "explode" : false,
          "in" : "path",
          "name" : "index",
          "required" : true,
          "schema" : {
            "format" : "int32",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/WordCheckRequest"
              }
            }
          }
        },
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "404" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "match_not_found",
                  "message" : "Match not found"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Not Found"
          },
          "400" : {
            "content" : {
              "application/json" : {
                "examples" : {
                  "Example 0" : {
                    "value" : {
                      "code" : "validation_error",
                      "message" : "request_id must not be blank"
                    }
                  },
                  "Example 1" : {
                    "value" : {
                      "code" : "invalid_word_path",
                      "message" : "Path is not a legal trace on this board"
                    }
                  }
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Bad Request"
          },
          "409" : {
            "content" : {
              "application/json" : {
                "examples" : {
                  "Example 0" : {
                    "value" : {
                      "code" : "round_not_active",
                      "message" : "Round 2 has not been started"
                    }
                  },
                  "Example 1" : {
                    "value" : {
                      "code" : "round_expired",
                      "message" : "This round has already ended"
                    }
                  },
                  "Example 2" : {
                    "value" : {
                      "code" : "word_request_conflict",
                      "message" : "This request_id was already used for another word request"
                    }
                  }
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Conflict"
          },
          "503" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "settings_unavailable",
                  "message" : "Game settings are not usable: word_scores must cover every length in 3..8 without gaps"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Service Unavailable"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/WordCheckResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Проверка найденного слова",
        "tags" : [ "Match" ]
      }
    },
    "/user/dictionary" : {
      "get" : {
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/DictionaryResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Личный словарь игрока — открытые и замаскированные термины",
        "tags" : [ "PlayerDictionary" ]
      }
    },
    "/user/dictionary/{id}" : {
      "get" : {
        "parameters" : [ {
          "deprecated" : false,
          "description" : "financial term id",
          "explode" : false,
          "in" : "path",
          "name" : "id",
          "required" : true,
          "schema" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        } ],
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "404" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "financial_term_not_found",
                  "message" : "Financial term not found"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Not Found"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/DictionaryTermDto"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Карточка открытого термина — слово и объяснение",
        "tags" : [ "PlayerDictionary" ]
      }
    },
    "/user/shop" : {
      "get" : {
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "503" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "settings_unavailable",
                  "message" : "Game settings are not usable: energy_max is not usable"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Service Unavailable"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PlayerShopResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Витрина магазина и запасы игрока",
        "tags" : [ "Shop" ]
      }
    },
    "/user/shop/products/{id}/purchase" : {
      "post" : {
        "description" : "Повтор того же request_id для того же товара возвращает исходный результат без нового списания.",
        "parameters" : [ {
          "deprecated" : false,
          "description" : "shop product id",
          "explode" : false,
          "in" : "path",
          "name" : "id",
          "required" : true,
          "schema" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/PlayerShopPurchaseRequest"
              }
            }
          }
        },
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "400" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "validation_error",
                  "message" : "request_id must contain 1..96 characters"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Bad Request"
          },
          "404" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "shop_product_not_found",
                  "message" : "Shop product not found"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Not Found"
          },
          "409" : {
            "content" : {
              "application/json" : {
                "examples" : {
                  "Example 0" : {
                    "value" : {
                      "code" : "shop_product_unavailable",
                      "message" : "Shop product is not available"
                    }
                  },
                  "Example 1" : {
                    "value" : {
                      "code" : "insufficient_coins",
                      "message" : "Not enough coins for this purchase"
                    }
                  },
                  "Example 2" : {
                    "value" : {
                      "code" : "shop_daily_limit_reached",
                      "message" : "Daily purchase limit reached"
                    }
                  },
                  "Example 3" : {
                    "value" : {
                      "code" : "shop_storage_limit_reached",
                      "message" : "Hint storage limit reached"
                    }
                  },
                  "Example 4" : {
                    "value" : {
                      "code" : "shop_energy_limit_reached",
                      "message" : "Energy package would exceed the maximum"
                    }
                  },
                  "Example 5" : {
                    "value" : {
                      "code" : "purchase_request_conflict",
                      "message" : "request_id was already used for another product"
                    }
                  }
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Conflict"
          },
          "503" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "settings_unavailable",
                  "message" : "Game settings are not usable: energy_max is not usable"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Service Unavailable"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PlayerShopPurchaseResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Покупка товара — идемпотентно по request_id",
        "tags" : [ "Shop" ]
      }
    },
    "/user/external-tasks" : {
      "get" : {
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PlayerExternalTasksResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Внешние задания игрока",
        "tags" : [ "ExternalTasks" ]
      }
    },
    "/user/external-tasks/{id}/claim" : {
      "post" : {
        "description" : "Повторный вызов для того же задания возвращает исходную награду без нового начисления.",
        "parameters" : [ {
          "deprecated" : false,
          "description" : "external task id",
          "explode" : false,
          "in" : "path",
          "name" : "id",
          "required" : true,
          "schema" : {
            "format" : "int64",
            "nullable" : false,
            "type" : "integer"
          },
          "style" : "simple"
        } ],
        "responses" : {
          "500" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "internal_error",
                  "message" : "Internal server error"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Internal Server Error"
          },
          "413" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "payload_too_large",
                  "message" : "The request body is larger than this endpoint accepts"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Payload Too Large"
          },
          "401" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "invalid_session",
                  "message" : "Session is missing, invalid or expired"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Unauthorized"
          },
          "404" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "external_task_not_found",
                  "message" : "External task not found"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Not Found"
          },
          "409" : {
            "content" : {
              "application/json" : {
                "examples" : {
                  "Example 0" : {
                    "value" : {
                      "code" : "external_task_not_completed",
                      "message" : "External task is not completed"
                    }
                  },
                  "Example 1" : {
                    "value" : {
                      "code" : "external_task_not_manually_claimable",
                      "message" : "External task is not configured for manual claim"
                    }
                  },
                  "Example 2" : {
                    "value" : {
                      "code" : "coin_balance_overflow",
                      "message" : "Coin balance would exceed the supported range"
                    }
                  }
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Conflict"
          },
          "503" : {
            "content" : {
              "application/json" : {
                "example" : {
                  "code" : "settings_unavailable",
                  "message" : "Game settings are not usable: energy_max is not usable"
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorResponse"
                }
              }
            },
            "description" : "Service Unavailable"
          },
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PlayerExternalTaskClaimResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "security" : [ {
          "SessionAuth" : [ ]
        } ],
        "summary" : "Получить награду за выполненное внешнее задание",
        "tags" : [ "ExternalTasks" ]
      }
    }
  },
  "servers" : [ {
    "description" : "This host",
    "url" : "/"
  } ],
  "tags" : [ {
    "description" : "Служебные",
    "name" : "System"
  }, {
    "description" : "Авторизация",
    "name" : "Auth"
  }, {
    "description" : "Пользователь",
    "name" : "User"
  }, {
    "description" : "Партия",
    "name" : "Match"
  }, {
    "description" : "Личный словарь",
    "name" : "PlayerDictionary"
  }, {
    "description" : "Магазин",
    "name" : "Shop"
  }, {
    "description" : "Внешние задания",
    "name" : "ExternalTasks"
  } ]
}