Trên trang này
- Tổng quan
- Mua & nhận license
- Giá kèm VPS
- Đọc license
- Trạng thái đơn
- Gia hạn & hết hạn
- Luật riêng
- Nhịp thao tác
- Mã lỗi riêng
- GET /key/products
- GET /key/groups
- GET /key/bindable
- POST /key/quote
- POST /key/buy
- GET /key/list
- GET /key/info
- GET /key/credentials
- POST /key/renew
- POST /key/auto-renew
- POST /key/note
- POST /key/delete
Tổng quan
Địa chỉ gốc của các endpoint trên trang này:
https://cloudmoon.net/api/v1| Endpoint | Việc | Quyền khoá |
|---|---|---|
GET /key/products |
Danh mục license key đang bày (gói bật trong nhóm đang bật — cùng tập trang web): in_stock = còn bán được, stock = số k… | Chỉ đọc |
GET /key/groups |
Nhóm phần mềm đang bật (mmo · ai · office…) — group_code dùng để lọc /key/products. | Chỉ đọc |
GET /key/bindable |
Dịch vụ đang chạy (Cloud VPS · Dedicated Server · VPS Giá Rẻ) của tài khoản để mua key giá kèm VPS — CÙNG phép lệnh mua… | Chỉ đọc |
POST /key/quote |
BÁO GIÁ — không trừ tiền, không ghi gì, khoá chỉ đọc gọi được. type buy (mặc định): CÙNG thân và CÙNG bộ kiểm với /key/… | Chỉ đọc |
POST /key/buy |
Mua 1–50 license key cùng sản phẩm + chu kỳ trong MỘT đơn — trừ tiền và giao key NGAY trong lượt gọi: HTTP 200 provisio… | Toàn quyền |
GET /key/list |
Mọi đơn key của tài khoản (KHÔNG kèm license), mỗi đơn kèm billing (price_renew = số lượt gia hạn kế tiếp sẽ trừ — giữ … | Chỉ đọc |
GET /key/info |
Chi tiết một đơn key: mọi trường của /key/list + renew_until (hạn mới nếu gia hạn ngay, giữ chu kỳ; null khi đơn không … | Chỉ đọc |
GET /key/credentials |
License của MỌI key trong đơn (keys[]; license_key = key đầu) — khoá TOÀN QUYỀN; chỉ đơn đang hoạt động (tạm ngưng ⇒ 40… | Toàn quyền |
POST /key/renew |
Gia hạn một đơn key thêm MỘT chu kỳ — trừ ví NGAY (báo giá: /key/quote type renew). Bỏ trống billing_cycle ⇒ giữ chu kỳ… | Toàn quyền |
POST /key/auto-renew |
ĐẶT tự gia hạn (không lật — gửi lại cùng giá trị vẫn thành công). Bật ⇒ khi còn ≤ 7 ngày tới time_expire hệ thống tự tr… | Toàn quyền |
POST /key/note |
Ghi chú riêng của tài khoản cho một đơn key (≤ 200 ký tự; rỗng = xoá). Đọc lại ở user_note của /key/info · /key/list — … | Toàn quyền |
POST /key/delete |
XOÁ một đơn key — KHÔNG hoàn tiền, không khôi phục được (confirm = order_code): đơn chuyển expired, license không còn đ… | Toàn quyền |
Giá đại lý: Danh mục, báo giá và lệnh mua trả về (và trừ ví) giá đã trừ chiết khấu theo cấp đại lý; gia hạn cùng chu kỳ + cùng loại giá theo GIÁ GHI TRÊN ĐƠN, đổi chu kỳ (hoặc dịch vụ gắn không còn chạy — sang giá mua lẻ) theo giá gói hiện hành × số key, chiết khấu như lúc mua. — xem mục Tài khoản đại lý.
Mua & nhận license
License Key đang tạm dừng bán mới
Mỗi đơn là 1 tới 50 key của cùng một sản phẩm, cùng chu kỳ và loại giá — hạn, gia hạn, tự gia hạn và ghi chú chung cho cả đơn (order_code). Key giao từ kho có sẵn tại đây: lệnh mua kiểm hết, trừ ví và giao đủ key trong cùng một giao dịch, ngay trong lượt gọi — không có trạng thái chờ, không cần hỏi info.
GET /key/productscho biết sản phẩm đang bán:cycles(chu kỳ mua được, ngắn → dài),pricing[chu kỳ]= giá một key theo hai loại giá —standalone(mua lẻ) ·with_server(giá kèm VPS, mục Giá kèm VPS);0= loại giá ấy không bán ở chu kỳ đó — vàstock(số key còn trong kho) +in_stock. Sản phẩm tạm hết hàng vẫn có trong danh sách vớiin_stock: false(?in_stock=1chỉ lấy sản phẩm còn hàng); lọc theo nhóm bằng?group_code=(mã ởGET /key/groups).POST /key/quotevới cùng thân lệnh mua (khoá Chỉ đọc gọi được): chạy đúng bộ kiểm của lệnh mua — sản phẩm còn bán và còn đủ key, chu kỳ, loại giá, dịch vụ gắn — rồi trảamount(tổng sẽ trừ),price_each,stockvàenough(số dư khả dụng đủ chưa).POST /key/buyvới{product_id, billing_cycle, price_type, quantity?}(+bind_service_type·bind_order_codekhiwith_server) và headerIdempotency-Key⇒ HTTP 200,provision_status: "ready",charged: truevàkeys— license của từng key.
- License chỉ có trong câu trả lời đầu tiên: gửi lại cùng
Idempotency-Keythì bản phát lại đểlicense_key: nullkèmsecrets_omitted. Đọc lại bất cứ lúc nào ởGET /key/credentials(khoá Toàn quyền — mục Đọc license). Hiếm khi lệnh mua xong mà license chưa đọc kèm được ⇒license_key: nullvànotechỉ sangcredentials— tiền đã trừ, key đã giao, đừng mua lại. - Một giao dịch: hoặc trừ tiền, tạo đơn và giao đủ
quantitykey, hoặc không có gì — không có đơn "đã trừ tiền mà chưa có key". Lời chối ở bước kiểm đều chưa trừ đồng nào: thiếu tiền (402), sản phẩm ngừng bán (404), tạm hết key hoặc kho còn ít hơnquantity(409 OUT_OF_STOCK— khi kho còn key mà không đủ,data.stock= số key còn), dịch vụ gắn không hợp lệ (409 BIND_NOT_ALLOWED,data.reason), giá vừa tăng giữa lúc kiểm và lúc trừ (409 PRICE_CHANGED,data.price_buy= số mới — báo giá lại rồi gửi lệnh mới vớiIdempotency-Keymới). - Ngoại lệ:
400 FAILEDở lệnh mua có thể là giao dịch chưa rõ kết quả — đừng mua lại ngay: đối chiếuGET /key/listhoặc liên hệ hỗ trợ; gửi lại cùngIdempotency-Keynhận lại đúng lỗi ấy. - Hết thời gian chờ, mất câu trả lời: gửi lại với đúng
Idempotency-Keycũ ⇒ nhận lại kết quả lần đầu (không kèm license), hoặc409 IDEMPOTENCY_PENDINGkhi lượt đầu chưa xong. quantity: số nguyên 1–50 (bỏ trống = 1) ·price_each= giá một key ·price_buy= tổng của cả đơn — ở lệnh mua lẫn ởlist/info(giá kỳ hiện tại của cả đơn).- Đơn mới bật sẵn tự gia hạn (
billing.renew_auto: "on") — chỉ muốn mua một kỳ thì gọiPOST /key/auto-renewvớienabled: falsesau khi mua (mục Gia hạn & hết hạn).
Giá kèm VPS
price_type: "with_server" là giá ưu đãi cho key dùng cùng một dịch vụ đang thuê tại đây của chính tài khoản — Cloud VPS, Dedicated Server hoặc VPS Giá Rẻ. Mỗi đơn giá kèm VPS đúng 1 key.
GET /key/bindable?product_id=…— dịch vụ đang chạy của tài khoản, mỗi dịch vụ kèmeligible(gắn được) vàreasonkhi không gắn được:hourly(Cloud VPS thuê theo giờ) ·expiring(còn dướibind_min_days= 15 ngày —days_leftlà số ngày còn) ·bound(dịch vụ đã có một key đang chạy của sản phẩm này — mỗi dịch vụ một key cho mỗi sản phẩm).- Gửi
service_type+order_codecủa một dịch vụeligiblevàobind_service_type+bind_order_codecủa lệnh mua (hoặc báo giá).
- Lệnh mua kiểm lại đúng các điều kiện ấy ngay trước khi trừ tiền ⇒ không đạt ⇒
409 BIND_NOT_ALLOWED+data.reason(thêmnot_found: dịch vụ không thuộc tài khoản, không còn chạy hoặc vừa đổi chủ) — chưa trừ tiền. Điều kiện "còn ít nhất 15 ngày" chỉ xét lúc mua mới. bind_service_type·bind_order_code·bind_ip(IP của dịch vụ lúc mua) có ở câu trả lời lệnh mua,list,infovàcredentials.- Gia hạn: dịch vụ gắn còn chạy ⇒ gia hạn theo giá kèm VPS; dịch vụ gắn không còn chạy (hết hạn, đã xoá, chuyển cho tài khoản khác) ⇒ lần gia hạn kế sang giá mua lẻ —
billing.price_type_renew: "standalone". Key không bị thu hồi giữa kỳ.
Đọc license
GET /key/credentials?order_code=…(khoá Toàn quyền):keys— license của mọi key trong đơn, theo thứ tự giao;license_key= key đầu tiên (giữ cho tích hợp cũ).- Chỉ đơn đang hoạt động (
order_status: "active") đọc được license: đơn tạm ngưng ⇒409 RENEW_REQUIRED(gia hạn rồi đọc lại) · hết hạn hoặc đã xoá ⇒409 ORDER_EXPIRED— license không đọc lại được nữa. - Chưa đọc được đủ license của đơn ⇒
503 UNAVAILABLE— hệ thống không trả thiếu; thử lại sau ít phút, vẫn lỗi thì liên hệ hỗ trợ kèmorder_code. list·infokhông bao giờ chứa license. Giữ license như mật khẩu — đừng ghi vào nhật ký hay đưa xuống mã chạy trên trình duyệt.
Trạng thái đơn
Đơn key được tạo xong ngay trong lệnh mua nên list / info không có provision_status — đọc order_status:
order_status | Nghĩa |
|---|---|
active | Đang hoạt động — đọc được license; làm được mọi lệnh: gia hạn, tự gia hạn, đọc license, ghi chú, xoá. |
pending_expired | Tạm ngưng (hiếm — do bộ phận hỗ trợ đặt): license bị chặn (409 RENEW_REQUIRED); gia hạn, tự gia hạn, ghi chú, xoá vẫn làm được. |
expired | Hết hạn, hoặc đã xoá — không lệnh nào làm được nữa (409 ORDER_EXPIRED). Đơn và key bị xoá hẳn 30 ngày sau time_expire. |
allowed_actions(ở cảlistlẫninfo) — việc làm được ngay lúc này, cùng luật với các nút trên trang quản lý key:renew·auto_renew·credentials·note·delete. Tên nào vắng mặt thì lệnh ấy đang bị chối. Chỉ xét trạng thái đơn — không tính nhịp thao tác (mục Nhịp thao tác), lượt gia hạn trong ngày, số dư hay giá:renewcó mặt màbilling.price_renewlànullthì gia hạn giữ chu kỳ sẽ bị chối (400 NOT_SUPPORTED) — báo giá trước, hoặc gia hạn sang một chu kỳ trongcycles.billing:price_buy(giá kỳ hiện tại của cả đơn) ·price_renew(số lượt gia hạn kế tiếp sẽ trừ khi giữ chu kỳ —nullkhi đơn không gia hạn được) ·price_type_renew(loại giá của lượt ấy) ·billing_cycle·cycle_label·days·renew_auto·time_buy·time_expire.infothêmrenew_until— hạn mới nếu gia hạn ngay.listtrả mọi đơn của tài khoản — mua trên web lẫn qua API, nhận chuyển quyền — kể cả đơn đã hết hạn / đã xoá cho tới khi bị xoá hẳn; lọc bằng?status=active·pending_expired·expired.user_note— ghi chú riêng (đặt bằngPOST /key/note), lưu nguyên văn sau khi bỏ khoảng trắng đầu / cuối: khi hiển thị nhớ thoát HTML.ref_excluded: 1= đơn không tính hoa hồng giới thiệu (mọi đơn mua qua API).
Gia hạn & hết hạn
POST /key/renewvới{order_code}gia hạn một chu kỳ và trừ ví ngay. Giữ chu kỳ và loại giá ⇒amount= giá ghi trên đơn (billing.price_renew— giá lúc mua, đã trừ chiết khấu khi ấy). Báo giá:quotevới{"type": "renew", "order_code": "…"}(keep_price: true= giữ giá ghi trên đơn).- Đổi chu kỳ khi gia hạn: thêm
billing_cycle(một mã trongcyclescủa sản phẩm) ⇒amount= giá sản phẩm hiện hành ở chu kỳ mới × số key (chiết khấu đại lý như lúc mua); từ đó giá ghi trên đơn đổi theo. Không có lệnh đổi chu kỳ riêng. - Hạn mới = max(hôm nay, hạn cũ) + số ngày của chu kỳ (
days— tính theo ngày, ví dụ 1 Tháng = 30 ngày). - Mỗi đơn một lượt gia hạn mỗi ngày, tính cả gia hạn trên web và tự gia hạn ⇒
429 COOLDOWN,Retry-Aftertới 0 giờ. - Giá vừa tăng giữa lúc kiểm và lúc trừ — hoặc dịch vụ gắn vừa ngừng chạy nên đơn sang giá mua lẻ ⇒
409 PRICE_CHANGED(data.price_buy= số mới), chưa trừ tiền: báo giá lại rồi gửi lệnh mới. - Một chu kỳ thôi bán chỉ dừng đơn mới: đơn đang ở chu kỳ ấy vẫn gia hạn giữ chu kỳ được (cả tự gia hạn) — miễn sản phẩm vẫn còn giá cho chu kỳ và loại giá ấy; sản phẩm đã thôi đặt giá cho chu kỳ ấy ⇒
400 NOT_SUPPORTED: gia hạn kèmbilling_cyclelà một chu kỳ trongcycles. Đổi sang chu kỳ khác thì chỉ chu kỳ đang bán. Dịch vụ tạm dừng bán, sản phẩm ngừng bày hay tạm hết key không chặn gia hạn. - Tự gia hạn (
billing.renew_auto— đơn mới bật sẵn; đặt bằngPOST /key/auto-renewvớienabledlà boolean — lệnh ĐẶT giá trị, gửi lại cùng giá trị không lật ngược): khi còn 7 ngày hoặc ít hơn tớitime_expire(tính cả ngày hết hạn), mỗi giờ hệ thống thử gia hạn một chu kỳ, giữ chu kỳ hiện tại — cùng số vớirenewkhông kèmbilling_cycle; số dư thiếu ⇒ bỏ qua, thử lại giờ sau. - Hết hạn là hết: đơn
activehết ngàytime_expiremà chưa gia hạn ⇒ chuyểnexpired— license không đọc được, không gia hạn được nữa (không có thời gian chờ); muốn dùng tiếp thì mua key mới. Đơn cònactivedù đã qua hạn (chưa tới lượt kiểm) vẫn gia hạn được — hạn mới tính từ hôm nay. Đơnpending_expired(tạm ngưng) không tự chuyểnexpired: vẫn gia hạn được để dùng lại, kể cả khi đã qua hạn.
Luật riêng
- Xoá (
POST /key/delete,confirm= đúngorder_code): đơn chuyểnexpiredngay — license không đọc được nữa, không hoàn tiền, không khôi phục được. Đơn đã hết hạn / đã xoá ⇒409 ORDER_EXPIRED. - Ghi chú (
POST /key/note): khoảng trắng đầu / cuối được bỏ trước, rồi tối đa 200 ký tự (dài hơn ⇒400, không bị cắt); rỗng = xoá ghi chú. - Dịch vụ License Key tạm dừng bán:
products·groups·bindable· báo giá mua mới · lệnh mua nhận503 SERVICE_DISABLED(GET /services/statusbáokey: false); mọi lệnh trên đơn đang có vẫn chạy bình thường. - Sản phẩm ngừng bán, tạm hết hàng: sản phẩm ngừng bán (hay thuộc nhóm đã tắt) không còn trong danh mục — báo giá / lệnh mua ⇒
404 NOT_FOUND; sản phẩm tạm hết hàng vẫn trong danh mục vớiin_stock: false— báo giá / lệnh mua ⇒409 OUT_OF_STOCK. Đơn đang có không bị ảnh hưởng. - Giới hạn lệnh mua (mỗi tài khoản): tối đa 10 lượt mua key mỗi giờ — đếm cả lượt mua trên web (
429 RATE_LIMITED), tính riêng với các sản phẩm khác. Số dư xét lệnh mua là số dư khả dụng — đã trừ tiền các lệnh mua Cloud VPS còn chờ tạo máy. - Không làm qua API: chuyển đơn sang tài khoản khác (xác nhận qua email trên web) · xem nhật ký đơn — dùng trang quản lý key trên web.
- Chạy thử (
X-Sandbox: 1): lệnh mua trả mãSANDBOX…(31 ký tự) cùng license mẫu dạngSANDBOX-XXXX-XXXX-XXXX-XXXXdựng từ mã (không phải key thật). Hỏiinfo/credentialsvà gửi gia hạn / tự gia hạn / ghi chú / xoá bằng mã ấy (vẫn kèmX-Sandbox: 1) ⇒ đơn mẫuactive: đi đủ các bước kiểm rồi trả mô phỏng. Mã chở sản phẩm, chu kỳ, loại giá, loại dịch vụ gắn và số key — không chở mã dịch vụ gắn (bind_order_code: null); giá dựng lại từ sản phẩm hiện hành mỗi lần hỏi, hạn tính từ lúc tạo mã. Không lưu gì: mã không có tronglist.
Nhịp thao tác trên cùng một đơn key
Các lệnh trên cùng một đơn key phải cách lệnh trước một khoảng tối thiểu — nhịp này chỉ áp cho lệnh gửi qua API, để chặn lệnh gửi lặp. Các việc trong cùng một dòng dùng chung một đồng hồ. Gửi sớm hơn ⇒ 429 COOLDOWN (header Retry-After cho biết còn bao nhiêu giây); gửi trong lúc máy đang xử lý lệnh khác ⇒ 429 IN_PROGRESS.
| Lệnh | Cách lệnh trước trên cùng đơn key |
|---|---|
| Gia hạn | 1 phút |
| Bật/tắt tự gia hạn | 5 giây (tính riêng) |
| Gia hạn | tối đa 1 lượt / ngày / đơn (tính cả gia hạn trên web và tự gia hạn — lượt thứ hai ⇒ 429 COOLDOWN, Retry-After tới 0 giờ) |
| Ghi chú · xoá | không phải chờ (chỉ một lệnh mỗi lúc trên cùng đơn (429 IN_PROGRESS)) |
Mã lỗi riêng
Ngoài các mã lỗi chung của mọi endpoint, trang này còn có các mã dưới đây. Hãy rẽ nhánh theo code.
| HTTP | code | Ý nghĩa | Nên làm gì |
|---|---|---|---|
| 400 | NOT_SUPPORTED |
Sản phẩm không có giá cho chu kỳ / loại giá của lệnh (mua · gia hạn đổi chu kỳ · gia hạn giữ chu kỳ mà sản phẩm đã thôi đặt giá cho chu kỳ ấy · dịch vụ gắn không còn chạy mà sản phẩm không bán lẻ ở chu kỳ ấy), hoặc giá gia hạn ghi trên đơn chưa hợp lệ. | Chọn một chu kỳ trong cycles của sản phẩm ở /key/products (gia hạn: gửi kèm billing_cycle của chu kỳ ấy); giá gia hạn lỗi ⇒ liên hệ hỗ trợ. |
| 400 | CONFIRM_REQUIRED |
Lệnh xoá key thiếu trường xác nhận. | Gửi confirm bằng đúng order_code — xoá không khôi phục được và KHÔNG hoàn tiền. |
| 409 | OUT_OF_STOCK |
Sản phẩm tạm hết key (danh mục ghi in_stock: false), hoặc kho còn ít hơn quantity (data.stock = số key còn) — lệnh mua CHƯA trừ tiền. |
Giảm quantity xuống tối đa data.stock, chọn sản phẩm khác hoặc thử lại sau — thêm ?in_stock=1 vào danh mục để chỉ thấy sản phẩm còn hàng. |
| 409 | BIND_NOT_ALLOWED |
Dịch vụ gắn không dùng được cho giá kèm VPS — lệnh mua CHƯA trừ tiền. data.reason: hourly (VPS thuê theo giờ) · expiring (còn dưới bind_min_days ngày) · bound (dịch vụ đã có key của sản phẩm này) · not_found (không thuộc tài khoản / không còn chạy / vừa đổi chủ). |
Chọn dịch vụ eligible: true ở /key/bindable?product_id=…, gia hạn dịch vụ trước, hoặc mua lẻ (price_type: standalone). |
| 409 | PRICE_CHANGED |
Số sẽ trừ vừa cao hơn lúc kiểm — mua: giá sản phẩm vừa đổi · gia hạn: dịch vụ gắn vừa hết hạn nên đơn sang giá mua lẻ, hoặc giá vừa đổi. Lệnh CHƯA trừ đồng nào; data.price_buy = số mới. |
Báo giá lại (/key/quote) rồi gửi lệnh mới (Idempotency-Key mới). |
| 409 | RENEW_REQUIRED |
Đơn đang tạm ngưng — license bị chặn tới khi gia hạn (gia hạn · tự gia hạn · ghi chú · xoá vẫn làm được). | Gia hạn (/key/renew) rồi đọc lại license. |
| 409 | ORDER_EXPIRED |
Đơn key đã hết hạn hoặc đã xoá — không thao tác được nữa (dữ liệu xoá hẳn 30 ngày sau hạn). | Mua key mới (/key/buy). |
| 429 | COOLDOWN |
Đơn vừa nhận lệnh cùng nhóm (gia hạn: 60 giây · tự gia hạn: 5 giây), hoặc hôm nay đơn đã có một lượt gia hạn (Retry-After tới 0 giờ). | Chờ Retry-After giây. |
| 429 | IN_PROGRESS |
Đơn đang xử lý một lệnh khác (hai lệnh cùng lúc trên một đơn key). | Chờ Retry-After giây rồi gửi lại. |
| 503 | UNAVAILABLE |
Chưa đọc được đủ license của đơn lúc này (/key/credentials — không trả thiếu), hoặc hệ thống tạm chưa ghi nhận được lệnh (CHƯA trừ tiền). |
Thử lại sau ít phút — lệnh trừ tiền dùng lại đúng Idempotency-Key được; credentials vẫn lỗi ⇒ liên hệ hỗ trợ kèm order_code. |
/key/products
Chỉ đọcDanh mục license key đang bày (gói bật trong nhóm đang bật — cùng tập trang web): in_stock = còn bán được, stock = số key còn trong kho (0 khi tạm hết hàng). Gói tạm hết hàng vẫn có trong danh sách (in_stock: false) — ?in_stock=1 chỉ lấy gói còn hàng · ?group_code= lọc theo nhóm (/key/groups). cycles = chu kỳ mua được (ngắn → dài); pricing[chu kỳ] = giá MỘT key: standalone (mua lẻ) · with_server (giá kèm VPS — cần một dịch vụ eligible ở /key/bindable), đã trừ chiết khấu đại lý (*_original = giá niêm yết; 0 = loại giá ấy không bán ở chu kỳ đó) · days = số ngày của chu kỳ. max_quantity = số key tối đa một đơn (giá kèm VPS: 1 key). bind_min_days = số ngày tối thiểu dịch vụ gắn còn lại để mua giá kèm VPS.
GET https://cloudmoon.net/api/v1/key/products| Tham số | Vị trí | Bắt buộc | Mô tả |
|---|---|---|---|
group_code |
query | không | lọc theo nhóm (mã ở /key/groups) |
in_stock |
query | không | 1 = chỉ gói còn hàng (bỏ trống / 0 = mọi gói) |
curl 'https://cloudmoon.net/api/v1/key/products' \
-H 'X-API-Key: ak_...'import requests
r = requests.get(
"https://cloudmoon.net/api/v1/key/products",
headers={"X-API-Key": "ak_..."},
timeout=30,
)
print(r.status_code, r.json())// Node.js 18+ — lưu thành tệp .mjs
const res = await fetch("https://cloudmoon.net/api/v1/key/products", {
headers: { "X-API-Key": "ak_..." },
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('GET', '/v1/key/products');
print_r($kq);{
"status": "success",
"msg": "OK",
"data": {
"items": [
{
"product_id": 1,
"group_code": "mmo",
"name": "GPMlogin",
"description": "Trình duyệt chống phát hiện (anti-detect browser)",
"image": "/upload/img/gpmlogin-logo.jpg",
"website_url": "https://gpmloginapp.com",
"in_stock": true,
"stock": 3,
"cycles": [
"onemonth",
"threemonth",
"oneyear",
"threeyear"
],
"pricing": {
"onemonth": {
"standalone": 100000,
"with_server": 50000,
"standalone_original": 100000,
"with_server_original": 50000,
"billing_cycle": "1 Tháng",
"days": 30,
"months": 1
},
"threemonth": {
"standalone": 250000,
"with_server": 125000,
"standalone_original": 250000,
"with_server_original": 125000,
"billing_cycle": "3 Tháng",
"days": 90,
"months": 3
},
"oneyear": {
"standalone": 800000,
"with_server": 400000,
"standalone_original": 800000,
"with_server_original": 400000,
"billing_cycle": "1 Năm",
"days": 365,
"months": 12
},
"threeyear": {
"standalone": 1500000,
"with_server": 750000,
"standalone_original": 1500000,
"with_server_original": 750000,
"billing_cycle": "3 Năm",
"days": 1095,
"months": 36
}
}
}
],
"total": 1,
"discount_percent": 0,
"max_quantity": 50,
"bind_min_days": 15,
"currency": "VND"
}
}/key/groups
Chỉ đọcNhóm phần mềm đang bật (mmo · ai · office…) — group_code dùng để lọc /key/products.
GET https://cloudmoon.net/api/v1/key/groupsKhông có tham số — chỉ cần header X-API-Key.
curl 'https://cloudmoon.net/api/v1/key/groups' \
-H 'X-API-Key: ak_...'import requests
r = requests.get(
"https://cloudmoon.net/api/v1/key/groups",
headers={"X-API-Key": "ak_..."},
timeout=30,
)
print(r.status_code, r.json())// Node.js 18+ — lưu thành tệp .mjs
const res = await fetch("https://cloudmoon.net/api/v1/key/groups", {
headers: { "X-API-Key": "ak_..." },
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('GET', '/v1/key/groups');
print_r($kq);{
"status": "success",
"msg": "OK",
"data": {
"items": [
{
"group_code": "mmo",
"group_name": "Phần Mềm MMO",
"icon": "fas fa-robot",
"description": ""
}
],
"total": 1
}
}/key/bindable
Chỉ đọcDịch vụ đang chạy (Cloud VPS · Dedicated Server · VPS Giá Rẻ) của tài khoản để mua key giá kèm VPS — CÙNG phép lệnh mua dùng: eligible = gắn được; reason khi không gắn được: hourly (VPS thuê theo giờ) · expiring (còn dưới bind_min_days ngày — days_left = số ngày còn) · bound (đã có key của sản phẩm ?product_id= — truyền product_id để xét luôn điều này). Gửi service_type + order_code của một dịch vụ eligible vào bind_service_type + bind_order_code của /key/buy.
GET https://cloudmoon.net/api/v1/key/bindable| Tham số | Vị trí | Bắt buộc | Mô tả |
|---|---|---|---|
product_id |
query | không | xét thêm "dịch vụ đã có key của sản phẩm này" (reason bound) |
curl 'https://cloudmoon.net/api/v1/key/bindable?product_id=1' \
-H 'X-API-Key: ak_...'import requests
r = requests.get(
"https://cloudmoon.net/api/v1/key/bindable",
headers={"X-API-Key": "ak_..."},
params={"product_id": "1"},
timeout=30,
)
print(r.status_code, r.json())// Node.js 18+ — lưu thành tệp .mjs
const res = await fetch("https://cloudmoon.net/api/v1/key/bindable?product_id=1", {
headers: { "X-API-Key": "ak_..." },
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('GET', '/v1/key/bindable?product_id=1');
print_r($kq);{
"status": "success",
"msg": "OK",
"data": {
"items": [
{
"service_type": "cloudvps",
"order_code": "090926CLOUDQCLIENFZGKOX",
"ip": "203.0.113.10",
"name": "Cloud VPS 2",
"time_expire": "2027-09-09",
"days_left": 325,
"eligible": true,
"reason": null,
"bound": false
},
{
"service_type": "cloudvps",
"order_code": "081026CLOUDVBHZQXKMNTRA",
"ip": "203.0.113.11",
"name": "Cloud VPS giờ 1",
"time_expire": null,
"days_left": null,
"eligible": false,
"reason": "hourly",
"bound": false
}
],
"total": 2,
"product_id": 1,
"bind_min_days": 15
}
}/key/quote
Chỉ đọcBÁO GIÁ — không trừ tiền, không ghi gì, khoá chỉ đọc gọi được. type buy (mặc định): CÙNG thân và CÙNG bộ kiểm với /key/buy (sản phẩm còn bày + còn đủ key, chu kỳ, loại giá, dịch vụ gắn) ⇒ amount = TỔNG số sẽ trừ (đã chiết khấu), price_each = giá một key, stock = số key còn; enough so với balance_available (= số dư − tiền các lệnh mua VPS còn chờ tạo máy). Đơn có sẵn: type renew + order_code (+ billing_cycle để đổi chu kỳ) ⇒ amount = số lượt gia hạn sẽ trừ + time_expire mới + price_type (loại giá của lượt ấy — dịch vụ gắn không còn chạy ⇒ standalone) + keep_price (true = giữ giá ghi trên đơn) — CÙNG phép số trừ của lệnh thật; enough so với số dư. Bảo trì chỉ chặn báo giá mua mới.
POST https://cloudmoon.net/api/v1/key/quote| Tham số | Vị trí | Bắt buộc | Mô tả |
|---|---|---|---|
type |
body | không | buy (mặc định) | renew |
order_code |
body | không | renew: mã đơn có sẵn |
product_id |
body | không | buy: id sản phẩm trong /key/products |
billing_cycle |
body | không | buy: một mã trong cycles của sản phẩm · renew: chu kỳ mới (bỏ trống = giữ chu kỳ hiện tại) |
price_type |
body | không | buy: standalone | with_server |
bind_service_type |
body | không | buy with_server: cloudvps | dedi | vpssave |
bind_order_code |
body | không | buy with_server: mã dịch vụ eligible ở /key/bindable |
quantity |
body | không | buy: 1–50 (mặc định 1; with_server = 1) |
Chạy thử Lệnh đọc — gửi kèm X-Sandbox: 1 vẫn chạy như thường (không đổi gì). Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu.
curl -X POST 'https://cloudmoon.net/api/v1/key/quote' \
-H 'X-API-Key: ak_...' \
-H 'Content-Type: application/json' \
-d '{"product_id":1,"billing_cycle":"onemonth","price_type":"standalone","quantity":2}'import requests
r = requests.post(
"https://cloudmoon.net/api/v1/key/quote",
headers={"X-API-Key": "ak_..."},
json={"product_id": 1, "billing_cycle": "onemonth", "price_type": "standalone", "quantity": 2},
timeout=30,
)
print(r.status_code, r.json())// Node.js 18+ — lưu thành tệp .mjs
const res = await fetch("https://cloudmoon.net/api/v1/key/quote", {
method: "POST",
headers: {
"X-API-Key": "ak_...",
"Content-Type": "application/json",
},
body: JSON.stringify({ product_id: 1, billing_cycle: "onemonth", price_type: "standalone", quantity: 2 }),
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('POST', '/v1/key/quote', ['product_id' => 1, 'billing_cycle' => 'onemonth', 'price_type' => 'standalone', 'quantity' => 2]);
print_r($kq);{
"product_id": 1,
"billing_cycle": "onemonth",
"price_type": "standalone",
"quantity": 2
}{
"status": "success",
"msg": "OK",
"data": {
"type": "buy",
"product_id": 1,
"billing_cycle": "onemonth",
"cycle_label": "1 Tháng",
"price_type": "standalone",
"quantity": 2,
"price_each": 100000,
"amount": 200000,
"amount_original": 200000,
"discount_percent": 0,
"time_expire": "2026-11-18",
"stock": 3,
"bind_service_type": null,
"bind_order_code": null,
"bind_ip": null,
"currency": "VND",
"balance": 500000,
"balance_available": 500000,
"enough": true
}
}/key/buy
Toàn quyềnMua 1–50 license key cùng sản phẩm + chu kỳ trong MỘT đơn — trừ tiền và giao key NGAY trong lượt gọi: HTTP 200 provision_status = ready + keys[] (license từng key; đọc lại ở /key/credentials). price_type with_server = giá kèm VPS: gửi bind_service_type + bind_order_code của một dịch vụ eligible ở /key/bindable (một key mỗi đơn). Kho còn ít hơn quantity ⇒ 409 OUT_OF_STOCK (data.stock = số key còn) · dịch vụ gắn không hợp lệ ⇒ 409 BIND_NOT_ALLOWED (data.reason) · giá vừa tăng giữa lúc kiểm và lúc trừ ⇒ 409 PRICE_CHANGED (data.price_buy) — các lỗi này CHƯA trừ tiền. Gửi lại cùng Idempotency-Key ⇒ phát lại câu trả lời (KHÔNG kèm license — data.secrets_omitted; đọc lại ở /key/credentials). Đơn mới BẬT SẴN tự gia hạn (renew_auto on) — chỉ mua một kỳ thì tắt bằng /key/auto-renew. Giới hạn lượt mua / giờ: xem mục Giới hạn.
POST https://cloudmoon.net/api/v1/key/buy| Tham số | Vị trí | Bắt buộc | Mô tả |
|---|---|---|---|
Idempotency-Key |
header | không | chống trừ tiền hai lần khi gửi lại |
product_id |
body | có | id sản phẩm trong /key/products |
billing_cycle |
body | có | một mã trong cycles của sản phẩm |
price_type |
body | có | standalone (mua lẻ) | with_server (giá kèm VPS) |
bind_service_type |
body | không | with_server: cloudvps | dedi | vpssave |
bind_order_code |
body | không | with_server: mã dịch vụ eligible ở /key/bindable |
quantity |
body | không | 1–50 (mặc định 1; with_server = 1) |
Chạy thử Gửi kèm X-Sandbox: 1: máy chủ kiểm như lượt thật rồi trả kết quả mô phỏng cùng khuôn — không trừ tiền, không đổi gì. Kịch bản lỗi (X-Sandbox-Scenario): INSUFFICIENT_BALANCE (402) · NOT_FOUND (404) · OUT_OF_STOCK (409) · BIND_NOT_ALLOWED (409) · PRICE_CHANGED (409) · IDEMPOTENCY_PENDING (409) · RATE_LIMITED (429) · BUSY (429) · SERVICE_DISABLED (503) · UNAVAILABLE (503) · FAILED (400).
curl -X POST 'https://cloudmoon.net/api/v1/key/buy' \
-H 'X-API-Key: ak_...' \
-H 'Idempotency-Key: 7f9c2e4b-1a2b-4c3d-9e8f-0123456789ab' \
-H 'Content-Type: application/json' \
-d '{"product_id":1,"billing_cycle":"onemonth","price_type":"standalone","quantity":2}'import uuid
import requests
r = requests.post(
"https://cloudmoon.net/api/v1/key/buy",
headers={"X-API-Key": "ak_...", "Idempotency-Key": str(uuid.uuid4())},
json={"product_id": 1, "billing_cycle": "onemonth", "price_type": "standalone", "quantity": 2},
timeout=30,
)
print(r.status_code, r.json())// Node.js 18+ — lưu thành tệp .mjs
import { randomUUID } from "node:crypto";
const res = await fetch("https://cloudmoon.net/api/v1/key/buy", {
method: "POST",
headers: {
"X-API-Key": "ak_...",
"Content-Type": "application/json",
"Idempotency-Key": randomUUID(),
},
body: JSON.stringify({ product_id: 1, billing_cycle: "onemonth", price_type: "standalone", quantity: 2 }),
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('POST', '/v1/key/buy', ['product_id' => 1, 'billing_cycle' => 'onemonth', 'price_type' => 'standalone', 'quantity' => 2], bin2hex(random_bytes(16)));
print_r($kq);{
"product_id": 1,
"billing_cycle": "onemonth",
"price_type": "standalone",
"quantity": 2
}{
"status": "success",
"msg": "Mua 2 key thành công",
"data": {
"order_code": "191026KEYQWERTYUIOPAS",
"provision_status": "ready",
"charged": true,
"product_id": 1,
"name": "GPMlogin",
"billing_cycle": "onemonth",
"price_type": "standalone",
"quantity": 2,
"price_each": 100000,
"price_buy": 200000,
"time_expire": "2026-11-18",
"bind_service_type": null,
"bind_order_code": null,
"bind_ip": null,
"keys": [
{
"license_key": "GPM-7KQ2-M9XT-4VW1"
},
{
"license_key": "GPM-P3RZ-8HNC-6YLD"
}
],
"note": "License đọc lại được ở GET /key/credentials (khoá toàn quyền)."
}
}/key/list
Chỉ đọcMọi đơn key của tài khoản (KHÔNG kèm license), mỗi đơn kèm billing (price_renew = số lượt gia hạn kế tiếp sẽ trừ — giữ chu kỳ; price_type_renew = loại giá của lượt ấy; null khi đơn không gia hạn được), user_note, allowed_actions. ?status= active | pending_expired | expired (bỏ trống = mọi đơn; expired gồm cả đơn đã xoá). Phân trang.
GET https://cloudmoon.net/api/v1/key/list| Tham số | Vị trí | Bắt buộc | Mô tả |
|---|---|---|---|
status |
query | không | active | pending_expired | expired |
limit |
query | không | 1-200, mặc định 50 |
page |
query | không | Trang, tính từ 1 |
curl 'https://cloudmoon.net/api/v1/key/list' \
-H 'X-API-Key: ak_...'import requests
r = requests.get(
"https://cloudmoon.net/api/v1/key/list",
headers={"X-API-Key": "ak_..."},
timeout=30,
)
print(r.status_code, r.json())// Node.js 18+ — lưu thành tệp .mjs
const res = await fetch("https://cloudmoon.net/api/v1/key/list", {
headers: { "X-API-Key": "ak_..." },
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('GET', '/v1/key/list');
print_r($kq);{
"status": "success",
"msg": "OK",
"data": {
"items": [
{
"order_code": "191026KEYQWERTYUIOPAS",
"product_id": 1,
"name": "GPMlogin",
"quantity": 2,
"price_type": "standalone",
"bind_service_type": null,
"bind_order_code": null,
"bind_ip": "",
"price_buy": 200000,
"billing_cycle": "onemonth",
"renew_auto": "on",
"order_status": "active",
"time_buy": "2026-10-19",
"time_renewal": "",
"time_expire": "2026-11-18",
"source_buy": "api:13",
"ref_excluded": 1,
"user_note": "",
"billing": {
"price_buy": 200000,
"price_renew": 200000,
"price_type_renew": "standalone",
"billing_cycle": "onemonth",
"cycle_label": "1 Tháng",
"days": 30,
"renew_auto": "on",
"time_buy": "2026-10-19",
"time_expire": "2026-11-18"
},
"allowed_actions": [
"renew",
"auto_renew",
"credentials",
"note",
"delete"
]
}
],
"page": 1,
"limit": 50,
"total": 1
}
}/key/info
Chỉ đọcChi tiết một đơn key: mọi trường của /key/list + renew_until (hạn mới nếu gia hạn ngay, giữ chu kỳ; null khi đơn không gia hạn được). order_status: active · pending_expired (tạm ngưng — hiếm, do bộ phận hỗ trợ đặt: chỉ gia hạn / tự gia hạn / ghi chú / xoá được, license bị chặn tới khi gia hạn) · expired (hết hạn hoặc đã xoá — không thao tác được nữa). KHÔNG có license — đọc ở /key/credentials.
GET https://cloudmoon.net/api/v1/key/info| Tham số | Vị trí | Bắt buộc | Mô tả |
|---|---|---|---|
order_code |
query | có | Mã đơn (order_code) — lấy từ lệnh mua hoặc /list |
Chạy thử Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu.
curl 'https://cloudmoon.net/api/v1/key/info?order_code=191026KEYQWERTYUIOPAS' \
-H 'X-API-Key: ak_...'import requests
r = requests.get(
"https://cloudmoon.net/api/v1/key/info",
headers={"X-API-Key": "ak_..."},
params={"order_code": "191026KEYQWERTYUIOPAS"},
timeout=30,
)
print(r.status_code, r.json())// Node.js 18+ — lưu thành tệp .mjs
const res = await fetch("https://cloudmoon.net/api/v1/key/info?order_code=191026KEYQWERTYUIOPAS", {
headers: { "X-API-Key": "ak_..." },
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('GET', '/v1/key/info?order_code=191026KEYQWERTYUIOPAS');
print_r($kq);{
"status": "success",
"msg": "OK",
"data": {
"order_code": "191026KEYQWERTYUIOPAS",
"product_id": 1,
"name": "GPMlogin",
"quantity": 2,
"price_type": "standalone",
"bind_service_type": null,
"bind_order_code": null,
"bind_ip": "",
"price_buy": 200000,
"billing_cycle": "onemonth",
"renew_auto": "on",
"order_status": "active",
"time_buy": "2026-10-19",
"time_renewal": "",
"time_expire": "2026-11-18",
"source_buy": "api:13",
"ref_excluded": 1,
"user_note": "",
"billing": {
"price_buy": 200000,
"price_renew": 200000,
"price_type_renew": "standalone",
"billing_cycle": "onemonth",
"cycle_label": "1 Tháng",
"days": 30,
"renew_auto": "on",
"time_buy": "2026-10-19",
"time_expire": "2026-11-18"
},
"renew_until": "2026-12-18",
"allowed_actions": [
"renew",
"auto_renew",
"credentials",
"note",
"delete"
]
}
}/key/credentials
Toàn quyềnLicense của MỌI key trong đơn (keys[]; license_key = key đầu) — khoá TOÀN QUYỀN; chỉ đơn đang hoạt động (tạm ngưng ⇒ 409 RENEW_REQUIRED · hết hạn / đã xoá ⇒ 409 ORDER_EXPIRED). Chưa đọc được đủ license ⇒ 503 (không trả thiếu).
GET https://cloudmoon.net/api/v1/key/credentials| Tham số | Vị trí | Bắt buộc | Mô tả |
|---|---|---|---|
order_code |
query | có | Mã đơn (order_code) — lấy từ lệnh mua hoặc /list |
Chạy thử Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu.
curl 'https://cloudmoon.net/api/v1/key/credentials?order_code=191026KEYQWERTYUIOPAS' \
-H 'X-API-Key: ak_...'import requests
r = requests.get(
"https://cloudmoon.net/api/v1/key/credentials",
headers={"X-API-Key": "ak_..."},
params={"order_code": "191026KEYQWERTYUIOPAS"},
timeout=30,
)
print(r.status_code, r.json())// Node.js 18+ — lưu thành tệp .mjs
const res = await fetch("https://cloudmoon.net/api/v1/key/credentials?order_code=191026KEYQWERTYUIOPAS", {
headers: { "X-API-Key": "ak_..." },
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('GET', '/v1/key/credentials?order_code=191026KEYQWERTYUIOPAS');
print_r($kq);{
"status": "success",
"msg": "OK",
"data": {
"order_code": "191026KEYQWERTYUIOPAS",
"name": "GPMlogin",
"product_id": 1,
"quantity": 2,
"license_key": "GPM-7KQ2-M9XT-4VW1",
"keys": [
{
"license_key": "GPM-7KQ2-M9XT-4VW1"
},
{
"license_key": "GPM-P3RZ-8HNC-6YLD"
}
],
"price_type": "standalone",
"bind_service_type": null,
"bind_order_code": null,
"bind_ip": "",
"time_expire": "2026-11-18"
}
}/key/renew
Toàn quyềnGia hạn một đơn key thêm MỘT chu kỳ — trừ ví NGAY (báo giá: /key/quote type renew). Bỏ trống billing_cycle ⇒ giữ chu kỳ: amount = giá ghi trên đơn (billing.price_renew) khi loại giá không đổi; dịch vụ gắn của đơn giá kèm VPS không còn chạy ⇒ sang giá mua lẻ (price_type standalone). Gửi billing_cycle khác ⇒ đổi chu kỳ: amount = giá sản phẩm hiện hành ở chu kỳ mới × số key (chiết khấu như lúc mua). Hạn mới = max(hôm nay, hạn cũ) + một chu kỳ. Mỗi đơn một lượt gia hạn mỗi ngày (429 COOLDOWN tới 0 giờ). Giá vừa tăng giữa lúc kiểm và lúc trừ ⇒ 409 PRICE_CHANGED (chưa trừ tiền). Bảo trì không chặn gia hạn. Đường cũ /api/webcon/key/renew trỏ cùng lệnh.
POST https://cloudmoon.net/api/v1/key/renew| Tham số | Vị trí | Bắt buộc | Mô tả |
|---|---|---|---|
Idempotency-Key |
header | không | chống trừ tiền hai lần khi gửi lại |
order_code |
body | có | Mã đơn (order_code) — lấy từ lệnh mua hoặc /list |
billing_cycle |
body | không | chu kỳ mới (một mã trong cycles của sản phẩm) — bỏ trống = giữ chu kỳ hiện tại |
Chạy thử Gửi kèm X-Sandbox: 1: máy chủ kiểm như lượt thật rồi trả kết quả mô phỏng cùng khuôn — không trừ tiền, không đổi gì. Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu. Kịch bản lỗi (X-Sandbox-Scenario): INSUFFICIENT_BALANCE (402) · ORDER_EXPIRED (409) · PRICE_CHANGED (409) · IDEMPOTENCY_PENDING (409) · COOLDOWN (429) · IN_PROGRESS (429) · BUSY (429) · UNAVAILABLE (503) · NOT_SUPPORTED (400) · FAILED (400).
curl -X POST 'https://cloudmoon.net/api/v1/key/renew' \
-H 'X-API-Key: ak_...' \
-H 'Idempotency-Key: 7f9c2e4b-1a2b-4c3d-9e8f-0123456789ab' \
-H 'Content-Type: application/json' \
-d '{"order_code":"191026KEYQWERTYUIOPAS"}'import uuid
import requests
r = requests.post(
"https://cloudmoon.net/api/v1/key/renew",
headers={"X-API-Key": "ak_...", "Idempotency-Key": str(uuid.uuid4())},
json={"order_code": "191026KEYQWERTYUIOPAS"},
timeout=30,
)
print(r.status_code, r.json())// Node.js 18+ — lưu thành tệp .mjs
import { randomUUID } from "node:crypto";
const res = await fetch("https://cloudmoon.net/api/v1/key/renew", {
method: "POST",
headers: {
"X-API-Key": "ak_...",
"Content-Type": "application/json",
"Idempotency-Key": randomUUID(),
},
body: JSON.stringify({ order_code: "191026KEYQWERTYUIOPAS" }),
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('POST', '/v1/key/renew', ['order_code' => '191026KEYQWERTYUIOPAS'], bin2hex(random_bytes(16)));
print_r($kq);{
"order_code": "191026KEYQWERTYUIOPAS"
}{
"status": "success",
"msg": "Gia hạn thành công",
"data": {
"order_code": "191026KEYQWERTYUIOPAS",
"amount": 200000,
"price_buy": 200000,
"billing_cycle": "onemonth",
"cycle_label": "1 Tháng",
"price_type": "standalone",
"quantity": 2,
"time_expire": "2026-12-18"
}
}/key/auto-renew
Toàn quyềnĐẶT tự gia hạn (không lật — gửi lại cùng giá trị vẫn thành công). Bật ⇒ khi còn ≤ 7 ngày tới time_expire hệ thống tự trừ ví gia hạn một chu kỳ, giữ chu kỳ hiện tại (cùng giá với /key/renew không kèm billing_cycle) — số dư thiếu ⇒ bỏ qua lượt ấy. Đơn đã hết hạn / đã xoá ⇒ 409 ORDER_EXPIRED. Nhịp 5 giây / đơn.
POST https://cloudmoon.net/api/v1/key/auto-renew| Tham số | Vị trí | Bắt buộc | Mô tả |
|---|---|---|---|
order_code |
body | có | Mã đơn (order_code) — lấy từ lệnh mua hoặc /list |
enabled |
body | có | true / false |
Chạy thử Gửi kèm X-Sandbox: 1: máy chủ kiểm như lượt thật rồi trả kết quả mô phỏng cùng khuôn — không trừ tiền, không đổi gì. Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu. Kịch bản lỗi (X-Sandbox-Scenario): ORDER_EXPIRED (409) · COOLDOWN (429) · IN_PROGRESS (429) · BUSY (429) · FAILED (400).
curl -X POST 'https://cloudmoon.net/api/v1/key/auto-renew' \
-H 'X-API-Key: ak_...' \
-H 'Content-Type: application/json' \
-d '{"order_code":"191026KEYQWERTYUIOPAS","enabled":false}'import requests
r = requests.post(
"https://cloudmoon.net/api/v1/key/auto-renew",
headers={"X-API-Key": "ak_..."},
json={"order_code": "191026KEYQWERTYUIOPAS", "enabled": False},
timeout=30,
)
print(r.status_code, r.json())// Node.js 18+ — lưu thành tệp .mjs
const res = await fetch("https://cloudmoon.net/api/v1/key/auto-renew", {
method: "POST",
headers: {
"X-API-Key": "ak_...",
"Content-Type": "application/json",
},
body: JSON.stringify({ order_code: "191026KEYQWERTYUIOPAS", enabled: false }),
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('POST', '/v1/key/auto-renew', ['order_code' => '191026KEYQWERTYUIOPAS', 'enabled' => false]);
print_r($kq);{
"order_code": "191026KEYQWERTYUIOPAS",
"enabled": false
}{
"status": "success",
"msg": "Đã tắt tự gia hạn",
"data": {
"order_code": "191026KEYQWERTYUIOPAS",
"renew_auto": "off"
}
}/key/note
Toàn quyềnGhi chú riêng của tài khoản cho một đơn key (≤ 200 ký tự; rỗng = xoá). Đọc lại ở user_note của /key/info · /key/list — lưu nguyên văn (bỏ khoảng trắng đầu / cuối), khi hiển thị nhớ thoát HTML.
POST https://cloudmoon.net/api/v1/key/note| Tham số | Vị trí | Bắt buộc | Mô tả |
|---|---|---|---|
order_code |
body | có | Mã đơn (order_code) — lấy từ lệnh mua hoặc /list |
note |
body | có | ≤ 200 ký tự |
Chạy thử Gửi kèm X-Sandbox: 1: máy chủ kiểm như lượt thật rồi trả kết quả mô phỏng cùng khuôn — không trừ tiền, không đổi gì. Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu. Kịch bản lỗi (X-Sandbox-Scenario): ORDER_EXPIRED (409) · IN_PROGRESS (429) · BUSY (429) · FAILED (400).
curl -X POST 'https://cloudmoon.net/api/v1/key/note' \
-H 'X-API-Key: ak_...' \
-H 'Content-Type: application/json' \
-d '{"order_code":"191026KEYQWERTYUIOPAS","note":"Key cho may ban hang"}'import requests
r = requests.post(
"https://cloudmoon.net/api/v1/key/note",
headers={"X-API-Key": "ak_..."},
json={"order_code": "191026KEYQWERTYUIOPAS", "note": "Key cho may ban hang"},
timeout=30,
)
print(r.status_code, r.json())// Node.js 18+ — lưu thành tệp .mjs
const res = await fetch("https://cloudmoon.net/api/v1/key/note", {
method: "POST",
headers: {
"X-API-Key": "ak_...",
"Content-Type": "application/json",
},
body: JSON.stringify({ order_code: "191026KEYQWERTYUIOPAS", note: "Key cho may ban hang" }),
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('POST', '/v1/key/note', ['order_code' => '191026KEYQWERTYUIOPAS', 'note' => 'Key cho may ban hang']);
print_r($kq);{
"order_code": "191026KEYQWERTYUIOPAS",
"note": "Key cho may ban hang"
}{
"status": "success",
"msg": "Đã lưu ghi chú",
"data": {
"order_code": "191026KEYQWERTYUIOPAS",
"user_note": "Key cho may ban hang"
}
}/key/delete
Toàn quyềnXOÁ một đơn key — KHÔNG hoàn tiền, không khôi phục được (confirm = order_code): đơn chuyển expired, license không còn đọc được. Đường cũ /api/webcon/key/delete trỏ cùng lệnh (thân cũ chỉ order_code vẫn nhận ở đường cũ).
POST https://cloudmoon.net/api/v1/key/delete| Tham số | Vị trí | Bắt buộc | Mô tả |
|---|---|---|---|
order_code |
body | có | Mã đơn (order_code) — lấy từ lệnh mua hoặc /list |
confirm |
body | có | bằng đúng order_code |
Chạy thử Gửi kèm X-Sandbox: 1: máy chủ kiểm như lượt thật rồi trả kết quả mô phỏng cùng khuôn — không trừ tiền, không đổi gì. Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu. Kịch bản lỗi (X-Sandbox-Scenario): ORDER_EXPIRED (409) · IN_PROGRESS (429) · BUSY (429) · FAILED (400).
curl -X POST 'https://cloudmoon.net/api/v1/key/delete' \
-H 'X-API-Key: ak_...' \
-H 'Content-Type: application/json' \
-d '{"order_code":"191026KEYQWERTYUIOPAS","confirm":"191026KEYQWERTYUIOPAS"}'import requests
r = requests.post(
"https://cloudmoon.net/api/v1/key/delete",
headers={"X-API-Key": "ak_..."},
json={"order_code": "191026KEYQWERTYUIOPAS", "confirm": "191026KEYQWERTYUIOPAS"},
timeout=30,
)
print(r.status_code, r.json())// Node.js 18+ — lưu thành tệp .mjs
const res = await fetch("https://cloudmoon.net/api/v1/key/delete", {
method: "POST",
headers: {
"X-API-Key": "ak_...",
"Content-Type": "application/json",
},
body: JSON.stringify({ order_code: "191026KEYQWERTYUIOPAS", confirm: "191026KEYQWERTYUIOPAS" }),
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('POST', '/v1/key/delete', ['order_code' => '191026KEYQWERTYUIOPAS', 'confirm' => '191026KEYQWERTYUIOPAS']);
print_r($kq);{
"order_code": "191026KEYQWERTYUIOPAS",
"confirm": "191026KEYQWERTYUIOPAS"
}{
"status": "success",
"msg": "Đã xoá key — không hoàn tiền",
"data": {
"order_code": "191026KEYQWERTYUIOPAS",
"order_status": "expired",
"refunded": false
}
}