{
  "openapi": "3.1.0",
  "info": {
    "title": "MONA Cloud API (compute; trước đây VibeCloud)",
    "description": "MONA Cloud API (compute; trước đây VibeCloud) cho tài khoản, thanh toán, VPS LXC, database và AI agent.",
    "version": "0.3.0"
  },
  "paths": {
    "/api/auth/login": {
      "post": {
        "tags": [
          "auth"
        ],
        "summary": "Login with email and password for CLI/script usage",
        "operationId": "api_login_api_auth_login_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PasswordLoginRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Login Api Auth Login Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/auth/login`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới."
      }
    },
    "/api/auth/check-otp": {
      "post": {
        "tags": [
          "auth"
        ],
        "summary": "Non-consuming OTP precheck for the SPA's two-step register/reset flows",
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/auth/check-otp`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_check_otp_api_auth_check_otp_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CheckOtpRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Check Otp Api Auth Check Otp Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/auth/refresh": {
      "post": {
        "tags": [
          "auth"
        ],
        "summary": "Trade a valid access token for a fresh one with a new expiry",
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/auth/refresh`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_refresh_access_token_api_auth_refresh_post",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Refresh Access Token Api Auth Refresh Post"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/auth/identify": {
      "post": {
        "tags": [
          "auth"
        ],
        "summary": "Identify an email and start registration OTP if needed",
        "operationId": "api_identify_email_api_auth_identify_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmailRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Identify Email Api Auth Identify Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/auth/identify`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới."
      }
    },
    "/api/auth/register/verify": {
      "post": {
        "tags": [
          "auth"
        ],
        "summary": "Verify registration OTP and create account",
        "operationId": "api_register_verify_api_auth_register_verify_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterVerifyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Register Verify Api Auth Register Verify Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/auth/register/verify`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới."
      }
    },
    "/api/auth/reset/start": {
      "post": {
        "tags": [
          "auth"
        ],
        "summary": "Send password reset OTP",
        "operationId": "api_reset_start_api_auth_reset_start_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmailRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Reset Start Api Auth Reset Start Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/auth/reset/start`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới."
      }
    },
    "/api/auth/reset/verify": {
      "post": {
        "tags": [
          "auth"
        ],
        "summary": "Verify reset OTP and change password",
        "operationId": "api_reset_verify_api_auth_reset_verify_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResetPasswordRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Reset Verify Api Auth Reset Verify Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/auth/reset/verify`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới."
      }
    },
    "/api/auth/providers": {
      "get": {
        "tags": [
          "auth"
        ],
        "summary": "Which social-login providers are enabled",
        "operationId": "api_auth_providers_api_auth_providers_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Auth Providers Api Auth Providers Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/auth/providers`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới."
      }
    },
    "/api/me": {
      "get": {
        "tags": [
          "auth"
        ],
        "summary": "Get the current account",
        "operationId": "api_me_api_me_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Me Api Me Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/me`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/me/referral": {
      "get": {
        "tags": [
          "auth"
        ],
        "summary": "Get the current user's referral code, link and stats",
        "description": "Đọc dữ liệu tại `/api/me/referral`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_me_referral_api_me_referral_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Me Referral Api Me Referral Get"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/me/credit-grants": {
      "get": {
        "tags": [
          "auth"
        ],
        "summary": "Per-user audit trail of credit grants",
        "operationId": "api_me_credit_grants_api_me_credit_grants_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Me Credit Grants Api Me Credit Grants Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/me/credit-grants`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/auth/logout": {
      "post": {
        "tags": [
          "auth"
        ],
        "summary": "Revoke the current account access token",
        "operationId": "api_logout_api_auth_logout_post",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Logout Api Auth Logout Post"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/auth/logout`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/dashboard": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "Dashboard data for a separate frontend",
        "operationId": "api_dashboard_api_dashboard_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Dashboard Api Dashboard Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/dashboard`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/api-keys": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "List automation API tokens",
        "operationId": "api_list_keys_api_api_keys_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api List Keys Api Api Keys Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/api-keys`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      },
      "post": {
        "tags": [
          "services"
        ],
        "summary": "Create an automation API token",
        "operationId": "api_create_key_api_api_keys_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApiKeyCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiKeyCreateResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/api-keys`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/api-keys/{key_id}": {
      "delete": {
        "tags": [
          "services"
        ],
        "summary": "Revoke an automation API token",
        "operationId": "api_revoke_key_api_api_keys__key_id__delete",
        "parameters": [
          {
            "name": "key_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Key Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Revoke Key Api Api Keys  Key Id  Delete"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Xóa hoặc vô hiệu hóa dữ liệu tại `/api/api-keys/{key_id}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/payments/vietqr": {
      "post": {
        "tags": [
          "billing"
        ],
        "summary": "Create a VietQR add-funds invoice",
        "operationId": "api_create_vietqr_invoice_api_payments_vietqr_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddFundsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VietQRInvoiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/payments/vietqr`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/payments": {
      "get": {
        "tags": [
          "billing"
        ],
        "summary": "List add-funds payments",
        "operationId": "api_list_payments_api_payments_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api List Payments Api Payments Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/payments`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/payments/{payment_id}": {
      "get": {
        "tags": [
          "billing"
        ],
        "summary": "Get payment details",
        "operationId": "api_get_payment_api_payments__payment_id__get",
        "parameters": [
          {
            "name": "payment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Payment Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Get Payment Api Payments  Payment Id  Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/payments/{payment_id}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/webhooks/payments": {
      "post": {
        "tags": [
          "billing"
        ],
        "summary": "Payment success webhook",
        "operationId": "payment_webhook_api_webhooks_payments_post",
        "parameters": [
          {
            "name": "x-api-key",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "default": "",
              "title": "X-Api-Key"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaymentWebhook"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Payment Webhook Api Webhooks Payments Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/webhooks/payments`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "PaymentWebhookKey": []
          }
        ]
      }
    },
    "/api/prices": {
      "get": {
        "tags": [
          "prices"
        ],
        "summary": "Get public hourly price settings",
        "operationId": "api_public_prices_api_prices_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Public Prices Api Prices Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/prices`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới."
      }
    },
    "/api/packages": {
      "get": {
        "tags": [
          "prices"
        ],
        "summary": "List active public packages",
        "operationId": "api_public_packages_api_packages_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Public Packages Api Packages Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/packages`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới."
      }
    },
    "/api/plans": {
      "get": {
        "tags": [
          "prices"
        ],
        "summary": "List active monthly compute plans",
        "operationId": "api_public_plans_api_plans_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Public Plans Api Plans Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/plans`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới."
      }
    },
    "/api/credit-codes/redeem": {
      "post": {
        "tags": [
          "billing"
        ],
        "summary": "Redeem a promotional credit code",
        "operationId": "api_redeem_credit_code_api_credit_codes_redeem_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreditCodeRedeemRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Redeem Credit Code Api Credit Codes Redeem Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/credit-codes/redeem`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/subscriptions": {
      "get": {
        "tags": [
          "billing"
        ],
        "summary": "List the current user's subscriptions",
        "operationId": "api_list_subscriptions_api_subscriptions_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api List Subscriptions Api Subscriptions Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/subscriptions`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/services/{service_id}/subscription": {
      "post": {
        "tags": [
          "billing"
        ],
        "summary": "Create or change a service subscription",
        "operationId": "api_change_subscription_api_services__service_id__subscription_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubscriptionUpdateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Change Subscription Api Services  Service Id  Subscription Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/services/{service_id}/subscription`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/invoices": {
      "get": {
        "tags": [
          "billing"
        ],
        "summary": "List the current user's monthly invoices",
        "operationId": "api_list_invoices_api_invoices_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api List Invoices Api Invoices Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/invoices`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/invoices/{invoice_id}.pdf": {
      "get": {
        "tags": [
          "billing"
        ],
        "summary": "Download a monthly invoice PDF",
        "operationId": "api_invoice_pdf_api_invoices__invoice_id__pdf_get",
        "parameters": [
          {
            "name": "invoice_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Invoice Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/invoices/{invoice_id}.pdf`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/lxc": {
      "post": {
        "tags": [
          "lxc"
        ],
        "summary": "Create an LXC VPS",
        "operationId": "create_lxc_api_lxc_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LxcCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/lxc`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/sandbox/lxc": {
      "post": {
        "tags": [
          "sandbox"
        ],
        "summary": "Create a sandbox LXC VPS",
        "operationId": "create_lxc_api_sandbox_lxc_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LxcCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/sandbox/lxc`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/databases": {
      "post": {
        "tags": [
          "databases"
        ],
        "summary": "Create a database instance",
        "operationId": "create_database_api_databases_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DatabaseCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EngineNotAvailableResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/databases`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới. Engine nhận `mongodb`, `postgresql`, `mysql` (`mongo` là alias). Route thật trả 409 `engine_not_available` trước khi tạo job nếu template đã resolve chưa có trên node; route sandbox không kiểm tra hạ tầng.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/sandbox/databases": {
      "post": {
        "tags": [
          "sandbox"
        ],
        "summary": "Create a sandbox database instance",
        "operationId": "create_database_api_sandbox_databases_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DatabaseCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EngineNotAvailableResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/sandbox/databases`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới. Engine nhận `mongodb`, `postgresql`, `mysql` (`mongo` là alias). Route thật trả 409 `engine_not_available` trước khi tạo job nếu template đã resolve chưa có trên node; route sandbox không kiểm tra hạ tầng.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/databases/{service_id}/databases": {
      "post": {
        "tags": [
          "databases"
        ],
        "summary": "Create another database on an existing DB instance",
        "operationId": "add_database_to_instance_api_databases__service_id__databases_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DatabaseAddRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Add Database To Instance Api Databases  Service Id  Databases Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/databases/{service_id}/databases`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/databases/{service_id}/databases/{db_name}/password": {
      "post": {
        "tags": [
          "databases"
        ],
        "summary": "Regenerate the password for a database on an instance",
        "operationId": "regenerate_database_password_api_databases__service_id__databases__db_name__password_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          },
          {
            "name": "db_name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Db Name"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Regenerate Database Password Api Databases  Service Id  Databases  Db Name  Password Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/databases/{service_id}/databases/{db_name}/password`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/databases/{service_id}/databases/{db_name}": {
      "delete": {
        "tags": [
          "databases"
        ],
        "summary": "Drop a database from an instance",
        "operationId": "delete_database_on_instance_api_databases__service_id__databases__db_name__delete",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          },
          {
            "name": "db_name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Db Name"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Delete Database On Instance Api Databases  Service Id  Databases  Db Name  Delete"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Xóa hoặc vô hiệu hóa dữ liệu tại `/api/databases/{service_id}/databases/{db_name}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/jobs/{job_id}": {
      "get": {
        "tags": [
          "jobs"
        ],
        "summary": "Check provisioning job status",
        "operationId": "get_job_api_jobs__job_id__get",
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Job Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/jobs/{job_id}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/sandbox/jobs/{job_id}": {
      "get": {
        "tags": [
          "sandbox"
        ],
        "summary": "Check sandbox job status",
        "operationId": "get_job_api_sandbox_jobs__job_id__get",
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Job Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/sandbox/jobs/{job_id}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/jobs": {
      "get": {
        "tags": [
          "jobs"
        ],
        "summary": "List provisioning jobs",
        "operationId": "list_jobs_api_jobs_get",
        "parameters": [
          {
            "name": "include_sandbox",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false,
              "title": "Include Sandbox"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response List Jobs Api Jobs Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/jobs`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/sandbox/jobs": {
      "get": {
        "tags": [
          "sandbox"
        ],
        "summary": "List sandbox jobs",
        "operationId": "list_jobs_api_sandbox_jobs_get",
        "parameters": [
          {
            "name": "include_sandbox",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false,
              "title": "Include Sandbox"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response List Jobs Api Sandbox Jobs Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/sandbox/jobs`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/jobs/{job_id}/retry": {
      "post": {
        "tags": [
          "jobs"
        ],
        "summary": "Retry a failed provisioning job",
        "operationId": "retry_job_api_jobs__job_id__retry_post",
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Job Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/jobs/{job_id}/retry`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/services": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "List services",
        "operationId": "list_services_api_services_get",
        "parameters": [
          {
            "name": "include_sandbox",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false,
              "title": "Include Sandbox"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ServiceResponse"
                  },
                  "title": "Response List Services Api Services Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/services`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/sandbox/services": {
      "get": {
        "tags": [
          "sandbox"
        ],
        "summary": "List sandbox services",
        "operationId": "list_services_api_sandbox_services_get",
        "parameters": [
          {
            "name": "include_sandbox",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false,
              "title": "Include Sandbox"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ServiceResponse"
                  },
                  "title": "Response List Services Api Sandbox Services Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/sandbox/services`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/services/{service_id}": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "Get service details",
        "operationId": "get_service_api_services__service_id__get",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/services/{service_id}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      },
      "delete": {
        "tags": [
          "services"
        ],
        "summary": "Delete any Proxmox-backed service",
        "operationId": "delete_service_api_services__service_id__delete",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Delete Service Api Services  Service Id  Delete"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Xóa hoặc vô hiệu hóa dữ liệu tại `/api/services/{service_id}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/sandbox/services/{service_id}": {
      "get": {
        "tags": [
          "sandbox"
        ],
        "summary": "Get sandbox service details",
        "operationId": "get_service_api_sandbox_services__service_id__get",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/sandbox/services/{service_id}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      },
      "delete": {
        "tags": [
          "sandbox"
        ],
        "summary": "Delete a sandbox service",
        "operationId": "delete_service_api_sandbox_services__service_id__delete",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Delete Service Api Sandbox Services  Service Id  Delete"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Xóa hoặc vô hiệu hóa dữ liệu tại `/api/sandbox/services/{service_id}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/services/{service_id}/credentials": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "Reveal service credentials",
        "operationId": "get_service_credentials_api_services__service_id__credentials_get",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          },
          {
            "name": "X-Confirm",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "default": "",
              "title": "X-Confirm"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Get Service Credentials Api Services  Service Id  Credentials Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/services/{service_id}/credentials`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/services/{service_id}/console": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "Get LXC console proxy data",
        "operationId": "service_console_api_services__service_id__console_get",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Service Console Api Services  Service Id  Console Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/services/{service_id}/console`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/sandbox/services/{service_id}/console": {
      "get": {
        "tags": [
          "sandbox"
        ],
        "summary": "Get sandbox console data",
        "operationId": "service_console_api_sandbox_services__service_id__console_get",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Service Console Api Sandbox Services  Service Id  Console Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/sandbox/services/{service_id}/console`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/services/{service_id}/stop": {
      "post": {
        "tags": [
          "services"
        ],
        "summary": "Stop any Proxmox-backed service",
        "operationId": "stop_service_api_services__service_id__stop_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Stop Service Api Services  Service Id  Stop Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/services/{service_id}/stop`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/sandbox/services/{service_id}/stop": {
      "post": {
        "tags": [
          "sandbox"
        ],
        "summary": "Stop a sandbox service",
        "operationId": "stop_service_api_sandbox_services__service_id__stop_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Stop Service Api Sandbox Services  Service Id  Stop Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/sandbox/services/{service_id}/stop`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/services/{service_id}/start": {
      "post": {
        "tags": [
          "services"
        ],
        "summary": "Start any Proxmox-backed service",
        "operationId": "start_service_api_services__service_id__start_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Start Service Api Services  Service Id  Start Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/services/{service_id}/start`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/sandbox/services/{service_id}/start": {
      "post": {
        "tags": [
          "sandbox"
        ],
        "summary": "Start a sandbox service",
        "operationId": "start_service_api_sandbox_services__service_id__start_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Start Service Api Sandbox Services  Service Id  Start Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/sandbox/services/{service_id}/start`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/lxc/{service_id}/stop": {
      "post": {
        "tags": [
          "lxc"
        ],
        "summary": "Stop an LXC service",
        "operationId": "stop_lxc_api_lxc__service_id__stop_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Stop Lxc Api Lxc  Service Id  Stop Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/lxc/{service_id}/stop`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/sandbox/lxc/{service_id}/stop": {
      "post": {
        "tags": [
          "sandbox"
        ],
        "summary": "Stop a sandbox LXC service",
        "operationId": "stop_lxc_api_sandbox_lxc__service_id__stop_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Stop Lxc Api Sandbox Lxc  Service Id  Stop Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/sandbox/lxc/{service_id}/stop`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/lxc/{service_id}/start": {
      "post": {
        "tags": [
          "lxc"
        ],
        "summary": "Start an LXC service",
        "operationId": "start_lxc_api_lxc__service_id__start_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Start Lxc Api Lxc  Service Id  Start Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/lxc/{service_id}/start`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/sandbox/lxc/{service_id}/start": {
      "post": {
        "tags": [
          "sandbox"
        ],
        "summary": "Start a sandbox LXC service",
        "operationId": "start_lxc_api_sandbox_lxc__service_id__start_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Start Lxc Api Sandbox Lxc  Service Id  Start Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/sandbox/lxc/{service_id}/start`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/lxc/{service_id}": {
      "delete": {
        "tags": [
          "lxc"
        ],
        "summary": "Delete an LXC service",
        "operationId": "delete_lxc_api_lxc__service_id__delete",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Delete Lxc Api Lxc  Service Id  Delete"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Xóa hoặc vô hiệu hóa dữ liệu tại `/api/lxc/{service_id}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/sandbox/lxc/{service_id}": {
      "delete": {
        "tags": [
          "sandbox"
        ],
        "summary": "Delete a sandbox LXC service",
        "operationId": "delete_lxc_api_sandbox_lxc__service_id__delete",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Delete Lxc Api Sandbox Lxc  Service Id  Delete"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Xóa hoặc vô hiệu hóa dữ liệu tại `/api/sandbox/lxc/{service_id}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/lxc/{service_id}/resize": {
      "post": {
        "tags": [
          "lxc"
        ],
        "summary": "Resize an LXC (CPU/RAM/disk-grow)",
        "operationId": "resize_lxc_api_lxc__service_id__resize_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LxcResizeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Resize Lxc Api Lxc  Service Id  Resize Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/lxc/{service_id}/resize`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/lxc/{service_id}/rebuild": {
      "post": {
        "tags": [
          "lxc"
        ],
        "summary": "Rebuild an LXC service",
        "operationId": "rebuild_lxc_api_lxc__service_id__rebuild_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/lxc/{service_id}/rebuild`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/sandbox/lxc/{service_id}/rebuild": {
      "post": {
        "tags": [
          "sandbox"
        ],
        "summary": "Rebuild a sandbox LXC service",
        "operationId": "rebuild_lxc_api_sandbox_lxc__service_id__rebuild_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/sandbox/lxc/{service_id}/rebuild`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/services/{service_id}/rebuild": {
      "post": {
        "tags": [
          "services"
        ],
        "summary": "Rebuild an LXC service",
        "operationId": "rebuild_service_api_services__service_id__rebuild_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/services/{service_id}/rebuild`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/sandbox/services/{service_id}/rebuild": {
      "post": {
        "tags": [
          "sandbox"
        ],
        "summary": "Rebuild a sandbox service",
        "operationId": "rebuild_service_api_sandbox_services__service_id__rebuild_post",
        "parameters": [
          {
            "name": "service_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Service Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/sandbox/services/{service_id}/rebuild`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/guide": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "Get the MONA Cloud guide markdown",
        "operationId": "api_guide_api_guide_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": {
                    "type": "string"
                  },
                  "type": "object",
                  "title": "Response Api Guide Api Guide Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/guide`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới."
      }
    },
    "/api/client-scripts": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "List client auth helper scripts",
        "operationId": "api_client_scripts_api_client_scripts_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Client Scripts Api Client Scripts Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/client-scripts`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới."
      }
    },
    "/api/admin/overview": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "Admin overview for a separate frontend",
        "operationId": "api_admin_overview_api_admin_overview_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Overview Api Admin Overview Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/admin/overview`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/plans": {
      "get": {
        "tags": [
          "prices"
        ],
        "summary": "Admin list monthly plans",
        "operationId": "api_admin_list_plans_api_admin_plans_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin List Plans Api Admin Plans Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/admin/plans`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      },
      "post": {
        "tags": [
          "prices"
        ],
        "summary": "Admin create a monthly plan",
        "operationId": "api_admin_create_plan_api_admin_plans_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminPlanUpsertRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Create Plan Api Admin Plans Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/plans`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/plans/{code}": {
      "put": {
        "tags": [
          "prices"
        ],
        "summary": "Admin update a monthly plan",
        "operationId": "api_admin_update_plan_api_admin_plans__code__put",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Code"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminPlanUpsertRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Update Plan Api Admin Plans  Code  Put"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Cập nhật dữ liệu tại `/api/admin/plans/{code}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/subscriptions": {
      "get": {
        "tags": [
          "billing"
        ],
        "summary": "Admin list subscriptions",
        "operationId": "api_admin_subscriptions_api_admin_subscriptions_get",
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Status"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Subscriptions Api Admin Subscriptions Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/admin/subscriptions`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/invoices": {
      "get": {
        "tags": [
          "billing"
        ],
        "summary": "Admin list or export invoices",
        "operationId": "api_admin_invoices_api_admin_invoices_get",
        "parameters": [
          {
            "name": "export",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Export"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "title": "Response Api Admin Invoices Api Admin Invoices Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/admin/invoices`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/reconcile/payments": {
      "get": {
        "tags": [
          "billing"
        ],
        "summary": "Reconcile paid VietQR payments and credit ledger",
        "operationId": "api_admin_reconcile_payments_api_admin_reconcile_payments_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Reconcile Payments Api Admin Reconcile Payments Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/admin/reconcile/payments`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/credit-codes": {
      "get": {
        "tags": [
          "billing"
        ],
        "summary": "Admin list credit codes",
        "operationId": "api_admin_list_credit_codes_api_admin_credit_codes_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin List Credit Codes Api Admin Credit Codes Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/admin/credit-codes`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      },
      "post": {
        "tags": [
          "billing"
        ],
        "summary": "Admin create a credit code",
        "operationId": "api_admin_create_credit_code_api_admin_credit_codes_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreditCodeUpsertRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Create Credit Code Api Admin Credit Codes Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/credit-codes`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/credit-codes/{code}": {
      "put": {
        "tags": [
          "billing"
        ],
        "summary": "Admin update a credit code",
        "operationId": "api_admin_update_credit_code_api_admin_credit_codes__code__put",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Code"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreditCodeUpsertRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Update Credit Code Api Admin Credit Codes  Code  Put"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Cập nhật dữ liệu tại `/api/admin/credit-codes/{code}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      },
      "delete": {
        "tags": [
          "billing"
        ],
        "summary": "Admin deactivate a credit code",
        "operationId": "api_admin_delete_credit_code_api_admin_credit_codes__code__delete",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Code"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Delete Credit Code Api Admin Credit Codes  Code  Delete"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Xóa hoặc vô hiệu hóa dữ liệu tại `/api/admin/credit-codes/{code}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/prices": {
      "get": {
        "tags": [
          "prices"
        ],
        "summary": "Admin get price settings",
        "operationId": "api_admin_get_prices_api_admin_prices_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Get Prices Api Admin Prices Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/admin/prices`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      },
      "put": {
        "tags": [
          "prices"
        ],
        "summary": "Admin update price settings",
        "operationId": "api_admin_update_prices_api_admin_prices_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PriceSettingsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Update Prices Api Admin Prices Put"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Cập nhật dữ liệu tại `/api/admin/prices`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/packages": {
      "get": {
        "tags": [
          "prices"
        ],
        "summary": "Admin list packages",
        "operationId": "api_admin_list_packages_api_admin_packages_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin List Packages Api Admin Packages Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/admin/packages`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      },
      "post": {
        "tags": [
          "prices"
        ],
        "summary": "Admin create or update a package",
        "operationId": "api_admin_create_package_api_admin_packages_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PackageUpsertRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Create Package Api Admin Packages Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/packages`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/packages/{slug}": {
      "put": {
        "tags": [
          "prices"
        ],
        "summary": "Admin update a package",
        "operationId": "api_admin_update_package_api_admin_packages__slug__put",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Slug"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PackageUpsertRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Update Package Api Admin Packages  Slug  Put"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Cập nhật dữ liệu tại `/api/admin/packages/{slug}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      },
      "delete": {
        "tags": [
          "prices"
        ],
        "summary": "Admin deactivate a package",
        "operationId": "api_admin_deactivate_package_api_admin_packages__slug__delete",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Slug"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Deactivate Package Api Admin Packages  Slug  Delete"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Xóa hoặc vô hiệu hóa dữ liệu tại `/api/admin/packages/{slug}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/ip-ranges": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "Admin list IP ranges",
        "operationId": "api_admin_list_ip_ranges_api_admin_ip_ranges_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin List Ip Ranges Api Admin Ip Ranges Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/admin/ip-ranges`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      },
      "post": {
        "tags": [
          "services"
        ],
        "summary": "Admin create or update an IP range",
        "operationId": "api_admin_create_ip_range_api_admin_ip_ranges_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IpRangeCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Create Ip Range Api Admin Ip Ranges Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/ip-ranges`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/ip-ranges/{range_id}": {
      "put": {
        "tags": [
          "services"
        ],
        "summary": "Admin update an IP range",
        "operationId": "api_admin_update_ip_range_api_admin_ip_ranges__range_id__put",
        "parameters": [
          {
            "name": "range_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Range Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IpRangeCreateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Update Ip Range Api Admin Ip Ranges  Range Id  Put"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Cập nhật dữ liệu tại `/api/admin/ip-ranges/{range_id}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      },
      "delete": {
        "tags": [
          "services"
        ],
        "summary": "Admin deactivate an IP range",
        "operationId": "api_admin_deactivate_ip_range_api_admin_ip_ranges__range_id__delete",
        "parameters": [
          {
            "name": "range_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Range Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Deactivate Ip Range Api Admin Ip Ranges  Range Id  Delete"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Xóa hoặc vô hiệu hóa dữ liệu tại `/api/admin/ip-ranges/{range_id}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/ip-allocations": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "Admin list IP usage",
        "operationId": "api_admin_ip_allocations_api_admin_ip_allocations_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Ip Allocations Api Admin Ip Allocations Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/admin/ip-allocations`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/jobs": {
      "get": {
        "tags": [
          "jobs"
        ],
        "summary": "Admin list provisioning jobs (optionally filtered by status)",
        "description": "Đọc dữ liệu tại `/api/admin/jobs`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_admin_list_jobs_api_admin_jobs_get",
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Status"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 500,
              "minimum": 1,
              "default": 100,
              "title": "Limit"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin List Jobs Api Admin Jobs Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/jobs/{job_id}/cancel": {
      "post": {
        "tags": [
          "jobs"
        ],
        "summary": "Admin cancel a pending/retrying/running job",
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/jobs/{job_id}/cancel`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_admin_cancel_job_api_admin_jobs__job_id__cancel_post",
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Job Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Cancel Job Api Admin Jobs  Job Id  Cancel Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/jobs/{job_id}/retry": {
      "post": {
        "tags": [
          "jobs"
        ],
        "summary": "Admin re-queue a failed/cancelled/retrying job",
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/jobs/{job_id}/retry`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_admin_retry_job_api_admin_jobs__job_id__retry_post",
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Job Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Retry Job Api Admin Jobs  Job Id  Retry Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/credit": {
      "post": {
        "tags": [
          "billing"
        ],
        "summary": "Admin grant credit to a user",
        "operationId": "api_admin_grant_credit_api_admin_credit_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminCreditGrant"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Grant Credit Api Admin Credit Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/credit`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/quota": {
      "get": {
        "tags": [
          "billing"
        ],
        "summary": "Get the current account's service quota usage",
        "description": "Đọc dữ liệu tại `/api/quota`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_get_quota_api_quota_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Get Quota Api Quota Get"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/quota-requests": {
      "get": {
        "tags": [
          "billing"
        ],
        "summary": "List my quota-increase requests",
        "operationId": "api_list_my_quota_requests_api_quota_requests_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api List My Quota Requests Api Quota Requests Get"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/quota-requests`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      },
      "post": {
        "tags": [
          "billing"
        ],
        "summary": "Submit a quota-increase request to admins",
        "operationId": "api_create_quota_request_api_quota_requests_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QuotaRequestCreate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Create Quota Request Api Quota Requests Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/quota-requests`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/quota-requests": {
      "get": {
        "tags": [
          "billing"
        ],
        "summary": "Admin list of quota-increase requests",
        "operationId": "api_admin_list_quota_requests_api_admin_quota_requests_get",
        "parameters": [
          {
            "name": "request_status",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Request Status"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 200,
              "title": "Limit"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin List Quota Requests Api Admin Quota Requests Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/admin/quota-requests`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/quota-requests/{request_id}/approve": {
      "post": {
        "tags": [
          "billing"
        ],
        "summary": "Approve a quota request",
        "operationId": "api_admin_approve_quota_request_api_admin_quota_requests__request_id__approve_post",
        "parameters": [
          {
            "name": "request_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Request Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QuotaRequestApprove"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Approve Quota Request Api Admin Quota Requests  Request Id  Approve Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/quota-requests/{request_id}/approve`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/quota-requests/{request_id}/deny": {
      "post": {
        "tags": [
          "billing"
        ],
        "summary": "Deny a quota request",
        "operationId": "api_admin_deny_quota_request_api_admin_quota_requests__request_id__deny_post",
        "parameters": [
          {
            "name": "request_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Request Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QuotaRequestDeny"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Deny Quota Request Api Admin Quota Requests  Request Id  Deny Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/quota-requests/{request_id}/deny`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/users": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "Admin list of users with balances",
        "description": "Đọc dữ liệu tại `/api/admin/users`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_admin_list_users_api_admin_users_get",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Q"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "created_at:desc",
              "title": "Sort"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "title": "Limit"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin List Users Api Admin Users Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/users/{user_id}/note": {
      "post": {
        "tags": [
          "services"
        ],
        "summary": "Add an internal user note",
        "operationId": "api_admin_user_note_api_admin_users__user_id__note_post",
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "User Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminUserNoteRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin User Note Api Admin Users  User Id  Note Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/users/{user_id}/note`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/users/{user_id}/tag": {
      "post": {
        "tags": [
          "services"
        ],
        "summary": "Set a user tag",
        "operationId": "api_admin_user_tag_api_admin_users__user_id__tag_post",
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "User Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminUserTagRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin User Tag Api Admin Users  User Id  Tag Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/users/{user_id}/tag`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/users/{user_id}/adjust": {
      "post": {
        "tags": [
          "services"
        ],
        "summary": "Apply a signed wallet adjustment",
        "operationId": "api_admin_user_adjust_api_admin_users__user_id__adjust_post",
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "User Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminUserAdjustRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin User Adjust Api Admin Users  User Id  Adjust Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/users/{user_id}/adjust`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/users/{user_id}/billing-ledger": {
      "get": {
        "tags": [
          "billing"
        ],
        "summary": "Admin per-user billing ledger (hourly debits)",
        "description": "Đọc dữ liệu tại `/api/admin/users/{user_id}/billing-ledger`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_admin_user_billing_ledger_api_admin_users__user_id__billing_ledger_get",
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "User Id"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 200,
              "title": "Limit"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin User Billing Ledger Api Admin Users  User Id  Billing Ledger Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/users/{user_id}/suspend": {
      "post": {
        "tags": [
          "services"
        ],
        "summary": "Suspend a customer account and all of their running services",
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/users/{user_id}/suspend`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_admin_suspend_user_api_admin_users__user_id__suspend_post",
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "User Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserSuspendRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Suspend User Api Admin Users  User Id  Suspend Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/users/{user_id}/unsuspend": {
      "post": {
        "tags": [
          "services"
        ],
        "summary": "Restore a suspended customer and re-activate their services",
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/users/{user_id}/unsuspend`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_admin_unsuspend_user_api_admin_users__user_id__unsuspend_post",
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "User Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserUnsuspendRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Unsuspend User Api Admin Users  User Id  Unsuspend Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/users/{user_id}/suspension-events": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "Admin per-user suspension/unsuspension history",
        "description": "Đọc dữ liệu tại `/api/admin/users/{user_id}/suspension-events`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_admin_user_suspension_events_api_admin_users__user_id__suspension_events_get",
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "User Id"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 50,
              "title": "Limit"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin User Suspension Events Api Admin Users  User Id  Suspension Events Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/users/{user_id}/delete": {
      "post": {
        "tags": [
          "services"
        ],
        "summary": "Hard-delete a customer: destroy their cloud resources, scrub PII, keep financial audit",
        "operationId": "api_admin_delete_user_api_admin_users__user_id__delete_post",
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "User Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserDeleteRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Delete User Api Admin Users  User Id  Delete Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/users/{user_id}/delete`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/users/{user_id}/deletion-event": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "Admin: fetch the single deletion event for a (deleted) user",
        "description": "Đọc dữ liệu tại `/api/admin/users/{user_id}/deletion-event`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_admin_user_deletion_event_api_admin_users__user_id__deletion_event_get",
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "User Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin User Deletion Event Api Admin Users  User Id  Deletion Event Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/users/{user_id}/login-as": {
      "post": {
        "tags": [
          "services"
        ],
        "summary": "Mint a session token to impersonate a customer (admin only)",
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/admin/users/{user_id}/login-as`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_admin_login_as_api_admin_users__user_id__login_as_post",
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "User Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Login As Api Admin Users  User Id  Login As Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/auth/stop-impersonation": {
      "post": {
        "tags": [
          "auth"
        ],
        "summary": "Revoke the current impersonation token and close the audit event",
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/auth/stop-impersonation`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_stop_impersonation_api_auth_stop_impersonation_post",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Stop Impersonation Api Auth Stop Impersonation Post"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/audit": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "Unified admin audit timeline",
        "operationId": "api_admin_audit_api_admin_audit_get",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 1000,
              "minimum": 1,
              "default": 200,
              "title": "Limit"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Audit Api Admin Audit Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Đọc dữ liệu tại `/api/admin/audit`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/audit/referrals": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "Admin list of referral payouts",
        "description": "Đọc dữ liệu tại `/api/admin/audit/referrals`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_admin_audit_referrals_api_admin_audit_referrals_get",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 200,
              "title": "Limit"
            }
          },
          {
            "name": "inviter_email",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Inviter Email"
            }
          },
          {
            "name": "invitee_email",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Invitee Email"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Audit Referrals Api Admin Audit Referrals Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/audit/credit-grants": {
      "get": {
        "tags": [
          "billing"
        ],
        "summary": "Admin list of credit grant audit entries",
        "description": "Đọc dữ liệu tại `/api/admin/audit/credit-grants`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_admin_audit_credit_grants_api_admin_audit_credit_grants_get",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 200,
              "title": "Limit"
            }
          },
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Kind"
            }
          },
          {
            "name": "email",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Email"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Audit Credit Grants Api Admin Audit Credit Grants Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/admin/audit/referrals/summary": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "Aggregate referral totals (audit overview)",
        "description": "Đọc dữ liệu tại `/api/admin/audit/referrals/summary`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "api_admin_audit_referrals_summary_api_admin_audit_referrals_summary_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Api Admin Audit Referrals Summary Api Admin Audit Referrals Summary Get"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/app-hosts": {
      "get": {
        "summary": "List the current user's app hosts and billing resources",
        "operationId": "list_app_hosts_api_app_hosts_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "type": "object"
                  },
                  "type": "array",
                  "title": "Response List App Hosts Api App Hosts Get"
                }
              }
            }
          }
        },
        "tags": [
          "apps"
        ],
        "description": "Đọc dữ liệu tại `/api/app-hosts`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới. Wave B: repo public HTTPS → job Dokploy → URL HTTPS. Poll /api/jobs/{id} tới succeeded/failed. App host dùng billing LXC Wave A; app không tính thêm phí. POST /api/app-hosts với {} dùng 2 CPU/2 GB RAM/30 GB disk; hỗ trợ billing_mode monthly + plan_code + period. X-Vibecloud-Sandbox: 1 trên /api/apps tạo URL giả, trả estimated_app_host và charged_vnd=0. PUT env thay toàn bộ env, cần POST deploy để áp dụng. Custom domain trả CNAME và SSL pending. Xoá app giữ host; xoá /api/services/{app_host_id} để ngừng phí.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      },
      "post": {
        "summary": "Create or reuse this user's Dokploy app host",
        "operationId": "create_app_host_api_app_hosts_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppHostCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "apps"
        ],
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/app-hosts`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới. Wave B: repo public HTTPS → job Dokploy → URL HTTPS. Poll /api/jobs/{id} tới succeeded/failed. App host dùng billing LXC Wave A; app không tính thêm phí. POST /api/app-hosts với {} dùng 2 CPU/2 GB RAM/30 GB disk; hỗ trợ billing_mode monthly + plan_code + period. X-Vibecloud-Sandbox: 1 trên /api/apps tạo URL giả, trả estimated_app_host và charged_vnd=0. PUT env thay toàn bộ env, cần POST deploy để áp dụng. Custom domain trả CNAME và SSL pending. Xoá app giữ host; xoá /api/services/{app_host_id} để ngừng phí.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/apps": {
      "get": {
        "summary": "List apps; sandbox header selects only fake apps",
        "operationId": "list_apps_api_apps_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AppResponse"
                  },
                  "type": "array",
                  "title": "Response List Apps Api Apps Get"
                }
              }
            }
          }
        },
        "tags": [
          "apps"
        ],
        "description": "Đọc dữ liệu tại `/api/apps`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới. Wave B: repo public HTTPS → job Dokploy → URL HTTPS. Poll /api/jobs/{id} tới succeeded/failed. App host dùng billing LXC Wave A; app không tính thêm phí. POST /api/app-hosts với {} dùng 2 CPU/2 GB RAM/30 GB disk; hỗ trợ billing_mode monthly + plan_code + period. X-Vibecloud-Sandbox: 1 trên /api/apps tạo URL giả, trả estimated_app_host và charged_vnd=0. PUT env thay toàn bộ env, cần POST deploy để áp dụng. Custom domain trả CNAME và SSL pending. Xoá app giữ host; xoá /api/services/{app_host_id} để ngừng phí.",
        "parameters": [
          {
            "name": "X-Vibecloud-Sandbox",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            },
            "description": "Tạo/list sandbox 0đ; lookup ID sandbox luôn giữ sandbox."
          }
        ],
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      },
      "post": {
        "summary": "Deploy a public git repository via Dokploy",
        "operationId": "create_app_api_apps_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "apps"
        ],
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/apps`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới. Wave B: repo public HTTPS → job Dokploy → URL HTTPS. Poll /api/jobs/{id} tới succeeded/failed. App host dùng billing LXC Wave A; app không tính thêm phí. POST /api/app-hosts với {} dùng 2 CPU/2 GB RAM/30 GB disk; hỗ trợ billing_mode monthly + plan_code + period. X-Vibecloud-Sandbox: 1 trên /api/apps tạo URL giả, trả estimated_app_host và charged_vnd=0. PUT env thay toàn bộ env, cần POST deploy để áp dụng. Custom domain trả CNAME và SSL pending. Xoá app giữ host; xoá /api/services/{app_host_id} để ngừng phí.",
        "parameters": [
          {
            "name": "X-Vibecloud-Sandbox",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            },
            "description": "Tạo/list sandbox 0đ; lookup ID sandbox luôn giữ sandbox."
          }
        ],
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/apps/{app_id}": {
      "get": {
        "summary": "Read app status, URL, last deployment and app host",
        "operationId": "get_app_api_apps__app_id__get",
        "parameters": [
          {
            "name": "app_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "App Id"
            }
          },
          {
            "name": "X-Vibecloud-Sandbox",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            },
            "description": "Tạo/list sandbox 0đ; lookup ID sandbox luôn giữ sandbox."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "apps"
        ],
        "description": "Đọc dữ liệu tại `/api/apps/{app_id}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới. Wave B: repo public HTTPS → job Dokploy → URL HTTPS. Poll /api/jobs/{id} tới succeeded/failed. App host dùng billing LXC Wave A; app không tính thêm phí. POST /api/app-hosts với {} dùng 2 CPU/2 GB RAM/30 GB disk; hỗ trợ billing_mode monthly + plan_code + period. X-Vibecloud-Sandbox: 1 trên /api/apps tạo URL giả, trả estimated_app_host và charged_vnd=0. PUT env thay toàn bộ env, cần POST deploy để áp dụng. Custom domain trả CNAME và SSL pending. Xoá app giữ host; xoá /api/services/{app_host_id} để ngừng phí.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      },
      "delete": {
        "summary": "Delete the application, its domains and managed DNS; keep the app host",
        "operationId": "delete_app_api_apps__app_id__delete",
        "parameters": [
          {
            "name": "app_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "App Id"
            }
          },
          {
            "name": "X-Vibecloud-Sandbox",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            },
            "description": "Tạo/list sandbox 0đ; lookup ID sandbox luôn giữ sandbox."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Delete App Api Apps  App Id  Delete"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "apps"
        ],
        "description": "Xóa hoặc vô hiệu hóa dữ liệu tại `/api/apps/{app_id}`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới. Wave B: repo public HTTPS → job Dokploy → URL HTTPS. Poll /api/jobs/{id} tới succeeded/failed. App host dùng billing LXC Wave A; app không tính thêm phí. POST /api/app-hosts với {} dùng 2 CPU/2 GB RAM/30 GB disk; hỗ trợ billing_mode monthly + plan_code + period. X-Vibecloud-Sandbox: 1 trên /api/apps tạo URL giả, trả estimated_app_host và charged_vnd=0. PUT env thay toàn bộ env, cần POST deploy để áp dụng. Custom domain trả CNAME và SSL pending. Xoá app giữ host; xoá /api/services/{app_host_id} để ngừng phí.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/apps/{app_id}/deploy": {
      "post": {
        "summary": "Redeploy the configured git branch",
        "operationId": "deploy_app_api_apps__app_id__deploy_post",
        "parameters": [
          {
            "name": "app_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "App Id"
            }
          },
          {
            "name": "X-Vibecloud-Sandbox",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            },
            "description": "Tạo/list sandbox 0đ; lookup ID sandbox luôn giữ sandbox."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "apps"
        ],
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/apps/{app_id}/deploy`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới. Wave B: repo public HTTPS → job Dokploy → URL HTTPS. Poll /api/jobs/{id} tới succeeded/failed. App host dùng billing LXC Wave A; app không tính thêm phí. POST /api/app-hosts với {} dùng 2 CPU/2 GB RAM/30 GB disk; hỗ trợ billing_mode monthly + plan_code + period. X-Vibecloud-Sandbox: 1 trên /api/apps tạo URL giả, trả estimated_app_host và charged_vnd=0. PUT env thay toàn bộ env, cần POST deploy để áp dụng. Custom domain trả CNAME và SSL pending. Xoá app giữ host; xoá /api/services/{app_host_id} để ngừng phí.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/apps/{app_id}/env": {
      "put": {
        "summary": "Replace app environment; redeploy explicitly to apply",
        "operationId": "update_env_api_apps__app_id__env_put",
        "parameters": [
          {
            "name": "app_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "App Id"
            }
          },
          {
            "name": "X-Vibecloud-Sandbox",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            },
            "description": "Tạo/list sandbox 0đ; lookup ID sandbox luôn giữ sandbox."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppEnvironmentRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Update Env Api Apps  App Id  Env Put"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "apps"
        ],
        "description": "Cập nhật dữ liệu tại `/api/apps/{app_id}/env`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới. Wave B: repo public HTTPS → job Dokploy → URL HTTPS. Poll /api/jobs/{id} tới succeeded/failed. App host dùng billing LXC Wave A; app không tính thêm phí. POST /api/app-hosts với {} dùng 2 CPU/2 GB RAM/30 GB disk; hỗ trợ billing_mode monthly + plan_code + period. X-Vibecloud-Sandbox: 1 trên /api/apps tạo URL giả, trả estimated_app_host và charged_vnd=0. PUT env thay toàn bộ env, cần POST deploy để áp dụng. Custom domain trả CNAME và SSL pending. Xoá app giữ host; xoá /api/services/{app_host_id} để ngừng phí.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/apps/{app_id}/domains": {
      "post": {
        "summary": "Add a custom domain and return CNAME instructions",
        "operationId": "add_domain_api_apps__app_id__domains_post",
        "parameters": [
          {
            "name": "app_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "App Id"
            }
          },
          {
            "name": "X-Vibecloud-Sandbox",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            },
            "description": "Tạo/list sandbox 0đ; lookup ID sandbox luôn giữ sandbox."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppDomainRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Add Domain Api Apps  App Id  Domains Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "apps"
        ],
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/apps/{app_id}/domains`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới. Wave B: repo public HTTPS → job Dokploy → URL HTTPS. Poll /api/jobs/{id} tới succeeded/failed. App host dùng billing LXC Wave A; app không tính thêm phí. POST /api/app-hosts với {} dùng 2 CPU/2 GB RAM/30 GB disk; hỗ trợ billing_mode monthly + plan_code + period. X-Vibecloud-Sandbox: 1 trên /api/apps tạo URL giả, trả estimated_app_host và charged_vnd=0. PUT env thay toàn bộ env, cần POST deploy để áp dụng. Custom domain trả CNAME và SSL pending. Xoá app giữ host; xoá /api/services/{app_host_id} để ngừng phí.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/apps/{app_id}/logs": {
      "get": {
        "summary": "Read the last 500 lines of an owned deployment log",
        "operationId": "app_logs_api_apps__app_id__logs_get",
        "parameters": [
          {
            "name": "app_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "App Id"
            }
          },
          {
            "name": "deployment",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 200
                },
                {
                  "type": "null"
                }
              ],
              "title": "Deployment"
            }
          },
          {
            "name": "X-Vibecloud-Sandbox",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            },
            "description": "Tạo/list sandbox 0đ; lookup ID sandbox luôn giữ sandbox."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response App Logs Api Apps  App Id  Logs Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "apps"
        ],
        "description": "Đọc dữ liệu tại `/api/apps/{app_id}/logs`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới. Wave B: repo public HTTPS → job Dokploy → URL HTTPS. Poll /api/jobs/{id} tới succeeded/failed. App host dùng billing LXC Wave A; app không tính thêm phí. POST /api/app-hosts với {} dùng 2 CPU/2 GB RAM/30 GB disk; hỗ trợ billing_mode monthly + plan_code + period. X-Vibecloud-Sandbox: 1 trên /api/apps tạo URL giả, trả estimated_app_host và charged_vnd=0. PUT env thay toàn bộ env, cần POST deploy để áp dụng. Custom domain trả CNAME và SSL pending. Xoá app giữ host; xoá /api/services/{app_host_id} để ngừng phí.",
        "security": [
          {
            "BearerAuth": []
          },
          {
            "ApiTokenHeader": []
          }
        ]
      }
    },
    "/api/auth/monaid/link/verify": {
      "post": {
        "tags": [
          "auth"
        ],
        "summary": "Monaid Link Verify",
        "operationId": "monaid_link_verify_api_auth_monaid_link_verify_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MonaIDLinkVerify"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Response Monaid Link Verify Api Auth Monaid Link Verify Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Tạo dữ liệu hoặc thực thi thao tác tại `/api/auth/monaid/link/verify`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới."
      }
    },
    "/health": {
      "get": {
        "tags": [
          "services"
        ],
        "summary": "Kiểm tra trạng thái API",
        "description": "Đọc dữ liệu tại `/health`. Phản hồi dùng JSON và tuân theo schema được công bố bên dưới.",
        "operationId": "health_health_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "title": "Response Health Health Get"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "AddFundsRequest": {
        "properties": {
          "amount": {
            "type": "integer",
            "maximum": 500000000,
            "minimum": 10000,
            "title": "Amount"
          }
        },
        "type": "object",
        "required": [
          "amount"
        ],
        "title": "AddFundsRequest"
      },
      "AdminCreditGrant": {
        "properties": {
          "email": {
            "type": "string",
            "maxLength": 320,
            "minLength": 3,
            "title": "Email"
          },
          "amount_vnd": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "title": "Amount Vnd"
          }
        },
        "type": "object",
        "required": [
          "email",
          "amount_vnd"
        ],
        "title": "AdminCreditGrant"
      },
      "AdminPlanUpsertRequest": {
        "properties": {
          "code": {
            "type": "string",
            "maxLength": 64,
            "minLength": 2,
            "title": "Code"
          },
          "name": {
            "type": "string",
            "maxLength": 120,
            "minLength": 2,
            "title": "Name"
          },
          "cpu": {
            "type": "integer",
            "maximum": 128,
            "minimum": 1,
            "title": "Cpu"
          },
          "ram_gb": {
            "type": "integer",
            "maximum": 1024,
            "minimum": 1,
            "title": "Ram Gb"
          },
          "disk_gb": {
            "type": "integer",
            "maximum": 32768,
            "minimum": 5,
            "title": "Disk Gb"
          },
          "price_month_vnd": {
            "type": "integer",
            "minimum": 0,
            "title": "Price Month Vnd"
          },
          "price_year_vnd": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ],
            "title": "Price Year Vnd"
          },
          "included_db": {
            "type": "integer",
            "minimum": -1,
            "title": "Included Db",
            "default": 0
          },
          "backup_policy": {
            "type": "string",
            "maxLength": 120,
            "minLength": 1,
            "title": "Backup Policy",
            "default": "none"
          },
          "active": {
            "type": "boolean",
            "title": "Active",
            "default": true
          },
          "admin_only": {
            "type": "boolean",
            "title": "Admin Only",
            "default": false
          }
        },
        "type": "object",
        "required": [
          "code",
          "name",
          "cpu",
          "ram_gb",
          "disk_gb",
          "price_month_vnd"
        ],
        "title": "AdminPlanUpsertRequest"
      },
      "AdminUserAdjustRequest": {
        "properties": {
          "amount_vnd": {
            "type": "integer",
            "maximum": 500000000,
            "minimum": -500000000,
            "title": "Amount Vnd"
          },
          "reason": {
            "type": "string",
            "maxLength": 2000,
            "minLength": 3,
            "title": "Reason"
          }
        },
        "type": "object",
        "required": [
          "amount_vnd",
          "reason"
        ],
        "title": "AdminUserAdjustRequest"
      },
      "AdminUserNoteRequest": {
        "properties": {
          "note": {
            "type": "string",
            "maxLength": 4000,
            "minLength": 1,
            "title": "Note"
          }
        },
        "type": "object",
        "required": [
          "note"
        ],
        "title": "AdminUserNoteRequest"
      },
      "AdminUserTagRequest": {
        "properties": {
          "tag": {
            "type": "string",
            "const": "mona_customer",
            "title": "Tag"
          },
          "enabled": {
            "type": "boolean",
            "title": "Enabled",
            "default": true
          }
        },
        "type": "object",
        "required": [
          "tag"
        ],
        "title": "AdminUserTagRequest"
      },
      "ApiKeyCreateRequest": {
        "properties": {
          "label": {
            "type": "string",
            "maxLength": 120,
            "minLength": 1,
            "title": "Label",
            "default": "Claude automation"
          }
        },
        "type": "object",
        "title": "ApiKeyCreateRequest"
      },
      "ApiKeyCreateResponse": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id"
          },
          "label": {
            "type": "string",
            "title": "Label"
          },
          "token": {
            "type": "string",
            "title": "Token"
          },
          "token_prefix": {
            "type": "string",
            "title": "Token Prefix"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "label",
          "token",
          "token_prefix",
          "created_at"
        ],
        "title": "ApiKeyCreateResponse"
      },
      "AppCreateRequest": {
        "properties": {
          "repo_url": {
            "type": "string",
            "maxLength": 2048,
            "title": "Repo Url",
            "examples": [
              "https://github.com/themonagroup/monacloud-example-node"
            ]
          },
          "branch": {
            "type": "string",
            "maxLength": 255,
            "minLength": 1,
            "title": "Branch",
            "default": "main"
          },
          "build_type": {
            "type": "string",
            "enum": [
              "dockerfile",
              "nixpacks",
              "static"
            ],
            "title": "Build Type",
            "default": "dockerfile"
          },
          "dockerfile": {
            "type": "string",
            "maxLength": 255,
            "minLength": 1,
            "title": "Dockerfile",
            "default": "Dockerfile"
          },
          "env": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "title": "Env"
          },
          "domain": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Domain"
          },
          "app_host_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "App Host Id"
          },
          "port": {
            "type": "integer",
            "maximum": 65535,
            "minimum": 1,
            "title": "Port",
            "default": 3000
          }
        },
        "type": "object",
        "required": [
          "repo_url"
        ],
        "title": "AppCreateRequest"
      },
      "AppDomainRequest": {
        "properties": {
          "host": {
            "type": "string",
            "title": "Host"
          }
        },
        "type": "object",
        "required": [
          "host"
        ],
        "title": "AppDomainRequest"
      },
      "AppEnvironmentRequest": {
        "properties": {
          "env": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "title": "Env"
          }
        },
        "type": "object",
        "required": [
          "env"
        ],
        "title": "AppEnvironmentRequest"
      },
      "AppHostCreateRequest": {
        "properties": {
          "app_name": {
            "type": "string",
            "maxLength": 80,
            "minLength": 2,
            "title": "App Name",
            "default": "app-host"
          },
          "package_slug": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 64,
                "minLength": 1
              },
              {
                "type": "null"
              }
            ],
            "title": "Package Slug"
          },
          "cpu": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 16,
                "minimum": 1
              },
              {
                "type": "null"
              }
            ],
            "title": "Cpu"
          },
          "ram_gb": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 64,
                "minimum": 1
              },
              {
                "type": "null"
              }
            ],
            "title": "Ram Gb"
          },
          "disk_gb": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 1000,
                "minimum": 10
              },
              {
                "type": "null"
              }
            ],
            "title": "Disk Gb"
          },
          "hostname": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 64
              },
              {
                "type": "null"
              }
            ],
            "title": "Hostname"
          },
          "billing_mode": {
            "type": "string",
            "enum": [
              "hourly",
              "monthly"
            ],
            "title": "Billing Mode",
            "default": "hourly"
          },
          "plan_code": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 64,
                "minLength": 2
              },
              {
                "type": "null"
              }
            ],
            "title": "Plan Code"
          },
          "period": {
            "type": "string",
            "enum": [
              "month",
              "year"
            ],
            "title": "Period",
            "default": "month"
          }
        },
        "type": "object",
        "title": "AppHostCreateRequest"
      },
      "AppResponse": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "repo_url": {
            "type": "string",
            "title": "Repo Url"
          },
          "branch": {
            "type": "string",
            "title": "Branch"
          },
          "build_type": {
            "type": "string",
            "title": "Build Type"
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "deploying",
              "done",
              "error",
              "deleted"
            ],
            "title": "Status"
          },
          "url": {
            "type": "string",
            "title": "Url"
          },
          "application_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Application Id"
          },
          "app_host": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "App Host"
          },
          "last_deploy": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Deploy"
          },
          "domains": {
            "items": {
              "type": "object"
            },
            "type": "array",
            "title": "Domains"
          },
          "errorMessage": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Errormessage"
          },
          "sandbox": {
            "type": "boolean",
            "title": "Sandbox",
            "default": false
          },
          "expires_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expires At"
          },
          "created_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created At"
          },
          "updated_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Updated At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "name",
          "repo_url",
          "branch",
          "build_type",
          "status",
          "url"
        ],
        "title": "AppResponse"
      },
      "CheckOtpRequest": {
        "properties": {
          "email": {
            "type": "string",
            "title": "Email"
          },
          "otp": {
            "type": "string",
            "maxLength": 6,
            "minLength": 6,
            "title": "Otp"
          },
          "purpose": {
            "type": "string",
            "enum": [
              "register",
              "reset_password"
            ],
            "title": "Purpose"
          }
        },
        "type": "object",
        "required": [
          "email",
          "otp",
          "purpose"
        ],
        "title": "CheckOtpRequest",
        "description": "Non-consuming OTP check (POST /api/auth/check-otp).\n\nPowers the SPA's two-step register / reset flows where the OTP is\nvalidated in step 1 so the user gets immediate feedback, and the\nreal consume happens at the final submit in step 2.\n\n`purpose` is constrained to the two OTP flows the SPA owns — pinning\nthe literal here means a typo (`\"reset\"` vs `\"reset_password\"`) is\ncaught by Pydantic, not by a silent 400 from the OTP lookup."
      },
      "CreditCodeRedeemRequest": {
        "properties": {
          "code": {
            "type": "string",
            "maxLength": 64,
            "minLength": 2,
            "title": "Code"
          }
        },
        "type": "object",
        "required": [
          "code"
        ],
        "title": "CreditCodeRedeemRequest"
      },
      "CreditCodeUpsertRequest": {
        "properties": {
          "code": {
            "type": "string",
            "maxLength": 64,
            "minLength": 2,
            "title": "Code"
          },
          "amount": {
            "type": "integer",
            "maximum": 500000000,
            "exclusiveMinimum": 0,
            "title": "Amount"
          },
          "max_uses": {
            "type": "integer",
            "maximum": 1000000,
            "minimum": 1,
            "title": "Max Uses"
          },
          "expires": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expires"
          },
          "tag": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 120
              },
              {
                "type": "null"
              }
            ],
            "title": "Tag"
          },
          "active": {
            "type": "boolean",
            "title": "Active",
            "default": true
          }
        },
        "type": "object",
        "required": [
          "code",
          "amount",
          "max_uses"
        ],
        "title": "CreditCodeUpsertRequest"
      },
      "DatabaseAddRequest": {
        "properties": {
          "app_name": {
            "type": "string",
            "maxLength": 80,
            "minLength": 2,
            "title": "App Name"
          }
        },
        "type": "object",
        "required": [
          "app_name"
        ],
        "title": "DatabaseAddRequest"
      },
      "DatabaseCreateRequest": {
        "properties": {
          "app_name": {
            "type": "string",
            "maxLength": 80,
            "minLength": 2,
            "title": "App Name"
          },
          "engine": {
            "type": "string",
            "enum": [
              "mongodb",
              "postgresql",
              "mysql"
            ],
            "title": "Engine",
            "description": "Database engine. `mongo` is accepted as a compatibility alias for `mongodb`; canonical values are `mongodb`, `postgresql`, and `mysql`.",
            "default": "mongodb"
          },
          "package_slug": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 64,
                "minLength": 1
              },
              {
                "type": "null"
              }
            ],
            "title": "Package Slug"
          },
          "cpu": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 16,
                "minimum": 1
              },
              {
                "type": "null"
              }
            ],
            "title": "Cpu"
          },
          "ram_gb": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 64,
                "minimum": 1
              },
              {
                "type": "null"
              }
            ],
            "title": "Ram Gb"
          },
          "disk_gb": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 1000,
                "minimum": 10
              },
              {
                "type": "null"
              }
            ],
            "title": "Disk Gb"
          }
        },
        "type": "object",
        "required": [
          "app_name"
        ],
        "title": "DatabaseCreateRequest",
        "description": "Database create payload. Like LxcCreateRequest, callers may either\npass `package_slug` or explicit cpu/ram_gb/disk_gb (not both)."
      },
      "EmailRequest": {
        "properties": {
          "email": {
            "type": "string",
            "title": "Email"
          }
        },
        "type": "object",
        "required": [
          "email"
        ],
        "title": "EmailRequest"
      },
      "EngineNotAvailableResponse": {
        "properties": {
          "code": {
            "type": "string",
            "const": "engine_not_available",
            "title": "Code",
            "default": "engine_not_available"
          },
          "message": {
            "type": "string",
            "title": "Message"
          },
          "next_step": {
            "type": "string",
            "title": "Next Step"
          }
        },
        "type": "object",
        "required": [
          "message",
          "next_step"
        ],
        "title": "EngineNotAvailableResponse"
      },
      "HTTPValidationError": {
        "properties": {
          "detail": {
            "items": {
              "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
          }
        },
        "type": "object",
        "title": "HTTPValidationError"
      },
      "IpRangeCreateRequest": {
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 120,
            "minLength": 2,
            "title": "Name"
          },
          "cidr": {
            "type": "string",
            "title": "Cidr",
            "examples": [
              "192.168.0.100/29"
            ]
          },
          "gateway": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gateway"
          },
          "active": {
            "type": "boolean",
            "title": "Active",
            "default": true
          }
        },
        "type": "object",
        "required": [
          "name",
          "cidr"
        ],
        "title": "IpRangeCreateRequest"
      },
      "JobResponse": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id"
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "pending",
              "running",
              "done",
              "succeeded",
              "failed",
              "retrying",
              "cancelled"
            ],
            "title": "Status"
          },
          "type": {
            "type": "string",
            "title": "Type"
          },
          "result": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Result"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "attempts": {
            "type": "integer",
            "title": "Attempts",
            "default": 0
          },
          "max_attempts": {
            "type": "integer",
            "title": "Max Attempts",
            "default": 0
          },
          "stages": {
            "items": {
              "$ref": "#/components/schemas/JobStage"
            },
            "type": "array",
            "title": "Stages"
          },
          "created_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created At"
          },
          "updated_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Updated At"
          },
          "sandbox": {
            "type": "boolean",
            "title": "Sandbox",
            "default": false
          },
          "expires_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expires At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "status",
          "type"
        ],
        "title": "JobResponse"
      },
      "JobStage": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name"
          },
          "status": {
            "type": "string",
            "enum": [
              "running",
              "succeeded",
              "failed"
            ],
            "title": "Status"
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "title": "Started At"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "title": "Updated At"
          },
          "completed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Completed At"
          },
          "duration_seconds": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Duration Seconds"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "detail": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Detail"
          }
        },
        "type": "object",
        "required": [
          "name",
          "status",
          "started_at",
          "updated_at"
        ],
        "title": "JobStage"
      },
      "LxcCreateRequest": {
        "properties": {
          "app_name": {
            "type": "string",
            "maxLength": 80,
            "minLength": 2,
            "title": "App Name"
          },
          "package_slug": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 64,
                "minLength": 1
              },
              {
                "type": "null"
              }
            ],
            "title": "Package Slug"
          },
          "cpu": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 16,
                "minimum": 1
              },
              {
                "type": "null"
              }
            ],
            "title": "Cpu"
          },
          "ram_gb": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 64,
                "minimum": 1
              },
              {
                "type": "null"
              }
            ],
            "title": "Ram Gb"
          },
          "disk_gb": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 1000,
                "minimum": 10
              },
              {
                "type": "null"
              }
            ],
            "title": "Disk Gb"
          },
          "hostname": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 64
              },
              {
                "type": "null"
              }
            ],
            "title": "Hostname"
          },
          "billing_mode": {
            "type": "string",
            "enum": [
              "hourly",
              "monthly"
            ],
            "title": "Billing Mode",
            "default": "hourly"
          },
          "plan_code": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 64,
                "minLength": 2
              },
              {
                "type": "null"
              }
            ],
            "title": "Plan Code"
          },
          "period": {
            "type": "string",
            "enum": [
              "month",
              "year"
            ],
            "title": "Period",
            "default": "month"
          }
        },
        "type": "object",
        "required": [
          "app_name"
        ],
        "title": "LxcCreateRequest",
        "description": "LXC create payload. Callers may either:\n  • pass `package_slug` (e.g. \"standard-2\") and let the API expand it\n    into cpu/ram_gb/disk_gb from the matching active package, or\n  • pass `cpu`, `ram_gb`, and `disk_gb` directly for a custom spec.\nExactly one of those two shapes is required; mixing them is a 422."
      },
      "LxcResizeRequest": {
        "properties": {
          "cpu": {
            "type": "integer",
            "maximum": 16,
            "minimum": 1,
            "title": "Cpu"
          },
          "ram_gb": {
            "type": "integer",
            "maximum": 64,
            "minimum": 1,
            "title": "Ram Gb"
          },
          "disk_gb": {
            "type": "integer",
            "maximum": 1000,
            "minimum": 10,
            "title": "Disk Gb"
          }
        },
        "type": "object",
        "required": [
          "cpu",
          "ram_gb",
          "disk_gb"
        ],
        "title": "LxcResizeRequest",
        "description": "Resize an existing LXC. All three fields are required and must already\npass the standard bounds; the route additionally enforces that disk_gb\nis >= the service's current disk size (no shrink) and that at least one\nvalue differs from the current spec."
      },
      "MonaIDLinkVerify": {
        "properties": {
          "link_token": {
            "type": "string",
            "maxLength": 500,
            "minLength": 20,
            "title": "Link Token"
          },
          "otp": {
            "type": "string",
            "pattern": "^\\d{6}$",
            "title": "Otp"
          }
        },
        "type": "object",
        "required": [
          "link_token",
          "otp"
        ],
        "title": "MonaIDLinkVerify"
      },
      "PackageUpsertRequest": {
        "properties": {
          "slug": {
            "type": "string",
            "maxLength": 64,
            "minLength": 2,
            "title": "Slug"
          },
          "name": {
            "type": "string",
            "maxLength": 120,
            "minLength": 2,
            "title": "Name"
          },
          "cpu": {
            "type": "integer",
            "maximum": 128,
            "minimum": 1,
            "title": "Cpu"
          },
          "ram_gb": {
            "type": "integer",
            "maximum": 1024,
            "minimum": 1,
            "title": "Ram Gb"
          },
          "disk_gb": {
            "type": "integer",
            "maximum": 32768,
            "minimum": 5,
            "title": "Disk Gb"
          },
          "active": {
            "type": "boolean",
            "title": "Active",
            "default": true
          }
        },
        "type": "object",
        "required": [
          "slug",
          "name",
          "cpu",
          "ram_gb",
          "disk_gb"
        ],
        "title": "PackageUpsertRequest"
      },
      "PasswordLoginRequest": {
        "properties": {
          "email": {
            "type": "string",
            "title": "Email"
          },
          "password": {
            "type": "string",
            "maxLength": 256,
            "minLength": 8,
            "title": "Password"
          }
        },
        "type": "object",
        "required": [
          "email",
          "password"
        ],
        "title": "PasswordLoginRequest"
      },
      "PaymentWebhook": {
        "properties": {
          "amount": {
            "type": "integer",
            "maximum": 500000000,
            "exclusiveMinimum": 0,
            "title": "Amount"
          },
          "description": {
            "type": "string",
            "maxLength": 255,
            "minLength": 1,
            "title": "Description"
          },
          "transfer_date": {
            "type": "integer",
            "title": "Transfer Date"
          },
          "transaction_code": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "title": "Transaction Code"
          },
          "account_number": {
            "type": "string",
            "title": "Account Number"
          },
          "bank_name": {
            "type": "string",
            "title": "Bank Name"
          },
          "type": {
            "type": "string",
            "title": "Type"
          }
        },
        "type": "object",
        "required": [
          "amount",
          "description",
          "transfer_date",
          "transaction_code",
          "account_number",
          "bank_name",
          "type"
        ],
        "title": "PaymentWebhook"
      },
      "PriceSettingsRequest": {
        "properties": {
          "cpu_hourly_vnd": {
            "type": "integer",
            "minimum": 0,
            "title": "Cpu Hourly Vnd"
          },
          "ram_gb_hourly_vnd": {
            "type": "integer",
            "minimum": 0,
            "title": "Ram Gb Hourly Vnd"
          },
          "disk_gb_hourly_vnd": {
            "type": "integer",
            "minimum": 0,
            "title": "Disk Gb Hourly Vnd"
          }
        },
        "type": "object",
        "required": [
          "cpu_hourly_vnd",
          "ram_gb_hourly_vnd",
          "disk_gb_hourly_vnd"
        ],
        "title": "PriceSettingsRequest"
      },
      "QuotaRequestApprove": {
        "properties": {
          "granted_max": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 1000,
                "minimum": 1
              },
              {
                "type": "null"
              }
            ],
            "title": "Granted Max"
          }
        },
        "type": "object",
        "title": "QuotaRequestApprove",
        "description": "Admin approval of a pending request.\n\n`granted_max` is optional — when omitted, the admin grants exactly\nwhat the user asked for. Supplying a value lets the admin grant\n*less* than requested (\"you asked for 50, I'm comfortable with 20\").\nGranting a value SMALLER than the user's current cap is allowed\n(admins can use the same flow to bring a cap down) but the SPA\nshould surface a confirm."
      },
      "QuotaRequestCreate": {
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "lxc",
              "database"
            ],
            "title": "Kind"
          },
          "requested_max": {
            "type": "integer",
            "maximum": 1000,
            "minimum": 1,
            "title": "Requested Max"
          },
          "justification": {
            "type": "string",
            "maxLength": 2000,
            "minLength": 10,
            "title": "Justification"
          }
        },
        "type": "object",
        "required": [
          "kind",
          "requested_max",
          "justification"
        ],
        "title": "QuotaRequestCreate",
        "description": "A customer asks for their `kind` cap to be raised to `requested_max`.\n\nThe justification is mandatory — it gives the admin enough context to\ndecide without round-tripping to the customer over email, and it shows\nup verbatim in the admin GUI."
      },
      "QuotaRequestDeny": {
        "properties": {
          "reason": {
            "type": "string",
            "maxLength": 2000,
            "minLength": 3,
            "title": "Reason"
          }
        },
        "type": "object",
        "required": [
          "reason"
        ],
        "title": "QuotaRequestDeny"
      },
      "RegisterVerifyRequest": {
        "properties": {
          "email": {
            "type": "string",
            "title": "Email"
          },
          "otp": {
            "type": "string",
            "maxLength": 6,
            "minLength": 6,
            "title": "Otp"
          },
          "password": {
            "type": "string",
            "maxLength": 256,
            "minLength": 10,
            "title": "Password"
          },
          "referral_code": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 32
              },
              {
                "type": "null"
              }
            ],
            "title": "Referral Code"
          }
        },
        "type": "object",
        "required": [
          "email",
          "otp",
          "password"
        ],
        "title": "RegisterVerifyRequest"
      },
      "ResetPasswordRequest": {
        "properties": {
          "email": {
            "type": "string",
            "title": "Email"
          },
          "otp": {
            "type": "string",
            "maxLength": 6,
            "minLength": 6,
            "title": "Otp"
          },
          "password": {
            "type": "string",
            "maxLength": 256,
            "minLength": 10,
            "title": "Password"
          }
        },
        "type": "object",
        "required": [
          "email",
          "otp",
          "password"
        ],
        "title": "ResetPasswordRequest"
      },
      "ServiceResponse": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id"
          },
          "kind": {
            "type": "string",
            "enum": [
              "lxc",
              "database"
            ],
            "title": "Kind"
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "provisioning",
              "active",
              "suspended",
              "destroyed",
              "failed"
            ],
            "title": "Status"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "ip_address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ip Address"
          },
          "package_slug": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Package Slug"
          },
          "package_snapshot": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Package Snapshot"
          },
          "cpu": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cpu"
          },
          "ram_gb": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ram Gb"
          },
          "disk_gb": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Disk Gb"
          },
          "hourly_rate_vnd": {
            "type": "integer",
            "title": "Hourly Rate Vnd",
            "default": 0
          },
          "billing_mode": {
            "type": "string",
            "enum": [
              "hourly",
              "monthly"
            ],
            "title": "Billing Mode",
            "default": "hourly"
          },
          "plan_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Plan Code"
          },
          "pending_hourly_rate_vnd": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pending Hourly Rate Vnd"
          },
          "power_state": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Power State"
          },
          "engine": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Engine"
          },
          "proxmox": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Proxmox"
          },
          "created_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created At"
          },
          "updated_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Updated At"
          },
          "destroyed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Destroyed At"
          },
          "next_bill_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Bill At"
          },
          "credentials": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Credentials"
          },
          "databases": {
            "anyOf": [
              {
                "items": {
                  "type": "object"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Databases"
          },
          "sandbox": {
            "type": "boolean",
            "title": "Sandbox",
            "default": false
          },
          "expires_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expires At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "kind",
          "status",
          "name"
        ],
        "title": "ServiceResponse"
      },
      "SubscriptionUpdateRequest": {
        "properties": {
          "plan_code": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 64,
                "minLength": 2
              },
              {
                "type": "null"
              }
            ],
            "title": "Plan Code"
          },
          "period": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "month",
                  "year"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Period"
          },
          "auto_renew": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Auto Renew"
          },
          "cancel_action": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "hourly",
                  "stop"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Cancel Action"
          }
        },
        "type": "object",
        "title": "SubscriptionUpdateRequest"
      },
      "UserDeleteRequest": {
        "properties": {
          "confirm_email": {
            "type": "string",
            "maxLength": 320,
            "minLength": 3,
            "title": "Confirm Email"
          },
          "reason": {
            "type": "string",
            "maxLength": 2000,
            "minLength": 3,
            "title": "Reason"
          }
        },
        "type": "object",
        "required": [
          "confirm_email",
          "reason"
        ],
        "title": "UserDeleteRequest",
        "description": "Body of `POST /api/admin/users/{id}/delete` — the irreversible\n\"close the account, free the resources, scrub the PII\" action.\n\n`confirm_email` MUST match the target user's current email exactly.\nThis is the type-the-name-of-the-repo destructive-confirm pattern —\na guardrail against fat-finger clicks on the admin UI. The handler\nre-checks server-side so we're not relying on the SPA enforcing it.\n\n`reason` is mandatory and goes verbatim into the `deletion_events`\naudit row — once the user row is anonymized, this is the only\ndurable trace of WHY they were deleted."
      },
      "UserSuspendRequest": {
        "properties": {
          "reason": {
            "type": "string",
            "maxLength": 2000,
            "minLength": 3,
            "title": "Reason"
          }
        },
        "type": "object",
        "required": [
          "reason"
        ],
        "title": "UserSuspendRequest",
        "description": "Body of `POST /api/admin/users/{id}/suspend`.\n\n`reason` is **mandatory** and surfaced verbatim in:\n  - the audit row (`suspension_events.reason`)\n  - the 403 detail the user sees when they next try to log in\n  - the SPA's admin-clients page \"suspended because: …\" pill\n\nKeep it human-readable — it's not an error code."
      },
      "UserUnsuspendRequest": {
        "properties": {
          "reason": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 2000
              },
              {
                "type": "null"
              }
            ],
            "title": "Reason"
          }
        },
        "type": "object",
        "title": "UserUnsuspendRequest",
        "description": "Body of `POST /api/admin/users/{id}/unsuspend`.\n\n`reason` is optional — sometimes an admin un-suspends because they\nrealised they suspended the wrong account, sometimes because the\ncustomer paid their overdue invoice. We just want it noted somewhere."
      },
      "ValidationError": {
        "properties": {
          "loc": {
            "items": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "integer"
                }
              ]
            },
            "type": "array",
            "title": "Location"
          },
          "msg": {
            "type": "string",
            "title": "Message"
          },
          "type": {
            "type": "string",
            "title": "Error Type"
          }
        },
        "type": "object",
        "required": [
          "loc",
          "msg",
          "type"
        ],
        "title": "ValidationError"
      },
      "VietQRInvoiceResponse": {
        "properties": {
          "payment_id": {
            "type": "string",
            "title": "Payment Id"
          },
          "amount": {
            "type": "integer",
            "title": "Amount"
          },
          "description": {
            "type": "string",
            "title": "Description"
          },
          "qr_url": {
            "type": "string",
            "title": "Qr Url"
          },
          "qr_data_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Qr Data Url"
          },
          "status": {
            "type": "string",
            "title": "Status"
          }
        },
        "type": "object",
        "required": [
          "payment_id",
          "amount",
          "description",
          "qr_url",
          "status"
        ],
        "title": "VietQRInvoiceResponse"
      }
    },
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "MONA Cloud token",
        "description": "Use vc_session_* for account endpoints or vc_live_* for automation endpoints."
      },
      "ApiTokenHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Token",
        "description": "Alternative header for vc_live_* automation tokens."
      },
      "PaymentWebhookKey": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key",
        "description": "Shared secret for payment provider webhook delivery."
      }
    }
  },
  "servers": [
    {
      "url": "https://api.monacloud.vn"
    },
    {
      "url": "https://api.vibecloud.vn"
    }
  ],
  "tags": [
    {
      "name": "auth",
      "description": "Đăng nhập, token và tài khoản."
    },
    {
      "name": "lxc",
      "description": "Tạo và quản lý VPS LXC."
    },
    {
      "name": "databases",
      "description": "Tạo và quản lý database."
    },
    {
      "name": "apps",
      "description": "Deploy app từ git và quản lý Dokploy app host."
    },
    {
      "name": "jobs",
      "description": "Theo dõi tác vụ bất đồng bộ."
    },
    {
      "name": "services",
      "description": "Dịch vụ và dữ liệu vận hành."
    },
    {
      "name": "prices",
      "description": "Bảng giá và gói tài nguyên."
    },
    {
      "name": "billing",
      "description": "Thanh toán, số dư và hạn mức."
    },
    {
      "name": "sandbox",
      "description": "Thử API miễn phí, không tạo hạ tầng thật."
    }
  ]
}