Trên trang này
- Tổng quan
- Mua & nhận chứng chỉ
- Xác minh tên miền
- CSR & khoá riêng
- Trạng thái đơn
- Hạn chứng chỉ & cấp lại
- Gia hạn & đổi chu kỳ
- Luật riêng
- Nhịp thao tác
- Mã lỗi riêng
- GET /ssl/products
- POST /ssl/quote
- POST /ssl/buy
- GET /ssl/list
- GET /ssl/info
- POST /ssl/sync
- POST /ssl/renew
- POST /ssl/auto-renew
- POST /ssl/change-cycle
- GET /ssl/download
- POST /ssl/cancel
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 /ssl/products |
Danh mục chứng chỉ: type (single · wildcard), periods = các kỳ bán được (số năm, ngắn → dài), pricing theo kỳ (amount đ… | Chỉ đọc |
POST /ssl/quote |
BÁO GIÁ — không trừ tiền, không ghi gì, khoá chỉ đọc gọi được. Mua mới: {product_code | product_id, period, common_name… | Chỉ đọc |
POST /ssl/buy |
Mua chứng chỉ — trừ tiền ngay, cấp BẤT ĐỒNG BỘ: HTTP 202 provision_status = provisioning + charged: true + order_code. … | Toàn quyền |
GET /ssl/list |
Mọi chứng chỉ của tài khoản (cùng khuôn /ssl/info, không kèm chứng chỉ / khoá). Mặc định bỏ đơn đã huỷ; ?status= provis… | Chỉ đọc |
GET /ssl/info |
Chi tiết một chứng chỉ: provision_status (provisioning · ready · expired · failed · cancelled) + renewing (đang gia hạn… | Chỉ đọc |
POST /ssl/sync |
Kiểm tra lại NGAY với nhà cấp (đã xác minh chưa · đã cấp chưa · lượt cấp lại định kỳ + bản ghi xác minh mới) rồi trả đơ… | Chỉ đọc |
POST /ssl/renew |
Gia hạn một kỳ, trừ ví ngay — CHỈ trong 30 ngày cuối trước hạn gói (sớm hơn ⇒ 409 RENEW_NOT_OPEN; xem billing.renew_ope… | Toàn quyền |
POST /ssl/auto-renew |
Bật/tắt tự gia hạn (tới hạn hệ thống tự trừ ví). ĐẶT giá trị — gửi lại cùng lệnh không lật ngược. Chỉ BẬT được khi tên … | Toàn quyền |
POST /ssl/change-cycle |
Đổi sang chu kỳ DÀI hơn (số năm) — KHÔNG trừ tiền ngay, giá kỳ mới áp từ lần gia hạn kế tiếp. Lần gia hạn ấy cấp chứng … | Toàn quyền |
GET /ssl/download |
Tệp chứng chỉ (certificate · private_key · ca_bundle · fullchain) — khoá TOÀN QUYỀN. Đơn đang gia hạn vẫn tải được chứn… | Toàn quyền |
POST /ssl/cancel |
Huỷ chứng chỉ — KHÔNG hoàn tiền (đã cấp hay chưa), không khôi phục. Bắt buộc confirm = đúng order_code. Đơn đang gia hạ… | 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 = giá cao hơn giữa giá đã trả và giá niêm yết hiện hành của kỳ. — xem mục Tài khoản đại lý.
Mua & nhận chứng chỉ
Lệnh mua trừ tiền ngay và tạo đơn trong cùng lượt gọi, còn chứng chỉ được cấp sau — khi Sectigo xác minh xong quyền của bạn với tên miền. Lệnh mua trả lời trong vài giây; bạn theo dõi đơn bằng /ssl/info.
POST /ssl/buyvới{product_code, period, common_name}(thêmcsrnếu muốn tự giữ khoá riêng — mục CSR & khoá riêng) kiểm hết — sản phẩm, thời hạn, tên miền, CSR, còn hàng, số dư khả dụng, giới hạn lượt mua — rồi trừ ví và trả HTTP 202:provision_status: "provisioning",charged: true,order_code,price_buy(số đã trừ),key_sourcevà khốidcv(cách xác minh tên miền).- Hỏi
GET /ssl/info?order_code=…mỗi 1–2 phút. Tên miền tự xác minh (dcv.mode: "auto") thì không phải làm gì; tên miền ngoài ("manual") thì thêm bản ghi CNAME ởdcv.recordngay khi nó xuất hiện (thường dưới một phút sau lệnh mua) — mục Xác minh tên miền. - Xác minh xong, chứng chỉ thường được cấp sau 10–60 phút:
provision_status: "ready",certificate.available: true. Tải bằngGET /ssl/download(khoá Toàn quyền):certificate·private_key·ca_bundle·fullchain(chứng chỉ nối chuỗi CA — thứ phần lớn máy chủ web cần).
- Không cấp được (Sectigo từ chối, hoặc đơn xác minh quá hạn ở CA) ⇒
provision_status: "failed". Tiền không tự hoàn — bộ phận hỗ trợ được báo và xử lý; liên hệ kèmorder_codenếu cần. - Lệnh mua bị chối ở bước kiểm (thiếu tiền, hết hàng, CSR không dùng được, giá vừa tăng…) thì chưa trừ đồng nào. Riêng
409 PRICE_CHANGED: 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ả (đã trừ tiền mà chưa kịp xác nhận) — đừng mua lại ngay: đối chiếu/ssl/listhoặc liên hệ hỗ trợ trước. - Luôn gửi
Idempotency-Key: một tên miền mua được nhiều chứng chỉ (đơn trùng tên miền là hợp lệ), nên lệnh mua gửi lại mà không kèm khoá là một đơn mới — trừ tiền lần hai. Gửi lại với đúng khoá cũ ⇒ nhận lại kết quả lần đầu (hoặc409 IDEMPOTENCY_PENDINGkhi lượt đầu chưa xong). Mất câu trả lời mà không có khoá ⇒ đối chiếu/ssl/listtrước khi mua lại. - Chủ tài khoản luôn nhận email khi có tệp chứng chỉ mới (cấp lần đầu, cấp lại định kỳ, gia hạn xong kèm chứng chỉ mới) hoặc khi cần xác minh lại tên miền — thêm tin Telegram nếu tài khoản đã liên kết Telegram và bật kênh ấy cho từng chứng chỉ ở trang quản lý SSL.
{
"status": "success",
"msg": "Đã nhận lệnh mua — chứng chỉ đang được cấp",
"data": {
"order_code": "131026SSLA1B2C3D4E5F6",
"common_name": "khachhang.com",
"type": "single",
"product_id": 1,
"product_code": "positive_ssl",
"period": 1,
"provision_status": "provisioning",
"charged": true,
"price_buy": 360000,
"key_source": "server",
"dcv": {
"mode": "auto",
"status": "pending",
"record": null,
"action_required": false
},
"note": "Tên miền dùng DNS của CloudMoon trong tài khoản này — hệ thống tự xác minh. Hỏi GET /ssl/info?order_code= tới khi provision_status = ready (thường 10–60 phút)."
}
}Xác minh tên miền
Sectigo chỉ cấp chứng chỉ khi xác minh được bạn kiểm soát tên miền — bằng một bản ghi CNAME. Khối dcv ở info · list · sync cho biết phải làm gì:
dcv.mode:auto— tên miền dùng DNS tại đây và nằm trong chính tài khoản đang gọi: hệ thống tự thêm bản ghi, tự xác minh, kể cả ở mỗi lượt cấp lại.manual— mọi trường hợp khác (DNS ở nơi khác, hoặc tên miền thuộc tài khoản khác): bạn tự thêm bản ghi. Báo giá mua cho biết trước (dcv_mode).dcv.record:{type: "CNAME", name, value}— có sau khi đơn được tạo ở CA (thường dưới một phút sau lệnh mua);nullkhi chưa có.dcv.status:pending(chưa có bản ghi) ·auto_submitted(hệ thống đã tự thêm) ·manual(chờ bạn thêm) ·validated(đã xác minh) ·revalidation_required(lượt cấp lại định kỳ cần bản ghi mới — mục Hạn chứng chỉ & cấp lại).dcv.action_required:true— bạn cần thêm hoặc sửa bản ghi ngay.- Thêm đúng
namevàvalue(kiểu CNAME) vào DNS của tên miền. Nhiều trang quản lý DNS chỉ cần phần đứng trước tên miền gốc củaname. ⚠namecó thể nằm ở tên miền gốc dù chứng chỉ cho tên miền con (đặtshop.khachhang.com, bản ghi là_….khachhang.com) — cứ đặt đúng tên trả về. - Thêm xong gọi
POST /ssl/syncđể kiểm ngay (nhịp 20 giây mỗi đơn); hệ thống cũng tự kiểm định kỳ vài phút một lần nên không gọi cũng được. Bản ghi mới có thể mất vài phút mới tới được mọi máy chủ DNS. - Giữ bản ghi sau khi chứng chỉ được cấp: nếu mã không đổi, lượt cấp lại định kỳ xác minh lại bằng chính bản ghi ấy; khi CA đưa mã mới,
dcv.statuschuyểnrevalidation_requiredkèm bản ghi mới. - Tên miền tự xác minh mà về sau chuyển sang tài khoản khác (chuyển quyền, bán trên chợ) hoặc chuyển DNS ra ngoài ⇒
dcv.modethànhmanual: hệ thống không ghi vào DNS không còn thuộc bạn, và tự gia hạn (nếu đang bật) bị tắt khi tới lượt tự gia hạn — hãy gia hạn tay.
CSR & khoá riêng
- Không gửi
csr⇒ hệ thống tự sinh cặp khoá và CSR, cất khoá riêng đã mã hoá:key_source: "server", khoá riêng tải về ở/ssl/download(private_key). - Gửi
csr(PEM, bắt đầu bằng-----BEGIN CERTIFICATE REQUEST-----) ⇒ khoá riêng chỉ nằm ở máy bạn:key_source: "customer",/ssl/downloadtrảprivate_key: null. Hệ thống không giữ bản sao — hãy cất kỹ khoá riêng. - CSR phải có: Common Name đúng tên đặt mua (wildcard:
*.tên-miền; tên miền có dấu thì ở dạng punycodexn--…) · khoá RSA từ 2048 bit, hoặc ECDSA P-256 / P-384 · chữ ký hợp lệ · tối đa 10 KB. Sai ⇒400 CSR_INVALID, chưa trừ tiền. Báo giá mua (/ssl/quote) kiểm CSR y như lệnh mua. - Các lượt cấp lại định kỳ và gia hạn dùng lại CSR của đơn ⇒ chứng chỉ mới vẫn khớp khoá riêng đang dùng. Đổi CSR không làm qua API.
Trạng thái đơn
provision_status gộp trạng thái đơn thành một chữ cho bộ tích hợp — cùng tên với các sản phẩm khác; order_status cho biết chi tiết. Mỗi ô bên trái ghi provision_status ở trên, order_status ở dưới:
provision_statusorder_status | Nghĩa |
|---|---|
provisioningpending_dcv | Đơn đang được tạo ở CA, chưa có bản ghi xác minh — vừa mua, hoặc lượt gia hạn cấp chứng chỉ mới. |
provisioningprocessing | Chờ xác minh tên miền / chờ CA cấp — đơn mua, hoặc lượt gia hạn. |
readyactive | Đã cấp — tải bằng /ssl/download. |
expiredpending_expired | Gói đã quá hạn. Chứng chỉ đã hết hiệu lực — trình duyệt hiện cảnh báo bảo mật với người vào website của bạn. Còn gia hạn được trong 7 ngày kể từ ngày hết hạn (xem allowed_actions). |
expiredexpired | Hết hạn hẳn — không thao tác được nữa (409 ORDER_EXPIRED); đặt mua chứng chỉ mới. |
failedfailed | Không cấp được — tiền không tự hoàn, bộ phận hỗ trợ xử lý. Lệnh còn làm được: huỷ. |
cancelledcancelled | Đã huỷ (không hoàn tiền) — lệnh thao tác nhận 409 ORDER_CANCELLED. |
renewing: true— đơn đang gia hạn (ởpending_dcvhayprocessing): chứng chỉ đang lưu (nếu có) vẫn tải được tới khi chứng chỉ kỳ mới thay — xem hạn của nó ởcert_expire. Hai trạng thái ấy màrenewing: falselà đơn mua mới.allowed_actions(ở cảlistlẫninfo) — việc làm được ngay lúc này, theo cùng luật với các nút trên trang quản lý SSL:renew·auto_renew·change_cycle·download·sync·cancel. Tên nào vắng mặt thì lệnh ấy đang bị chối (chưa tới cửa sổ gia hạn, chưa có chứng chỉ, đang gia hạn…);auto_renewcó mặt nghĩa là đổi được cài đặt — riêng BẬT còn cầndcv.mode: "auto". Không tính nhịp thao tác — xem mục Nhịp thao tác.listmặc định bỏ đơn đã huỷ; lọc bằng?status=theoprovision_status. Đơn đã huỷ hoặc hết hạn hẳn được xoá khỏi hệ thống sau khoảng 30 ngày — sau đóinfotrả404.
Hạn chứng chỉ & cấp lại
- Thời hạn bạn mua (theo năm) là hạn gói —
billing.time_expire. Mỗi chứng chỉ Sectigo chỉ hiệu lực tối đa khoảng 199 ngày (certificate.cert_expire), nên trong suốt thời hạn gói hệ thống tự cấp lại chứng chỉ mới, không thu thêm tiền. Chứng chỉ cuối cùng hết hạn cùng lúc với gói. certificate.reissue_at— ngày cấp lại dự kiến (do CA đặt, khoảng 15 ngày trướccert_expire). Cấp lại xong,certificate.cert_expirelùi ra (vàreissue_atđổi) kèm email báo — nhận ra chứng chỉ mới bằngcert_expire(issued_atkhông đổi ở lượt cấp lại định kỳ — đừng dựa vào nó). Tải lại bằng/ssl/downloadrồi cài lên máy chủ trướccert_expirecũ. Gợi ý: quanhreissue_at, hỏiinfomỗi ngày một lần.- Tên miền tự xác minh: lượt cấp lại tự xác minh lại. Tên miền ngoài: nếu CA đưa mã xác minh mới ⇒
dcv.status: "revalidation_required",dcv.action_required: truevàdcv.recordmới (kèm email) — thêm bản ghi mới rồi gọi/ssl/sync. Trong lúc chờ, chứng chỉ hiện tại vẫn dùng được tớicert_expire.
Gia hạn & đổi chu kỳ
- Cửa sổ gia hạn: chỉ trong 30 ngày cuối trước hạn gói — từ ngày
billing.renew_open_from. Sớm hơn ⇒409 RENEW_NOT_OPEN; tới cửa sổ thìrenewcó mặt trongallowed_actions. POST /ssl/renewtrừ ví ngay. Giá = giá cao hơn giữa giá bạn đã trả và giá niêm yết hiện hành của kỳ (billing.price_renew; báo giá trước bằngquotevới{"order_code": "…", "type": "renew"}). Gói còn hạn ⇒renew_mode: "renew": hạn mới = hạn cũ + một kỳ, giữ nguyên phần ngày còn lại. Gói đã quá hạn ⇒"new_order": cấp chứng chỉ mới, hạn tính từ ngày cấp.- Sau lệnh gia hạn, đơn ở
provisioning+renewing: truetới khi CA xác nhận kỳ mới. Gia hạn xong =renewing: false+billing.time_expiremới — CA có thể giữ nguyên tệp chứng chỉ tới lượt cấp lại định kỳ kế (khi ấy không có thư báo). Trong lúc chờ, chứng chỉ đang lưu vẫn tải được — xemcertificate.cert_expire, vì nó có thể hết hiệu lực trước khi kỳ mới được cấp. Gia hạn khi gói đã quá hạn thì chứng chỉ cũ (đã hết hiệu lực) được gỡ khỏi đơn —downloadnhận409 CERTIFICATE_NOT_READYtới khi chứng chỉ mới được cấp. Trong lúc ấy gia hạn, đổi chu kỳ, huỷ nhận409 RENEWING. Mỗi đơn tối đa một lượt gia hạn mỗi ngày (429 COOLDOWN). - Hiếm khi CA chưa xác nhận kịp kết quả ⇒ HTTP 202: tiền đã trừ, bộ phận hỗ trợ đối soát — đừng gửi lại lệnh gia hạn.
- Tự gia hạn (
billing.renew_auto, đổi bằngPOST /ssl/auto-renewvớienabledlà boolean — lệnh ĐẶT giá trị, gửi lại không lật ngược): chỉ BẬT được khidcv.mode: "auto", vì chứng chỉ kỳ mới phải được xác minh lại mà không cần ai thêm bản ghi — tên miền ngoài ⇒400 NOT_SUPPORTED, hãy gia hạn tay. Trong 7 ngày cuối trước hạn, hệ thống tự gia hạn khi ví đủ tiền — cùng giá với gia hạn tay; vẫn chạy trong thời gian tạm ngưng. - Đổi chu kỳ (
POST /ssl/change-cyclevới{order_code, period}): chỉ lên số năm dài hơn đang bán, cần chứng chỉ đã cấp; không trừ tiền lúc đổi — giá kỳ mới (price_renewtrong câu trả lời) áp từ lần gia hạn kế. Lần gia hạn ấy cấp chứng chỉ mới, hạn tính từ ngày cấp ⇒ tối đa 30 ngày còn lại của gói hiện tại không được cộng: lệnh gia hạn tay đầu tiên nhận400 NEW_TERM_CONFIRM_REQUIRED(chưa trừ tiền,msgnêu số ngày), gửi lại kèmaccept_new_term: true— dùng lại đúngIdempotency-Keyđược. ⚠ Đơn đang bật tự gia hạn thì lượt tự gia hạn ấy không hỏi — trừ tiền và bỏ phần ngày còn lại luôn; muốn tự quyết thì tắt tự gia hạn trước. Lệnh đổi chu kỳ không nhậnIdempotency-Key(không thu tiền). - Quá hạn: qua ngày hết hạn gói mà chưa gia hạn, đơn chuyển
pending_expired(provision_status: "expired"). Chứng chỉ đã hết hiệu lực — trình duyệt hiện cảnh báo bảo mật với người vào website của bạn. Gia hạn trong 7 ngày kể từ ngày hết hạn ⇒ cấp chứng chỉ mới (new_order). Sau 7 ngày, đơn bị đóng và lần sau phải cấp chứng chỉ mới từ đầu. Khi đơn đã sangexpired, mọi lệnh nhận409 ORDER_EXPIRED.
Luật riêng
- Huỷ (
POST /ssl/cancel,confirm= đúngorder_code): không hoàn tiền — chứng chỉ đã cấp hay chưa — và không khôi phục. Huỷ không thu hồi chứng chỉ đã cấp: tệp bạn đã tải vẫn hiệu lực tớicert_expire, nhưng đơn không tải lại, không cấp lại, không gia hạn được nữa. Đơn đang gia hạn ⇒409 RENEWING(liên hệ hỗ trợ). - Dịch vụ SSL tạm dừng bán: danh mục, báo giá mua và lệnh mua nhận
503 SERVICE_DISABLED(GET /services/statusbáossl: false); đơn đang có vẫn gia hạn, tải, kiểm tra bình thường. Một sản phẩm ngừng bán thì không còn trong danh mục (báo giá / mua nhận404), còn đơn đã mua vẫn gia hạn, đổi chu kỳ. - Hết hàng theo thời hạn: danh mục vẫn bày thời hạn tạm hết với
in_stock: false; lệnh mua thời hạn ấy nhận409 OUT_OF_STOCK(chưa trừ tiền). Gia hạn không bị chặn vì hết hàng. - Giới hạn lệnh mua qua API: tối đa 10 lượt mua chứng chỉ mỗi giờ (
429 RATE_LIMITED) — đếm cả chứng chỉ mua trên web, tính riêng với các sản phẩm khác; không giới hạn số đơn đang chờ cấp. 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 quyền · ghi chú · xem nhật ký đơn — dùng trang quản lý SSL trên web.
- Chạy thử (
X-Sandbox: 1): lệnh mua trả mãSANDBOX…(26 ký tự). Hỏiinfobằng mã ấy (vẫn kèmX-Sandbox: 1) — tính từ lúc mua: dưới 10 giâyprovisioning, chưa có bản ghi; từ giây thứ 10 có bản ghi CNAME mẫu (dcv.statusmanual, hoặcauto_submittednếu tên miền tự xác minh); từ giây thứ 40readyvới chứng chỉ mẫu ~199 ngày (dcv.status: "validated"). Chứng chỉ mẫu mang tên miềnsandbox-….example— mã chỉ chở sản phẩm, số năm và cờ, không chở tên miền;downloadtrả chuỗi đánh dấu thay cho tệp thật; mua thử kèmcsr⇒key_source: "customer"vàprivate_key: null. Không lưu gì: huỷ hay đổi chu kỳ mô phỏng không làminfovề sau đổi theo, mã không có tronglist. Chứng chỉ mẫu đãreadyvẫn chưa tới cửa sổ gia hạn ⇒ gia hạn chạy thử nhận409 RENEW_NOT_OPEN, đúng như đơn thật (trong 40 giây đầu, lúc mẫu còn chờ cấp, nhận400 NOT_SUPPORTED). Kịch bảnPROVISION_FAILED⇒ lệnh mua vẫn 202,infovềfailedsau khoảng 40 giây.
Nhịp thao tác trên cùng một chứng chỉ
Các lệnh trên cùng một chứng chỉ 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 chứng chỉ |
|---|---|
| Gia hạn · Đổi chu kỳ | 1 phút (chung một nhịp) |
| 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 (lượt thứ hai trong ngày ⇒ 429 COOLDOWN, Retry-After tới 0 giờ) |
Kiểm tra lại (/ssl/sync) | 20 giây (chung với nút "Kiểm tra" trên web) |
| Huỷ | 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 |
Chứng chỉ không làm được thao tác này ở trạng thái hiện tại (vd bật tự gia hạn cho tên miền không dùng DNS tại đây, đổi sang chu kỳ ngắn hơn, đơn chưa có chứng chỉ). | Đọc allowed_actions và dcv.mode ở /ssl/info trước khi gọi. |
| 400 | CONFIRM_REQUIRED |
Lệnh huỷ thiếu trường xác nhận. | Gửi confirm bằng đúng order_code — huỷ không khôi phục được và KHÔNG hoàn tiền. |
| 400 | CSR_INVALID |
CSR gửi kèm lệnh mua không dùng được: sai dạng PEM, Common Name khác tên đặt mua (wildcard: *.tên-miền), khoá yếu (RSA dưới 2048 bit · EC khác P-256 / P-384) hoặc chữ ký hỏng — lệnh CHƯA trừ tiền. |
Tạo lại CSR theo msg rồi gửi lại. |
| 400 | NEW_TERM_CONFIRM_REQUIRED |
Đơn đã đổi chu kỳ: lần gia hạn này cấp chứng chỉ mới, hạn gói tính từ ngày cấp nên số ngày còn lại (ghi trong msg) KHÔNG được cộng — lệnh CHƯA trừ tiền. |
Đồng ý thì gửi lại kèm accept_new_term: true (dùng lại đúng Idempotency-Key được). |
| 409 | OUT_OF_STOCK |
Chứng chỉ ở thời hạn này tạm hết hàng (danh mục ghi pricing.<kỳ>.in_stock: false) — lệnh mua CHƯA trừ tiền. |
Chọn thời hạn khác hoặc thử lại sau — thêm ?in_stock=1 vào danh mục để chỉ thấy kỳ còn hàng. |
| 409 | PRICE_CHANGED |
Giá gói vừa tăng giữa lúc kiểm và lúc trừ tiền — lệnh mua CHƯA trừ đồng nào. | Báo giá lại (/ssl/quote) rồi gửi lệnh mua mới (Idempotency-Key mới). |
| 409 | RENEW_NOT_OPEN |
Chưa tới cửa sổ gia hạn: chỉ gia hạn được trong 30 ngày cuối trước hạn gói (ngày mở = billing.renew_open_from ở /ssl/info). |
Gọi lại từ ngày renew_open_from — gia hạn trong cửa sổ ấy giữ nguyên phần ngày còn lại. |
| 409 | RENEWING |
Đơn đang gia hạn — chứng chỉ của kỳ mới đang được cấp (chứng chỉ đang lưu, nếu có, vẫn tải được); gia hạn, đổi chu kỳ, huỷ chờ tới khi xong. | Hỏi /ssl/info tới khi renewing: false. |
| 409 | CERTIFICATE_NOT_READY |
Chứng chỉ chưa được cấp (đơn còn chờ xác minh tên miền / chờ cấp, hoặc không cấp được). | Hỏi /ssl/info tới khi certificate.available: true. |
| 409 | ORDER_EXPIRED |
Chứng chỉ đã hết hạn hẳn. | Không thao tác được nữa; đặt mua chứng chỉ mới. |
| 409 | ORDER_CANCELLED |
Chứng chỉ đã huỷ (khách huỷ — không hoàn tiền — hoặc bộ phận hỗ trợ huỷ). | Không thao tác được nữa; đặt mua chứng chỉ mới. |
| 429 | COOLDOWN |
Đơn vừa nhận lệnh cùng nhóm — cần nghỉ giữa hai lệnh (xem bảng Nhịp thao tác), hoặc hôm nay đơn đã có một lượt gia hạn. | 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 chứng chỉ), đơn vừa thay đổi giữa lúc kiểm và lúc ghi, hoặc chứng chỉ đang ở bước cấp. | Chờ Retry-After giây rồi gửi lại. |
/ssl/products
Chỉ đọcDanh mục chứng chỉ: type (single · wildcard), periods = các kỳ bán được (số năm, ngắn → dài), pricing theo kỳ (amount đã trừ chiết khấu đại lý, amount_original = giá niêm yết, in_stock). Kỳ tạm hết hàng VẪN có với in_stock: false (đặt mua nhận 409 OUT_OF_STOCK) — thêm ?in_stock=1 để chỉ lấy kỳ còn hàng.
GET https://cloudmoon.net/api/v1/ssl/products| Tham số | Vị trí | Bắt buộc | Mô tả |
|---|---|---|---|
in_stock |
query | không | 1 = chỉ kỳ còn hàng |
curl 'https://cloudmoon.net/api/v1/ssl/products' \
-H 'X-API-Key: ak_...'import requests
r = requests.get(
"https://cloudmoon.net/api/v1/ssl/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/ssl/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/ssl/products');
print_r($kq);{
"status": "success",
"msg": "OK",
"data": {
"items": [
{
"product_id": 1,
"product_code": "positive_ssl",
"name": "SSL Tên Miền (DV)",
"type": "single",
"validation": "DV",
"in_stock": true,
"periods": [
1,
2,
3
],
"pricing": {
"1": {
"amount": 360000,
"amount_original": 360000,
"years": 1,
"in_stock": true
},
"2": {
"amount": 570000,
"amount_original": 570000,
"years": 2,
"in_stock": true
},
"3": {
"amount": 820000,
"amount_original": 820000,
"years": 3,
"in_stock": true
}
}
}
],
"total": 1,
"discount_percent": 0,
"currency": "VND"
}
}/ssl/quote
Chỉ đọcBÁO GIÁ — không trừ tiền, không ghi gì, khoá chỉ đọc gọi được. Mua mới: {product_code | product_id, period, common_name, csr?} — CÙNG bộ kiểm với lệnh mua (kỳ bán được, tên miền hợp lệ, CSR, còn hàng); dcv_mode = auto khi tên miền dùng DNS tại đây; enough so với available_balance (= số dư − tiền các lệnh mua VPS còn chờ tạo máy). Đơn có sẵn: {order_code, type: renew} ⇒ giá kỳ tới + renew_open_from (+ renew_mode · time_expire mới · new_term_confirm_required khi đơn đã trong cửa sổ gia hạn) · {order_code, type: change_cycle, period} ⇒ amount 0 + price_renew của kỳ mới.
POST https://cloudmoon.net/api/v1/ssl/quote| Tham số | Vị trí | Bắt buộc | Mô tả |
|---|---|---|---|
product_code |
body | không | mua mới — hoặc product_id |
product_id |
body | không | mua mới — id số trong /ssl/products |
period |
body | không | số năm — mua mới / đổi chu kỳ |
common_name |
body | không | mua mới |
csr |
body | không | mua mới (tuỳ chọn) — gửi thì kiểm luôn |
order_code |
body | không | đơn có sẵn |
type |
body | không | renew | change_cycle (đơn có sẵn) |
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/ssl/quote' \
-H 'X-API-Key: ak_...' \
-H 'Content-Type: application/json' \
-d '{"product_code":"positive_ssl","period":1,"common_name":"khachhang.com"}'import requests
r = requests.post(
"https://cloudmoon.net/api/v1/ssl/quote",
headers={"X-API-Key": "ak_..."},
json={"product_code": "positive_ssl", "period": 1, "common_name": "khachhang.com"},
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/ssl/quote", {
method: "POST",
headers: {
"X-API-Key": "ak_...",
"Content-Type": "application/json",
},
body: JSON.stringify({ product_code: "positive_ssl", period: 1, common_name: "khachhang.com" }),
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('POST', '/v1/ssl/quote', ['product_code' => 'positive_ssl', 'period' => 1, 'common_name' => 'khachhang.com']);
print_r($kq);{
"product_code": "positive_ssl",
"period": 1,
"common_name": "khachhang.com"
}{
"status": "success",
"msg": "OK",
"data": {
"type": "buy",
"product_id": 1,
"product_code": "positive_ssl",
"period": 1,
"common_name": "khachhang.com",
"amount": 360000,
"amount_original": 360000,
"discount_percent": 0,
"dcv_mode": "manual",
"key_source": "server",
"currency": "VND",
"balance": 500000,
"available_balance": 500000,
"enough": true
}
}/ssl/buy
Toàn quyềnMua chứng chỉ — trừ tiền ngay, cấp BẤT ĐỒNG BỘ: HTTP 202 provision_status = provisioning + charged: true + order_code. Hỏi /ssl/info tới khi ready (tên miền dùng DNS tại đây: tự xác minh, chứng chỉ thường có sau 10–60 phút; tên miền ngoài: thêm bản ghi CNAME ở info.dcv.record rồi gọi /ssl/sync). common_name: tên miền (gói wildcard nhận cả *.tên-miền; tên có dấu tự đổi sang punycode). csr (tuỳ chọn, PEM): Common Name phải đúng tên đặt mua (wildcard: *.tên-miền), khoá RSA ≥ 2048 bit hoặc ECDSA P-256 / P-384 — khoá riêng nằm ở máy bạn, /ssl/download trả private_key: null. Lượt mua mỗi giờ: xem mục Giới hạn.
POST https://cloudmoon.net/api/v1/ssl/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_code |
body | có | positive_ssl | positive_ssl_wildcard (hoặc product_id) |
period |
body | có | số năm — một trong periods của sản phẩm |
common_name |
body | có | tên miền (vd khachhang.com) |
csr |
body | không | CSR PEM của bạn (tuỳ chọn) |
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) · PRICE_CHANGED (409) · CSR_INVALID (400) · IDEMPOTENCY_PENDING (409) · RATE_LIMITED (429) · BUSY (429) · SERVICE_DISABLED (503) · UNAVAILABLE (503) · FAILED (400) · PROVISION_FAILED (lệnh vẫn nhận, info về sau báo failed).
curl -X POST 'https://cloudmoon.net/api/v1/ssl/buy' \
-H 'X-API-Key: ak_...' \
-H 'Idempotency-Key: 7f9c2e4b-1a2b-4c3d-9e8f-0123456789ab' \
-H 'Content-Type: application/json' \
-d '{"product_code":"positive_ssl","period":1,"common_name":"khachhang.com"}'import uuid
import requests
r = requests.post(
"https://cloudmoon.net/api/v1/ssl/buy",
headers={"X-API-Key": "ak_...", "Idempotency-Key": str(uuid.uuid4())},
json={"product_code": "positive_ssl", "period": 1, "common_name": "khachhang.com"},
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/ssl/buy", {
method: "POST",
headers: {
"X-API-Key": "ak_...",
"Content-Type": "application/json",
"Idempotency-Key": randomUUID(),
},
body: JSON.stringify({ product_code: "positive_ssl", period: 1, common_name: "khachhang.com" }),
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('POST', '/v1/ssl/buy', ['product_code' => 'positive_ssl', 'period' => 1, 'common_name' => 'khachhang.com'], bin2hex(random_bytes(16)));
print_r($kq);{
"product_code": "positive_ssl",
"period": 1,
"common_name": "khachhang.com"
}{
"status": "success",
"msg": "Đã nhận lệnh mua — chứng chỉ đang được cấp",
"data": {
"order_code": "131026SSLA1B2C3D4E5F6",
"common_name": "khachhang.com",
"type": "single",
"product_id": 1,
"product_code": "positive_ssl",
"period": 1,
"provision_status": "provisioning",
"charged": true,
"price_buy": 360000,
"key_source": "server",
"dcv": {
"mode": "manual",
"status": "pending",
"record": null,
"action_required": false
},
"note": "Bản ghi xác minh (dcv.record — CNAME) có ở GET /ssl/info?order_code= sau khoảng 1–3 phút: thêm vào DNS tên miền, chứng chỉ được cấp sau khi xác minh xong (POST /ssl/sync để kiểm tra ngay)."
}
}/ssl/list
Chỉ đọcMọi chứng chỉ của tài khoản (cùng khuôn /ssl/info, không kèm chứng chỉ / khoá). Mặc định bỏ đơn đã huỷ; ?status= provisioning | ready | expired | failed | cancelled. Phân trang.
GET https://cloudmoon.net/api/v1/ssl/list| Tham số | Vị trí | Bắt buộc | Mô tả |
|---|---|---|---|
status |
query | không | provisioning · ready · expired · failed · cancelled |
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/ssl/list' \
-H 'X-API-Key: ak_...'import requests
r = requests.get(
"https://cloudmoon.net/api/v1/ssl/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/ssl/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/ssl/list');
print_r($kq);{
"status": "success",
"msg": "OK",
"data": {
"items": [
{
"order_code": "131026SSLA1B2C3D4E5F6",
"common_name": "khachhang.com",
"type": "single",
"product": {
"product_id": 1,
"product_code": "positive_ssl",
"name": "SSL Tên Miền (DV)"
},
"period": 1,
"order_status": "active",
"provision_status": "ready",
"renewing": false,
"dcv": {
"mode": "manual",
"status": "validated",
"record": {
"type": "CNAME",
"name": "_3F2A9C1D7E5B4A6C8D0E1F2A3B4C5D6E.khachhang.com",
"value": "9A8B7C6D5E4F3A2B1C0D9E8F7A6B5C4D.1A2B3C4D5E6F7A8B9C0D.sectigo.com"
},
"action_required": false
},
"certificate": {
"available": true,
"issued_at": "2026-10-13T10:05:00+07:00",
"cert_expire": "2027-04-30",
"reissue_at": "2027-04-15",
"key_source": "server"
},
"billing": {
"price_buy": 360000,
"price_renew": 360000,
"renew_auto": "off",
"time_buy": "2026-10-13",
"time_expire": "2027-10-13",
"renew_open_from": "2027-09-13"
},
"allowed_actions": [
"auto_renew",
"change_cycle",
"download",
"sync",
"cancel"
]
}
],
"page": 1,
"limit": 50,
"total": 1
}
}/ssl/info
Chỉ đọcChi tiết một chứng chỉ: provision_status (provisioning · ready · expired · failed · cancelled) + renewing (đang gia hạn — chứng chỉ đang lưu, nếu có, vẫn tải được; xem cert_expire) · dcv (mode auto | manual, status, record {type, name, value} | null, action_required = cần thêm / sửa bản ghi ngay) · certificate (available, issued_at, cert_expire, reissue_at, key_source) · billing (price_renew = giá gia hạn kỳ tới, renew_open_from = ngày mở gia hạn) · allowed_actions. Không kèm chứng chỉ / khoá (xem /ssl/download).
GET https://cloudmoon.net/api/v1/ssl/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/ssl/info?order_code=131026SSLA1B2C3D4E5F6' \
-H 'X-API-Key: ak_...'import requests
r = requests.get(
"https://cloudmoon.net/api/v1/ssl/info",
headers={"X-API-Key": "ak_..."},
params={"order_code": "131026SSLA1B2C3D4E5F6"},
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/ssl/info?order_code=131026SSLA1B2C3D4E5F6", {
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/ssl/info?order_code=131026SSLA1B2C3D4E5F6');
print_r($kq);{
"status": "success",
"msg": "OK",
"data": {
"order_code": "131026SSLA1B2C3D4E5F6",
"common_name": "khachhang.com",
"type": "single",
"product": {
"product_id": 1,
"product_code": "positive_ssl",
"name": "SSL Tên Miền (DV)"
},
"period": 1,
"order_status": "active",
"provision_status": "ready",
"renewing": false,
"dcv": {
"mode": "manual",
"status": "validated",
"record": {
"type": "CNAME",
"name": "_3F2A9C1D7E5B4A6C8D0E1F2A3B4C5D6E.khachhang.com",
"value": "9A8B7C6D5E4F3A2B1C0D9E8F7A6B5C4D.1A2B3C4D5E6F7A8B9C0D.sectigo.com"
},
"action_required": false
},
"certificate": {
"available": true,
"issued_at": "2026-10-13T10:05:00+07:00",
"cert_expire": "2027-04-30",
"reissue_at": "2027-04-15",
"key_source": "server"
},
"billing": {
"price_buy": 360000,
"price_renew": 360000,
"renew_auto": "off",
"time_buy": "2026-10-13",
"time_expire": "2027-10-13",
"renew_open_from": "2027-09-13"
},
"allowed_actions": [
"auto_renew",
"change_cycle",
"download",
"sync",
"cancel"
]
}
}/ssl/sync
Chỉ đọcKiểm tra lại NGAY với nhà cấp (đã xác minh chưa · đã cấp chưa · lượt cấp lại định kỳ + bản ghi xác minh mới) rồi trả đơn như /ssl/info. Khoá chỉ đọc gọi được. Nhịp 20 giây / đơn, chung với nút "Kiểm tra" trên web (429 COOLDOWN). Đơn đang được hệ thống xử lý ⇒ trả trạng thái đang lưu kèm câu báo.
POST https://cloudmoon.net/api/v1/ssl/sync| 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 |
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_CANCELLED (409) · ORDER_EXPIRED (409) · NOT_SUPPORTED (400) · COOLDOWN (429) · IN_PROGRESS (429) · UNAVAILABLE (503).
curl -X POST 'https://cloudmoon.net/api/v1/ssl/sync' \
-H 'X-API-Key: ak_...' \
-H 'Content-Type: application/json' \
-d '{"order_code":"131026SSLA1B2C3D4E5F6"}'import requests
r = requests.post(
"https://cloudmoon.net/api/v1/ssl/sync",
headers={"X-API-Key": "ak_..."},
json={"order_code": "131026SSLA1B2C3D4E5F6"},
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/ssl/sync", {
method: "POST",
headers: {
"X-API-Key": "ak_...",
"Content-Type": "application/json",
},
body: JSON.stringify({ order_code: "131026SSLA1B2C3D4E5F6" }),
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('POST', '/v1/ssl/sync', ['order_code' => '131026SSLA1B2C3D4E5F6']);
print_r($kq);{
"order_code": "131026SSLA1B2C3D4E5F6"
}{
"status": "success",
"msg": "Đã kiểm tra — trạng thái mới nhất",
"data": {
"order_code": "131026SSLA1B2C3D4E5F6",
"common_name": "khachhang.com",
"type": "single",
"product": {
"product_id": 1,
"product_code": "positive_ssl",
"name": "SSL Tên Miền (DV)"
},
"period": 1,
"order_status": "active",
"provision_status": "ready",
"renewing": false,
"dcv": {
"mode": "manual",
"status": "validated",
"record": {
"type": "CNAME",
"name": "_3F2A9C1D7E5B4A6C8D0E1F2A3B4C5D6E.khachhang.com",
"value": "9A8B7C6D5E4F3A2B1C0D9E8F7A6B5C4D.1A2B3C4D5E6F7A8B9C0D.sectigo.com"
},
"action_required": false
},
"certificate": {
"available": true,
"issued_at": "2026-10-13T10:05:00+07:00",
"cert_expire": "2027-04-30",
"reissue_at": "2027-04-15",
"key_source": "server"
},
"billing": {
"price_buy": 360000,
"price_renew": 360000,
"renew_auto": "off",
"time_buy": "2026-10-13",
"time_expire": "2027-10-13",
"renew_open_from": "2027-09-13"
},
"allowed_actions": [
"auto_renew",
"change_cycle",
"download",
"sync",
"cancel"
]
}
}/ssl/renew
Toàn quyềnGia hạn một kỳ, trừ ví ngay — CHỈ trong 30 ngày cuối trước hạn gói (sớm hơn ⇒ 409 RENEW_NOT_OPEN; xem billing.renew_open_from). Phần ngày còn lại được giữ: hạn mới = hạn cũ + kỳ (renew_mode = renew). Đơn đã hết hạn ⇒ cấp chứng chỉ mới, hạn tính từ ngày cấp (renew_mode = new_order). Đơn đã ĐỔI CHU KỲ ⇒ lần này cấp chứng chỉ mới, số ngày còn lại KHÔNG được cộng: lần gửi đầu nhận 400 NEW_TERM_CONFIRM_REQUIRED (chưa trừ gì), gửi lại kèm accept_new_term: true. Giá = max(giá đã trả, giá hiện hành) — báo giá trước bằng /ssl/quote {order_code, type: renew}. Nhịp 60 giây / đơn (chung với đổi chu kỳ); mỗi đơn tối đa một lượt gia hạn mỗi ngày.
POST https://cloudmoon.net/api/v1/ssl/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 |
accept_new_term |
body | không | true (boolean) = chấp nhận cấp chứng chỉ mới tính từ ngày cấp khi đơn đã đổi chu kỳ (ngày còn lại không được cộng) |
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) · RENEW_NOT_OPEN (409) · RENEWING (409) · ORDER_CANCELLED (409) · ORDER_EXPIRED (409) · NEW_TERM_CONFIRM_REQUIRED (400) · IDEMPOTENCY_PENDING (409) · COOLDOWN (429) · IN_PROGRESS (429) · BUSY (429) · NOT_SUPPORTED (400) · UNAVAILABLE (503) · FAILED (400).
curl -X POST 'https://cloudmoon.net/api/v1/ssl/renew' \
-H 'X-API-Key: ak_...' \
-H 'Idempotency-Key: 7f9c2e4b-1a2b-4c3d-9e8f-0123456789ab' \
-H 'Content-Type: application/json' \
-d '{"order_code":"131026SSLA1B2C3D4E5F6"}'import uuid
import requests
r = requests.post(
"https://cloudmoon.net/api/v1/ssl/renew",
headers={"X-API-Key": "ak_...", "Idempotency-Key": str(uuid.uuid4())},
json={"order_code": "131026SSLA1B2C3D4E5F6"},
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/ssl/renew", {
method: "POST",
headers: {
"X-API-Key": "ak_...",
"Content-Type": "application/json",
"Idempotency-Key": randomUUID(),
},
body: JSON.stringify({ order_code: "131026SSLA1B2C3D4E5F6" }),
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('POST', '/v1/ssl/renew', ['order_code' => '131026SSLA1B2C3D4E5F6'], bin2hex(random_bytes(16)));
print_r($kq);{
"order_code": "131026SSLA1B2C3D4E5F6"
}{
"status": "success",
"msg": "Đã gia hạn — hạn gói mới 13/10/2028. Chứng chỉ của kỳ mới đang được cấp, chứng chỉ hiện tại vẫn dùng bình thường.",
"data": {
"order_code": "131026SSLA1B2C3D4E5F6",
"amount": 360000,
"period": 1,
"renew_mode": "renew",
"time_expire": "2028-10-13",
"provision_status": "provisioning",
"renewing": true,
"charged": true
}
}/ssl/auto-renew
Toàn quyềnBật/tắt tự gia hạn (tới hạn hệ thống tự trừ ví). ĐẶT giá trị — gửi lại cùng lệnh không lật ngược. Chỉ BẬT được khi tên miền dùng DNS tại đây trong chính tài khoản (dcv.mode = auto — để tự xác minh lại); tên miền ngoài ⇒ 400 NOT_SUPPORTED, gia hạn bằng /ssl/renew.
POST https://cloudmoon.net/api/v1/ssl/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 (boolean JSON) |
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_CANCELLED (409) · ORDER_EXPIRED (409) · NOT_SUPPORTED (400) · COOLDOWN (429) · IN_PROGRESS (429) · BUSY (429) · FAILED (400).
curl -X POST 'https://cloudmoon.net/api/v1/ssl/auto-renew' \
-H 'X-API-Key: ak_...' \
-H 'Content-Type: application/json' \
-d '{"order_code":"131026SSLA1B2C3D4E5F6","enabled":false}'import requests
r = requests.post(
"https://cloudmoon.net/api/v1/ssl/auto-renew",
headers={"X-API-Key": "ak_..."},
json={"order_code": "131026SSLA1B2C3D4E5F6", "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/ssl/auto-renew", {
method: "POST",
headers: {
"X-API-Key": "ak_...",
"Content-Type": "application/json",
},
body: JSON.stringify({ order_code: "131026SSLA1B2C3D4E5F6", 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/ssl/auto-renew', ['order_code' => '131026SSLA1B2C3D4E5F6', 'enabled' => false]);
print_r($kq);{
"order_code": "131026SSLA1B2C3D4E5F6",
"enabled": false
}{
"status": "success",
"msg": "Đã tắt tự gia hạn",
"data": {
"order_code": "131026SSLA1B2C3D4E5F6",
"renew_auto": "off"
}
}/ssl/change-cycle
Toàn quyềnĐổi sang chu kỳ DÀI hơn (số năm) — KHÔNG trừ tiền ngay, giá kỳ mới áp từ lần gia hạn kế tiếp. Lần gia hạn ấy cấp chứng chỉ mới (hạn gói tính từ ngày cấp) nên tối đa 30 ngày còn lại của gói hiện tại không được cộng — lệnh gia hạn tay sẽ hỏi xác nhận (accept_new_term); lượt tự gia hạn (nếu đang bật) thì không hỏi.
POST https://cloudmoon.net/api/v1/ssl/change-cycle| 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 |
period |
body | có | số năm mới (dài hơn 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): RENEWING (409) · ORDER_CANCELLED (409) · ORDER_EXPIRED (409) · NOT_SUPPORTED (400) · COOLDOWN (429) · IN_PROGRESS (429) · BUSY (429) · FAILED (400).
curl -X POST 'https://cloudmoon.net/api/v1/ssl/change-cycle' \
-H 'X-API-Key: ak_...' \
-H 'Content-Type: application/json' \
-d '{"order_code":"131026SSLA1B2C3D4E5F6","period":2}'import requests
r = requests.post(
"https://cloudmoon.net/api/v1/ssl/change-cycle",
headers={"X-API-Key": "ak_..."},
json={"order_code": "131026SSLA1B2C3D4E5F6", "period": 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/ssl/change-cycle", {
method: "POST",
headers: {
"X-API-Key": "ak_...",
"Content-Type": "application/json",
},
body: JSON.stringify({ order_code: "131026SSLA1B2C3D4E5F6", period: 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/ssl/change-cycle', ['order_code' => '131026SSLA1B2C3D4E5F6', 'period' => 2]);
print_r($kq);{
"order_code": "131026SSLA1B2C3D4E5F6",
"period": 2
}{
"status": "success",
"msg": "Đã đổi chu kỳ sang 2 năm — áp dụng cho lần gia hạn tiếp theo.",
"data": {
"type": "change_cycle",
"order_code": "131026SSLA1B2C3D4E5F6",
"period": 2,
"amount": 0,
"price_renew": 570000,
"note": "Áp dụng từ lần gia hạn kế tiếp — lần ấy cấp chứng chỉ mới (đặt đơn mới), hạn gói tính từ ngày cấp nên tối đa 30 ngày còn lại của gói hiện tại không được cộng (lệnh gia hạn tay sẽ hỏi xác nhận: accept_new_term; lượt tự gia hạn thì không hỏi)."
}
}/ssl/download
Toàn quyềnTệp chứng chỉ (certificate · private_key · ca_bundle · fullchain) — khoá TOÀN QUYỀN. Đơn đang gia hạn vẫn tải được chứng chỉ đang lưu (xem cert_expire); gia hạn sau khi gói đã quá hạn thì chứng chỉ cũ bị gỡ ⇒ 409 tới khi có chứng chỉ mới. Đơn đặt bằng CSR của bạn ⇒ private_key: null. Chưa cấp ⇒ 409 CERTIFICATE_NOT_READY.
GET https://cloudmoon.net/api/v1/ssl/download| 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/ssl/download?order_code=131026SSLA1B2C3D4E5F6' \
-H 'X-API-Key: ak_...'import requests
r = requests.get(
"https://cloudmoon.net/api/v1/ssl/download",
headers={"X-API-Key": "ak_..."},
params={"order_code": "131026SSLA1B2C3D4E5F6"},
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/ssl/download?order_code=131026SSLA1B2C3D4E5F6", {
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/ssl/download?order_code=131026SSLA1B2C3D4E5F6');
print_r($kq);{
"status": "success",
"msg": "OK",
"data": {
"order_code": "131026SSLA1B2C3D4E5F6",
"common_name": "khachhang.com",
"cert_expire": "2027-04-30",
"key_source": "server",
"certificate": "-----BEGIN CERTIFICATE-----...",
"private_key": "-----BEGIN PRIVATE KEY-----...",
"ca_bundle": "-----BEGIN CERTIFICATE-----...",
"fullchain": "-----BEGIN CERTIFICATE-----..."
}
}/ssl/cancel
Toàn quyềnHuỷ chứng chỉ — KHÔNG hoàn tiền (đã cấp hay chưa), không khôi phục. Bắt buộc confirm = đúng order_code. Đơn đang gia hạn ⇒ 409 RENEWING (liên hệ hỗ trợ).
POST https://cloudmoon.net/api/v1/ssl/cancel| 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ó | gõ lại đú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_CANCELLED (409) · ORDER_EXPIRED (409) · RENEWING (409) · IN_PROGRESS (429) · BUSY (429) · FAILED (400).
curl -X POST 'https://cloudmoon.net/api/v1/ssl/cancel' \
-H 'X-API-Key: ak_...' \
-H 'Content-Type: application/json' \
-d '{"order_code":"131026SSLA1B2C3D4E5F6","confirm":"131026SSLA1B2C3D4E5F6"}'import requests
r = requests.post(
"https://cloudmoon.net/api/v1/ssl/cancel",
headers={"X-API-Key": "ak_..."},
json={"order_code": "131026SSLA1B2C3D4E5F6", "confirm": "131026SSLA1B2C3D4E5F6"},
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/ssl/cancel", {
method: "POST",
headers: {
"X-API-Key": "ak_...",
"Content-Type": "application/json",
},
body: JSON.stringify({ order_code: "131026SSLA1B2C3D4E5F6", confirm: "131026SSLA1B2C3D4E5F6" }),
});
console.log(res.status, await res.json());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('POST', '/v1/ssl/cancel', ['order_code' => '131026SSLA1B2C3D4E5F6', 'confirm' => '131026SSLA1B2C3D4E5F6']);
print_r($kq);{
"order_code": "131026SSLA1B2C3D4E5F6",
"confirm": "131026SSLA1B2C3D4E5F6"
}{
"status": "success",
"msg": "Đã huỷ chứng chỉ — không hoàn tiền",
"data": {
"order_code": "131026SSLA1B2C3D4E5F6",
"order_status": "cancelled",
"provision_status": "cancelled",
"refunded": false
}
}