{"components":{"schemas":{"Error":{"properties":{"error":{"properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"type":"object"}},"required":["error"],"type":"object"}},"securitySchemes":{"bearerAuth":{"bearerFormat":"vk_…","description":"Khoá API của khách","scheme":"bearer","type":"http","x-scopes":{"billing:read":"Xem ví, hoá đơn, lịch sử nạp (CHỈ ĐỌC)","catalog:read":"Xem bảng giá và danh mục gói","shield:read":"Xem DDoS Shield của chính mình","shield:write":"Sửa luật DDoS Shield của chính mình","sshkey:read":"Xem khoá SSH đã lưu","sshkey:write":"Thêm/xoá khoá SSH","vm:console":"Mở vé console VNC","vm:create":"TẠO máy ảo mới (tốn tiền)","vm:destroy":"XOÁ máy ảo","vm:plan":"ĐỔI GÓI / đổi cấu hình tuỳ chọn (tốn tiền)","vm:read":"Xem máy ảo, số liệu, hoá đơn của máy","vm:write":"Bật/tắt/khởi động lại, đổi cấu hình nhỏ, tường lửa, sao lưu nhanh"}}}},"info":{"description":"API cho khách của ONIE. Xác thực bằng khoá API riêng: header `Authorization: Bearer vk_…`.\n\nKhoá tạo tại trang **Khoá API** trong bảng điều khiển, hiện đúng một lần — cất kỹ.\nKhoá gọi từ máy chủ của bạn: **không** dùng trong trình duyệt (API không mở CORS).\n\nKhoá KHÔNG bao giờ chạm được tới: nạp/rút tiền, đổi mật khẩu/email/2FA, xoá tài khoản, tạo khoá khác.","title":"ONIE — API v1","version":"1.0.0"},"openapi":"3.1.0","paths":{"/v1/billing/invoices":{"get":{"description":"Danh sách hoá đơn\n\nList invoices","operationId":"get_v1_billing_invoices","parameters":[],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["billing:read"]}],"summary":"Danh sách hoá đơn","tags":["billing"],"x-scope":"billing:read"}},"/v1/billing/invoices/{id}":{"get":{"description":"Chi tiết hoá đơn\n\nGet one invoice","operationId":"get_v1_billing_invoices__id","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["billing:read"]}],"summary":"Chi tiết hoá đơn","tags":["billing"],"x-scope":"billing:read"}},"/v1/billing/orders":{"get":{"description":"Lịch sử đơn hàng\n\nOrder history","operationId":"get_v1_billing_orders","parameters":[],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["billing:read"]}],"summary":"Lịch sử đơn hàng","tags":["billing"],"x-scope":"billing:read"}},"/v1/billing/payments":{"get":{"description":"Lịch sử nạp tiền\n\nPayment history","operationId":"get_v1_billing_payments","parameters":[],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["billing:read"]}],"summary":"Lịch sử nạp tiền","tags":["billing"],"x-scope":"billing:read"}},"/v1/billing/summary":{"get":{"description":"Tổng quan chi phí\n\nBilling overview","operationId":"get_v1_billing_summary","parameters":[],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["billing:read"]}],"summary":"Tổng quan chi phí","tags":["billing"],"x-scope":"billing:read"}},"/v1/billing/wallet":{"get":{"description":"Số dư ví\n\nWallet balance","operationId":"get_v1_billing_wallet","parameters":[],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["billing:read"]}],"summary":"Số dư ví","tags":["billing"],"x-scope":"billing:read"}},"/v1/client/usage":{"get":{"description":"Mức dùng hiện tại\n\nCurrent usage","operationId":"get_v1_client_usage","parameters":[],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["billing:read"]}],"summary":"Mức dùng hiện tại","tags":["billing"],"x-scope":"billing:read"}},"/v1/public/plans":{"get":{"description":"Bảng giá công khai của site\n\nPublic price list of the site","operationId":"get_v1_public_plans","parameters":[],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["catalog:read"]}],"summary":"Bảng giá công khai của site","tags":["catalog"],"x-scope":"catalog:read"}},"/v1/tenants/{tid}/summary":{"get":{"description":"Tổng quan DDoS Shield\n\nDDoS Shield overview","operationId":"get_v1_tenants__tid_summary","parameters":[{"in":"path","name":"tid","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["shield:read"]}],"summary":"Tổng quan DDoS Shield","tags":["shield"],"x-scope":"shield:read"}},"/v1/tenants/{tid}/targets":{"get":{"description":"Danh sách IP đang bảo vệ\n\nProtected IPs","operationId":"get_v1_tenants__tid_targets","parameters":[{"in":"path","name":"tid","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["shield:read"]}],"summary":"Danh sách IP đang bảo vệ","tags":["shield"],"x-scope":"shield:read"}},"/v1/tenants/{tid}/targets/{id}/events":{"get":{"description":"Sự kiện tấn công của một IP\n\nAttack events of one IP","operationId":"get_v1_tenants__tid_targets__id_events","parameters":[{"in":"path","name":"tid","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["shield:read"]}],"summary":"Sự kiện tấn công của một IP","tags":["shield"],"x-scope":"shield:read"}},"/v1/tenants/{tid}/targets/{id}/rules":{"get":{"description":"Luật chặn của một IP\n\nRules of one IP","operationId":"get_v1_tenants__tid_targets__id_rules","parameters":[{"in":"path","name":"tid","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["shield:read"]}],"summary":"Luật chặn của một IP","tags":["shield"],"x-scope":"shield:read"},"post":{"description":"Thêm luật chặn\n\nAdd a blocking rule","operationId":"post_v1_tenants__tid_targets__id_rules","parameters":[{"in":"path","name":"tid","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["shield:write"]}],"summary":"Thêm luật chặn","tags":["shield"],"x-scope":"shield:write"}},"/v1/tenants/{tid}/targets/{id}/rules/{rid}":{"delete":{"description":"Xoá luật chặn\n\nDelete a blocking rule","operationId":"delete_v1_tenants__tid_targets__id_rules__rid","parameters":[{"in":"path","name":"tid","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"rid","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["shield:write"]}],"summary":"Xoá luật chặn","tags":["shield"],"x-scope":"shield:write"}},"/v1/tenants/{tid}/traffic":{"get":{"description":"Lưu lượng biên\n\nEdge traffic","operationId":"get_v1_tenants__tid_traffic","parameters":[{"in":"path","name":"tid","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["shield:read"]}],"summary":"Lưu lượng biên","tags":["shield"],"x-scope":"shield:read"}},"/v1/vm":{"get":{"description":"Danh sách máy ảo\n\nList VMs","operationId":"get_v1_vm","parameters":[],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Danh sách máy ảo","tags":["vm"],"x-scope":"vm:read"},"post":{"description":"Tạo máy ảo mới (trừ tiền ví)\n\nCreate a VM (charges the wallet)","operationId":"post_v1_vm","parameters":[{"description":"Chuỗi tuỳ ý do bạn đặt, tối đa 200 ký tự. Gọi lại đúng chuỗi này sẽ trả lại KẾT QUẢ CŨ thay vì làm lần nữa.","in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":200,"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:create"]}],"summary":"Tạo máy ảo mới (trừ tiền ví)","tags":["vm"],"x-scope":"vm:create"}},"/v1/vm/catalog":{"get":{"description":"Danh mục gói, vùng, hệ điều hành\n\nPlans, regions and OS images","operationId":"get_v1_vm_catalog","parameters":[],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["catalog:read"]}],"summary":"Danh mục gói, vùng, hệ điều hành","tags":["catalog"],"x-scope":"catalog:read"}},"/v1/vm/custom-quote":{"get":{"description":"Báo giá một cấu hình tuỳ chọn\n\nQuote a custom configuration","operationId":"get_v1_vm_custom-quote","parameters":[],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["catalog:read"]}],"summary":"Báo giá một cấu hình tuỳ chọn","tags":["catalog"],"x-scope":"catalog:read"}},"/v1/vm/ops-key":{"get":{"description":"Khoá SSH vận hành được gắn sẵn (tên + vân tay, không phải bí mật)\n\nThe pre-attached ops SSH key (name + fingerprint, not a secret)","operationId":"get_v1_vm_ops-key","parameters":[],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Khoá SSH vận hành được gắn sẵn (tên + vân tay, không phải bí mật)","tags":["vm"],"x-scope":"vm:read"}},"/v1/vm/prices":{"get":{"description":"Đơn giá từng thành phần (vCPU, RAM, đĩa)\n\nUnit prices per component (vCPU, RAM, disk)","operationId":"get_v1_vm_prices","parameters":[],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["catalog:read"]}],"summary":"Đơn giá từng thành phần (vCPU, RAM, đĩa)","tags":["catalog"],"x-scope":"catalog:read"}},"/v1/vm/sshkeys":{"get":{"description":"Danh sách khoá SSH\n\nList SSH keys","operationId":"get_v1_vm_sshkeys","parameters":[],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["sshkey:read"]}],"summary":"Danh sách khoá SSH","tags":["sshkey"],"x-scope":"sshkey:read"},"post":{"description":"Thêm khoá SSH\n\nAdd an SSH key","operationId":"post_v1_vm_sshkeys","parameters":[],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["sshkey:write"]}],"summary":"Thêm khoá SSH","tags":["sshkey"],"x-scope":"sshkey:write"}},"/v1/vm/sshkeys/{id}":{"delete":{"description":"Xoá khoá SSH\n\nDelete an SSH key","operationId":"delete_v1_vm_sshkeys__id","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["sshkey:write"]}],"summary":"Xoá khoá SSH","tags":["sshkey"],"x-scope":"sshkey:write"}},"/v1/vm/{id}":{"delete":{"description":"Xoá máy ảo (mất dữ liệu)\n\nDelete the VM (data is lost)","operationId":"delete_v1_vm__id","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Chuỗi tuỳ ý do bạn đặt, tối đa 200 ký tự. Gọi lại đúng chuỗi này sẽ trả lại KẾT QUẢ CŨ thay vì làm lần nữa.","in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":200,"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:destroy"]}],"summary":"Xoá máy ảo (mất dữ liệu)","tags":["vm"],"x-scope":"vm:destroy"},"get":{"description":"Chi tiết một máy ảo\n\nGet one VM","operationId":"get_v1_vm__id","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Chi tiết một máy ảo","tags":["vm"],"x-scope":"vm:read"},"patch":{"description":"Đổi tên hiển thị / ghi chú\n\nRename / notes","operationId":"patch_v1_vm__id","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:write"]}],"summary":"Đổi tên hiển thị / ghi chú","tags":["vm"],"x-scope":"vm:write"}},"/v1/vm/{id}/ai-agent":{"post":{"description":"Chạy AI SSH Agent (SSE stream)\n\nRun AI SSH Agent (SSE stream)","operationId":"post_v1_vm__id_ai-agent","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:console"]}],"summary":"Chạy AI SSH Agent (SSE stream)","tags":["vm"],"x-scope":"vm:console"}},"/v1/vm/{id}/ai-agent/clear":{"post":{"description":"Tạo phiên hội thoại AI SSH Agent mới\n\nStart a new AI SSH Agent session","operationId":"post_v1_vm__id_ai-agent_clear","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:write"]}],"summary":"Tạo phiên hội thoại AI SSH Agent mới","tags":["vm"],"x-scope":"vm:write"}},"/v1/vm/{id}/ai-agent/status":{"get":{"description":"Trạng thái & lịch sử AI SSH Agent\n\nAI SSH Agent status and history","operationId":"get_v1_vm__id_ai-agent_status","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Trạng thái & lịch sử AI SSH Agent","tags":["vm"],"x-scope":"vm:read"}},"/v1/vm/{id}/bandwidth":{"get":{"description":"Lưu lượng đã dùng\n\nBandwidth usage","operationId":"get_v1_vm__id_bandwidth","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Lưu lượng đã dùng","tags":["vm"],"x-scope":"vm:read"}},"/v1/vm/{id}/billing":{"get":{"description":"Chi phí của riêng máy này\n\nBilling of this VM","operationId":"get_v1_vm__id_billing","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Chi phí của riêng máy này","tags":["vm"],"x-scope":"vm:read"}},"/v1/vm/{id}/change-custom":{"post":{"description":"Đổi cấu hình tuỳ chọn\n\nCustom resize","operationId":"post_v1_vm__id_change-custom","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Chuỗi tuỳ ý do bạn đặt, tối đa 200 ký tự. Gọi lại đúng chuỗi này sẽ trả lại KẾT QUẢ CŨ thay vì làm lần nữa.","in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":200,"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:plan"]}],"summary":"Đổi cấu hình tuỳ chọn","tags":["vm"],"x-scope":"vm:plan"}},"/v1/vm/{id}/change-plan":{"post":{"description":"Đổi gói (trừ/hoàn tiền chênh lệch)\n\nChange plan (prorated)","operationId":"post_v1_vm__id_change-plan","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Chuỗi tuỳ ý do bạn đặt, tối đa 200 ký tự. Gọi lại đúng chuỗi này sẽ trả lại KẾT QUẢ CŨ thay vì làm lần nữa.","in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":200,"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:plan"]}],"summary":"Đổi gói (trừ/hoàn tiền chênh lệch)","tags":["vm"],"x-scope":"vm:plan"}},"/v1/vm/{id}/console":{"get":{"description":"Xin vé console VNC (dùng một lần)\n\nGet a one-time VNC console ticket","operationId":"get_v1_vm__id_console","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:console"]}],"summary":"Xin vé console VNC (dùng một lần)","tags":["vm"],"x-scope":"vm:console"}},"/v1/vm/{id}/console-shares":{"get":{"description":"Danh sách liên kết chia sẻ phiên SSH\n\nList active SSH session share links","operationId":"get_v1_vm__id_console-shares","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Danh sách liên kết chia sẻ phiên SSH","tags":["vm"],"x-scope":"vm:read"},"post":{"description":"Tạo liên kết chia sẻ phiên SSH\n\nCreate an SSH session share link","operationId":"post_v1_vm__id_console-shares","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:console"]}],"summary":"Tạo liên kết chia sẻ phiên SSH","tags":["vm"],"x-scope":"vm:console"}},"/v1/vm/{id}/console-shares/{sid}":{"delete":{"description":"Thu hồi liên kết chia sẻ phiên SSH\n\nRevoke an SSH session share link","operationId":"delete_v1_vm__id_console-shares__sid","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"sid","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:console"]}],"summary":"Thu hồi liên kết chia sẻ phiên SSH","tags":["vm"],"x-scope":"vm:console"}},"/v1/vm/{id}/delete-preview":{"get":{"description":"Xem trước khi xoá (hoàn tiền, dữ liệu mất)\n\nPreview before delete","operationId":"get_v1_vm__id_delete-preview","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Xem trước khi xoá (hoàn tiền, dữ liệu mất)","tags":["vm"],"x-scope":"vm:read"}},"/v1/vm/{id}/events":{"get":{"description":"Nhật ký sự kiện của máy\n\nVM event log","operationId":"get_v1_vm__id_events","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Nhật ký sự kiện của máy","tags":["vm"],"x-scope":"vm:read"}},"/v1/vm/{id}/firewall":{"get":{"description":"Luật tường lửa\n\nFirewall rules","operationId":"get_v1_vm__id_firewall","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Luật tường lửa","tags":["vm"],"x-scope":"vm:read"},"post":{"description":"Thêm luật tường lửa\n\nAdd a firewall rule","operationId":"post_v1_vm__id_firewall","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:write"]}],"summary":"Thêm luật tường lửa","tags":["vm"],"x-scope":"vm:write"}},"/v1/vm/{id}/firewall/{rule_id}":{"delete":{"description":"Xoá luật tường lửa\n\nDelete a firewall rule","operationId":"delete_v1_vm__id_firewall__rule_id","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"rule_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:write"]}],"summary":"Xoá luật tường lửa","tags":["vm"],"x-scope":"vm:write"}},"/v1/vm/{id}/force-stop":{"post":{"description":"Ngắt điện máy\n\nForce stop the VM","operationId":"post_v1_vm__id_force-stop","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:write"]}],"summary":"Ngắt điện máy","tags":["vm"],"x-scope":"vm:write"}},"/v1/vm/{id}/jobs":{"get":{"description":"Việc đang chạy trên máy\n\nRunning jobs of the VM","operationId":"get_v1_vm__id_jobs","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Việc đang chạy trên máy","tags":["vm"],"x-scope":"vm:read"}},"/v1/vm/{id}/metrics":{"get":{"description":"CPU/RAM/đĩa/mạng theo thời gian\n\nCPU/RAM/disk/network over time","operationId":"get_v1_vm__id_metrics","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"CPU/RAM/đĩa/mạng theo thời gian","tags":["vm"],"x-scope":"vm:read"}},"/v1/vm/{id}/nics":{"get":{"description":"Card mạng và IP\n\nNetwork interfaces and IPs","operationId":"get_v1_vm__id_nics","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Card mạng và IP","tags":["vm"],"x-scope":"vm:read"}},"/v1/vm/{id}/plan-options":{"get":{"description":"Gói đổi được từ máy này (cùng vị trí)\n\nPlans this VM can switch to (same zone)","operationId":"get_v1_vm__id_plan-options","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Gói đổi được từ máy này (cùng vị trí)","tags":["vm"],"x-scope":"vm:read"}},"/v1/vm/{id}/plan-quote":{"get":{"description":"Báo giá trước khi đổi gói\n\nQuote before changing plan","operationId":"get_v1_vm__id_plan-quote","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Báo giá trước khi đổi gói","tags":["vm"],"x-scope":"vm:read"}},"/v1/vm/{id}/port-forwarding":{"get":{"description":"Luật chuyển cổng\n\nPort forwarding rules","operationId":"get_v1_vm__id_port-forwarding","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Luật chuyển cổng","tags":["vm"],"x-scope":"vm:read"},"post":{"description":"Thêm luật chuyển cổng\n\nAdd a port-forwarding rule","operationId":"post_v1_vm__id_port-forwarding","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:write"]}],"summary":"Thêm luật chuyển cổng","tags":["vm"],"x-scope":"vm:write"}},"/v1/vm/{id}/port-forwarding/{rule_id}":{"delete":{"description":"Xoá luật chuyển cổng\n\nDelete a port-forwarding rule","operationId":"delete_v1_vm__id_port-forwarding__rule_id","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"rule_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:write"]}],"summary":"Xoá luật chuyển cổng","tags":["vm"],"x-scope":"vm:write"}},"/v1/vm/{id}/reboot":{"post":{"description":"Khởi động lại\n\nReboot the VM","operationId":"post_v1_vm__id_reboot","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:write"]}],"summary":"Khởi động lại","tags":["vm"],"x-scope":"vm:write"}},"/v1/vm/{id}/reset-password":{"post":{"description":"Đặt lại mật khẩu quản trị\n\nReset the admin password","operationId":"post_v1_vm__id_reset-password","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:write"]}],"summary":"Đặt lại mật khẩu quản trị","tags":["vm"],"x-scope":"vm:write"}},"/v1/vm/{id}/snapshots":{"get":{"description":"Danh sách bản chụp\n\nList snapshots","operationId":"get_v1_vm__id_snapshots","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Danh sách bản chụp","tags":["vm"],"x-scope":"vm:read"},"post":{"description":"Tạo bản chụp\n\nCreate a snapshot","operationId":"post_v1_vm__id_snapshots","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:write"]}],"summary":"Tạo bản chụp","tags":["vm"],"x-scope":"vm:write"}},"/v1/vm/{id}/snapshots/{sid}":{"delete":{"description":"Xoá bản chụp\n\nDelete a snapshot","operationId":"delete_v1_vm__id_snapshots__sid","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"sid","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:write"]}],"summary":"Xoá bản chụp","tags":["vm"],"x-scope":"vm:write"}},"/v1/vm/{id}/ssh-key":{"post":{"description":"Gắn khoá SSH vào máy\n\nAttach an SSH key to the VM","operationId":"post_v1_vm__id_ssh-key","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:write"]}],"summary":"Gắn khoá SSH vào máy","tags":["vm"],"x-scope":"vm:write"}},"/v1/vm/{id}/ssh-token":{"post":{"description":"Xin vé SSH WebSocket (dùng một lần)\n\nGet a one-time SSH WebSocket token","operationId":"post_v1_vm__id_ssh-token","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:console"]}],"summary":"Xin vé SSH WebSocket (dùng một lần)","tags":["vm"],"x-scope":"vm:console"}},"/v1/vm/{id}/start":{"post":{"description":"Bật máy\n\nStart the VM","operationId":"post_v1_vm__id_start","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:write"]}],"summary":"Bật máy","tags":["vm"],"x-scope":"vm:write"}},"/v1/vm/{id}/stop":{"post":{"description":"Tắt máy (êm)\n\nStop the VM (graceful)","operationId":"post_v1_vm__id_stop","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:write"]}],"summary":"Tắt máy (êm)","tags":["vm"],"x-scope":"vm:write"}},"/v1/vm/{id}/volumes":{"get":{"description":"Ổ đĩa của máy\n\nVolumes of the VM","operationId":"get_v1_vm__id_volumes","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá sai, hết hạn, đã thu hồi, hoặc IP không được phép"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Khoá thiếu phạm vi quyền cho đường này"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Không tìm thấy, hoặc tài nguyên không thuộc tài khoản của khoá"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vượt hạn mức gọi — xem header Retry-After"}},"security":[{"bearerAuth":["vm:read"]}],"summary":"Ổ đĩa của máy","tags":["vm"],"x-scope":"vm:read"}}},"security":[{"bearerAuth":[]}],"servers":[{"url":"https://onie.net"}],"x-rate-limit":{"headers":["X-RateLimit-Limit","X-RateLimit-Remaining","X-RateLimit-Reset","Retry-After"],"per_account_per_minute":300,"per_key_per_minute":120}}