Tham chiếu API

API SSL/TLS

Chứng chỉ SSL DV của Sectigo cho 1 tên miền hoặc wildcard (*.tên-miền), thời hạn 1–3 năm. Mua trừ tiền NGAY rồi cấp BẤT ĐỒNG BỘ: lệnh mua trả HTTP 202 provision_status = provisioning + charged: true; hỏi /ssl/info tới khi ready. Tên miền dùng DNS tại đây trong chính tài khoản ⇒ hệ thống tự xác minh (dcv.mode = auto; chứng chỉ thường có sau 10–60 phút); tên miền ngoài ⇒ thêm bản ghi CNAME ở dcv.record (có sau 1–3 phút) rồi gọi /ssl/sync để kiểm ngay. Gửi kèm csr nếu muốn giữ khoá riêng ở máy bạn (khi ấy /ssl/download trả private_key: null). Chứng chỉ hiệu lực tối đa ~199 ngày và được tự cấp lại trong suốt thời hạn gói — tên miền ngoài phải thêm lại bản ghi mới khi dcv.action_required = true. Gia hạn chỉ mở trong 30 ngày cuối trước hạn gói (giữ nguyên phần ngày còn lại). Huỷ KHÔNG hoàn tiền.

Trên trang này
  1. Tổng quan
  2. Mua & nhận chứng chỉ
  3. Xác minh tên miền
  4. CSR & khoá riêng
  5. Trạng thái đơn
  6. Hạn chứng chỉ & cấp lại
  7. Gia hạn & đổi chu kỳ
  8. Luật riêng
  9. Nhịp thao tác
  10. Mã lỗi riêng
  11. GET /ssl/products
  12. POST /ssl/quote
  13. POST /ssl/buy
  14. GET /ssl/list
  15. GET /ssl/info
  16. POST /ssl/sync
  17. POST /ssl/renew
  18. POST /ssl/auto-renew
  19. POST /ssl/change-cycle
  20. GET /ssl/download
  21. POST /ssl/cancel

Tổng quan

Địa chỉ gốc của các endpoint trên trang này:

Base URL
https://cloudmoon.net/api/v1
EndpointViệcQuyề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.

  1. POST /ssl/buy với {product_code, period, common_name} (thêm csr nế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_source và khối dcv (cách xác minh tên miền).
  2. 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.record ngay 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.
  3. 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ằng GET /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èm order_code nế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ới Idempotency-Key mớ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/list hoặ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ặc 409 IDEMPOTENCY_PENDING khi lượt đầu chưa xong). Mất câu trả lời mà không có khoá ⇒ đối chiếu /ssl/list trướ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.
Ví dụ — HTTP 202 (tên miền tự xác minh)
{
    "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); null khi 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 name và 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ủa name. ⚠ name có thể nằm ở tên miền gốc dù chứng chỉ cho tên miền con (đặt shop.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.status chuyển revalidation_required kè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.mode thành manual: 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/download trả 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 punycode xn--…) · 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_status
order_status
Nghĩa
provisioning
pending_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.
provisioning
processing
Chờ xác minh tên miền / chờ CA cấp — đơn mua, hoặc lượt gia hạn.
ready
active
Đã cấp — tải bằng /ssl/download.
expired
pending_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).
expired
expired
Hết hạn hẳn — không thao tác được nữa (409 ORDER_EXPIRED); đặt mua chứng chỉ mới.
failed
failed
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ỷ.
cancelled
cancelled
Đã 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_dcv hay processing): 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: false là đơn mua mới.
  • allowed_actions (ở cả list lẫn info) — 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_renew có mặt nghĩa là đổi được cài đặt — riêng BẬT còn cần dcv.mode: "auto". Không tính nhịp thao tác — xem mục Nhịp thao tác.
  • list mặc định bỏ đơn đã huỷ; lọc bằng ?status= theo provision_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 đó info trả 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ước cert_expire). Cấp lại xong, certificate.cert_expire lùi ra (và reissue_at đổi) kèm email báo — nhận ra chứng chỉ mới bằng cert_expire (issued_at không đổi ở lượt cấp lại định kỳ — đừng dựa vào nó). Tải lại bằng /ssl/download rồi cài lên máy chủ trước cert_expire cũ. Gợi ý: quanh reissue_at, hỏi info mỗ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: true và dcv.record mớ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ới cert_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ì renew có mặt trong allowed_actions.
  • POST /ssl/renew trừ 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ằng quote vớ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: true tới khi CA xác nhận kỳ mới. Gia hạn xong = renewing: false + billing.time_expire mớ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 — xem certificate.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 — download nhận 409 CERTIFICATE_NOT_READY tới khi chứng chỉ mới được cấp. Trong lúc ấy gia hạn, đổi chu kỳ, huỷ nhận 409 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ằng POST /ssl/auto-renew với enabled là boolean — lệnh ĐẶT giá trị, gửi lại không lật ngược): chỉ BẬT được khi dcv.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-cycle vớ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_renew trong 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ận 400 NEW_TERM_CONFIRM_REQUIRED (chưa trừ tiền, msg nêu số ngày), gửi lại kèm accept_new_term: true — dùng lại đúng Idempotency-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ận Idempotency-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 đã sang expired, mọi lệnh nhận 409 ORDER_EXPIRED.

Luật riêng

  • Huỷ (POST /ssl/cancel, confirm = đúng order_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ới cert_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/status báo ssl: 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ận 404), 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ận 409 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ỏi info bằng mã ấy (vẫn kèm X-Sandbox: 1) — tính từ lúc mua: dưới 10 giây provisioning, chưa có bản ghi; từ giây thứ 10 có bản ghi CNAME mẫu (dcv.status manual, hoặc auto_submitted nếu tên miền tự xác minh); từ giây thứ 40 ready với chứng chỉ mẫu ~199 ngày (dcv.status: "validated"). Chứng chỉ mẫu mang tên miền sandbox-….example — mã chỉ chở sản phẩm, số năm và cờ, không chở tên miền; download trả chuỗi đánh dấu thay cho tệp thật; mua thử kèm csr ⇒ key_source: "customer" và private_key: null. Không lưu gì: huỷ hay đổi chu kỳ mô phỏng không làm info về sau đổi theo, mã không có trong list. Chứng chỉ mẫu đã ready vẫn chưa tới cửa sổ gia hạn ⇒ gia hạn chạy thử nhận 409 RENEW_NOT_OPEN, đúng như đơn thật (trong 40 giây đầu, lúc mẫu còn chờ cấp, nhận 400 NOT_SUPPORTED). Kịch bản PROVISION_FAILED ⇒ lệnh mua vẫn 202, info về failed sau 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ệnhCá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ạn5 giây (tính riêng)
Gia hạntố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.

HTTPcodeÝ nghĩaNê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.
GET

/ssl/products

Chỉ đọc

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 đã 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ộcMô tả
in_stock query không 1 = chỉ kỳ còn hàng
Yêu cầu
curl 'https://cloudmoon.net/api/v1/ssl/products' \
  -H 'X-API-Key: ak_...'
Yêu cầu
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())
Yêu cầu
// 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());
Yêu cầu
// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('GET', '/v1/ssl/products');
print_r($kq);
Phản hồi
{
    "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"
    }
}
POST

/ssl/quote

Chỉ đọc

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, 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ộcMô 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.

Yêu cầ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"}'
Yêu cầu
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())
Yêu cầu
// 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());
Yêu cầu
// 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);
Thân yêu cầu
{
    "product_code": "positive_ssl",
    "period": 1,
    "common_name": "khachhang.com"
}
Phản hồi
{
    "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
    }
}
POST

/ssl/buy

Toàn quyền

Mua 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ộcMô 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).

Yêu cầu
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"}'
Yêu cầu
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())
Yêu cầu
// 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());
Yêu cầu
// 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);
Thân yêu cầu
{
    "product_code": "positive_ssl",
    "period": 1,
    "common_name": "khachhang.com"
}
Phản hồi
{
    "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)."
    }
}
GET

/ssl/list

Chỉ đọc

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= provisioning | ready | expired | failed | cancelled. Phân trang.

GET https://cloudmoon.net/api/v1/ssl/list
Tham sốVị tríBắt buộcMô 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
Yêu cầu
curl 'https://cloudmoon.net/api/v1/ssl/list' \
  -H 'X-API-Key: ak_...'
Yêu cầu
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())
Yêu cầu
// 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());
Yêu cầu
// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('GET', '/v1/ssl/list');
print_r($kq);
Phản hồi
{
    "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
    }
}
GET

/ssl/info

Chỉ đọc

Chi 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ộcMô 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.

Yêu cầu
curl 'https://cloudmoon.net/api/v1/ssl/info?order_code=131026SSLA1B2C3D4E5F6' \
  -H 'X-API-Key: ak_...'
Yêu cầu
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())
Yêu cầu
// 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());
Yêu cầu
// 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);
Phản hồi
{
    "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"
        ]
    }
}
POST

/ssl/sync

Chỉ đọc

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ả đơ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ộcMô 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).

Yêu cầu
curl -X POST 'https://cloudmoon.net/api/v1/ssl/sync' \
  -H 'X-API-Key: ak_...' \
  -H 'Content-Type: application/json' \
  -d '{"order_code":"131026SSLA1B2C3D4E5F6"}'
Yêu cầu
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())
Yêu cầu
// 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());
Yêu cầu
// 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);
Thân yêu cầu
{
    "order_code": "131026SSLA1B2C3D4E5F6"
}
Phản hồi
{
    "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"
        ]
    }
}
POST

/ssl/renew

Toàn quyền

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_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ộcMô 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).

Yêu cầu
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"}'
Yêu cầu
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())
Yêu cầu
// 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());
Yêu cầu
// 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);
Thân yêu cầu
{
    "order_code": "131026SSLA1B2C3D4E5F6"
}
Phản hồi
{
    "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
    }
}
POST

/ssl/auto-renew

Toàn quyền

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 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ộcMô 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).

Yêu cầu
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}'
Yêu cầu
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())
Yêu cầu
// 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());
Yêu cầu
// 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);
Thân yêu cầu
{
    "order_code": "131026SSLA1B2C3D4E5F6",
    "enabled": false
}
Phản hồi
{
    "status": "success",
    "msg": "Đã tắt tự gia hạn",
    "data": {
        "order_code": "131026SSLA1B2C3D4E5F6",
        "renew_auto": "off"
    }
}
POST

/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ộcMô 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).

Yêu cầu
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}'
Yêu cầu
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())
Yêu cầu
// 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());
Yêu cầu
// 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);
Thân yêu cầu
{
    "order_code": "131026SSLA1B2C3D4E5F6",
    "period": 2
}
Phản hồi
{
    "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)."
    }
}
GET

/ssl/download

Toàn quyền

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ứ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ộcMô 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.

Yêu cầu
curl 'https://cloudmoon.net/api/v1/ssl/download?order_code=131026SSLA1B2C3D4E5F6' \
  -H 'X-API-Key: ak_...'
Yêu cầu
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())
Yêu cầu
// 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());
Yêu cầu
// 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);
Phản hồi
{
    "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-----..."
    }
}
POST

/ssl/cancel

Toàn quyền

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ạn ⇒ 409 RENEWING (liên hệ hỗ trợ).

POST https://cloudmoon.net/api/v1/ssl/cancel
Tham sốVị tríBắt buộcMô 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).

Yêu cầu
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"}'
Yêu cầu
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())
Yêu cầu
// 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());
Yêu cầu
// 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);
Thân yêu cầu
{
    "order_code": "131026SSLA1B2C3D4E5F6",
    "confirm": "131026SSLA1B2C3D4E5F6"
}
Phản hồi
{
    "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
    }
}
Zalo