ONIE

Tài liệu API

API v1 của ONIE — gọi từ máy chủ của bạn bằng khoá API.

Lấy khoá APITải đặc tả OpenAPI

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/vm

Phạ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:readXem bảng giá và danh mục gói
vm:readXem máy ảo, số liệu, hoá đơn của máy
vm:writeBật/tắt/khởi động lại, đổi cấu hình nhỏ, tường lửa, sao lưu nhanh
vm:createTẠ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:destroyXOÁ máy ảo
vm:consoleMở vé console VNC
sshkey:readXem khoá SSH đã lưu
sshkey:writeThêm/xoá khoá SSH
billing:readXem ví, hoá đơn, lịch sử nạp (CHỈ ĐỌC)
shield:readXem DDoS Shield của chính mình
shield:writeSử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

EndpointLàm gìCần quyền
GET /v1/vm/catalogDanh mục gói, vùng, hệ điều hành catalog:read
GET /v1/public/plansBả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-quoteBáo giá một cấu hình tuỳ chọn catalog:read

vm

EndpointLàm gìCần quyền
GET /v1/vmDanh sách máy ảo vm:read
GET /v1/vm/:idChi tiết một máy ảo vm:read
GET /v1/vm/:id/metricsCPU/RAM/đĩa/mạng theo thời gian vm:read
GET /v1/vm/:id/bandwidthLưu lượng đã dùng vm:read
GET /v1/vm/:id/volumesỔ đĩa của máy vm:read
GET /v1/vm/:id/nicsCard mạng và IP vm:read
GET /v1/vm/:id/eventsNhật ký sự kiện của máy vm:read
GET /v1/vm/:id/jobsViệc đang chạy trên máy vm:read
GET /v1/vm/:id/billingChi phí của riêng máy này vm:read
GET /v1/vm/:id/plan-quoteBáo giá trước khi đổi gói vm:read
GET /v1/vm/:id/plan-optionsGói đổi được từ máy này (cùng vị trí) vm:read
GET /v1/vm/:id/delete-previewXem trước khi xoá (hoàn tiền, dữ liệu mất) vm:read
GET /v1/vm/:id/firewallLuật tường lửa vm:read
GET /v1/vm/:id/port-forwardingLuật chuyển cổng vm:read
GET /v1/vm/:id/snapshotsDanh sách bản chụp vm:read
GET /v1/vm/ops-keyKhoá 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/startBật máy vm:write
POST /v1/vm/:id/stopTắt máy (êm) vm:write
POST /v1/vm/:id/force-stopNgắt điện máy vm:write
POST /v1/vm/:id/rebootKhở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-keyGắ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/firewallThêm luật tường lửa vm:write
DELETE /v1/vm/:id/firewall/:rule_idXoá luật tường lửa vm:write
POST /v1/vm/:id/port-forwardingThêm luật chuyển cổng vm:write
DELETE /v1/vm/:id/port-forwarding/:rule_idXoá luật chuyển cổng vm:write
POST /v1/vm/:id/snapshotsTạo bản chụp vm:write
DELETE /v1/vm/:id/snapshots/:sidXoá bản chụp vm:write
POST /v1/vmTạo máy ảo mới (trừ tiền ví) Cần Idempotency-Keyvm:create
POST /v1/vm/:id/change-planĐổi gói (trừ/hoàn tiền chênh lệch) Cần Idempotency-Keyvm:plan
POST /v1/vm/:id/change-customĐổi cấu hình tuỳ chọn Cần Idempotency-Keyvm:plan
DELETE /v1/vm/:idXoá máy ảo (mất dữ liệu) Cần Idempotency-Keyvm:destroy
GET /v1/vm/:id/consoleXin vé console VNC (dùng một lần) vm:console
POST /v1/vm/:id/ssh-tokenXin vé SSH WebSocket (dùng một lần) vm:console
GET /v1/vm/:id/ai-agent/statusTrạng thái & lịch sử AI SSH Agent vm:read
POST /v1/vm/:id/ai-agent/clearTạo phiên hội thoại AI SSH Agent mới vm:write
POST /v1/vm/:id/ai-agentChạy AI SSH Agent (SSE stream) vm:console
GET /v1/vm/:id/console-sharesDanh sách liên kết chia sẻ phiên SSH vm:read
POST /v1/vm/:id/console-sharesTạo liên kết chia sẻ phiên SSH vm:console
DELETE /v1/vm/:id/console-shares/:sidThu hồi liên kết chia sẻ phiên SSH vm:console

sshkey

EndpointLàm gìCần quyền
GET /v1/vm/sshkeysDanh sách khoá SSH sshkey:read
POST /v1/vm/sshkeysThêm khoá SSH sshkey:write
DELETE /v1/vm/sshkeys/:idXoá khoá SSH sshkey:write

billing

EndpointLàm gìCần quyền
GET /v1/billing/walletSố dư ví billing:read
GET /v1/billing/summaryTổng quan chi phí billing:read
GET /v1/billing/invoicesDanh sách hoá đơn billing:read
GET /v1/billing/invoices/:idChi tiết hoá đơn billing:read
GET /v1/billing/paymentsLịch sử nạp tiền billing:read
GET /v1/billing/ordersLịch sử đơn hàng billing:read
GET /v1/client/usageMức dùng hiện tại billing:read

shield

EndpointLàm gìCần quyền
GET /v1/tenants/:tid/summaryTổng quan DDoS Shield shield:read
GET /v1/tenants/:tid/targetsDanh sách IP đang bảo vệ shield:read
GET /v1/tenants/:tid/targets/:id/rulesLuật chặn của một IP shield:read
GET /v1/tenants/:tid/targets/:id/eventsSự kiện tấn công của một IP shield:read
GET /v1/tenants/:tid/trafficLưu lượng biên shield:read
POST /v1/tenants/:tid/targets/:id/rulesThêm luật chặn shield:write
DELETE /v1/tenants/:tid/targets/:id/rules/:ridXoá 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.