Tham chiếu API

API Domain

Tên miền quốc tế. Mua trừ tiền NGAY và đăng ký luôn trong lượt gọi: thường xong ngay (HTTP 200 provision_status = ready); đuôi nào nhà đăng ký cần duyệt thêm ⇒ HTTP 202 provisioning + charged: true — hỏi /domain/info tới ready. Người đứng tên (registrant): không gửi ⇒ hồ sơ định danh của tài khoản (khai một lần ở trang Thông tin định danh trên web — thiếu ⇒ 422 IDENTITY_REQUIRED); gửi registrant ⇒ đăng ký HỘ người khác. Giá năm đầu theo nhà đăng ký đúng lúc mua (có thể đang khuyến mãi), các năm sau và gia hạn theo bảng giá — nhiều đuôi gia hạn đắt hơn hẳn năm đầu (renewal_shock).

Trên trang này
  1. Tổng quan
  2. Đăng ký & theo dõi
  3. Người đứng tên
  4. Chuyển tên miền về
  5. Trạng thái đơn
  6. Gia hạn & hết hạn
  7. DNS
  8. Luật riêng
  9. Nhịp thao tác
  10. Mã lỗi riêng
  11. GET /domain/tlds
  12. GET /domain/check
  13. GET /domain/price
  14. POST /domain/quote
  15. POST /domain/buy
  16. POST /domain/transfer
  17. GET /domain/list
  18. GET /domain/info
  19. POST /domain/renew
  20. POST /domain/auto-renew
  21. POST /domain/note
  22. POST /domain/delete
  23. GET /domain/dns/list
  24. POST /domain/dns/add
  25. POST /domain/dns/update
  26. POST /domain/dns/delete
  27. POST /domain/dns/mode

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 /domain/tlds Danh mục đuôi đang bán + bảng giá (đăng ký năm đầu theo bảng · gia hạn mỗi năm) đã trừ chiết khấu đại lý; *_original = … Chỉ đọc
GET /domain/check Tên miền còn đăng ký được không: available = nhà đăng ký báo trống VÀ chưa có đơn nào giữ tên (status in_order). Đuôi k… Chỉ đọc
GET /domain/price Giá đăng ký một tên miền: amount (= price_buy) = năm đầu theo nhà đăng ký lúc gọi + (period − 1) × giá gia hạn, đã trừ … Chỉ đọc
POST /domain/quote BÁO GIÁ — không trừ tiền, không ghi gì, khoá chỉ đọc gọi được. type register (mặc định) {domain, period?, whois_privacy… Chỉ đọc
POST /domain/buy Đăng ký tên miền — trừ tiền NGAY và đăng ký luôn trong lượt gọi (đặt thời gian chờ HTTP từ 90 giây): HTTP 200 provision… Toàn quyền
POST /domain/transfer CHUYỂN tên miền đang đăng ký ở nơi khác về đây — trừ tiền NGAY (giá chuyển về = +1 năm, đã trừ chiết khấu; báo giá: /do… Toàn quyền
GET /domain/list Mọi tên miền của tài khoản (mua trên web lẫn qua API, nhận chuyển quyền), cùng khuôn /domain/info (kèm allowed_actions)… Chỉ đọc
GET /domain/info Chi tiết một tên miền: provision_status (provisioning · ready · failed · expired · suspended · cancelled · transferred_… Chỉ đọc
POST /domain/renew Gia hạn — trừ ví NGAY: amount = giá gia hạn mỗi năm hiện hành × period, đã trừ chiết khấu (báo giá: /domain/quote type … Toàn quyền
POST /domain/auto-renew ĐẶT tự gia hạn (không lật — gửi lại cùng giá trị vẫn thành công). Bật ⇒ khi còn ≤ 7 ngày tới billing.time_expire (kể cả… Toàn quyền
POST /domain/note Ghi chú riêng của tài khoản cho một tên miền (≤ 200 ký tự, bỏ thẻ HTML; rỗng = xoá). Đọc lại ở user_note của /domain/in… Toàn quyền
POST /domain/delete XOÁ tên miền khỏi danh sách quản lý — KHÔNG hoàn tiền, không khôi phục được (confirm = order_code). Tên miền VẪN đăng k… Toàn quyền
GET /domain/dns/list Bản ghi DNS (bản lưu tại đây là nguồn đúng) + dns_mode. name rỗng = gốc tên miền (@). sync: synced · pending (đang đẩy … Chỉ đọc
POST /domain/dns/add Thêm bản ghi: A · AAAA · CNAME (không ở gốc) · TXT · MX (priority) · NS (không ở gốc) · SRV (tên _dịch-vụ._giao-thức nh… Toàn quyền
POST /domain/dns/update Sửa một bản ghi (record_id lấy từ /domain/dns/list). Máy chủ DNS chối ⇒ 400 và bản ghi GIỮ giá trị cũ; tạm hỏng ⇒ sync … Toàn quyền
POST /domain/dns/delete Xoá một bản ghi. Máy chủ DNS xoá hỏng ⇒ 503 UNAVAILABLE và bản ghi GIỮ NGUYÊN — gửi lại sau ít phút. Toàn quyền
POST /domain/dns/mode Đổi chế độ DNS: external_ns + ns (2–13 hostname) ⇒ trỏ sang nameserver riêng (bản ghi tại đây giữ lại nhưng thôi có hiệ… 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ý — cả giá gia hạn mỗi năm (billing.price_renew). — xem mục Tài khoản đại lý.

Đăng ký & theo dõi

Lệnh mua trừ tiền và đăng ký luôn trong lượt gọi — thường xong ngay trong câu trả lời, nhưng một lượt có thể mất tới khoảng một phút: đặt thời gian chờ HTTP từ 90 giây.

  1. GET /domain/check?domain=… cho biết tên còn đăng ký được không (available). Muốn biết đúng số sẽ trừ thì gọi POST /domain/quote với {domain, period} (khoá Chỉ đọc gọi được): nó chạy đúng bộ kiểm của lệnh mua — tên, đuôi, số năm, người đứng tên, còn trống, giá năm đầu theo nhà đăng ký — rồi trả amount (số sẽ trừ) và enough (số dư khả dụng đủ chưa).
  2. POST /domain/buy với {domain, period} (thêm registrant nếu đăng ký hộ người khác — mục Người đứng tên) và header Idempotency-Key: hệ thống kiểm lại hết rồi trừ ví và gửi đăng ký. Thường nhận HTTP 200 + provision_status: "ready": tên miền đã đăng ký xong. Vùng DNS tại đây được dựng ngay sau đó — sửa bản ghi được khi dns_status là ready (dns có trong allowed_actions); sớm hơn ⇒ 409 DNS_NOT_READY, thử lại sau ít phút.
  3. Đuôi nào nhà đăng ký cần duyệt thêm ⇒ HTTP 202 + provisioning + charged: true: đơn đã tồn tại — hỏi GET /domain/info?order_code=… mỗi vài phút tới khi ready.
  • Đã trừ tiền mà nhà đăng ký chối ⇒ HTTP 200 + provision_status: "failed" + charged: true (ví dụ dưới). Tiền không tự hoàn — bộ phận hỗ trợ được báo và xử lý (đăng ký lại, hoặc hoàn tiền nếu không làm tiếp được). Đừng gửi lại lệnh mua.
  • Lệnh bị chối ở bước kiểm — tên đã có người đăng ký (409 DOMAIN_UNAVAILABLE), thiếu tiền, thiếu thông tin người đứng tên, đuôi không bán… — thì chưa trừ đồng nào. 409 PRICE_CHANGED: giá năm đầu theo nhà đăng ký vừa cao hơn lúc kiểm — 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ả — đừng mua lại ngay: đối chiếu /domain/list hoặc liên hệ hỗ trợ trước.
  • Hết thời gian chờ, mất câu trả lời: gửi lại với đúng Idempotency-Key cũ ⇒ nhận lại kết quả lần đầu (hoặc 409 IDEMPOTENCY_PENDING khi lượt đầu chưa xong). Gửi lại cùng tên mà không kèm khoá ⇒ 409 DOMAIN_UNAVAILABLE (đơn của lượt đầu đang giữ tên) — không bị trừ hai lần, nhưng hãy đối chiếu /domain/list để biết lượt đầu ra sao.
  • Giá: năm đầu theo nhà đăng ký đúng lúc mua (có thể đang khuyến mãi — is_promo), các năm sau và mọi lần gia hạn theo bảng giá gia hạn. Nhiều đuôi gia hạn đắt hơn hẳn năm đầu (renewal_shock: 1) — xem price_renew trước khi mua. Bảng giá ở /domain/tlds cập nhật mỗi ngày; số chính xác cho một tên cụ thể là /domain/quote.
  • Một lệnh mua đăng ký từ 1 tới 10 năm (max_period ở /domain/tlds; vượt ⇒ 400 + data.max_period). Tên miền premium (giá riêng do registry đặt) chưa bán qua đây (400 NOT_SUPPORTED).
Ví dụ — HTTP 200, đã trừ tiền nhưng nhà đăng ký chối
{
    "status": "success",
    "msg": "Đã trừ tiền nhưng tên miền chưa đăng ký được — hỗ trợ sẽ xử lý",
    "data": {
        "order_code": "151026DOMAINHNFPVZRQWUOD",
        "domain": "ten-mien-cua-ban.com",
        "period": 1,
        "provision_status": "failed",
        "order_status": "register_failed",
        "charged": true,
        "price_buy": 418950,
        "need_info": false,
        "time_expire": "",
        "registrant_source": "request",
        "note": "Đã trừ tiền nhưng nhà đăng ký chưa nhận tên miền — bộ phận hỗ trợ sẽ xử lý (không cần gửi lại lệnh)."
    }
}

Người đứng tên

Mỗi tên miền có một người đứng tên (registrant) — chủ sở hữu ghi ở nhà đăng ký. Lệnh mua và lệnh chuyển về chọn người đứng tên theo một trong hai cách:

  • Không gửi registrant ⇒ dùng hồ sơ Thông tin định danh của tài khoản (khai một lần ở trang tài khoản trên web; email người đứng tên là email tài khoản). Hồ sơ còn thiếu ⇒ 422 IDENTITY_REQUIRED với data.fields (các trường còn thiếu) và data.link (trang cần khai) — chưa trừ tiền; khai xong gửi lại được bằng đúng Idempotency-Key cũ.
  • Gửi registrant ⇒ đăng ký hộ người khác (khách của bạn) với thông tin trong lệnh. Hồ sơ của tài khoản không bị đổi.
Trường của registrantQuy tắc
name cóHọ tên, tối đa 100 ký tự — chữ cái, khoảng trắng và . ' - (chữ có dấu được tự bỏ dấu).
emailEmail người đứng tên. Bỏ trống ⇒ email của tài khoản đang gọi.
phone cóDạng quốc tế E.164, vd +84901234567.
address có3–255 ký tự — chữ, số, khoảng trắng và , . - /.
city cóTối đa 100 ký tự — chữ, khoảng trắng và . ' -.
zip cóMã bưu chính: Việt Nam 4–10 chữ số; nước khác 2–10 ký tự (chữ, số, khoảng trắng, -).
country cóMã quốc gia ISO 2 chữ cái: VN, US, GB…
company · stateTuỳ chọn — tên tổ chức · tỉnh / bang, mỗi trường tối đa 100 ký tự.
  • Sai ⇒ 422 INVALID_REGISTRANT với data.fields = {trường: lý do} — chưa trừ tiền, sửa rồi gửi lại cùng Idempotency-Key được. Nhà đăng ký cũng có thể chối dữ liệu (email, số điện thoại, quốc gia) ⇒ cùng mã. /domain/quote kiểm registrant y như lệnh mua.
  • ⚠ Xác minh email: sau khi đăng ký, nhà đăng ký có thể gửi thư xác minh tới email người đứng tên (với địa chỉ chưa từng xác minh). Không xác nhận trong 14 ngày ⇒ tên miền bị tạm khoá — ngừng phân giải — tới khi xác minh. Đăng ký hộ thì dùng email mà chính người ấy đọc được.
  • Người đứng tên gắn với tên miền lúc đăng ký: sửa hồ sơ về sau chỉ áp cho tên miền đăng ký sau đó. Đổi người đứng tên của tên miền đang có không làm qua API — liên hệ hỗ trợ (đổi tên, tổ chức hoặc email người đứng tên có thể khoá việc chuyển nhà đăng ký 60 ngày theo quy định chung của tên miền quốc tế).
  • registrant ở info / list: {source, name, company, country, email} — source là profile (hồ sơ tài khoản) hoặc request (khai trong lệnh), email đã che bớt. Chỉ tài khoản đã khai bộ người đứng tên ấy mới thấy chi tiết; tên miền nhận qua chuyển quyền hoặc mua trên Chợ ⇒ {"source": "other"}; tên miền mua trước 15/10/2026 ⇒ null.
  • WHOIS privacy (whois_privacy ở lệnh mua): bật ⇒ thông tin người đứng tên được che trên tra cứu WHOIS công khai (với các đuôi hỗ trợ). Không gửi ⇒ theo whois_privacy_default của /domain/tlds (hiện: bật).

Chuyển tên miền về

  1. Ở nhà đăng ký hiện tại: mở khoá chuyển (transfer lock) và lấy mã chuyển (auth code / EPP). Tên miền vừa đăng ký hoặc vừa chuyển nhà trong 60 ngày thì chưa chuyển được.
  2. POST /domain/quote với {"type": "transfer", "domain": "…"} — giá chuyển về theo nhà đăng ký đúng lúc hỏi, đã trừ chiết khấu (gồm 1 năm hạn: chuyển xong, hạn tên miền được cộng thêm 1 năm). Báo giá không giữ giá: lệnh chuyển hỏi lại giá lúc nó tới và trừ theo giá ấy; giá tăng ngay giữa lúc lệnh kiểm và lúc trừ ⇒ 409 PRICE_CHANGED, chưa trừ tiền. Tên chưa đăng ký ở đâu ⇒ 409 DOMAIN_NOT_REGISTERED — đăng ký mới bằng /domain/buy.
  3. POST /domain/transfer với {domain, auth_code} (thêm registrant như lệnh mua) và Idempotency-Key: trừ ví ngay rồi gửi lệnh chuyển ⇒ HTTP 202, provision_status: "provisioning", charged: true.
  4. Nhà đăng ký cũ và registry duyệt — thường 5–7 ngày. Hỏi info thưa thôi (vài giờ một lần) tới khi ready.
  • Nhà đăng ký chối ngay (mã chuyển sai, tên miền còn khoá, chưa đủ 60 ngày) ⇒ HTTP 200 + failed + charged: true — tiền không tự hoàn, bộ phận hỗ trợ xử lý; đừng gửi lại lệnh. Hãy kiểm mã chuyển và khoá chuyển trước khi gửi.
  • ⚠ DNS sau khi chuyển: chuyển xong, tên miền được trỏ về DNS quản lý tại đây với một vùng DNS mới chưa có bản ghi nào. Khi đơn ready và dns_status: "ready", thêm bản ghi (/domain/dns/add) hoặc trỏ sang nameserver riêng (/domain/dns/mode) — không thì website và email dùng tên miền sẽ ngừng hoạt động tới lúc ấy.
  • auth_code: 1–255 ký tự in được, không khoảng trắng. Mã chuyển không bao giờ được trả lại qua API.
  • Trong lúc chuyển, đơn chỉ đổi được tự gia hạn và ghi chú; lượt chuyển về tính chung giới hạn lượt mua mỗi giờ với lệnh mua (mục Luật riêng).

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
processing
Đang đăng ký (nhà đăng ký chưa duyệt xong) hoặc đang chuyển về.
provisioning
pending_info
Chỉ còn ở đơn cũ: chờ khai thông tin định danh — khai ở trang Thông tin định danh để đơn chạy tiếp.
ready
active
Đang hoạt động.
failed
register_failed
Đã trừ tiền nhưng nhà đăng ký chối (đăng ký hoặc chuyển về) — bộ phận hỗ trợ xử lý, không tự hoàn. Lệnh còn làm được: ghi chú.
expired
pending_expired
Đã quá hạn bạn trả (billing.time_expire). Khi hạn ở nhà đăng ký (time_expire) cũng đã qua, nhà đăng ký đã huỷ tên miền — website / email ngừng; gia hạn lúc này được hệ thống tự chuộc lại theo giá gia hạn thường. Còn gia hạn được tối đa 30 ngày kể từ ngày hết hạn (tuỳ đuôi tên miền — vài đuôi không cho gia hạn sau ngày hết hạn).
expired
expired
Hết hạn hẳn — không gia hạn được nữa (409 ORDER_EXPIRED), vùng DNS tại đây đã gỡ; chỉ còn ghi chú và xoá khỏi danh sách.
suspended
suspended
Bị tạm ngưng bởi bộ phận hỗ trợ — chỉ ghi chú và xem bản ghi DNS được; liên hệ hỗ trợ.
cancelled
cancelled
Đã xoá khỏi danh sách quản lý (hoặc đơn đã huỷ) — lệnh nhận 409 ORDER_CANCELLED.
transferred_out
transferred_out
Đã chuyển sang nhà đăng ký khác — chỉ còn ghi chú và xoá khỏi danh sách.
  • 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ý tên miền: renew · auto_renew · note · delete · dns (thêm / sửa / xoá bản ghi) · dns_mode. Tên nào vắng mặt thì lệnh ấy đang bị chối — vd renew vắng khi hôm nay tên miền đã được gia hạn hoặc hạn đã chạm trần 10 năm. Không tính nhịp thao tác — xem mục Nhịp thao tác.
  • billing.time_expire (= time_expire_moon) là ngày bạn đã trả tới — mốc của mọi luật hết hạn. time_expire là hạn đang ghi ở nhà đăng ký: thường khớp ngay sau lệnh gia hạn; khi registrar_renewed: false nó đứng nguyên tới lúc hệ thống gia hạn lại ở nhà đăng ký (chậm nhất quanh ngày hết hạn ở đó) — đừng gửi lại lệnh gia hạn vì nó.
  • charged luôn là true: mọi đơn tên miền được tạo cùng lượt trừ tiền. billing.price_renew = giá gia hạn 1 năm hiện hành, đã trừ chiết khấu (price_renew_est là số ước tính cũ lưu trên đơn, chưa trừ chiết khấu — giữ cho tích hợp cũ).
  • list trả mọi tên miền của tài khoản — mua trên web lẫn qua API, nhận chuyển quyền — mới nhất trước; lọc bằng ?status= theo provision_status (nhận cả giá trị order_status).

Gia hạn & hết hạn

  • POST /domain/renew với {order_code, period} trừ ví ngay: giá = giá gia hạn niêm yết hiện hành × số năm, trừ chiết khấu (làm tròn xuống trên tổng — có thể lệch vài đồng so với billing.price_renew × số năm; nhà đăng ký có thể đổi giá theo năm). Số chính xác là amount của báo giá với đúng period: quote với {"type": "renew", "order_code": "…", "period": …}. Hạn mới = billing.time_expire cộng số năm — kể cả khi gia hạn trễ (những ngày tên miền đã ngừng không được bù, như mọi nhà đăng ký).
  • Tổng hạn tối đa 10 năm tính từ hôm nay: vượt ⇒ 400 BAD_REQUEST + data.max_years (số năm còn gia hạn được — báo giá cũng trả max_years). Mỗi tên miền một lượt gia hạn mỗi ngày, tính cả gia hạn trên web và tự gia hạn: lượt thứ hai ⇒ 429 COOLDOWN, Retry-After tới 0 giờ.
  • registrar_renewed: false trong câu trả lời ⇒ tiền đã thu và hạn đã cộng, còn phần gia hạn ở nhà đăng ký sẽ được hệ thống tự làm lại — đừng gửi lại lệnh.
  • Tự gia hạn (billing.renew_auto; đổi bằng POST /domain/auto-renew với enabled là boolean — lệnh ĐẶT giá trị, gửi lại cùng giá trị không lật ngược): khi còn 7 ngày hoặc ít hơn tới billing.time_expire — kể cả khi đã quá hạn — hệ thống tự trừ ví gia hạn 1 năm, cùng giá với gia hạn tay. Lượt tự gia hạn chạy khi số dư đủ đúng số sẽ trừ — giá gia hạn 1 năm hiện hành đã trừ chiết khấu (billing.price_renew); thiếu ⇒ bỏ qua, thử lại ở lượt kiểm sau (mỗi giờ).
  • Quá hạn: qua billing.time_expire mà chưa gia hạn, đơn chuyển pending_expired (provision_status: "expired") — đã quá hạn bạn trả tại đây; khi hạn ở nhà đăng ký (time_expire) cũng đã qua, nhà đăng ký đã huỷ tên miền — website / email ngừng. Vẫn gia hạn được tối đa 30 ngày kể từ ngày hết hạn (tuỳ đuôi — vài đuôi không cho gia hạn sau ngày hết hạn) đúng giá gia hạn thường: hệ thống tự chuộc lại ở nhà đăng ký, đơn về active ngay khi lệnh thành công, tên miền có thể mất tới 1–2 ngày để chạy lại ở mọi nơi (registrar_renewed: false = nhà đang xử lý, hệ thống tự làm tiếp — đừng gửi lại lệnh). Trước khi trừ tiền, hệ thống hỏi nhà đăng ký: chưa hỏi được ⇒ 503 UNAVAILABLE · nhà đang chuộc ⇒ 429 IN_PROGRESS — chưa trừ tiền, gửi lại sau (kể cả cùng Idempotency-Key). Quá hạn chót ⇒ 409 ORDER_EXPIRED: không gia hạn / không chuộc được nữa, đơn chuyển expired, vùng DNS tại đây bị gỡ; lúc tên miền được thả cho người khác đăng ký do registry quyết. Đừng để tới hạn: bật tự gia hạn hoặc gia hạn sớm.
  • Dịch vụ tên miền tạm dừng bán (bảo trì) hay đuôi ngừng bán đều không chặn gia hạn tên miền đang có.

DNS

  • dns_mode: cloudmoon_managed — DNS quản lý tại đây (mặc định khi mua; nameserver ns1.systemcloudvps.com · ns2.systemcloudvps.com) · external_ns — tên miền trỏ sang nameserver riêng của bạn, bản ghi quản lý ở nơi ấy. Đổi bằng POST /domain/dns/mode: external_ns kèm ns (2–13 hostname); về cloudmoon_managed thì tên miền trỏ lại DNS tại đây với các bản ghi đã lưu (vùng DNS chưa có thì được dựng trước khi trỏ nameserver; dựng hỏng ⇒ 503 UNAVAILABLE, chưa đổi gì). Nameserver mới cần vài giờ để có hiệu lực trên toàn mạng.
  • Bản ghi đọc ở GET /domain/dns/list — bản lưu tại đây là nguồn đúng. name rỗng hoặc @ là gốc tên miền; tên con nhiều cấp và wildcard *. được.
  • Loại bản ghi: A · AAAA · CNAME (không đặt ở gốc) · MX (priority 0–65535) · TXT (tối đa 2000 ký tự) · NS (chỉ cho tên con — muốn dùng nameserver riêng cho cả tên miền thì đổi dns_mode) · SRV (tên dạng _dịch-vụ._giao-thức, vd _sip._tcp; priority 0–65535; value = trọng-số cổng máy-đích, vd 5 5060 sip.example.com; 0 0 . = tên miền không có dịch vụ này) · CAA (value = cờ thẻ giá-trị, vd 0 issue letsencrypt.org — thẻ issue · issuewild · iodef, giá trị không chứa dấu nháy kép hay gạch ngược; hệ thống lưu giá trị trong nháy kép: 0 issue "letsencrypt.org"). TTL do hệ thống tự đặt (ngắn khi bạn vừa sửa, dài dần khi bản ghi ổn định). Tối đa 200 bản ghi mỗi tên miền (vượt ⇒ 400 + data.max_records).
  • sync của mỗi bản ghi: synced — đã có hiệu lực · pending — đã lưu, máy chủ DNS tạm lỗi nên hệ thống tự đẩy lại trong vài phút · error — đẩy chưa được, hệ thống đang thử lại (kéo dài thì liên hệ hỗ trợ).
  • Máy chủ DNS chối một bản ghi (vd CNAME trùng tên với bản ghi khác) ⇒ 400: bản ghi mới không được lưu, bản ghi đang sửa giữ giá trị cũ. Xoá mà máy chủ DNS chưa xoá được ⇒ 503 UNAVAILABLE, bản ghi giữ nguyên — gửi lại sau ít phút.
  • Sửa DNS cần tên miền đang hoạt động và dùng DNS tại đây (409 DNS_EXTERNAL khi đang dùng nameserver riêng · 409 DNS_NOT_READY khi vùng DNS chưa dựng xong). Tên miền quá hạn hoặc bị tạm ngưng vẫn xem được bản ghi, không sửa được.

Luật riêng

  • Xoá khỏi danh sách (POST /domain/delete, confirm = đúng order_code): không hoàn tiền, không khôi phục được. Tên miền vẫn đăng ký ở nhà đăng ký tới hết hạn rồi tự hết (tự gia hạn bị tắt), và vùng DNS tại đây bị gỡ — tên miền đang dùng DNS tại đây sẽ ngừng phân giải. Bị chối khi tên miền đang đăng ký / chuyển về, gặp sự cố chờ hỗ trợ, bị tạm ngưng, hoặc đang rao bán trên Chợ.
  • Dịch vụ tên miền tạm dừng bán: tlds · check · price · báo giá mua / chuyển về · lệnh mua · lệnh chuyển về nhận 503 SERVICE_DISABLED (GET /services/status báo domain: false); gia hạn, báo giá gia hạn, info, list, DNS, tự gia hạn, ghi chú, xoá vẫn chạy bình thường. Một đuôi ngừng bán thì không còn trong /domain/tlds (kiểm tên, báo giá, mua, chuyển về nhận 404), còn tên miền đã có của đuôi ấy vẫn gia hạn và dùng DNS bình thường.
  • Giới hạn lệnh mua qua API: tối đa 10 lượt mua + chuyển về tên miền mỗi giờ (gộp chung, đếm cả lượt trên web — 429 RATE_LIMITED), tính riêng với các sản phẩm khác. Số dư xét lệnh mua là số dư khả dụng — đã trừ tiền các lệnh mua Cloud VPS còn chờ tạo máy.
  • Không làm qua API: lấy mã chuyển đi / chuyển tên miền sang nhà đăng ký khác · đổi người đứng tên của tên miền đang có · chuyển quyền sang tài khoản khác · rao bán trên Chợ · xem nhật ký đơn — dùng trang quản lý tên miền trên web.
  • Chạy thử (X-Sandbox: 1): kiểm tên, giá và báo giá không hỏi nhà đăng ký — check trả status: "simulated" (chỉ biết tên có đang được một đơn tại đây giữ không), giá năm đầu lấy theo bảng giá (realtime: false). Lệnh mua trả mã SANDBOX… (26 ký tự): hỏi info bằng mã ấy (vẫn kèm X-Sandbox: 1) ⇒ tên miền mẫu sandbox-….<đuôi> ở ready ngay, hạn = hôm mua + số năm; kịch bản PROVISION_FAILED ⇒ lệnh mua 202, info ở provisioning 10 giây đầu rồi failed. Lệnh chuyển về thử ⇒ 202, provisioning 10 giây đầu rồi ready (failed với PROVISION_FAILED). Mã chỉ chở đuôi, số năm và cờ — không chở tên miền. Gia hạn, tự gia hạn, ghi chú, xoá, DNS trên đơn mẫu đi đủ các bước kiểm rồi trả mô phỏng; dns/list trả hai bản ghi mẫu. Không lưu gì: mã không có trong list, lệnh mô phỏng không làm info về sau đổi theo.

Nhịp thao tác trên cùng một tên miền

Các lệnh trên cùng một tên miền 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 tên miền
Gia hạn1 phút
Bật/tắt tự gia hạn5 giây (tính riêng)
Gia hạntối đa 1 lượt / ngày / tên miền (tính cả gia hạn trên web và tự gia hạn — lượt thứ hai ⇒ 429 COOLDOWN, Retry-After tới 0 giờ)
Xoá · đổi chế độ DNSkhông phải chờ (chỉ một lệnh mỗi lúc trên cùng tên miền (429 IN_PROGRESS))
Ghi chú · thêm / sửa / xoá bản ghi DNSkhông phải chờ (hai lệnh cùng lúc trên một tên miền thì lệnh sau chờ tối đa 10 giây, quá ⇒ 429 BUSY)

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ì
409 PRICE_CHANGED Giá năm đầu (theo nhà đăng ký, đúng lúc trừ tiền) vừa cao hơn lúc kiểm — lệnh mua CHƯA trừ đồng nào. Báo giá lại (/domain/quote) rồi gửi lệnh mua mới (Idempotency-Key mới).
409 DOMAIN_UNAVAILABLE Tên miền đã có người đăng ký, hoặc đang có một đơn khác giữ tên ấy — lệnh mua CHƯA trừ tiền. Chọn tên khác — hỏi /domain/check trước khi mua.
422 IDENTITY_REQUIRED Tài khoản chưa khai đủ thông tin định danh (người đứng tên tên miền) mà lệnh không gửi registrant — CHƯA trừ tiền. data.fields = các trường còn thiếu / sai của hồ sơ. Khai một lần ở trang Thông tin định danh của tài khoản (web), hoặc gửi registrant trong lệnh (đăng ký hộ người khác). Gửi lại được bằng đúng Idempotency-Key cũ.
422 INVALID_REGISTRANT Người đứng tên trong registrant không hợp lệ, hoặc bị nhà đăng ký chối — CHƯA trừ tiền. data.fields = {trường: lý do}. Sửa đúng các trường rồi gửi lại.
400 NOT_SUPPORTED Tên miền premium (giá riêng do nhà đăng ký đặt) — chưa hỗ trợ bán; hoặc thao tác chưa làm được cho tên miền này (vd giá gia hạn chưa có). Chọn tên khác / liên hệ hỗ trợ.
400 CONFIRM_REQUIRED Lệnh xoá thiếu trường xác nhận. Gửi confirm bằng đúng order_code — xoá khỏi danh sách không khôi phục được và KHÔNG hoàn tiền.
409 DOMAIN_NOT_REGISTERED Tên miền chưa được đăng ký ở đâu nên không chuyển về được — lệnh CHƯA trừ tiền. Đăng ký mới bằng /domain/buy.
409 PROVISIONING Tên miền đang được đăng ký / chuyển về — lúc này chỉ đổi tự gia hạn và ghi chú được. Hỏi /domain/info tới khi provision_status = ready.
409 ORDER_FAILED Đơn đăng ký / chuyển về gặp sự cố SAU khi đã trừ tiền — bộ phận hỗ trợ đang xử lý (hoàn tiền nếu không làm tiếp được); chỉ ghi chú được. Liên hệ hỗ trợ kèm order_code — ⛔ đừng đặt lại.
409 SUSPENDED Tên miền đang bị tạm ngưng — chỉ ghi chú và xem bản ghi DNS được. Liên hệ hỗ trợ.
409 RENEW_REQUIRED Tên miền đã quá hạn — chỉ gia hạn, tự gia hạn, ghi chú, xem bản ghi DNS và xoá khỏi danh sách được. Gia hạn (/domain/renew) rồi thao tác lại.
409 ORDER_EXPIRED Tên miền đã hết hạn hẳn — chỉ còn ghi chú / xoá khỏi danh sách. Đăng ký lại (nếu tên còn trống).
409 TRANSFERRED_OUT Tên miền đã chuyển sang nhà đăng ký khác — chỉ còn ghi chú / xoá khỏi danh sách. Không thao tác được nữa.
409 ORDER_CANCELLED Tên miền đã bị xoá khỏi danh sách quản lý (hoặc đơn đã huỷ). Không thao tác được nữa.
409 LISTED_ON_MARKETPLACE Tên miền đang được rao bán trên chợ — xoá bị chặn. Huỷ tin rao trên web rồi gửi lại.
409 DNS_EXTERNAL Tên miền đang dùng nameserver riêng — bản ghi DNS quản lý ở nhà cung cấp DNS của bạn. Muốn quản lý DNS tại đây: /domain/dns/mode với mode: cloudmoon_managed.
409 DNS_NOT_READY Vùng DNS của tên miền chưa sẵn sàng. Thử lại sau ít phút; vẫn vậy ⇒ /domain/dns/mode với mode: cloudmoon_managed (tạo lại vùng) hoặc liên hệ hỗ trợ.
429 COOLDOWN Đơn vừa nhận lệnh cùng nhóm (gia hạn: 60 giây · tự gia hạn: 5 giây), hoặc hôm nay tên miền đã có một lượt gia hạn (Retry-After tới 0 giờ). Chờ Retry-After giây.
429 IN_PROGRESS Đơn đang xử lý một lệnh khác (hai lệnh cùng lúc trên một tên miền). Chờ Retry-After giây rồi gửi lại.
GET

/domain/tlds

Chỉ đọc

Danh mục đuôi đang bán + bảng giá (đăng ký năm đầu theo bảng · gia hạn mỗi năm) đã trừ chiết khấu đại lý; *_original = giá gốc. renewal_shock = 1 khi giá gia hạn cao hơn hẳn năm đầu. max_period = số năm tối đa của một lệnh mua. Giá năm đầu thật lấy theo nhà đăng ký lúc mua — báo giá chính xác bằng /domain/quote.

GET https://cloudmoon.net/api/v1/domain/tlds

Không có tham số — chỉ cần header X-API-Key.

Yêu cầu
curl 'https://cloudmoon.net/api/v1/domain/tlds' \
  -H 'X-API-Key: ak_...'
Yêu cầu
import requests

r = requests.get(
    "https://cloudmoon.net/api/v1/domain/tlds",
    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/domain/tlds", {
  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/domain/tlds');
print_r($kq);
Phản hồi
{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "tld": "com",
                "name": ".com",
                "tier": "popular",
                "price_register": 427770,
                "price_renew": 427770,
                "price_register_original": 441000,
                "price_renew_original": 441000,
                "renewal_shock": 0
            }
        ],
        "total": 1,
        "discount_percent": 3,
        "max_period": 10,
        "whois_privacy_default": true,
        "currency": "VND"
    }
}
GET

/domain/check

Chỉ đọc

Tên miền còn đăng ký được không: available = nhà đăng ký báo trống VÀ chưa có đơn nào giữ tên (status in_order). Đuôi không bán ⇒ 404 NOT_FOUND. is_premium = tên giá riêng (chưa bán).

GET https://cloudmoon.net/api/v1/domain/check
Tham sốVị tríBắt buộcMô tả
domain query có vd example.com
Yêu cầu
curl 'https://cloudmoon.net/api/v1/domain/check?domain=ten-mien-cua-ban.com' \
  -H 'X-API-Key: ak_...'
Yêu cầu
import requests

r = requests.get(
    "https://cloudmoon.net/api/v1/domain/check",
    headers={"X-API-Key": "ak_..."},
    params={"domain": "ten-mien-cua-ban.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/domain/check?domain=ten-mien-cua-ban.com", {
  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/domain/check?domain=ten-mien-cua-ban.com');
print_r($kq);
Phản hồi
{
    "status": "success",
    "msg": "OK",
    "data": {
        "domain": "ten-mien-cua-ban.com",
        "available": true,
        "status": "free",
        "is_premium": false
    }
}
GET

/domain/price

Chỉ đọc

Giá đăng ký một tên miền: amount (= price_buy) = năm đầu theo nhà đăng ký lúc gọi + (period − 1) × giá gia hạn, đã trừ chiết khấu; price_renew (= price_renew_year) = giá gia hạn mỗi năm đã trừ chiết khấu. realtime: false ⇒ năm đầu lấy theo bảng giá. period 1 … max_period.

GET https://cloudmoon.net/api/v1/domain/price
Tham sốVị tríBắt buộcMô tả
domain query có —
period query không số năm, mặc định 1
Yêu cầu
curl 'https://cloudmoon.net/api/v1/domain/price?domain=ten-mien-cua-ban.com' \
  -H 'X-API-Key: ak_...'
Yêu cầu
import requests

r = requests.get(
    "https://cloudmoon.net/api/v1/domain/price",
    headers={"X-API-Key": "ak_..."},
    params={"domain": "ten-mien-cua-ban.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/domain/price?domain=ten-mien-cua-ban.com", {
  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/domain/price?domain=ten-mien-cua-ban.com');
print_r($kq);
Phản hồi
{
    "status": "success",
    "msg": "OK",
    "data": {
        "domain": "ten-mien-cua-ban.com",
        "period": 1,
        "price_buy": 418950,
        "price_renew_year": 427770,
        "discount_percent": 3,
        "is_promo": false,
        "realtime": true,
        "amount": 418950,
        "amount_original": 431900,
        "price_renew": 427770,
        "price_renew_original": 441000,
        "renewal_shock": 0,
        "max_period": 10,
        "currency": "VND"
    }
}
POST

/domain/quote

Chỉ đọc

BÁO GIÁ — không trừ tiền, không ghi gì, khoá chỉ đọc gọi được. type register (mặc định) {domain, period?, whois_privacy?, registrant?}: CÙNG bộ kiểm với lệnh mua (tên · đuôi · số năm · người đứng tên · còn trống · giá năm đầu theo nhà đăng ký) ⇒ báo giá được thì lệnh mua chỉ còn hỏng vì số dư hoặc có người vừa mua mất tên. type transfer {domain, registrant?}: giá chuyển về (+1 năm), tên miền phải đang đăng ký ở nơi khác (chưa đăng ký ⇒ 409 DOMAIN_NOT_REGISTERED). type renew {order_code, period?}: giá gia hạn + hạn mới (time_expire) + max_years (số năm tối đa còn gia hạn được — trần 10 năm tính từ hôm nay); bảo trì không chặn báo giá gia hạn. enough so với available_balance (= số dư − tiền các lệnh mua VPS còn chờ tạo máy; báo giá gia hạn so với số dư).

POST https://cloudmoon.net/api/v1/domain/quote
Tham sốVị tríBắt buộcMô tả
type body không register | transfer | renew (mặc định register)
domain body không register · transfer
period body không số năm (register · renew), mặc định 1
whois_privacy body không register: true / false (mặc định: whois_privacy_default)
registrant body không register · transfer — người đứng tên, như /domain/buy
order_code body không renew

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/domain/quote' \
  -H 'X-API-Key: ak_...' \
  -H 'Content-Type: application/json' \
  -d '{"domain":"ten-mien-cua-ban.com","period":1}'
Yêu cầu
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/domain/quote",
    headers={"X-API-Key": "ak_..."},
    json={"domain": "ten-mien-cua-ban.com", "period": 1},
    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/domain/quote", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ domain: "ten-mien-cua-ban.com", period: 1 }),
});
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/domain/quote', ['domain' => 'ten-mien-cua-ban.com', 'period' => 1]);
print_r($kq);
Thân yêu cầu
{
    "domain": "ten-mien-cua-ban.com",
    "period": 1
}
Phản hồi
{
    "status": "success",
    "msg": "OK",
    "data": {
        "type": "register",
        "domain": "ten-mien-cua-ban.com",
        "period": 1,
        "available": true,
        "amount": 418950,
        "amount_original": 431900,
        "discount_percent": 3,
        "price_renew": 427770,
        "price_renew_original": 441000,
        "renewal_shock": 0,
        "realtime": true,
        "registrant_source": "profile",
        "whois_privacy": true,
        "currency": "VND",
        "balance": 800000,
        "available_balance": 800000,
        "enough": true
    }
}
POST

/domain/buy

Toàn quyền

Đăng ký tên miền — trừ tiền NGAY và đăng ký luôn trong lượt gọi (đặt thời gian chờ HTTP từ 90 giây): HTTP 200 provision_status = ready; nhà đăng ký cần duyệt thêm ⇒ HTTP 202 provisioning + charged: true (hỏi /domain/info); đã trừ mà nhà chối ⇒ HTTP 200 provision_status = failed + charged: true (hỗ trợ xử lý — đừng gửi lại). Người đứng tên: không gửi registrant ⇒ hồ sơ định danh của tài khoản (thiếu ⇒ 422 IDENTITY_REQUIRED, data.fields = trường còn thiếu); gửi registrant ⇒ đăng ký HỘ người khác (sai ⇒ 422 INVALID_REGISTRANT, data.fields = {trường: lý do}) — hồ sơ tài khoản không bị đổi. Tên đã có người đăng ký / đang có đơn khác giữ ⇒ 409 DOMAIN_UNAVAILABLE. Lượt mua mỗi giờ: xem mục Giới hạn.

POST https://cloudmoon.net/api/v1/domain/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
domain body có —
period body không số năm 1 … max_period, mặc định 1 (đường cũ nhận reg_period)
whois_privacy body không true / false — ẩn thông tin người đứng tên trên WHOIS
registrant body không object { name, email, phone (E.164, vd +84901234567), address, city, zip, country (ISO 2 chữ), company?, state? } — chữ không dấu

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) · DOMAIN_UNAVAILABLE (409) · PRICE_CHANGED (409) · IDENTITY_REQUIRED (422) · INVALID_REGISTRANT (422) · 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/domain/buy' \
  -H 'X-API-Key: ak_...' \
  -H 'Idempotency-Key: 7f9c2e4b-1a2b-4c3d-9e8f-0123456789ab' \
  -H 'Content-Type: application/json' \
  -d '{"domain":"ten-mien-cua-ban.com","period":1,"registrant":{"name":"Nguyen Van A","email":"[email protected]","phone":"+84901234567","address":"12 Nguyen Hue","city":"Ho Chi Minh","zip":"700000","country":"VN"}}'
Yêu cầu
import uuid
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/domain/buy",
    headers={"X-API-Key": "ak_...", "Idempotency-Key": str(uuid.uuid4())},
    json={"domain": "ten-mien-cua-ban.com", "period": 1, "registrant": {"name": "Nguyen Van A", "email": "[email protected]", "phone": "+84901234567", "address": "12 Nguyen Hue", "city": "Ho Chi Minh", "zip": "700000", "country": "VN"}},
    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/domain/buy", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
    "Idempotency-Key": randomUUID(),
  },
  body: JSON.stringify({ domain: "ten-mien-cua-ban.com", period: 1, registrant: { name: "Nguyen Van A", email: "[email protected]", phone: "+84901234567", address: "12 Nguyen Hue", city: "Ho Chi Minh", zip: "700000", country: "VN" } }),
});
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/domain/buy', ['domain' => 'ten-mien-cua-ban.com', 'period' => 1, 'registrant' => ['name' => 'Nguyen Van A', 'email' => '[email protected]', 'phone' => '+84901234567', 'address' => '12 Nguyen Hue', 'city' => 'Ho Chi Minh', 'zip' => '700000', 'country' => 'VN']], bin2hex(random_bytes(16)));
print_r($kq);
Thân yêu cầu
{
    "domain": "ten-mien-cua-ban.com",
    "period": 1,
    "registrant": {
        "name": "Nguyen Van A",
        "email": "[email protected]",
        "phone": "+84901234567",
        "address": "12 Nguyen Hue",
        "city": "Ho Chi Minh",
        "zip": "700000",
        "country": "VN"
    }
}
Phản hồi
{
    "status": "success",
    "msg": "Đăng ký tên miền thành công",
    "data": {
        "order_code": "151026DOMAINHNFPVZRQWUOD",
        "domain": "ten-mien-cua-ban.com",
        "period": 1,
        "provision_status": "ready",
        "order_status": "active",
        "charged": true,
        "price_buy": 418950,
        "need_info": false,
        "time_expire": "2027-10-15",
        "registrant_source": "request",
        "note": "Tên miền đã đăng ký xong — quản lý DNS ở /domain/dns/*."
    }
}
POST

/domain/transfer

Toàn quyền

CHUYỂN tên miền đang đăng ký ở nơi khác về đây — trừ tiền NGAY (giá chuyển về = +1 năm, đã trừ chiết khấu; báo giá: /domain/quote type transfer) rồi gửi lệnh chuyển trong lượt gọi ⇒ HTTP 202 provision_status = provisioning + charged: true. Nhà đăng ký cũ + registry duyệt, thường 5–7 ngày — hỏi /domain/info tới ready. Nhà chối ngay (mã chuyển sai · tên miền đang khoá chuyển · đăng ký chưa đủ 60 ngày) ⇒ HTTP 200 provision_status = failed + charged: true (hỗ trợ xử lý — đừng gửi lại). Người đứng tên như /domain/buy. Chưa đăng ký ở đâu ⇒ 409 DOMAIN_NOT_REGISTERED. Lượt mua mỗi giờ tính chung với /domain/buy. Chuyển xong, tên miền trỏ về DNS quản lý tại đây với vùng DNS MỚI chưa có bản ghi — thêm bản ghi (/domain/dns/add) hoặc đổi sang nameserver riêng (/domain/dns/mode) ngay khi ready.

POST https://cloudmoon.net/api/v1/domain/transfer
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
domain body có —
auth_code body có mã chuyển (EPP) lấy từ nhà đăng ký hiện tại — tên miền phải đã MỞ khoá chuyển
registrant body không người đứng tên — như /domain/buy (không gửi ⇒ hồ sơ tài khoả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) · DOMAIN_UNAVAILABLE (409) · DOMAIN_NOT_REGISTERED (409) · PRICE_CHANGED (409) · IDENTITY_REQUIRED (422) · INVALID_REGISTRANT (422) · 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/domain/transfer' \
  -H 'X-API-Key: ak_...' \
  -H 'Idempotency-Key: 7f9c2e4b-1a2b-4c3d-9e8f-0123456789ab' \
  -H 'Content-Type: application/json' \
  -d '{"domain":"khachhang.com","auth_code":"Ab#12345cd"}'
Yêu cầu
import uuid
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/domain/transfer",
    headers={"X-API-Key": "ak_...", "Idempotency-Key": str(uuid.uuid4())},
    json={"domain": "khachhang.com", "auth_code": "Ab#12345cd"},
    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/domain/transfer", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
    "Idempotency-Key": randomUUID(),
  },
  body: JSON.stringify({ domain: "khachhang.com", auth_code: "Ab#12345cd" }),
});
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/domain/transfer', ['domain' => 'khachhang.com', 'auth_code' => 'Ab#12345cd'], bin2hex(random_bytes(16)));
print_r($kq);
Thân yêu cầu
{
    "domain": "khachhang.com",
    "auth_code": "Ab#12345cd"
}
Phản hồi
{
    "status": "success",
    "msg": "Đã gửi lệnh chuyển về — chờ nhà đăng ký duyệt",
    "data": {
        "order_code": "151026DOMAINHNFPVZRQWUOD",
        "domain": "khachhang.com",
        "type": "transfer",
        "provision_status": "provisioning",
        "order_status": "processing",
        "charged": true,
        "price_buy": 427770,
        "registrant_source": "profile",
        "note": "Đã gửi lệnh chuyển — nhà đăng ký cũ + registry duyệt, thường 5–7 ngày; hỏi GET /domain/info?order_code= tới khi provision_status = ready."
    }
}
GET

/domain/list

Chỉ đọc

Mọi tên miền của tài khoản (mua trên web lẫn qua API, nhận chuyển quyền), cùng khuôn /domain/info (kèm allowed_actions). ?status= provisioning | ready | failed | expired | suspended | cancelled | transferred_out (nhận cả trạng thái thô order_status cũ). Phân trang.

GET https://cloudmoon.net/api/v1/domain/list
Tham sốVị tríBắt buộcMô tả
status query không Lọc theo trạng thái đơn
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/domain/list' \
  -H 'X-API-Key: ak_...'
Yêu cầu
import requests

r = requests.get(
    "https://cloudmoon.net/api/v1/domain/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/domain/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/domain/list');
print_r($kq);
Phản hồi
{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "order_code": "151026DOMAINHNFPVZRQWUOD",
                "domain": "ten-mien-cua-ban.com",
                "sld": "ten-mien-cua-ban",
                "tld": "com",
                "purchase_type": "register",
                "reg_period": 1,
                "whois_privacy": 1,
                "price_buy": 418950,
                "price_renew_est": 441000,
                "dns_mode": "cloudmoon_managed",
                "dns_status": "ready",
                "order_status": "active",
                "renew_auto": "on",
                "time_buy": "2026-10-15",
                "time_expire_moon": "2027-10-15",
                "time_expire": "2027-10-15",
                "user_note": "",
                "source_buy": "webcon:15",
                "ref_excluded": 1,
                "period": 1,
                "provision_status": "ready",
                "charged": true,
                "billing": {
                    "price_buy": 418950,
                    "price_renew": 427770,
                    "renew_auto": "on",
                    "time_buy": "2026-10-15",
                    "time_expire": "2027-10-15"
                },
                "registrant": {
                    "source": "profile",
                    "name": "Nguyen Van A",
                    "company": null,
                    "country": "VN",
                    "email": "n*******@gmail.com"
                },
                "allowed_actions": [
                    "renew",
                    "auto_renew",
                    "note",
                    "delete",
                    "dns",
                    "dns_mode"
                ]
            }
        ],
        "page": 1,
        "limit": 50,
        "total": 1
    }
}
GET

/domain/info

Chỉ đọc

Chi tiết một tên miền: provision_status (provisioning · ready · failed · expired · suspended · cancelled · transferred_out) + order_status thô, DNS (dns_mode · dns_status), billing (price_renew = giá gia hạn mỗi năm đã trừ chiết khấu · time_expire), registrant (tên · công ty · quốc gia · email che — chỉ hiện với tài khoản đã khai người đứng tên ấy; tên miền nhận chuyển quyền ⇒ source = other; tên miền mua trước 15/10/2026 ⇒ null), allowed_actions (renew · auto_renew · note · delete · dns · dns_mode — việc làm được NGAY LÚC NÀY, cùng luật nút trên web).

GET https://cloudmoon.net/api/v1/domain/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/domain/info?order_code=151026DOMAINHNFPVZRQWUOD' \
  -H 'X-API-Key: ak_...'
Yêu cầu
import requests

r = requests.get(
    "https://cloudmoon.net/api/v1/domain/info",
    headers={"X-API-Key": "ak_..."},
    params={"order_code": "151026DOMAINHNFPVZRQWUOD"},
    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/domain/info?order_code=151026DOMAINHNFPVZRQWUOD", {
  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/domain/info?order_code=151026DOMAINHNFPVZRQWUOD');
print_r($kq);
Phản hồi
{
    "status": "success",
    "msg": "OK",
    "data": {
        "order_code": "151026DOMAINHNFPVZRQWUOD",
        "domain": "ten-mien-cua-ban.com",
        "sld": "ten-mien-cua-ban",
        "tld": "com",
        "purchase_type": "register",
        "reg_period": 1,
        "whois_privacy": 1,
        "price_buy": 418950,
        "price_renew_est": 441000,
        "dns_mode": "cloudmoon_managed",
        "dns_status": "ready",
        "order_status": "active",
        "renew_auto": "on",
        "time_buy": "2026-10-15",
        "time_expire_moon": "2027-10-15",
        "time_expire": "2027-10-15",
        "user_note": "",
        "source_buy": "webcon:15",
        "ref_excluded": 1,
        "period": 1,
        "provision_status": "ready",
        "charged": true,
        "billing": {
            "price_buy": 418950,
            "price_renew": 427770,
            "renew_auto": "on",
            "time_buy": "2026-10-15",
            "time_expire": "2027-10-15"
        },
        "registrant": {
            "source": "profile",
            "name": "Nguyen Van A",
            "company": null,
            "country": "VN",
            "email": "n*******@gmail.com"
        },
        "allowed_actions": [
            "renew",
            "auto_renew",
            "note",
            "delete",
            "dns",
            "dns_mode"
        ]
    }
}
POST

/domain/renew

Toàn quyền

Gia hạn — trừ ví NGAY: amount = giá gia hạn mỗi năm hiện hành × period, đã trừ chiết khấu (báo giá: /domain/quote type renew). Hạn mới = hạn đã trả + period năm (kể cả gia hạn trễ); tối đa 10 năm tính từ hôm nay (vượt ⇒ 400, data.max_years). Gia hạn trễ: tối đa 30 ngày sau ngày hết hạn tuỳ đuôi — hệ thống tự chuộc lại ở nhà đăng ký đúng giá thường; quá hạn chót ⇒ 409 ORDER_EXPIRED; hỏi nhà đăng ký trước khi trừ tiền: 503 UNAVAILABLE / 429 IN_PROGRESS (chưa trừ tiền, gửi lại sau). Mỗi tên miền một lượt gia hạn mỗi ngày (429 COOLDOWN tới 0 giờ). registrar_renewed = false ⇒ đã thu tiền + cộng hạn, nhà đăng ký được gia hạn lại tự động (không cần gửi lại). Bảo trì không chặn gia hạn. Khoá cũ time_expire_moon · price giữ cho tích hợp cũ.

POST https://cloudmoon.net/api/v1/domain/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
period body không số năm 1–10, mặc định 1

Chạy thử Gửi kèm X-Sandbox: 1: máy chủ kiểm như lượt thật rồi trả kết quả mô phỏng cùng khuôn — không trừ tiền, không đổi gì. Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu. Kịch bản lỗi (X-Sandbox-Scenario): INSUFFICIENT_BALANCE (402) · ORDER_CANCELLED (409) · ORDER_EXPIRED (409) · ORDER_FAILED (409) · TRANSFERRED_OUT (409) · PROVISIONING (409) · SUSPENDED (409) · IDEMPOTENCY_PENDING (409) · COOLDOWN (429) · IN_PROGRESS (429) · BUSY (429) · FAILED (400).

Yêu cầu
curl -X POST 'https://cloudmoon.net/api/v1/domain/renew' \
  -H 'X-API-Key: ak_...' \
  -H 'Idempotency-Key: 7f9c2e4b-1a2b-4c3d-9e8f-0123456789ab' \
  -H 'Content-Type: application/json' \
  -d '{"order_code":"151026DOMAINHNFPVZRQWUOD","period":1}'
Yêu cầu
import uuid
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/domain/renew",
    headers={"X-API-Key": "ak_...", "Idempotency-Key": str(uuid.uuid4())},
    json={"order_code": "151026DOMAINHNFPVZRQWUOD", "period": 1},
    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/domain/renew", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
    "Idempotency-Key": randomUUID(),
  },
  body: JSON.stringify({ order_code: "151026DOMAINHNFPVZRQWUOD", period: 1 }),
});
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/domain/renew', ['order_code' => '151026DOMAINHNFPVZRQWUOD', 'period' => 1], bin2hex(random_bytes(16)));
print_r($kq);
Thân yêu cầu
{
    "order_code": "151026DOMAINHNFPVZRQWUOD",
    "period": 1
}
Phản hồi
{
    "status": "success",
    "msg": "Gia hạn thành công",
    "data": {
        "order_code": "151026DOMAINHNFPVZRQWUOD",
        "domain": "ten-mien-cua-ban.com",
        "period": 1,
        "amount": 427770,
        "time_expire": "2028-10-15",
        "registrar_renewed": true,
        "time_expire_moon": "2028-10-15",
        "price": 427770
    }
}
POST

/domain/auto-renew

Toàn quyền

ĐẶT tự gia hạn (không lật — gửi lại cùng giá trị vẫn thành công). Bật ⇒ khi còn ≤ 7 ngày tới billing.time_expire (kể cả khi đã quá hạn) hệ thống tự trừ ví gia hạn 1 năm, cùng giá gia hạn tay — lượt tự gia hạn chỉ chạy khi số dư đủ giá gia hạn NIÊM YẾT (price_renew_original, chưa trừ chiết khấu); thiếu ⇒ bỏ qua, thử lại mỗi giờ.

POST https://cloudmoon.net/api/v1/domain/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

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) · ORDER_FAILED (409) · TRANSFERRED_OUT (409) · SUSPENDED (409) · COOLDOWN (429) · IN_PROGRESS (429) · BUSY (429) · FAILED (400).

Yêu cầu
curl -X POST 'https://cloudmoon.net/api/v1/domain/auto-renew' \
  -H 'X-API-Key: ak_...' \
  -H 'Content-Type: application/json' \
  -d '{"order_code":"151026DOMAINHNFPVZRQWUOD","enabled":false}'
Yêu cầu
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/domain/auto-renew",
    headers={"X-API-Key": "ak_..."},
    json={"order_code": "151026DOMAINHNFPVZRQWUOD", "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/domain/auto-renew", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ order_code: "151026DOMAINHNFPVZRQWUOD", 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/domain/auto-renew', ['order_code' => '151026DOMAINHNFPVZRQWUOD', 'enabled' => false]);
print_r($kq);
Thân yêu cầu
{
    "order_code": "151026DOMAINHNFPVZRQWUOD",
    "enabled": false
}
Phản hồi
{
    "status": "success",
    "msg": "Đã tắt tự gia hạn",
    "data": {
        "order_code": "151026DOMAINHNFPVZRQWUOD",
        "renew_auto": "off"
    }
}
POST

/domain/note

Toàn quyền

Ghi chú riêng của tài khoản cho một tên miền (≤ 200 ký tự, bỏ thẻ HTML; rỗng = xoá). Đọc lại ở user_note của /domain/info.

POST https://cloudmoon.net/api/v1/domain/note
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
note body có ≤ 200 ký tự

Chạy thử Gửi kèm X-Sandbox: 1: máy chủ kiểm như lượt thật rồi trả kết quả mô phỏng cùng khuôn — không trừ tiền, không đổi gì. Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu. Kịch bản lỗi (X-Sandbox-Scenario): ORDER_CANCELLED (409) · FAILED (400).

Yêu cầu
curl -X POST 'https://cloudmoon.net/api/v1/domain/note' \
  -H 'X-API-Key: ak_...' \
  -H 'Content-Type: application/json' \
  -d '{"order_code":"151026DOMAINHNFPVZRQWUOD","note":"Website cong ty"}'
Yêu cầu
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/domain/note",
    headers={"X-API-Key": "ak_..."},
    json={"order_code": "151026DOMAINHNFPVZRQWUOD", "note": "Website cong ty"},
    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/domain/note", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ order_code: "151026DOMAINHNFPVZRQWUOD", note: "Website cong ty" }),
});
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/domain/note', ['order_code' => '151026DOMAINHNFPVZRQWUOD', 'note' => 'Website cong ty']);
print_r($kq);
Thân yêu cầu
{
    "order_code": "151026DOMAINHNFPVZRQWUOD",
    "note": "Website cong ty"
}
Phản hồi
{
    "status": "success",
    "msg": "Đã lưu ghi chú",
    "data": {
        "order_code": "151026DOMAINHNFPVZRQWUOD",
        "user_note": "Website cong ty"
    }
}
POST

/domain/delete

Toàn quyền

XOÁ tên miền khỏi danh sách quản lý — KHÔNG hoàn tiền, không khôi phục được (confirm = order_code). Tên miền VẪN đăng ký tới hết hạn (không tự gia hạn nữa); vùng DNS tại đây bị gỡ. Đang đăng ký / lỗi đăng ký / tạm ngưng / đang rao Chợ ⇒ 409.

POST https://cloudmoon.net/api/v1/domain/delete
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ó bằng đúng order_code

Chạy thử Gửi kèm X-Sandbox: 1: máy chủ kiểm như lượt thật rồi trả kết quả mô phỏng cùng khuôn — không trừ tiền, không đổi gì. Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu. Kịch bản lỗi (X-Sandbox-Scenario): ORDER_CANCELLED (409) · PROVISIONING (409) · ORDER_FAILED (409) · SUSPENDED (409) · LISTED_ON_MARKETPLACE (409) · IN_PROGRESS (429) · BUSY (429) · FAILED (400).

Yêu cầu
curl -X POST 'https://cloudmoon.net/api/v1/domain/delete' \
  -H 'X-API-Key: ak_...' \
  -H 'Content-Type: application/json' \
  -d '{"order_code":"151026DOMAINHNFPVZRQWUOD","confirm":"151026DOMAINHNFPVZRQWUOD"}'
Yêu cầu
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/domain/delete",
    headers={"X-API-Key": "ak_..."},
    json={"order_code": "151026DOMAINHNFPVZRQWUOD", "confirm": "151026DOMAINHNFPVZRQWUOD"},
    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/domain/delete", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ order_code: "151026DOMAINHNFPVZRQWUOD", confirm: "151026DOMAINHNFPVZRQWUOD" }),
});
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/domain/delete', ['order_code' => '151026DOMAINHNFPVZRQWUOD', 'confirm' => '151026DOMAINHNFPVZRQWUOD']);
print_r($kq);
Thân yêu cầu
{
    "order_code": "151026DOMAINHNFPVZRQWUOD",
    "confirm": "151026DOMAINHNFPVZRQWUOD"
}
Phản hồi
{
    "status": "success",
    "msg": "Đã xoá tên miền khỏi danh sách quản lý — tên miền vẫn đăng ký tới hết hạn, không hoàn tiền",
    "data": {
        "order_code": "151026DOMAINHNFPVZRQWUOD",
        "domain": "ten-mien-cua-ban.com",
        "order_status": "cancelled",
        "provision_status": "cancelled",
        "refunded": false
    }
}
GET

/domain/dns/list

Chỉ đọc

Bản ghi DNS (bản lưu tại đây là nguồn đúng) + dns_mode. name rỗng = gốc tên miền (@). sync: synced · pending (đang đẩy sang máy chủ DNS — tự đẩy lại trong vài phút) · error. Tên miền dùng nameserver riêng ⇒ 409 DNS_EXTERNAL.

GET https://cloudmoon.net/api/v1/domain/dns/list
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/domain/dns/list?order_code=151026DOMAINHNFPVZRQWUOD' \
  -H 'X-API-Key: ak_...'
Yêu cầu
import requests

r = requests.get(
    "https://cloudmoon.net/api/v1/domain/dns/list",
    headers={"X-API-Key": "ak_..."},
    params={"order_code": "151026DOMAINHNFPVZRQWUOD"},
    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/domain/dns/list?order_code=151026DOMAINHNFPVZRQWUOD", {
  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/domain/dns/list?order_code=151026DOMAINHNFPVZRQWUOD');
print_r($kq);
Phản hồi
{
    "status": "success",
    "msg": "OK",
    "data": {
        "records": [
            {
                "id": 123,
                "type": "A",
                "name": "",
                "value": "203.0.113.10",
                "ttl": 3600,
                "priority": 0,
                "sync": "synced"
            },
            {
                "id": 124,
                "type": "CNAME",
                "name": "www",
                "value": "ten-mien-cua-ban.com",
                "ttl": 3600,
                "priority": 0,
                "sync": "synced"
            }
        ],
        "dns_mode": "cloudmoon_managed"
    }
}
POST

/domain/dns/add

Toàn quyền

Thêm bản ghi: A · AAAA · CNAME (không ở gốc) · TXT · MX (priority) · NS (không ở gốc) · SRV (tên _dịch-vụ._giao-thức như _sip._tcp, priority, value "trọng-số cổng máy-đích" — vd 5 5060 sip.example.com) · CAA (value "cờ thẻ giá-trị" — vd 0 issue letsencrypt.org; thẻ issue / issuewild / iodef; lưu ở dạng 0 issue "letsencrypt.org"). TTL hệ thống tự đặt (nhanh khi vừa sửa, chậm khi ổn định). Chạm trần số bản ghi mỗi tên miền ⇒ 400 + data.max_records. Máy chủ DNS chối (vd CNAME trùng tên với bản ghi khác) ⇒ 400, không lưu; tạm hỏng ⇒ 200 sync = pending (đã lưu, tự đẩy lại).

POST https://cloudmoon.net/api/v1/domain/dns/add
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
type body có A / AAAA / CNAME / TXT / MX / NS / SRV / CAA
name body không "@" hoặc "" = gốc · www · mail … · SRV: _dịch-vụ._giao-thức (vd _sip._tcp)
value body có SRV: "trọng-số cổng máy-đích" · CAA: "cờ thẻ giá-trị"
priority body không MX · SRV: số 0–65535

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) · ORDER_FAILED (409) · TRANSFERRED_OUT (409) · PROVISIONING (409) · SUSPENDED (409) · RENEW_REQUIRED (409) · DNS_EXTERNAL (409) · DNS_NOT_READY (409) · BUSY (429) · FAILED (400).

Yêu cầu
curl -X POST 'https://cloudmoon.net/api/v1/domain/dns/add' \
  -H 'X-API-Key: ak_...' \
  -H 'Content-Type: application/json' \
  -d '{"order_code":"151026DOMAINHNFPVZRQWUOD","type":"A","name":"shop","value":"203.0.113.10"}'
Yêu cầu
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/domain/dns/add",
    headers={"X-API-Key": "ak_..."},
    json={"order_code": "151026DOMAINHNFPVZRQWUOD", "type": "A", "name": "shop", "value": "203.0.113.10"},
    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/domain/dns/add", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ order_code: "151026DOMAINHNFPVZRQWUOD", type: "A", name: "shop", value: "203.0.113.10" }),
});
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/domain/dns/add', ['order_code' => '151026DOMAINHNFPVZRQWUOD', 'type' => 'A', 'name' => 'shop', 'value' => '203.0.113.10']);
print_r($kq);
Thân yêu cầu
{
    "order_code": "151026DOMAINHNFPVZRQWUOD",
    "type": "A",
    "name": "shop",
    "value": "203.0.113.10"
}
Phản hồi
{
    "status": "success",
    "msg": "Đã thêm bản ghi",
    "data": {
        "order_code": "151026DOMAINHNFPVZRQWUOD",
        "record_id": 125,
        "sync": "synced"
    }
}
POST

/domain/dns/update

Toàn quyền

Sửa một bản ghi (record_id lấy từ /domain/dns/list). Máy chủ DNS chối ⇒ 400 và bản ghi GIỮ giá trị cũ; tạm hỏng ⇒ sync = pending.

POST https://cloudmoon.net/api/v1/domain/dns/update
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
record_id body có —
type body có —
name body không Tên gợi nhớ
value body có SRV: "trọng-số cổng máy-đích" · CAA: "cờ thẻ giá-trị"
priority body không MX · SRV

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): NOT_FOUND (404) · ORDER_CANCELLED (409) · ORDER_EXPIRED (409) · ORDER_FAILED (409) · TRANSFERRED_OUT (409) · PROVISIONING (409) · SUSPENDED (409) · RENEW_REQUIRED (409) · DNS_EXTERNAL (409) · DNS_NOT_READY (409) · BUSY (429) · FAILED (400).

Yêu cầu
curl -X POST 'https://cloudmoon.net/api/v1/domain/dns/update' \
  -H 'X-API-Key: ak_...' \
  -H 'Content-Type: application/json' \
  -d '{"order_code":"151026DOMAINHNFPVZRQWUOD","record_id":123,"type":"A","name":"@","value":"203.0.113.20"}'
Yêu cầu
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/domain/dns/update",
    headers={"X-API-Key": "ak_..."},
    json={"order_code": "151026DOMAINHNFPVZRQWUOD", "record_id": 123, "type": "A", "name": "@", "value": "203.0.113.20"},
    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/domain/dns/update", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ order_code: "151026DOMAINHNFPVZRQWUOD", record_id: 123, type: "A", name: "@", value: "203.0.113.20" }),
});
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/domain/dns/update', ['order_code' => '151026DOMAINHNFPVZRQWUOD', 'record_id' => 123, 'type' => 'A', 'name' => '@', 'value' => '203.0.113.20']);
print_r($kq);
Thân yêu cầu
{
    "order_code": "151026DOMAINHNFPVZRQWUOD",
    "record_id": 123,
    "type": "A",
    "name": "@",
    "value": "203.0.113.20"
}
Phản hồi
{
    "status": "success",
    "msg": "Đã cập nhật bản ghi",
    "data": {
        "order_code": "151026DOMAINHNFPVZRQWUOD",
        "record_id": 123,
        "sync": "synced"
    }
}
POST

/domain/dns/delete

Toàn quyền

Xoá một bản ghi. Máy chủ DNS xoá hỏng ⇒ 503 UNAVAILABLE và bản ghi GIỮ NGUYÊN — gửi lại sau ít phút.

POST https://cloudmoon.net/api/v1/domain/dns/delete
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
record_id body có —

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): NOT_FOUND (404) · ORDER_CANCELLED (409) · ORDER_EXPIRED (409) · ORDER_FAILED (409) · TRANSFERRED_OUT (409) · PROVISIONING (409) · SUSPENDED (409) · RENEW_REQUIRED (409) · DNS_EXTERNAL (409) · DNS_NOT_READY (409) · BUSY (429) · UNAVAILABLE (503) · FAILED (400).

Yêu cầu
curl -X POST 'https://cloudmoon.net/api/v1/domain/dns/delete' \
  -H 'X-API-Key: ak_...' \
  -H 'Content-Type: application/json' \
  -d '{"order_code":"151026DOMAINHNFPVZRQWUOD","record_id":124}'
Yêu cầu
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/domain/dns/delete",
    headers={"X-API-Key": "ak_..."},
    json={"order_code": "151026DOMAINHNFPVZRQWUOD", "record_id": 124},
    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/domain/dns/delete", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ order_code: "151026DOMAINHNFPVZRQWUOD", record_id: 124 }),
});
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/domain/dns/delete', ['order_code' => '151026DOMAINHNFPVZRQWUOD', 'record_id' => 124]);
print_r($kq);
Thân yêu cầu
{
    "order_code": "151026DOMAINHNFPVZRQWUOD",
    "record_id": 124
}
Phản hồi
{
    "status": "success",
    "msg": "Đã xóa bản ghi",
    "data": {
        "order_code": "151026DOMAINHNFPVZRQWUOD",
        "record_id": 124
    }
}
POST

/domain/dns/mode

Toàn quyền

Đổi chế độ DNS: external_ns + ns (2–13 hostname) ⇒ trỏ sang nameserver riêng (bản ghi tại đây giữ lại nhưng thôi có hiệu lực) · cloudmoon_managed ⇒ trỏ về DNS quản lý tại đây. Nameserver mới có hiệu lực sau vài giờ.

POST https://cloudmoon.net/api/v1/domain/dns/mode
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
mode body có cloudmoon_managed / external_ns
ns body không external_ns: danh sách 2–13 hostname

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) · ORDER_FAILED (409) · TRANSFERRED_OUT (409) · PROVISIONING (409) · SUSPENDED (409) · RENEW_REQUIRED (409) · IN_PROGRESS (429) · BUSY (429) · UNAVAILABLE (503) · FAILED (400).

Yêu cầu
curl -X POST 'https://cloudmoon.net/api/v1/domain/dns/mode' \
  -H 'X-API-Key: ak_...' \
  -H 'Content-Type: application/json' \
  -d '{"order_code":"151026DOMAINHNFPVZRQWUOD","mode":"external_ns","ns":["ns1.example.com","ns2.example.com"]}'
Yêu cầu
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/domain/dns/mode",
    headers={"X-API-Key": "ak_..."},
    json={"order_code": "151026DOMAINHNFPVZRQWUOD", "mode": "external_ns", "ns": ["ns1.example.com", "ns2.example.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/domain/dns/mode", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ order_code: "151026DOMAINHNFPVZRQWUOD", mode: "external_ns", ns: ["ns1.example.com", "ns2.example.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/domain/dns/mode', ['order_code' => '151026DOMAINHNFPVZRQWUOD', 'mode' => 'external_ns', 'ns' => ['ns1.example.com', 'ns2.example.com']]);
print_r($kq);
Thân yêu cầu
{
    "order_code": "151026DOMAINHNFPVZRQWUOD",
    "mode": "external_ns",
    "ns": [
        "ns1.example.com",
        "ns2.example.com"
    ]
}
Phản hồi
{
    "status": "success",
    "msg": "Đã chuyển sang nameserver riêng",
    "data": {
        "order_code": "151026DOMAINHNFPVZRQWUOD",
        "dns_mode": "external_ns",
        "ns": [
            "ns1.example.com",
            "ns2.example.com"
        ]
    }
}
Zalo