{
  "openapi": "3.0.1",
  "info": {
    "title": "TableHub API",
    "description": "Modular board-game platform — Classic Backgammon MVP",
    "version": "v1"
  },
  "paths": {
    "/health": {
      "get": {
        "tags": [
          "TableHub.Api"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/": {
      "get": {
        "tags": [
          "TableHub.Api"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/admin/cosmetics": {
      "get": {
        "tags": [
          "AdminCosmetics"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "post": {
        "tags": [
          "AdminCosmetics"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminCosmeticRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminCosmeticRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AdminCosmeticRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/admin/cosmetics/{cosmeticId}": {
      "put": {
        "tags": [
          "AdminCosmetics"
        ],
        "parameters": [
          {
            "name": "cosmeticId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminCosmeticRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminCosmeticRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AdminCosmeticRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "AdminCosmetics"
        ],
        "parameters": [
          {
            "name": "cosmeticId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/admin/cosmetics/grant": {
      "post": {
        "tags": [
          "AdminCosmetics"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminGrantRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminGrantRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AdminGrantRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/admin/cosmetics/revoke": {
      "post": {
        "tags": [
          "AdminCosmetics"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminGrantRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminGrantRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AdminGrantRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/admin/cosmetics/upload": {
      "post": {
        "tags": [
          "AdminCosmetics"
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "allOf": [
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "object",
                    "properties": {
                      "file": {
                        "$ref": "#/components/schemas/IFormFile"
                      }
                    }
                  },
                  {
                    "type": "object",
                    "properties": {
                      "side": {
                        "type": "string",
                        "default": null
                      }
                    }
                  },
                  {
                    "type": "object",
                    "properties": {
                      "face": {
                        "type": "integer",
                        "format": "int32",
                        "default": null
                      }
                    }
                  }
                ]
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/admin/users": {
      "get": {
        "tags": [
          "AdminUsers"
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "includeBots",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "take",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/admin/users/{userId}": {
      "get": {
        "tags": [
          "AdminUsers"
        ],
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/auth/register": {
      "post": {
        "tags": [
          "Auth"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/auth/login": {
      "post": {
        "tags": [
          "Auth"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/auth/refresh": {
      "post": {
        "tags": [
          "Auth"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/auth/social": {
      "post": {
        "tags": [
          "Auth"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SocialLoginRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SocialLoginRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SocialLoginRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/competitions": {
      "get": {
        "tags": [
          "Competitions"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "post": {
        "tags": [
          "Competitions"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateCompetitionRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateCompetitionRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateCompetitionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/competitions/{competitionId}": {
      "get": {
        "tags": [
          "Competitions"
        ],
        "parameters": [
          {
            "name": "competitionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/competitions/{competitionId}/play": {
      "post": {
        "tags": [
          "Competitions"
        ],
        "parameters": [
          {
            "name": "competitionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/competitions/{competitionId}/invite": {
      "post": {
        "tags": [
          "Competitions"
        ],
        "parameters": [
          {
            "name": "competitionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/competitions/invites/{inviteId}": {
      "get": {
        "tags": [
          "Competitions"
        ],
        "parameters": [
          {
            "name": "inviteId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "Competitions"
        ],
        "parameters": [
          {
            "name": "inviteId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/competitions/invites/join": {
      "post": {
        "tags": [
          "Competitions"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JoinCompetitionInviteRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/JoinCompetitionInviteRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/JoinCompetitionInviteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/competitions/tickets/{ticketId}": {
      "get": {
        "tags": [
          "Competitions"
        ],
        "parameters": [
          {
            "name": "ticketId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "Competitions"
        ],
        "parameters": [
          {
            "name": "ticketId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/competitions/sessions/{sessionId}": {
      "get": {
        "tags": [
          "Competitions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/competitions/sessions/{sessionId}/ready": {
      "post": {
        "tags": [
          "Competitions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/competitions/sessions/{sessionId}/forfeit": {
      "post": {
        "tags": [
          "Competitions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/cosmetics/catalog": {
      "get": {
        "tags": [
          "Cosmetics"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/cosmetics/me": {
      "get": {
        "tags": [
          "Cosmetics"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/cosmetics/me/equip": {
      "put": {
        "tags": [
          "Cosmetics"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EquipCosmeticsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/EquipCosmeticsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/EquipCosmeticsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/cosmetics/{cosmeticId}/purchase": {
      "post": {
        "tags": [
          "Cosmetics"
        ],
        "parameters": [
          {
            "name": "cosmeticId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/economy/me": {
      "get": {
        "tags": [
          "Economy"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/economy/packages": {
      "get": {
        "tags": [
          "Economy"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/economy/shop": {
      "get": {
        "tags": [
          "Economy"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/economy/ads/reward": {
      "post": {
        "tags": [
          "Economy"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/economy/quests/{kind}/claim": {
      "post": {
        "tags": [
          "Economy"
        ],
        "parameters": [
          {
            "name": "kind",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/economy/packages/{packageId}/redeem": {
      "post": {
        "tags": [
          "Economy"
        ],
        "parameters": [
          {
            "name": "packageId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/admin/economy/settings": {
      "get": {
        "tags": [
          "AdminEconomy"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "put": {
        "tags": [
          "AdminEconomy"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EconomySettingsEntity"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/EconomySettingsEntity"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/EconomySettingsEntity"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/admin/economy/packages": {
      "get": {
        "tags": [
          "AdminEconomy"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "post": {
        "tags": [
          "AdminEconomy"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreditPackageEntity"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreditPackageEntity"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreditPackageEntity"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/admin/economy/packages/{packageId}": {
      "put": {
        "tags": [
          "AdminEconomy"
        ],
        "parameters": [
          {
            "name": "packageId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreditPackageEntity"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreditPackageEntity"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreditPackageEntity"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "AdminEconomy"
        ],
        "parameters": [
          {
            "name": "packageId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/admin/economy/users/{userId}/credits": {
      "post": {
        "tags": [
          "AdminEconomy"
        ],
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdjustCreditsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AdjustCreditsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AdjustCreditsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/admin/economy/users/{userId}/packages/{packageId}/grant": {
      "post": {
        "tags": [
          "AdminEconomy"
        ],
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "packageId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/friends/favorites": {
      "get": {
        "tags": [
          "Friends"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/friends/favorite-code": {
      "get": {
        "tags": [
          "Friends"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/friends/favorite-code/regenerate": {
      "post": {
        "tags": [
          "Friends"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/friends/favorites/redeem": {
      "post": {
        "tags": [
          "Friends"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RedeemFavoriteRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RedeemFavoriteRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RedeemFavoriteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/friends/invites": {
      "post": {
        "tags": [
          "Friends"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateFriendInviteRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateFriendInviteRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateFriendInviteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/friends/invites/pending": {
      "get": {
        "tags": [
          "Friends"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/friends/invites/{inviteId}": {
      "get": {
        "tags": [
          "Friends"
        ],
        "parameters": [
          {
            "name": "inviteId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/friends/invites/{inviteId}/respond": {
      "post": {
        "tags": [
          "Friends"
        ],
        "parameters": [
          {
            "name": "inviteId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RespondFriendInviteRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RespondFriendInviteRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RespondFriendInviteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/friends/devices/push-token": {
      "post": {
        "tags": [
          "Friends"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpsertPushTokenRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpsertPushTokenRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpsertPushTokenRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/matches": {
      "get": {
        "tags": [
          "Matches"
        ],
        "parameters": [
          {
            "name": "open",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MatchDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MatchDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MatchDto"
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Matches"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMatchRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMatchRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMatchRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/CreateMatchResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateMatchResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateMatchResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/matches/{matchId}": {
      "get": {
        "tags": [
          "Matches"
        ],
        "parameters": [
          {
            "name": "matchId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/MatchDto2"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchDto2"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchDto2"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Matches"
        ],
        "parameters": [
          {
            "name": "matchId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/matches/{matchId}/join": {
      "post": {
        "tags": [
          "Matches"
        ],
        "parameters": [
          {
            "name": "matchId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/MatchDto2"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchDto2"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchDto2"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/matches/join-by-code": {
      "post": {
        "tags": [
          "Matches"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JoinByCodeRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/JoinByCodeRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/JoinByCodeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/MatchDto2"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchDto2"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchDto2"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/matchmaking/enqueue": {
      "post": {
        "tags": [
          "Matchmaking"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnqueueMatchmakingRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/EnqueueMatchmakingRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/EnqueueMatchmakingRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/MatchmakingTicketDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchmakingTicketDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchmakingTicketDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/matchmaking/tickets/{ticketId}": {
      "get": {
        "tags": [
          "Matchmaking"
        ],
        "parameters": [
          {
            "name": "ticketId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/MatchmakingTicketDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchmakingTicketDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchmakingTicketDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Matchmaking"
        ],
        "parameters": [
          {
            "name": "ticketId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/me": {
      "get": {
        "tags": [
          "Profile"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "put": {
        "tags": [
          "Profile"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProfileRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProfileRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProfileRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/users/{userId}": {
      "get": {
        "tags": [
          "Profile"
        ],
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/replays/{replayId}": {
      "get": {
        "tags": [
          "Replays"
        ],
        "parameters": [
          {
            "name": "replayId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/replays/{replayId}/events": {
      "get": {
        "tags": [
          "Replays"
        ],
        "parameters": [
          {
            "name": "replayId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/replays/{replayId}/export": {
      "get": {
        "tags": [
          "Replays"
        ],
        "parameters": [
          {
            "name": "replayId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/rulesets/catalog": {
      "get": {
        "tags": [
          "Rulesets"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/school/lesson": {
      "post": {
        "tags": [
          "School"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StartLessonRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/StartLessonRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/StartLessonRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/stats/me": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/leaderboard": {
      "get": {
        "tags": [
          "Stats"
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "AdjustCreditsRequest": {
        "type": "object",
        "properties": {
          "delta": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "AdminCosmeticRequest": {
        "type": "object",
        "properties": {
          "cosmeticId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "kind": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "isDefault": {
            "type": "boolean"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "boardAssetUrl": {
            "type": "string",
            "nullable": true
          },
          "diceAssetUrl": {
            "type": "string",
            "nullable": true
          },
          "diceFace1Url": {
            "type": "string",
            "nullable": true
          },
          "diceFace2Url": {
            "type": "string",
            "nullable": true
          },
          "diceFace3Url": {
            "type": "string",
            "nullable": true
          },
          "diceFace4Url": {
            "type": "string",
            "nullable": true
          },
          "diceFace5Url": {
            "type": "string",
            "nullable": true
          },
          "diceFace6Url": {
            "type": "string",
            "nullable": true
          },
          "checkerWhiteAssetUrl": {
            "type": "string",
            "nullable": true
          },
          "checkerBlackAssetUrl": {
            "type": "string",
            "nullable": true
          },
          "unlockType": {
            "type": "string"
          },
          "winsRequired": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "priceCents": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "currency": {
            "type": "string"
          },
          "bundleBoardCosmeticId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "bundleDiceCosmeticId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "bundleCheckerCosmeticId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "isActive": {
            "type": "boolean"
          }
        }
      },
      "AdminGrantRequest": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "cosmeticId": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "AuthResponse": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "username": {
            "type": "string"
          },
          "accessToken": {
            "type": "string"
          },
          "refreshToken": {
            "type": "string"
          }
        }
      },
      "CreateCompetitionRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "mode": {
            "type": "string"
          },
          "targetPoints": {
            "type": "integer",
            "format": "int32"
          },
          "ruleSets": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "CreateFriendInviteRequest": {
        "type": "object",
        "properties": {
          "toUserId": {
            "type": "string",
            "nullable": true
          },
          "kind": {
            "type": "string",
            "nullable": true
          },
          "ruleSet": {
            "type": "string",
            "nullable": true
          },
          "competitionId": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "CreateMatchRequest": {
        "type": "object",
        "properties": {
          "ruleSet": {
            "type": "string"
          },
          "isPrivate": {
            "type": "boolean"
          }
        }
      },
      "CreateMatchResponse": {
        "type": "object",
        "properties": {
          "matchId": {
            "type": "string",
            "format": "uuid"
          },
          "joinCode": {
            "type": "string"
          }
        }
      },
      "CreditPackageEntity": {
        "type": "object",
        "properties": {
          "packageId": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "creditsAmount": {
            "type": "integer",
            "format": "int32"
          },
          "priceCents": {
            "type": "integer",
            "format": "int32"
          },
          "currency": {
            "type": "string"
          },
          "productSku": {
            "type": "string",
            "nullable": true
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "isActive": {
            "type": "boolean"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "updatedUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "EconomySettingsEntity": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "creditsPerWinPoint": {
            "type": "integer",
            "format": "int32"
          },
          "creditsPerLossPoint": {
            "type": "integer",
            "format": "int32"
          },
          "dailyQuestTargetGames": {
            "type": "integer",
            "format": "int32"
          },
          "dailyQuestRewardCredits": {
            "type": "integer",
            "format": "int32"
          },
          "weeklyQuestTargetGames": {
            "type": "integer",
            "format": "int32"
          },
          "weeklyQuestRewardCredits": {
            "type": "integer",
            "format": "int32"
          },
          "adRewardCredits": {
            "type": "integer",
            "format": "int32"
          },
          "adCooldownMinutes": {
            "type": "integer",
            "format": "int32"
          },
          "levelWinsPerLevel": {
            "type": "integer",
            "format": "int32"
          },
          "levelGamesPerLevel": {
            "type": "integer",
            "format": "int32"
          },
          "updatedUtc": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "EnqueueMatchmakingRequest": {
        "type": "object",
        "properties": {
          "ruleSet": {
            "type": "string"
          }
        }
      },
      "EquipCosmeticsRequest": {
        "type": "object",
        "properties": {
          "boardCosmeticId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "diceCosmeticId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "checkerCosmeticId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "IFormFile": {
        "type": "string",
        "format": "binary"
      },
      "JoinByCodeRequest": {
        "required": [
          "joinCode"
        ],
        "type": "object",
        "properties": {
          "joinCode": {
            "type": "string"
          }
        }
      },
      "JoinCompetitionInviteRequest": {
        "type": "object",
        "properties": {
          "joinCode": {
            "type": "string"
          }
        }
      },
      "LoginRequest": {
        "required": [
          "emailOrUsername",
          "password"
        ],
        "type": "object",
        "properties": {
          "emailOrUsername": {
            "type": "string"
          },
          "password": {
            "type": "string"
          }
        }
      },
      "MatchDto": {
        "type": "object",
        "properties": {
          "matchId": {
            "type": "string",
            "format": "uuid"
          },
          "ruleSet": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "whitePlayer": {
            "$ref": "#/components/schemas/UserDto"
          },
          "blackPlayer": {
            "$ref": "#/components/schemas/UserDto2"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "joinCode": {
            "type": "string",
            "nullable": true
          },
          "replayId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "winnerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "winPoints": {
            "type": "integer",
            "format": "int32"
          },
          "competitionSessionId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "turnSeconds": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "MatchDto2": {
        "type": "object",
        "properties": {
          "matchId": {
            "type": "string",
            "format": "uuid"
          },
          "ruleSet": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "whitePlayer": {
            "$ref": "#/components/schemas/UserDto"
          },
          "blackPlayer": {
            "$ref": "#/components/schemas/UserDto3"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "joinCode": {
            "type": "string",
            "nullable": true
          },
          "replayId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "winnerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "winPoints": {
            "type": "integer",
            "format": "int32"
          },
          "competitionSessionId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "turnSeconds": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "MatchmakingTicketDto": {
        "type": "object",
        "properties": {
          "ticketId": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "string"
          },
          "ruleSet": {
            "type": "string"
          },
          "matchId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "waitMs": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "PlayerCosmeticsDto": {
        "type": "object",
        "properties": {
          "checkerSheetUrl": {
            "type": "string",
            "nullable": true
          },
          "checkerWhiteAssetUrl": {
            "type": "string",
            "nullable": true
          },
          "checkerBlackAssetUrl": {
            "type": "string",
            "nullable": true
          },
          "diceAssetUrl": {
            "type": "string",
            "nullable": true
          },
          "diceFace1Url": {
            "type": "string",
            "nullable": true
          },
          "diceFace2Url": {
            "type": "string",
            "nullable": true
          },
          "diceFace3Url": {
            "type": "string",
            "nullable": true
          },
          "diceFace4Url": {
            "type": "string",
            "nullable": true
          },
          "diceFace5Url": {
            "type": "string",
            "nullable": true
          },
          "diceFace6Url": {
            "type": "string",
            "nullable": true
          }
        },
        "nullable": true
      },
      "RedeemFavoriteRequest": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "RefreshRequest": {
        "required": [
          "refreshToken"
        ],
        "type": "object",
        "properties": {
          "refreshToken": {
            "type": "string"
          }
        }
      },
      "RegisterRequest": {
        "required": [
          "email",
          "username",
          "password"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          },
          "username": {
            "maxLength": 64,
            "minLength": 3,
            "type": "string"
          },
          "password": {
            "minLength": 6,
            "type": "string"
          }
        }
      },
      "RespondFriendInviteRequest": {
        "type": "object",
        "properties": {
          "action": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "SocialLoginRequest": {
        "required": [
          "provider"
        ],
        "type": "object",
        "properties": {
          "provider": {
            "maxLength": 32,
            "minLength": 3,
            "type": "string"
          },
          "idToken": {
            "type": "string",
            "nullable": true
          },
          "accessToken": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "StartLessonRequest": {
        "type": "object",
        "properties": {
          "ruleSet": {
            "type": "string"
          }
        }
      },
      "UpdateProfileRequest": {
        "type": "object",
        "properties": {
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "avatarUrl": {
            "type": "string",
            "nullable": true
          },
          "turnTimerSeconds": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        }
      },
      "UpsertPushTokenRequest": {
        "type": "object",
        "properties": {
          "platform": {
            "type": "string",
            "nullable": true
          },
          "token": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "UserDto": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "username": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "avatarUrl": {
            "type": "string",
            "nullable": true
          },
          "rating": {
            "type": "integer",
            "format": "int32"
          },
          "level": {
            "type": "integer",
            "format": "int32"
          },
          "cosmetics": {
            "$ref": "#/components/schemas/PlayerCosmeticsDto"
          }
        },
        "nullable": true
      },
      "UserDto2": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "username": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "avatarUrl": {
            "type": "string",
            "nullable": true
          },
          "rating": {
            "type": "integer",
            "format": "int32"
          },
          "level": {
            "type": "integer",
            "format": "int32"
          },
          "cosmetics": {
            "$ref": "#/components/schemas/#/items/properties/whitePlayer/properties/cosmetics"
          }
        },
        "nullable": true
      },
      "UserDto3": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "username": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "avatarUrl": {
            "type": "string",
            "nullable": true
          },
          "rating": {
            "type": "integer",
            "format": "int32"
          },
          "level": {
            "type": "integer",
            "format": "int32"
          },
          "cosmetics": {
            "$ref": "#/components/schemas/#/properties/whitePlayer/properties/cosmetics"
          }
        },
        "nullable": true
      }
    },
    "securitySchemes": {
      "Bearer": {
        "type": "http",
        "description": "JWT Authorization header using the Bearer scheme.",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  },
  "tags": [
    {
      "name": "TableHub.Api"
    },
    {
      "name": "AdminCosmetics"
    },
    {
      "name": "AdminUsers"
    },
    {
      "name": "Auth"
    },
    {
      "name": "Competitions"
    },
    {
      "name": "Cosmetics"
    },
    {
      "name": "Economy"
    },
    {
      "name": "AdminEconomy"
    },
    {
      "name": "Friends"
    },
    {
      "name": "Matches"
    },
    {
      "name": "Matchmaking"
    },
    {
      "name": "Profile"
    },
    {
      "name": "Replays"
    },
    {
      "name": "Rulesets"
    },
    {
      "name": "School"
    },
    {
      "name": "Stats"
    }
  ]
}