Xác thực
Gắn khoá vào header của mỗi request. Không có khoá hoặc khoá sai thì nhận 401.
curl -H "Authorization: Bearer vk_xxxxxxxx" \
https://onie.net/v1/vmPhạm vi quyền
Mỗi khoá chỉ gọi được những endpoint thuộc phạm vi quyền đã chọn lúc tạo. Thiếu quyền thì nhận 403 kèm mã `scope_required`.
catalog:read | Xem bảng giá và danh mục gói |
|---|---|
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 |
vm:create | TẠO máy ảo mới (tốn tiền) |
vm:plan | ĐỔI GÓI / đổi cấu hình tuỳ chọn (tốn tiền) |
vm:destroy | XOÁ máy ảo |
vm:console | Mở vé console VNC |
sshkey:read | Xem khoá SSH đã lưu |
sshkey:write | Thêm/xoá khoá SSH |
billing:read | Xem ví, hoá đơn, lịch sử nạp (CHỈ ĐỌC) |
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 |
Danh sách endpoint
62 endpoint. Cột “Cần quyền” là phạm vi quyền khoá phải có.
catalog
| Endpoint | Làm gì | Cần quyền |
|---|---|---|
GET /v1/vm/catalog | Danh mục gói, vùng, hệ điều hành | catalog:read |
GET /v1/public/plans | Bảng giá công khai của site | catalog:read |
GET /v1/vm/prices | Đơn giá từng thành phần (vCPU, RAM, đĩa) | catalog:read |
GET /v1/vm/custom-quote | Báo giá một cấu hình tuỳ chọn | catalog:read |
vm
| Endpoint | Làm gì | Cần quyền |
|---|---|---|
GET /v1/vm | Danh sách máy ảo | vm:read |
GET /v1/vm/:id | Chi tiết một máy ảo | vm:read |
GET /v1/vm/:id/metrics | CPU/RAM/đĩa/mạng theo thời gian | vm:read |
GET /v1/vm/:id/bandwidth | Lưu lượng đã dùng | vm:read |
GET /v1/vm/:id/volumes | Ổ đĩa của máy | vm:read |
GET /v1/vm/:id/nics | Card mạng và IP | vm:read |
GET /v1/vm/:id/events | Nhật ký sự kiện của máy | vm:read |
GET /v1/vm/:id/jobs | Việc đang chạy trên máy | vm:read |
GET /v1/vm/:id/billing | Chi phí của riêng máy này | vm:read |
GET /v1/vm/:id/plan-quote | Báo giá trước khi đổi gói | vm:read |
GET /v1/vm/:id/plan-options | Gói đổi được từ máy này (cùng vị trí) | vm:read |
GET /v1/vm/:id/delete-preview | Xem trước khi xoá (hoàn tiền, dữ liệu mất) | vm:read |
GET /v1/vm/:id/firewall | Luật tường lửa | vm:read |
GET /v1/vm/:id/port-forwarding | Luật chuyển cổng | vm:read |
GET /v1/vm/:id/snapshots | Danh sách bản chụp | vm:read |
GET /v1/vm/ops-key | Khoá SSH vận hành được gắn sẵn (tên + vân tay, không phải bí mật) | vm:read |
POST /v1/vm/:id/start | Bật máy | vm:write |
POST /v1/vm/:id/stop | Tắt máy (êm) | vm:write |
POST /v1/vm/:id/force-stop | Ngắt điện máy | vm:write |
POST /v1/vm/:id/reboot | Khởi động lại | vm:write |
POST /v1/vm/:id/reset-password | Đặt lại mật khẩu quản trị | vm:write |
POST /v1/vm/:id/ssh-key | Gắn khoá SSH vào máy | vm:write |
PATCH /v1/vm/:id | Đổi tên hiển thị / ghi chú | vm:write |
POST /v1/vm/:id/firewall | Thêm luật tường lửa | vm:write |
DELETE /v1/vm/:id/firewall/:rule_id | Xoá luật tường lửa | vm:write |
POST /v1/vm/:id/port-forwarding | Thêm luật chuyển cổng | vm:write |
DELETE /v1/vm/:id/port-forwarding/:rule_id | Xoá luật chuyển cổng | vm:write |
POST /v1/vm/:id/snapshots | Tạo bản chụp | vm:write |
DELETE /v1/vm/:id/snapshots/:sid | Xoá bản chụp | vm:write |
POST /v1/vm | Tạo máy ảo mới (trừ tiền ví) Cần Idempotency-Key | vm:create |
POST /v1/vm/:id/change-plan | Đổi gói (trừ/hoàn tiền chênh lệch) Cần Idempotency-Key | vm:plan |
POST /v1/vm/:id/change-custom | Đổi cấu hình tuỳ chọn Cần Idempotency-Key | vm:plan |
DELETE /v1/vm/:id | Xoá máy ảo (mất dữ liệu) Cần Idempotency-Key | vm:destroy |
GET /v1/vm/:id/console | Xin vé console VNC (dùng một lần) | vm:console |
POST /v1/vm/:id/ssh-token | Xin vé SSH WebSocket (dùng một lần) | vm:console |
GET /v1/vm/:id/ai-agent/status | Trạng thái & lịch sử AI SSH Agent | vm:read |
POST /v1/vm/:id/ai-agent/clear | Tạo phiên hội thoại AI SSH Agent mới | vm:write |
POST /v1/vm/:id/ai-agent | Chạy AI SSH Agent (SSE stream) | vm:console |
GET /v1/vm/:id/console-shares | Danh sách liên kết chia sẻ phiên SSH | vm:read |
POST /v1/vm/:id/console-shares | Tạo liên kết chia sẻ phiên SSH | vm:console |
DELETE /v1/vm/:id/console-shares/:sid | Thu hồi liên kết chia sẻ phiên SSH | vm:console |
sshkey
| Endpoint | Làm gì | Cần quyền |
|---|---|---|
GET /v1/vm/sshkeys | Danh sách khoá SSH | sshkey:read |
POST /v1/vm/sshkeys | Thêm khoá SSH | sshkey:write |
DELETE /v1/vm/sshkeys/:id | Xoá khoá SSH | sshkey:write |
billing
| Endpoint | Làm gì | Cần quyền |
|---|---|---|
GET /v1/billing/wallet | Số dư ví | billing:read |
GET /v1/billing/summary | Tổng quan chi phí | billing:read |
GET /v1/billing/invoices | Danh sách hoá đơn | billing:read |
GET /v1/billing/invoices/:id | Chi tiết hoá đơn | billing:read |
GET /v1/billing/payments | Lịch sử nạp tiền | billing:read |
GET /v1/billing/orders | Lịch sử đơn hàng | billing:read |
GET /v1/client/usage | Mức dùng hiện tại | billing:read |
shield
| Endpoint | Làm gì | Cần quyền |
|---|---|---|
GET /v1/tenants/:tid/summary | Tổng quan DDoS Shield | shield:read |
GET /v1/tenants/:tid/targets | Danh sách IP đang bảo vệ | shield:read |
GET /v1/tenants/:tid/targets/:id/rules | Luật chặn của một IP | shield:read |
GET /v1/tenants/:tid/targets/:id/events | Sự kiện tấn công của một IP | shield:read |
GET /v1/tenants/:tid/traffic | Lưu lượng biên | shield:read |
POST /v1/tenants/:tid/targets/:id/rules | Thêm luật chặn | shield:write |
DELETE /v1/tenants/:tid/targets/:id/rules/:rid | Xoá luật chặn | shield:write |
Hạn mức gọi
Mỗi khoá 120/phút, mỗi tài khoản 300/phút. Mọi phản hồi đều kèm X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset; vượt hạn mức thì nhận 429 kèm Retry-After (số giây nên chờ).
X-RateLimit-Limit: 120 X-RateLimit-Remaining: 118 X-RateLimit-Reset: 1758658800 Retry-After: 37 ← chỉ có khi 429 X-Request-Id: r7f2a9c1b4e8d0a63
Lệnh tốn tiền
Tạo máy, đổi gói và xoá máy bắt buộc kèm header Idempotency-Key. Gọi lại đúng chuỗi đó sẽ trả lại kết quả cũ thay vì làm lần nữa — mạng chập chờn cũng không bị trừ tiền hai lần.
curl -X POST https://onie.net/v1/vm \
-H "Authorization: Bearer vk_xxxxxxxx" \
-H "Idempotency-Key: don-hang-2026-09-23-001" \
-H "Content-Type: application/json" \
-d '{"plan":"vm-1-2","template":"ubuntu-24.04","hostname":"web-01"}'Khuôn lỗi
Mọi lỗi đều cùng một khuôn, kèm X-Request-Id để đối chiếu khi cần hỗ trợ.
{
"error": {
"code": "scope_required",
"message": "Khoá thiếu phạm vi quyền 'vm:write' cho POST /v1/vm/:id/start"
}
}Gọi từ đâu
API dành cho máy chủ của bạn, không mở CORS nên không gọi được thẳng từ trình duyệt. Đừng nhúng khoá vào mã chạy trên máy khách.