Tham chiếu API

API Mailbox Domain

Hộp thư email theo tên miền. Mỗi hộp là MỘT đơn (order_code riêng, hạn và gia hạn riêng). Mua trừ tiền NGAY và tạo hộp luôn trong lượt gọi: thường HTTP 200 provision_status = ready kèm mật khẩu từng hộp (về sau đọc lại ở /mailbox/credentials với khoá toàn quyền); hệ thống email chậm ⇒ HTTP 202 provisioning + charged: true (mật khẩu đã chốt vẫn có trong câu trả lời) — hỏi /mailbox/info tới ready. Tên miền: domain_type shared = miền chung của hệ thống (không cần xác minh) · own = tên miền của bạn — cần bằng chứng bạn quản lý nó: tên miền mua tại đây và đang chạy (tự đạt) hoặc bản ghi TXT xác minh qua /mailbox/verify-domain. Tên miền dùng DNS tại đây (domain_source managed) ⇒ hệ thống tự ghi bộ bản ghi thư; DNS ở nơi khác (external) ⇒ bạn tự thêm. Không có chuyển quyền qua API.

Trên trang này
  1. Tổng quan
  2. Mua & theo dõi
  3. Tên miền & xác minh
  4. Bản ghi DNS thư
  5. Kết nối & mật khẩu
  6. Trạng thái hộp thư
  7. Gia hạn & hết hạn
  8. Luật riêng
  9. Nhịp thao tác
  10. Mã lỗi riêng
  11. GET /mailbox/products
  12. GET /mailbox/check
  13. POST /mailbox/verify-domain
  14. POST /mailbox/quote
  15. POST /mailbox/buy
  16. GET /mailbox/list
  17. GET /mailbox/info
  18. GET /mailbox/credentials
  19. POST /mailbox/renew
  20. POST /mailbox/auto-renew
  21. POST /mailbox/upgrade
  22. POST /mailbox/change-cycle
  23. POST /mailbox/change-password
  24. POST /mailbox/webmail
  25. POST /mailbox/note
  26. POST /mailbox/delete
  27. GET /mailbox/stats
  28. GET /mailbox/dns
  29. POST /mailbox/dns/autowrite

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 /mailbox/products Danh mục gói hộp thư đang bán: cycles = chu kỳ mua được (ngắn → dài), pricing = giá MỘT hộp từng chu kỳ (amount đã trừ … Chỉ đọc
GET /mailbox/check Địa chỉ còn tạo được không: ?email=ten@mien hoặc ?username=&domain= (bỏ domain = miền chung đầu tiên). status = availab… Chỉ đọc
POST /mailbox/verify-domain Xác minh bạn quản lý một tên miền RIÊNG trước khi mở hộp thư trên nó. Lần đầu ⇒ record = bản ghi TXT cần thêm (tên _mbx… Toàn quyền
POST /mailbox/quote BÁO GIÁ — không trừ tiền, không ghi gì, khoá chỉ đọc gọi được. type buy (mặc định): CÙNG thân và CÙNG bộ kiểm đầu vào v… Chỉ đọc
POST /mailbox/buy Mua 1–50 hộp thư trên CÙNG một tên miền — trừ tiền và tạo hộp NGAY trong lượt gọi (đặt thời gian chờ HTTP từ 90 giây): … Toàn quyền
GET /mailbox/list Mọi hộp thư của tài khoản (không kèm mật khẩu), mỗi hộp kèm provision_status, gói, billing (price_renew = giá gia hạn k… Chỉ đọc
GET /mailbox/info Chi tiết một hộp thư: provision_status (provisioning · ready · failed · expired · deleted), order_status thô (pending_e… Chỉ đọc
GET /mailbox/credentials Email · mật khẩu · thông số kết nối của một hộp — khoá TOÀN QUYỀN; chỉ hộp đang hoạt động (đang khởi tạo ⇒ 409 PROVISIO… Toàn quyền
POST /mailbox/renew Gia hạn một hộp thư thêm MỘT chu kỳ — trừ ví NGAY: amount = giá ghi trên đơn (billing.price_renew — đổi theo khi nâng g… Toàn quyền
POST /mailbox/auto-renew ĐẶT tự gia hạn (không lật — gửi lại cùng giá trị vẫn thành công). Bật ⇒ khi còn ≤ 7 ngày tới time_expire (kể cả khi hộp… Toàn quyền
POST /mailbox/upgrade Nâng gói (dung lượng lớn hơn, giữ chu kỳ) — trừ ví NGAY: amount = (giá tháng gói mới − giá tháng gói đang dùng, cùng ch… Toàn quyền
POST /mailbox/change-cycle Đổi chu kỳ thanh toán (giữ gói) — KHÔNG thu tiền ngay: price_renew = giá gói đang dùng ở chu kỳ mới (đã chiết khấu), áp… Toàn quyền
POST /mailbox/change-password Đổi mật khẩu hộp thư; bỏ trống new_password ⇒ hệ thống sinh 16 ký tự. Luật: 8–64 ký tự ASCII 0x21–0x7E (chữ không dấu, … Toàn quyền
POST /mailbox/webmail Đường đăng nhập webmail MỘT LẦN — mở thẳng hộp thư trong trình duyệt, không cần gõ mật khẩu. webmail_url chứa mã đăng n… Toàn quyền
POST /mailbox/note Ghi chú riêng của tài khoản cho một hộp (≤ 200 ký tự; rỗng = xoá). Đọc lại ở user_note của /mailbox/info · /mailbox/lis… Toàn quyền
POST /mailbox/delete XOÁ hẳn một hộp thư — KHÔNG hoàn tiền, không khôi phục được (confirm = order_code). Hộp bị xoá ở hệ thống email trước: … Toàn quyền
GET /mailbox/stats Số liệu dùng của một hộp. series theo by (day: theo ngày · week: theo tuần · month: theo tháng — số kỳ do hệ thống emai… Chỉ đọc
GET /mailbox/dns Bộ bản ghi thư (MX · SPF · DKIM · DMARC) của một tên miền RIÊNG có hộp thư + kiểm THẬT từng bản ghi trên DNS công cộng … Chỉ đọc
POST /mailbox/dns/autowrite Ghi (đồng bộ) bộ bản ghi thư vào DNS tại đây cho một tên miền riêng dùng DNS tại đây (domain_source managed) — chỉ đúng… 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 theo GIÁ ĐANG GHI TRÊN ĐƠN (price_buy hiện tại: giá lúc mua đã trừ chiết khấu khi ấy, đổi theo khi nâng gói hoặc đổi chu kỳ). — xem mục Tài khoản đại lý.

Mua & theo dõi

Mỗi hộp thư là một đơn riêng (order_code, hạn và gia hạn riêng). Một lệnh mua tạo từ 1 tới 50 hộp trên cùng một tên miền, cùng gói và chu kỳ — trừ tiền một lần cho cả lô rồi tạo hộp luôn trong lượt gọi (thường vài giây tới vài chục giây — đặt thời gian chờ HTTP từ 90 giây).

  1. GET /mailbox/products cho biết gói đang bán, chu kỳ mua được (cycles), giá một hộp từng chu kỳ (pricing) và các miền chung dùng được (shared_domains). GET /mailbox/check?email=… cho biết một địa chỉ còn tạo được không (status: available · taken · retired).
  2. POST /mailbox/quote với cùng thân lệnh mua (khoá Chỉ đọc gọi được): chạy bộ kiểm đầu vào của lệnh mua — gói, chu kỳ, tên miền, tên từng hộp (còn trống theo dữ liệu tại đây) — rồi trả amount (tổng sẽ trừ), price_each và enough (số dư khả dụng đủ chưa).
  3. POST /mailbox/buy với {product_id, billing_cycle, domain_type, shared_domain? | domain?, mailboxes} và header Idempotency-Key: hệ thống kiểm lại, hỏi hệ thống email từng địa chỉ, trừ ví rồi tạo hộp. Thường nhận HTTP 200 + provision_status: "ready" + mailboxes — mỗi hộp order_code · email · password.
  • Mật khẩu: bỏ trống password ⇒ hệ thống sinh 16 ký tự; tự đặt thì 8–64 ký tự ASCII in được (0x21–0x7E — chữ không dấu, số, ký tự đặc biệt, không khoảng trắng). Mật khẩu chỉ có trong câu trả lời đầu tiên: gửi lại cùng Idempotency-Key thì bản phát lại để password: null kèm secrets_omitted. Đọc lại bất cứ lúc nào ở GET /mailbox/credentials (khoá Toàn quyền).
  • Tên hộp (username): 1–64 ký tự a-z · 0-9 · . _ - (chữ hoa tự đổi về thường); bỏ trống ⇒ hệ thống đặt tên. Trên miền chung, một số tên dành riêng không mua được (409 MAILBOX_TAKEN). name là tên hiển thị của hộp, tối đa 120 ký tự.
  • Hệ thống email chậm ⇒ HTTP 202 + provisioning + charged: true: các đơn đã tồn tại và đã trả tiền — đừng mua lại; mật khẩu đã chốt vẫn có trong mailboxes. Hỏi GET /mailbox/info?order_code=… tới khi ready.
  • Đã trừ tiền mà chưa tạo được hộp ⇒ 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ý (tạo lại, hoặc huỷ và hoàn tiền — khi ấy info báo refunded_amount). Đừng gửi lại lệnh mua.
  • Lệnh bị chối ở bước kiểm — thiếu tiền (402), địa chỉ đã có người dùng (409 MAILBOX_TAKEN, data.email = địa chỉ vướng), tên miền chưa có bằng chứng (409 DOMAIN_NOT_VERIFIED), gói / chu kỳ không bán… — thì chưa trừ đồng nào. 409 PRICE_CHANGED: giá vừa đổi giữa lúc kiểm và lúc trừ — 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 /mailbox/list hoặc liên hệ hỗ trợ.
  • 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 (không kèm mật khẩu), hoặc 409 IDEMPOTENCY_PENDING khi lượt đầu chưa xong.
  • price_each = giá một hộp · price_buy ở câu trả lời lệnh mua = tổng cả lô đã trừ (ở list / info, price_buy là giá của một hộp ấy). Các trường order_code · email ở cấp data là của hộp đầu tiên.
Ví dụ — HTTP 200, đã trừ tiền nhưng chưa tạo được hộp
{
    "status": "success",
    "msg": "Đã trừ tiền nhưng chưa khởi tạo được hộp thư — hỗ trợ sẽ xử lý",
    "data": {
        "order_code": "171026MAILBOXQWERTYUIOPAS",
        "email": "[email protected]",
        "domain": "mail-chung.example",
        "domain_type": "shared",
        "domain_source": null,
        "provision_status": "failed",
        "charged": true,
        "product_id": 1,
        "billing_cycle": "onemonth",
        "count": 1,
        "price_each": 40000,
        "price_buy": 40000,
        "time_expire": "2026-11-17 14:30:00",
        "mailboxes": [
            {
                "order_code": "171026MAILBOXQWERTYUIOPAS",
                "email": "[email protected]",
                "password": null
            }
        ],
        "note": "Đã trừ tiền nhưng chưa khởi tạo được hộp thư — bộ phận hỗ trợ sẽ xử lý (không cần gửi lại lệnh)."
    }
}

Tên miền & xác minh

  • domain_type: "shared" — địa chỉ trên một miền chung của hệ thống (một miền trong shared_domains; bỏ trống shared_domain = miền đầu tiên). Không cần xác minh, không cần bản ghi DNS.
  • domain_type: "own" + domain — tên miền của bạn. Hệ thống cần một bằng chứng bạn quản lý tên miền ấy (proof ở /mailbox/verify-domain):
    • registered_here — tên miền đăng ký tại đây, đơn tên miền đang chạy của chính tài khoản (kể cả khi trỏ nameserver nơi khác) — đạt ngay;
    • txt — bản ghi TXT xác minh đạt trong 7 ngày gần nhất;
    • existing_mail_domain — tên miền thư đã thuộc chính tài khoản và tài khoản từng xác minh TXT tên miền ấy: mua thêm hộp không phải xác minh lại.
    Thiếu ⇒ 409 DOMAIN_NOT_VERIFIED + data.record (bản ghi cần thêm; null = chưa có mã — gọi verify-domain) — chưa trừ tiền.

Xác minh bằng bản ghi TXT

  1. POST /mailbox/verify-domain với {domain} ⇒ record = bản ghi TXT cần thêm: tên _mbx-verify.<tên miền>, giá trị 32 ký tự riêng của tài khoản, cố định tới khi đạt.
  2. Thêm bản ghi tại nơi quản lý DNS của tên miền — TXT đặt trực tiếp tại đúng tên ấy (CNAME không tính), giá trị đúng từng ký tự.
  3. Gọi lại kèm check: true ⇒ verified: true, hoặc verified: false + result (not_found · wrong_value · cname). Đừng gửi check: true trước khi thêm bản ghi: hệ thống DNS có thể nhớ "chưa có" một thời gian.
  • Nhịp: mỗi tên miền một lượt kiểm / 10 giây · tối đa 30 lượt kiểm / giờ / tài khoản · 30 tên miền mới / ngày (429). Mã chưa xác minh mà quá 30 ngày kể từ lần cấp và lần kiểm gần nhất thì bị dọn — gọi lại để nhận mã mới.
  • Đã có bằng chứng mà tên miền đang thuộc tài khoản khác (đơn tên miền đang chạy, hoặc tên miền thư có hộp của người khác) ⇒ lệnh mua và check nhận 409 DOMAIN_IN_USE — liên hệ hỗ trợ (chưa có bằng chứng thì gặp 409 DOMAIN_NOT_VERIFIED trước). Tên miền thuộc hạ tầng của hệ thống, hoặc gửi miền chung với own ⇒ 400 DOMAIN_FORBIDDEN.
  • Nguồn DNS (domain_source): managed — tên miền nằm trong tài khoản (đơn tên miền đang chạy) và dùng DNS quản lý tại đây: hệ thống tự ghi bộ bản ghi thư · external — DNS ở nơi khác: bạn tự thêm bản ghi (mục Bản ghi DNS thư). Bỏ trống ⇒ hệ thống tự chọn (managed khi đủ điều kiện) — nên để trống. Tên miền đã có hộp thư: nguồn là managed chỉ khi tên miền thư đang được hệ thống ghi DNS và vẫn đủ điều kiện trên (ví dụ chưa trỏ nameserver đi nơi khác); còn lại là external. Gửi managed khi nguồn thật là external ⇒ 409 DNS_EXTERNAL; gửi external khi nguồn thật là managed ⇒ 400.

Bản ghi DNS thư

Hộp trên tên miền riêng cần bộ bốn bản ghi để nhận thư và để thư gửi đi không bị coi là thư rác:

LoạiTênGiá trị
MXgốc tên miền (@)máy nhận thư của hệ thống (ưu tiên 10)
TXT (SPF)@v=spf1 include:… ~all
TXT (DKIM)<selector>._domainkeyv=DKIM1; k=rsa; p=… — khoá công khai riêng của tên miền
TXT (DMARC)_dmarcv=DMARC1; p=none; — tên miền đã có DMARC của bạn thì giữ

Giá trị đúng cho tên miền của bạn lấy ở GET /mailbox/dns?domain=…: records — mỗi bản ghi kèm found (đã thấy trên DNS công cộng) và found_values; all_found: true khi đủ cả bộ. Đừng chép giá trị từ ví dụ.

  • managed: hệ thống tự ghi bộ bản ghi vào DNS tại đây ngay sau khi trừ tiền, trong lúc tạo hộp — chỉ đúng bộ bản ghi thư: thay MX và SPF ở gốc tên miền (thư của tên miền chuyển về đây), đặt DKIM, thêm DMARC khi chưa có; bản ghi khác của bạn để yên. Ghi chưa trọn ⇒ dns_status: "pending" — gọi POST /mailbox/dns/autowrite (cũng dùng để ghi lại khi lỡ xoá); bản ghi đã đúng được giữ nguyên. Mỗi tên miền một lượt tự ghi / 60 giây.
  • external: thêm bộ bản ghi tại nơi quản lý DNS của tên miền; DNS cần từ vài phút tới vài giờ để lan truyền — kiểm bằng GET /mailbox/dns. dns_status của các hộp này luôn là external (hệ thống không tự kiểm hộ).
  • dns_status ở list / info: not_required (miền chung) · configured (hệ thống đã ghi xong ở DNS tại đây — chưa chắc đã lan truyền, xem all_found) · pending (chưa ghi xong) · external.
  • GET /mailbox/dns chỉ nhận tên miền thư mà chính tài khoản làm chủ (hộp nhận chuyển quyền trên tên miền của người khác ⇒ 404); tối đa 20 lượt / phút / tài khoản — lượt chạy thử cũng tính vì vẫn tra DNS thật.
  • Xoá hộp cuối cùng của một tên miền riêng ⇒ hệ thống dọn tên miền thư ở hệ thống email và đúng bộ bản ghi thư mà nó đã ghi vào DNS tại đây (có thể xong sau ít phút).

Kết nối & mật khẩu

Tên đăng nhập là địa chỉ email đầy đủ. Tên máy chủ nằm ở connection của /mailbox/info và trong /mailbox/credentials:

Giao thứcCổngBảo mật
IMAP (đọc thư)993SSL/TLS
POP3 (tải thư về)995SSL/TLS
SMTP (gửi thư)587STARTTLS
Webmail443HTTPS — connection.webmail
  • GET /mailbox/credentials (khoá Toàn quyền): email, mật khẩu đang lưu và thông số kết nối — chỉ hộp đang hoạt động, không bị khoá.
  • POST /mailbox/change-password với {new_password?} — bỏ trống ⇒ hệ thống sinh 16 ký tự. Mật khẩu mới chỉ có trong câu trả lời này. Hệ thống email chối ⇒ 503 UNAVAILABLE (chưa đổi — gửi lại được); mất phản hồi rồi vẫn chưa xác nhận được ⇒ 400 FAILED: mật khẩu có thể đã đổi — đặt lại một mật khẩu mới. ⚠ Mật khẩu cũ có thể còn đăng nhập được thêm một lúc ngắn sau khi đổi (thường vài giây, có lúc tới khoảng 3 phút) — đổi vì lộ mật khẩu thì kiểm lại sau vài phút.
  • POST /mailbox/webmail ⇒ webmail_url: đường đăng nhập webmail một lần, mở thẳng hộp thư trong trình duyệt không cần gõ mật khẩu. Giữ kín như mật khẩu; chưa dùng thì còn hiệu lực ít nhất 15 phút; mỗi lượt gọi xin một mã mới (mã cũ chưa dùng không bị huỷ — đừng gọi thừa); đổi mật khẩu hộp làm mọi mã chưa dùng mất hiệu lực.
  • Gửi thư: mỗi hộp gửi tối đa smtp_sent_limit người nhận trong 24 giờ gần nhất — số của gói ở /mailbox/products (một thư gửi 3 người tính 3). Chạm giới hạn, hoặc lượng gửi tăng bất thường, hệ thống tự tạm ngưng gửi của hộp ấy (vẫn nhận), rồi tự mở lại khi lượng gửi trong 24 giờ xuống dưới 90% giới hạn. Gửi bản tin / thư quảng cáo số lượng lớn hãy dùng dịch vụ gửi thư hàng loạt.

Trạng thái hộp thư

provision_status gộp trạng thái 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_provision
Đã trả tiền, hộp đang được tạo. Lệnh còn làm được: tự gia hạn, ghi chú.
failed
pending_provision
Đã trả tiền nhưng chưa tạo được hộp — bộ phận hỗ trợ xử lý, không tự hoàn. Lệnh còn làm được: tự gia hạn, ghi chú.
ready
active
Đang hoạt động. suspended: true = bộ phận hỗ trợ đang tạm khoá hộp: chỉ gia hạn, tự gia hạn, ghi chú, xoá được (409 SUSPENDED).
expired
pending_expired
Đã quá hạn — hộp ngừng hoạt động (không gửi / nhận thư). Gia hạn trước restore_deadline ⇒ hệ thống khôi phục hộp kèm thư cũ từ bản sao mà hệ thống email còn giữ (bản sao không còn ⇒ hộp mới rỗng cùng địa chỉ — mục Gia hạn & hết hạn). Lệnh còn làm được: gia hạn, tự gia hạn, đổi chu kỳ, ghi chú, xoá (409 RENEW_REQUIRED).
expired
expired
Hết thời gian lưu — hộp và thư đã bị xoá. Gia hạn = tạo hộp mới rỗng cùng địa chỉ. Lệnh còn làm được: gia hạn, đổi chu kỳ, ghi chú, xoá (409 ORDER_EXPIRED).
failed
cancelled
Đơn đã huỷ và hoàn tiền (refunded_amount ở info).
deleted
cancelled
Đã xoá — lệnh nhận 409 ORDER_CANCELLED.
  • allowed_actions (ở cả list lẫn info) — việc làm được ngay lúc này, cùng luật với các nút trên trang quản lý hộp thư: renew · auto_renew · upgrade · change_cycle · change_password · credentials · webmail · note · delete · stats. Tên nào vắng mặt thì lệnh ấy đang bị chối. Không tính nhịp thao tác, lượt gia hạn trong ngày hay số dư — xem mục Nhịp thao tác.
  • charged luôn là true: mọi hộp được tạo cùng lượt trừ tiền. billing: price_buy · price_renew (giá gia hạn kỳ tới = giá ghi trên đơn) · billing_cycle · months · renew_auto · time_buy · time_expire.
  • list trả mọi hộp của tài khoản — mua trên web lẫn qua API, nhận chuyển quyền — mặc định bỏ hộp đã huỷ; lọc bằng ?status= theo provision_status (nhận cả giá trị order_status), ?domain=, ?domain_type=.
  • GET /mailbox/stats: thư gửi · thư nhận · thư rác bị chặn · dung lượng · lượt đăng nhập theo ngày / tuần / tháng (by) — hệ thống nhớ kết quả 30 phút.

Gia hạn & hết hạn

  • POST /mailbox/renew với {order_code} gia hạn một chu kỳ và trừ ví ngay: amount = giá ghi trên đơn (billing.price_renew — giá lúc mua đã trừ chiết khấu khi ấy, đổi theo khi nâng gói hoặc đổi chu kỳ; báo giá: quote với {"type": "renew", "order_code": "…"}). Hạn mới = max(hôm nay, hạn cũ) + một chu kỳ.
  • Mỗi hộp 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; ngày mua đã tính là lượt của ngày ấy ⇒ 429 COOLDOWN, Retry-After tới 0 giờ.
  • Hộp có giá ghi trên đơn bằng 0 không gia hạn được ở bất kỳ đường nào — web, tự gia hạn hay API (renew vắng trong allowed_actions, lệnh nhận 400 NOT_SUPPORTED) — liên hệ hỗ trợ.
  • Quá hạn: qua time_expire mà chưa gia hạn, ở lượt kiểm hằng đêm kế tiếp hộp ngừng hoạt động (pending_expired): hộp bị gỡ khỏi hệ thống email, thư được giữ dạng bản sao tới restore_deadline (30 ngày sau). Gia hạn trong khoảng ấy ⇒ hệ thống khôi phục hộp kèm thư cũ trước, có hộp rồi mới trừ tiền (mailbox_data: "restored"; bản sao không còn ⇒ hộp mới rỗng cùng địa chỉ, "new"). Chưa khôi phục được ⇒ 503 UNAVAILABLE, chưa trừ tiền — gửi lại sau (kể cả cùng Idempotency-Key).
  • Quá restore_deadline ⇒ expired: hộp và thư bị xoá vĩnh viễn. Vẫn gia hạn được — hệ thống tạo hộp mới rỗng cùng địa chỉ (mailbox_data: "new"); mật khẩu đọc lại ở credentials.
  • Tự gia hạn (billing.renew_auto; đặt bằng POST /mailbox/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 time_expire — kể cả lúc hộp đã ngừng hoạt động vì quá hạn — mỗi giờ hệ thống thử gia hạn một chu kỳ theo giá ghi trên đơn; số dư thiếu ⇒ bỏ qua, thử lại giờ sau. Hộp hết thời gian lưu không tự gia hạn — gia hạn tay.
  • Nâng gói (POST /mailbox/upgrade với {order_code, product_id}): chỉ lên gói dung lượng lớn hơn đang bán — không có hạ gói. Trừ ngay phần chênh lệch theo số ngày còn lại (tròn lên 1.000đ); dung lượng đổi ngay ở hệ thống email; kỳ sau gia hạn theo giá gói mới (price_renew). Chưa đổi được dung lượng ⇒ trả gói cũ + hoàn tiền, 503; hoàn tiền / trả gói chưa xác nhận được ⇒ 400 FAILED — đừng gửi lại, liên hệ hỗ trợ.
  • Đổi chu kỳ (POST /mailbox/change-cycle với {order_code, billing_cycle}): 0 đồng, hạn hiện tại giữ nguyên; giá chu kỳ mới (price_renew) áp từ lần gia hạn kế tiếp.
  • Dịch vụ hộp thư tạm dừng bán (bảo trì), hay một miền chung / tên miền thôi nhận hộp mới, không chặn gia hạn, nâng gói, đổi chu kỳ hay bất kỳ lệnh nào trên hộp đang có.

Luật riêng

  • Xoá (POST /mailbox/delete, confirm = đúng order_code): hộp bị xoá ở hệ thống email trước rồi đơn mới đóng — không hoàn tiền, thư không khôi phục được. Chưa xác nhận xoá được ⇒ 503, đơn giữ nguyên — gửi lại sau. Hộp đang tạo ⇒ 409 PROVISIONING. Địa chỉ đã xoá không tạo lại được (check: retired trên tên miền riêng, taken trên miền chung).
  • Dịch vụ hộp thư tạm dừng bán: products · check · verify-domain · báo giá mua mới · lệnh mua nhận 503 SERVICE_DISABLED (GET /services/status báo mailbox: false); mọi lệnh trên hộp đang có vẫn chạy bình thường.
  • Giới hạn lệnh mua (mỗi tài khoản): tối đa 10 lượt mua và 100 hộp mỗi giờ — đếm cả mua trên web (429 RATE_LIMITED), tính riêng với các sản phẩm khác; cộng 60 lần thử mua mỗi giờ qua API (lệnh bị chối sau bước hỏi hệ thống email cũng tính). Kiểm tên (check) tối đa 40 lượt / phút / tài khoản, chung với ô kiểm tên trên web. 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 hộp sang tài khoản khác · mua kèm đăng ký tên miền mới (đăng ký trước bằng API Domain, rồi mua hộp với domain_type: "own") · xem nhật ký hộp — dùng trang quản lý trên web.
  • Chạy thử (X-Sandbox: 1): check không hỏi hệ thống email (status: "simulated" khi địa chỉ chưa có ở đây) · verify-domain không cấp mã, không tra DNS · lệnh mua trả mỗi hộp một mã SANDBOX… (28 ký tự) — hỏi info bằng mã ấy (vẫn kèm X-Sandbox: 1) ⇒ hộp mẫu ready ngay, địa chỉ mẫu sbx…@<miền> (tên miền riêng mẫu sandbox-….example); kịch bản PROVISION_FAILED ⇒ lệnh mua 202, info ở provisioning 10 giây đầu rồi failed. Mã chỉ chở gói, chu kỳ, miền chung, số hộp và cờ — không chở tên hộp. stats trả số mẫu; webmail trả địa chỉ webmail không kèm mã đăng nhập; GET /mailbox/dns vẫn tra DNS thật (tính vào giới hạn 20 lượt / phút). Mọi lệnh trên hộp mẫu đi đủ các bước kiểm rồi trả mô phỏng; không lưu gì: mã không có trong list.

Nhịp thao tác trên cùng một hộp thư

Các lệnh trên cùng một hộp thư 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 hộp thư
Gia hạn · Nâng gói · Đổi chu kỳ1 phút (chung một nhịp)
Đổi mật khẩu1 phút (tính riêng)
Mở webmail (/mailbox/webmail)10 giây (tính riêng)
Bật/tắt tự gia hạn5 giây (tính riêng)
Gia hạntối đa 1 lượt / ngày / hộp (tính cả ngày mua, gia hạn trên web và tự gia hạn — lượt thứ hai ⇒ 429 COOLDOWN, Retry-After tới 0 giờ)
Ghi chú · xoákhông phải chờ (chỉ một lệnh mỗi lúc trên cùng hộp (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ì
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 (/mailbox/quote) rồi gửi lệnh mua mới (Idempotency-Key mới).
400 DOMAIN_FORBIDDEN Tên miền không dùng được cho hộp thư riêng (miền chung của hệ thống, hoặc tên miền thuộc hạ tầng của hệ thống) — lệnh CHƯA trừ tiền. Dùng tên miền của bạn, hoặc domain_type: shared với một miền trong shared_domains.
400 NOT_SUPPORTED Gói chưa có giá cho chu kỳ được chọn (mua · đổi chu kỳ · nâng lên gói chưa có giá ở chu kỳ đang dùng), giá gia hạn ghi trên hộp chưa hợp lệ, hoặc lệnh DNS gửi miền chung (miền chung đã cấu hình sẵn, không cần bản ghi). Chọn một chu kỳ / gói trong /mailbox/products; giá gia hạn lỗi ⇒ liên hệ hỗ trợ.
400 CONFIRM_REQUIRED Lệnh xoá hộp thư thiếu trường xác nhận. Gửi confirm bằng đúng order_code — xoá không khôi phục được và KHÔNG hoàn tiền.
409 DOMAIN_NOT_VERIFIED Tên miền riêng chưa được xác minh cho tài khoản này — lệnh CHƯA trừ tiền. data.record = bản ghi TXT cần thêm (null ⇒ chưa có mã — gọi /mailbox/verify-domain để nhận). Thêm bản ghi TXT rồi gọi /mailbox/verify-domain kèm check: true; xác minh xong gửi lại (dùng lại đúng Idempotency-Key được).
409 DOMAIN_IN_USE Tên miền này đang thuộc một tài khoản khác (đơn tên miền đang chạy, hoặc hộp thư trên tên miền ấy) — lệnh CHƯA trừ tiền. Liên hệ hỗ trợ.
409 MAILBOX_TAKEN Địa chỉ đã có người dùng (hoặc đã từng dùng trên tên miền riêng — không tạo lại được) — lệnh CHƯA trừ tiền. data.email = địa chỉ vướng (khi xác định được — hai lệnh tranh cùng một địa chỉ thì có thể vắng). Chọn tên khác — hỏi /mailbox/check trước khi mua.
409 DNS_EXTERNAL Tên miền không nằm trong tài khoản, hoặc không dùng DNS tại đây, nên không chọn được domain_source: managed / không tự ghi được bản ghi thư (/mailbox/dns/autowrite). Gửi domain_source: external rồi tự thêm bộ bản ghi thư (/mailbox/dns) tại nơi quản lý DNS của tên miền.
409 PROVISIONING Hộp thư đang được khởi tạo — lúc này chỉ đổi tự gia hạn và ghi chú được. Hỏi /mailbox/info tới khi provision_status = ready.
409 RENEW_REQUIRED Hộp thư đang tạm ngưng vì quá hạn — chỉ gia hạn, tự gia hạn, đổi chu kỳ, ghi chú và xoá được (gia hạn trước restore_deadline để khôi phục thư từ bản sao hệ thống email còn giữ). Gia hạn rồi thao tác lại.
409 ORDER_EXPIRED Hộp thư đã hết thời gian lưu — gia hạn sẽ tạo một hộp MỚI cùng địa chỉ (thư cũ không còn). Gia hạn, hoặc mua hộp khác.
409 SUSPENDED Hộp thư đang bị bộ phận hỗ trợ tạm khoá — chỉ gia hạn, tự gia hạn, ghi chú và xoá được. Liên hệ hỗ trợ.
409 ORDER_CANCELLED Hộp thư đã bị huỷ (xoá, hoặc huỷ + hoàn tiền — refunded_amount ở /mailbox/info). Không thao tác được nữa.
429 COOLDOWN Hộp vừa nhận lệnh cùng nhóm (gia hạn · nâng gói · đổi chu kỳ: 60 giây · đổi mật khẩu: 60 giây · webmail: 10 giây · tự gia hạn: 5 giây · tự ghi DNS: 60 giây / tên miền), hôm nay hộp đã có một lượt gia hạn — kể cả ngày mua (Retry-After tới 0 giờ), hoặc vừa kiểm bản ghi xác minh của tên miền (10 giây). Chờ Retry-After giây.
429 IN_PROGRESS Hộp đang xử lý một lệnh khác (hai lệnh cùng lúc trên một hộp), hoặc hộp vừa thay đổi giữa lúc kiểm và lúc ghi. Chờ Retry-After giây rồi gửi lại.
503 UNAVAILABLE Hệ thống email chưa thực hiện được lệnh lúc này — gia hạn: chưa khôi phục / tạo lại được hộp (CHƯA trừ tiền) · nâng gói: chưa đổi được dung lượng (đã trả gói cũ + hoàn tiền) · đổi mật khẩu · xoá (hộp giữ nguyên) · webmail · thống kê · ghi DNS. Thử lại sau ít phút — lệnh trừ tiền dùng lại đúng Idempotency-Key được.
GET

/mailbox/products

Chỉ đọc

Danh mục gói hộp thư đang bán: cycles = chu kỳ mua được (ngắn → dài), pricing = giá MỘT hộp từng chu kỳ (amount đã trừ chiết khấu đại lý, amount_original = giá niêm yết, months = số tháng). shared_domains = các miền chung dùng được với domain_type shared. max_mailboxes_per_order = số hộp tối đa một lệnh mua. smtp_sent_limit = số người nhận tối đa MỘT hộp của gói gửi trong 24 giờ gần nhất (một thư gửi 3 người tính 3) — chạm ngưỡng thì hộp tạm ngưng gửi (vẫn nhận), tự mở lại khi lượng gửi giảm. Gói / chu kỳ chưa có giá không có trong danh mục.

GET https://cloudmoon.net/api/v1/mailbox/products

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

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

r = requests.get(
    "https://cloudmoon.net/api/v1/mailbox/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/mailbox/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/mailbox/products');
print_r($kq);
Phản hồi
{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "product_id": 1,
                "code": "mb5",
                "name": "Email 5GB",
                "quota_gb": 5,
                "smtp_sent_limit": 500,
                "price_month": 33333,
                "in_stock": true,
                "cycles": [
                    "onemonth",
                    "sixmonth",
                    "oneyear",
                    "twoyear",
                    "threeyear"
                ],
                "pricing": {
                    "onemonth": {
                        "amount": 40000,
                        "amount_original": 40000,
                        "billing_cycle": "1 tháng",
                        "months": 1
                    },
                    "sixmonth": {
                        "amount": 210000,
                        "amount_original": 210000,
                        "billing_cycle": "6 tháng",
                        "months": 6
                    },
                    "oneyear": {
                        "amount": 400000,
                        "amount_original": 400000,
                        "billing_cycle": "1 năm",
                        "months": 12
                    },
                    "twoyear": {
                        "amount": 760000,
                        "amount_original": 760000,
                        "billing_cycle": "2 năm",
                        "months": 24
                    },
                    "threeyear": {
                        "amount": 1080000,
                        "amount_original": 1080000,
                        "billing_cycle": "3 năm",
                        "months": 36
                    }
                }
            }
        ],
        "total": 1,
        "shared_domains": [
            "mail-chung.example"
        ],
        "shared_domain": "mail-chung.example",
        "max_mailboxes_per_order": 50,
        "discount_percent": 0,
        "currency": "VND"
    }
}
GET

/mailbox/check

Chỉ đọc

Địa chỉ còn tạo được không: ?email=ten@mien hoặc ?username=&domain= (bỏ domain = miền chung đầu tiên). status = available · taken · retired (địa chỉ đã từng dùng trên tên miền riêng — không tạo lại được). Tên miền riêng phải có bằng chứng quản lý — mua tại đây, hoặc xác minh TXT (409 DOMAIN_NOT_VERIFIED). Hệ thống email chưa trả lời ⇒ 503 (thử lại). Giới hạn 40 lượt / phút / tài khoản (chung với ô kiểm tên trên web).

GET https://cloudmoon.net/api/v1/mailbox/check
Tham sốVị tríBắt buộcMô tả
email query không ten@mien (hoặc dùng username + domain)
username query không phần trước @ — 1–64 ký tự a-z · 0-9 · . _ -
domain query không miền chung hoặc tên miền của bạn
Yêu cầu
curl 'https://cloudmoon.net/api/v1/mailbox/check?email=lienhe%40systemcloudvps.com' \
  -H 'X-API-Key: ak_...'
Yêu cầu
import requests

r = requests.get(
    "https://cloudmoon.net/api/v1/mailbox/check",
    headers={"X-API-Key": "ak_..."},
    params={"email": "[email protected]"},
    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/mailbox/check?email=lienhe%40systemcloudvps.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/mailbox/check?email=lienhe%40systemcloudvps.com');
print_r($kq);
Phản hồi
{
    "status": "success",
    "msg": "Còn trống",
    "data": {
        "email": "[email protected]",
        "username": "lienhe",
        "domain": "mail-chung.example",
        "domain_type": "shared",
        "available": true,
        "status": "available"
    }
}
POST

/mailbox/verify-domain

Toàn quyền

Xác minh bạn quản lý một tên miền RIÊNG trước khi mở hộp thư trên nó. Lần đầu ⇒ record = bản ghi TXT cần thêm (tên _mbx-verify.<tên miền>, giá trị = mã 32 ký tự RIÊNG của tài khoản, cố định tới khi đạt — mã chưa xác minh mà quá 30 ngày từ lần cấp và từ lần kiểm gần nhất thì bị dọn, gọi lại để nhận mã mới). Thêm bản ghi tại nơi quản lý DNS rồi gọi lại kèm check: true ⇒ verified: true (giữ 7 ngày để đặt mua; tên miền đã có hộp thư mà phần tên miền ấy thuộc chính tài khoản VÀ tài khoản từng xác minh TXT tên miền ấy thì mua thêm không cần xác minh lại) hoặc verified: false + result (not_found · wrong_value · cname — bản ghi phải là TXT đặt TRỰC TIẾP tại tên ấy, CNAME không tính). Tên miền mua tại đây và đang chạy ⇒ verified ngay (proof registered_here). Đừng gửi check: true trước khi thêm bản ghi: hệ thống DNS có thể nhớ "chưa có" một thời gian. Nhịp: 10 giây / tên miền · 30 lượt kiểm / giờ · 30 tên miền mới / ngày.

POST https://cloudmoon.net/api/v1/mailbox/verify-domain
Tham sốVị tríBắt buộcMô tả
domain body có tên miền của bạn
check body không true = kiểm bản ghi TXT ngay (mặc định false — chỉ lấy bản ghi cần thêm)

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): RATE_LIMITED (429) · COOLDOWN (429) · UNAVAILABLE (503).

Yêu cầu
curl -X POST 'https://cloudmoon.net/api/v1/mailbox/verify-domain' \
  -H 'X-API-Key: ak_...' \
  -H 'Content-Type: application/json' \
  -d '{"domain":"congty.vn","check":true}'
Yêu cầu
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/mailbox/verify-domain",
    headers={"X-API-Key": "ak_..."},
    json={"domain": "congty.vn", "check": True},
    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/mailbox/verify-domain", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ domain: "congty.vn", check: true }),
});
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/mailbox/verify-domain', ['domain' => 'congty.vn', 'check' => true]);
print_r($kq);
Thân yêu cầu
{
    "domain": "congty.vn",
    "check": true
}
Phản hồi
{
    "status": "success",
    "msg": "Xác minh tên miền thành công",
    "data": {
        "domain": "congty.vn",
        "verified": true,
        "proof": "txt",
        "verified_at": "2026-10-17T14:30:00+07:00",
        "record": null,
        "checked": true,
        "result": "verified"
    }
}
POST

/mailbox/quote

Chỉ đọc

BÁO GIÁ — không trừ tiền, không ghi gì, khoá chỉ đọc gọi được. type buy (mặc định): CÙNG thân và CÙNG bộ kiểm đầu vào với /mailbox/buy (gói, chu kỳ, tên miền + xác minh, tên từng hộp — còn trống theo dữ liệu tại đây; lệnh mua hỏi lại hệ thống email và xét thêm giới hạn lượt mua / giờ) ⇒ amount = TỔNG số sẽ trừ (đã chiết khấu), price_each = giá một hộp; enough so với balance_available (= số dư − tiền các lệnh mua VPS còn chờ tạo máy). Hộp có sẵn (order_code): type renew ⇒ amount = giá ghi trên đơn + time_expire mới + mailbox_data (kept · restored · new) · type upgrade + product_id ⇒ amount = phí nâng gói thu ngay + price_renew (giá kỳ sau) · type change_cycle + billing_cycle ⇒ amount 0 + price_renew (áp từ lần gia hạn kế) — CÙNG phép số trừ của lệnh thật; enough so với số dư. Bảo trì chỉ chặn báo giá mua mới.

POST https://cloudmoon.net/api/v1/mailbox/quote
Tham sốVị tríBắt buộcMô tả
type body không buy (mặc định) | renew | upgrade | change_cycle
order_code body không renew · upgrade · change_cycle: mã hộp có sẵn
product_id body không buy: id gói trong /mailbox/products · upgrade: gói mới
billing_cycle body không buy: một khoá trong cycles của gói · change_cycle: chu kỳ mới
domain_type body không buy: shared | own (bắt buộc)
shared_domain body không buy shared: một miền trong shared_domains (bỏ trống = miền đầu tiên)
domain body không buy own: tên miền của bạn (đã xác minh)
domain_source body không buy own: managed (DNS tại đây) | external — bỏ trống = tự chọn
mailboxes body không buy: danh sách 1–50 hộp (như /mailbox/buy) — quyết định số hộp; thiếu ⇒ 400

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/mailbox/quote' \
  -H 'X-API-Key: ak_...' \
  -H 'Content-Type: application/json' \
  -d '{"product_id":1,"billing_cycle":"onemonth","domain_type":"shared","mailboxes":[{"username":"lienhe"},{"username":"ketoan"}]}'
Yêu cầu
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/mailbox/quote",
    headers={"X-API-Key": "ak_..."},
    json={"product_id": 1, "billing_cycle": "onemonth", "domain_type": "shared", "mailboxes": [{"username": "lienhe"}, {"username": "ketoan"}]},
    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/mailbox/quote", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ product_id: 1, billing_cycle: "onemonth", domain_type: "shared", mailboxes: [{ username: "lienhe" }, { username: "ketoan" }] }),
});
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/mailbox/quote', ['product_id' => 1, 'billing_cycle' => 'onemonth', 'domain_type' => 'shared', 'mailboxes' => [['username' => 'lienhe'], ['username' => 'ketoan']]]);
print_r($kq);
Thân yêu cầu
{
    "product_id": 1,
    "billing_cycle": "onemonth",
    "domain_type": "shared",
    "mailboxes": [
        {
            "username": "lienhe"
        },
        {
            "username": "ketoan"
        }
    ]
}
Phản hồi
{
    "status": "success",
    "msg": "OK",
    "data": {
        "type": "buy",
        "product_id": 1,
        "billing_cycle": "onemonth",
        "domain": "mail-chung.example",
        "domain_type": "shared",
        "domain_source": null,
        "count": 2,
        "price_each": 40000,
        "amount": 80000,
        "amount_original": 80000,
        "discount_percent": 0,
        "time_expire": "2026-11-17 14:30:00",
        "currency": "VND",
        "balance": 500000,
        "balance_available": 500000,
        "enough": true
    }
}
POST

/mailbox/buy

Toàn quyền

Mua 1–50 hộp thư trên CÙNG một tên miền — trừ tiền và tạo hộp NGAY trong lượt gọi (đặt thời gian chờ HTTP từ 90 giây): HTTP 200 provision_status = ready + mailboxes[] (order_code · email · password của TỪNG hộp — mỗi hộp là một đơn riêng). Hệ thống email chậm ⇒ HTTP 202 provisioning + charged: true (mật khẩu đã chốt vẫn có trong mailboxes[]; hỏi /mailbox/info). Hiếm khi tạo hỏng sau lúc đã trừ tiền ⇒ HTTP 200 failed + charged: true — bộ phận hỗ trợ xử lý, ĐỪNG gửi lại. username bỏ trống ⇒ hệ thống đặt tên; password bỏ trống ⇒ hệ thống sinh 16 ký tự (luật: 8–64 ký tự ASCII 0x21–0x7E — chữ không dấu, số, ký tự đặc biệt, không khoảng trắng); username 1–64 ký tự a-z · 0-9 · . _ - ; name tối đa 120 ký tự. Tên miền riêng phải có bằng chứng quản lý (mua tại đây, hoặc xác minh TXT — /mailbox/verify-domain). Gửi lại cùng Idempotency-Key ⇒ phát lại câu trả lời (KHÔNG kèm mật khẩu — data.secrets_omitted; đọc lại ở /mailbox/credentials). Giới hạn lượt mua / giờ: xem mục Giới hạn.

POST https://cloudmoon.net/api/v1/mailbox/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_id body có id gói trong /mailbox/products
billing_cycle body có một khoá trong cycles của gói
domain_type body có shared | own
shared_domain body không shared: một miền trong shared_domains (bỏ trống = miền đầu tiên)
domain body không own: tên miền của bạn (đã xác minh)
domain_source body không own: managed (DNS tại đây — hệ thống tự ghi bản ghi thư) | external (tự thêm) — bỏ trống = tự chọn
mailboxes body có [{username?, password?, name?}] — 1 tới 50 hộp; thiếu ⇒ 400 (chỉ đường web con cũ /api/webcon nhận một hộp ở cấp gố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ì. Kịch bản lỗi (X-Sandbox-Scenario): INSUFFICIENT_BALANCE (402) · NOT_FOUND (404) · DOMAIN_NOT_VERIFIED (409) · DOMAIN_IN_USE (409) · MAILBOX_TAKEN (409) · PRICE_CHANGED (409) · 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/mailbox/buy' \
  -H 'X-API-Key: ak_...' \
  -H 'Idempotency-Key: 7f9c2e4b-1a2b-4c3d-9e8f-0123456789ab' \
  -H 'Content-Type: application/json' \
  -d '{"product_id":1,"billing_cycle":"onemonth","domain_type":"shared","mailboxes":[{"username":"lienhe","name":"Lien he"}]}'
Yêu cầu
import uuid
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/mailbox/buy",
    headers={"X-API-Key": "ak_...", "Idempotency-Key": str(uuid.uuid4())},
    json={"product_id": 1, "billing_cycle": "onemonth", "domain_type": "shared", "mailboxes": [{"username": "lienhe", "name": "Lien he"}]},
    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/mailbox/buy", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
    "Idempotency-Key": randomUUID(),
  },
  body: JSON.stringify({ product_id: 1, billing_cycle: "onemonth", domain_type: "shared", mailboxes: [{ username: "lienhe", name: "Lien he" }] }),
});
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/mailbox/buy', ['product_id' => 1, 'billing_cycle' => 'onemonth', 'domain_type' => 'shared', 'mailboxes' => [['username' => 'lienhe', 'name' => 'Lien he']]], bin2hex(random_bytes(16)));
print_r($kq);
Thân yêu cầu
{
    "product_id": 1,
    "billing_cycle": "onemonth",
    "domain_type": "shared",
    "mailboxes": [
        {
            "username": "lienhe",
            "name": "Lien he"
        }
    ]
}
Phản hồi
{
    "status": "success",
    "msg": "Đã tạo 1 hộp thư",
    "data": {
        "order_code": "171026MAILBOXQWERTYUIOPAS",
        "email": "[email protected]",
        "domain": "mail-chung.example",
        "domain_type": "shared",
        "domain_source": null,
        "provision_status": "ready",
        "charged": true,
        "product_id": 1,
        "billing_cycle": "onemonth",
        "count": 1,
        "price_each": 40000,
        "price_buy": 40000,
        "time_expire": "2026-11-17 14:30:00",
        "mailboxes": [
            {
                "order_code": "171026MAILBOXQWERTYUIOPAS",
                "email": "[email protected]",
                "password": "Xy7kP2m#Q9rT4vW1"
            }
        ],
        "note": "Hộp thư đã sẵn sàng — mật khẩu đọc lại được ở GET /mailbox/credentials (khoá toàn quyền)."
    }
}
GET

/mailbox/list

Chỉ đọc

Mọi hộp thư của tài khoản (không kèm mật khẩu), mỗi hộp kèm provision_status, gói, billing (price_renew = giá gia hạn kỳ tới — giá ghi trên đơn), dns_status, allowed_actions. Mặc định bỏ hộp đã huỷ; ?status= lọc theo đúng provision_status · ?domain= · ?domain_type= own | shared. Phân trang.

GET https://cloudmoon.net/api/v1/mailbox/list
Tham sốVị tríBắt buộcMô tả
status query không provisioning | ready | failed | expired | deleted (theo provision_status — total đếm sau khi lọc); trạng thái thô pending_provision | active | pending_expired | cancelled cũng nhận
domain query không lọc theo tên miền
domain_type query không own | shared
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/mailbox/list' \
  -H 'X-API-Key: ak_...'
Yêu cầu
import requests

r = requests.get(
    "https://cloudmoon.net/api/v1/mailbox/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/mailbox/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/mailbox/list');
print_r($kq);
Phản hồi
{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "order_code": "171026MAILBOXQWERTYUIOPAS",
                "email": "[email protected]",
                "domain": "mail-chung.example",
                "domain_type": "shared",
                "plan": "Email 5GB",
                "quota_gb": 5,
                "price_buy": 40000,
                "billing_cycle": "onemonth",
                "billing_months": 1,
                "order_status": "active",
                "renew_auto": "on",
                "time_expire": "2026-11-17 14:30:00",
                "product_id": 1,
                "display_name": "Lien he",
                "smtp_sent_limit": 500,
                "provision_status": "ready",
                "charged": true,
                "suspended": false,
                "billing": {
                    "price_buy": 40000,
                    "price_renew": 40000,
                    "billing_cycle": "onemonth",
                    "months": 1,
                    "renew_auto": "on",
                    "time_buy": "2026-10-17 14:30:00",
                    "time_expire": "2026-11-17 14:30:00"
                },
                "dns_status": "not_required",
                "restore_deadline": null,
                "user_note": "",
                "allowed_actions": [
                    "renew",
                    "auto_renew",
                    "upgrade",
                    "change_cycle",
                    "change_password",
                    "credentials",
                    "webmail",
                    "note",
                    "delete",
                    "stats"
                ]
            }
        ],
        "page": 1,
        "limit": 50,
        "total": 1
    }
}
GET

/mailbox/info

Chỉ đọc

Chi tiết một hộp thư: provision_status (provisioning · ready · failed · expired · deleted), order_status thô (pending_expired = tạm ngưng vì quá hạn — gia hạn trước restore_deadline để khôi phục thư từ bản sao hệ thống email còn giữ), billing, dns_status (not_required · configured · pending · external), connection (máy chủ IMAP / POP3 / SMTP / webmail), refunded_amount (hộp bị huỷ + hoàn), allowed_actions. KHÔNG có mật khẩu — đọc ở /mailbox/credentials.

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

r = requests.get(
    "https://cloudmoon.net/api/v1/mailbox/info",
    headers={"X-API-Key": "ak_..."},
    params={"order_code": "171026MAILBOXQWERTYUIOPAS"},
    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/mailbox/info?order_code=171026MAILBOXQWERTYUIOPAS", {
  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/mailbox/info?order_code=171026MAILBOXQWERTYUIOPAS');
print_r($kq);
Phản hồi
{
    "status": "success",
    "msg": "OK",
    "data": {
        "order_code": "171026MAILBOXQWERTYUIOPAS",
        "email": "[email protected]",
        "domain": "mail-chung.example",
        "domain_type": "shared",
        "plan": "Email 5GB",
        "quota_gb": 5,
        "price_buy": 40000,
        "billing_cycle": "onemonth",
        "billing_months": 1,
        "order_status": "active",
        "renew_auto": "on",
        "time_expire": "2026-11-17 14:30:00",
        "product_id": 1,
        "display_name": "Lien he",
        "smtp_sent_limit": 500,
        "provision_status": "ready",
        "charged": true,
        "suspended": false,
        "billing": {
            "price_buy": 40000,
            "price_renew": 40000,
            "billing_cycle": "onemonth",
            "months": 1,
            "renew_auto": "on",
            "time_buy": "2026-10-17 14:30:00",
            "time_expire": "2026-11-17 14:30:00"
        },
        "dns_status": "not_required",
        "restore_deadline": null,
        "user_note": "",
        "connection": {
            "imap": {
                "host": "mail.example.com",
                "port": 993,
                "security": "ssl"
            },
            "pop3": {
                "host": "mail.example.com",
                "port": 995,
                "security": "ssl"
            },
            "smtp": {
                "host": "mail.example.com",
                "port": 587,
                "security": "starttls"
            },
            "webmail": "https://mail.example.com"
        },
        "refunded_amount": null,
        "allowed_actions": [
            "renew",
            "auto_renew",
            "upgrade",
            "change_cycle",
            "change_password",
            "credentials",
            "webmail",
            "note",
            "delete",
            "stats"
        ]
    }
}
GET

/mailbox/credentials

Toàn quyền

Email · mật khẩu · thông số kết nối của một hộp — khoá TOÀN QUYỀN; chỉ hộp đang hoạt động (đang khởi tạo ⇒ 409 PROVISIONING · tạm ngưng vì quá hạn ⇒ 409 RENEW_REQUIRED · bị khoá ⇒ 409 SUSPENDED).

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

r = requests.get(
    "https://cloudmoon.net/api/v1/mailbox/credentials",
    headers={"X-API-Key": "ak_..."},
    params={"order_code": "171026MAILBOXQWERTYUIOPAS"},
    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/mailbox/credentials?order_code=171026MAILBOXQWERTYUIOPAS", {
  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/mailbox/credentials?order_code=171026MAILBOXQWERTYUIOPAS');
print_r($kq);
Phản hồi
{
    "status": "success",
    "msg": "OK",
    "data": {
        "order_code": "171026MAILBOXQWERTYUIOPAS",
        "email": "[email protected]",
        "password": "Xy7kP2m#Q9rT4vW1",
        "imap": {
            "host": "mail.example.com",
            "port": 993,
            "security": "ssl"
        },
        "pop3": {
            "host": "mail.example.com",
            "port": 995,
            "security": "ssl"
        },
        "smtp": {
            "host": "mail.example.com",
            "port": 587,
            "security": "starttls"
        },
        "webmail": "https://mail.example.com"
    }
}
POST

/mailbox/renew

Toàn quyền

Gia hạn một hộp thư thêm MỘT chu kỳ — trừ ví NGAY: amount = giá ghi trên đơn (billing.price_renew — đổi theo khi nâng gói / đổi chu kỳ; báo giá: /mailbox/quote type renew). Hạn mới = max(hôm nay, hạn cũ) + một chu kỳ. Hộp đang tạm ngưng vì quá hạn ⇒ khôi phục cả thư từ bản sao hệ thống email còn giữ (trước restore_deadline — mailbox_data: restored; bản sao không còn ⇒ hộp MỚI rỗng cùng địa chỉ, mailbox_data: new); đã hết thời gian lưu ⇒ tạo hộp MỚI cùng địa chỉ (mailbox_data: new — thư cũ không còn). Khôi phục / tạo xong mới trừ tiền: chưa được ⇒ 503 UNAVAILABLE, CHƯA trừ tiền, gửi lại sau (dùng lại đúng Idempotency-Key được). Mỗi hộp một lượt gia hạn mỗi ngày — ngày mua đã tính là lượt của ngày ấy, gia hạn thêm được từ hôm sau (429 COOLDOWN tới 0 giờ). Bảo trì không chặn gia hạn. Đường cũ /api/webcon/mailbox/renew trỏ cùng lệnh.

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

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) · PROVISIONING (409) · IDEMPOTENCY_PENDING (409) · COOLDOWN (429) · IN_PROGRESS (429) · BUSY (429) · UNAVAILABLE (503) · NOT_SUPPORTED (400) · FAILED (400).

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

r = requests.post(
    "https://cloudmoon.net/api/v1/mailbox/renew",
    headers={"X-API-Key": "ak_...", "Idempotency-Key": str(uuid.uuid4())},
    json={"order_code": "171026MAILBOXQWERTYUIOPAS"},
    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/mailbox/renew", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
    "Idempotency-Key": randomUUID(),
  },
  body: JSON.stringify({ order_code: "171026MAILBOXQWERTYUIOPAS" }),
});
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/mailbox/renew', ['order_code' => '171026MAILBOXQWERTYUIOPAS'], bin2hex(random_bytes(16)));
print_r($kq);
Thân yêu cầu
{
    "order_code": "171026MAILBOXQWERTYUIOPAS"
}
Phản hồi
{
    "status": "success",
    "msg": "Đã gia hạn",
    "data": {
        "order_code": "171026MAILBOXQWERTYUIOPAS",
        "email": "[email protected]",
        "amount": 40000,
        "billing_cycle": "onemonth",
        "months": 1,
        "time_expire": "2026-12-17 14:30:00",
        "mailbox_data": "kept"
    }
}
POST

/mailbox/auto-renew

Toàn quyền

ĐẶT tự gia hạn (không lật — gửi lại cùng giá trị vẫn thành công). Bật ⇒ khi còn ≤ 7 ngày tới time_expire (kể cả khi hộp đang tạm ngưng vì quá hạn) hệ thống tự trừ ví gia hạn một chu kỳ theo giá ghi trên đơn — mỗi giờ thử một lần, số dư thiếu ⇒ bỏ qua lượt ấy. Đặt được cả khi hộp đang khởi tạo / bị khoá; hộp đã hết thời gian lưu ⇒ 409 ORDER_EXPIRED. Nhịp 5 giây / hộp.

POST https://cloudmoon.net/api/v1/mailbox/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) · COOLDOWN (429) · IN_PROGRESS (429) · BUSY (429) · FAILED (400).

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

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

/mailbox/upgrade

Toàn quyền

Nâng gói (dung lượng lớn hơn, giữ chu kỳ) — trừ ví NGAY: amount = (giá tháng gói mới − giá tháng gói đang dùng, cùng chu kỳ, đã chiết khấu) × số ngày còn lại / 30, tròn lên 1.000đ (báo giá: /mailbox/quote type upgrade). Kỳ sau gia hạn theo price_renew (gói mới). Chỉ gói đang bán trong /mailbox/products có quota_gb lớn hơn gói đang dùng. Dung lượng đổi NGAY ở hệ thống email; đổi hỏng ⇒ trả gói cũ + hoàn tiền, 503 UNAVAILABLE (gửi lại cùng Idempotency-Key được); hoàn tiền / trả gói chưa xác nhận được ⇒ 400 FAILED — đừng gửi lại, liên hệ hỗ trợ. Nhịp 60 giây / hộp (chung với gia hạn và đổi chu kỳ).

POST https://cloudmoon.net/api/v1/mailbox/upgrade
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
product_id body có gói mới (quota_gb lớn hơn, trong /mailbox/products)

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) · NOT_FOUND (404) · ORDER_CANCELLED (409) · PROVISIONING (409) · RENEW_REQUIRED (409) · ORDER_EXPIRED (409) · SUSPENDED (409) · IDEMPOTENCY_PENDING (409) · COOLDOWN (429) · IN_PROGRESS (429) · BUSY (429) · UNAVAILABLE (503) · NOT_SUPPORTED (400) · FAILED (400).

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

r = requests.post(
    "https://cloudmoon.net/api/v1/mailbox/upgrade",
    headers={"X-API-Key": "ak_...", "Idempotency-Key": str(uuid.uuid4())},
    json={"order_code": "171026MAILBOXQWERTYUIOPAS", "product_id": 2},
    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/mailbox/upgrade", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
    "Idempotency-Key": randomUUID(),
  },
  body: JSON.stringify({ order_code: "171026MAILBOXQWERTYUIOPAS", product_id: 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/mailbox/upgrade', ['order_code' => '171026MAILBOXQWERTYUIOPAS', 'product_id' => 2], bin2hex(random_bytes(16)));
print_r($kq);
Thân yêu cầu
{
    "order_code": "171026MAILBOXQWERTYUIOPAS",
    "product_id": 2
}
Phản hồi
{
    "status": "success",
    "msg": "Đã nâng gói — dung lượng mới đã áp dụng",
    "data": {
        "type": "upgrade",
        "order_code": "171026MAILBOXQWERTYUIOPAS",
        "email": "[email protected]",
        "product_id": 2,
        "plan": "Email 10GB",
        "quota_gb": 10,
        "billing_cycle": "onemonth",
        "amount": 37000,
        "days_left": 31,
        "price_renew": 75000
    }
}
POST

/mailbox/change-cycle

Toàn quyền

Đổi chu kỳ thanh toán (giữ gói) — KHÔNG thu tiền ngay: price_renew = giá gói đang dùng ở chu kỳ mới (đã chiết khấu), áp từ lần gia hạn kế tiếp; hạn hiện tại giữ nguyên. billing_cycle = một mã trong cycles của gói (dài hơn hay ngắn hơn đều được), khác chu kỳ đang dùng. Báo giá: /mailbox/quote type change_cycle. Đổi được cả khi hộp đang tạm ngưng vì quá hạn hoặc đã hết thời gian lưu. Nhịp 60 giây / hộp (chung với gia hạn và nâng gói).

POST https://cloudmoon.net/api/v1/mailbox/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
billing_cycle body có chu kỳ mới (một khoá trong cycles của gó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): ORDER_CANCELLED (409) · PROVISIONING (409) · SUSPENDED (409) · COOLDOWN (429) · IN_PROGRESS (429) · BUSY (429) · NOT_SUPPORTED (400) · FAILED (400).

Yêu cầu
curl -X POST 'https://cloudmoon.net/api/v1/mailbox/change-cycle' \
  -H 'X-API-Key: ak_...' \
  -H 'Content-Type: application/json' \
  -d '{"order_code":"171026MAILBOXQWERTYUIOPAS","billing_cycle":"sixmonth"}'
Yêu cầu
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/mailbox/change-cycle",
    headers={"X-API-Key": "ak_..."},
    json={"order_code": "171026MAILBOXQWERTYUIOPAS", "billing_cycle": "sixmonth"},
    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/mailbox/change-cycle", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ order_code: "171026MAILBOXQWERTYUIOPAS", billing_cycle: "sixmonth" }),
});
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/mailbox/change-cycle', ['order_code' => '171026MAILBOXQWERTYUIOPAS', 'billing_cycle' => 'sixmonth']);
print_r($kq);
Thân yêu cầu
{
    "order_code": "171026MAILBOXQWERTYUIOPAS",
    "billing_cycle": "sixmonth"
}
Phản hồi
{
    "status": "success",
    "msg": "Đã đổi chu kỳ — áp dụng từ lần gia hạn kế tiếp",
    "data": {
        "type": "change_cycle",
        "order_code": "171026MAILBOXQWERTYUIOPAS",
        "email": "[email protected]",
        "billing_cycle": "sixmonth",
        "months": 6,
        "amount": 0,
        "price_renew": 210000,
        "time_expire": "2026-11-17 14:30:00"
    }
}
POST

/mailbox/change-password

Toàn quyền

Đổi mật khẩu hộp thư; bỏ trống new_password ⇒ hệ thống sinh 16 ký tự. Luật: 8–64 ký tự ASCII 0x21–0x7E (chữ không dấu, số, ký tự đặc biệt, không khoảng trắng). Mật khẩu mới CHỈ có trong câu trả lời này (đọc lại ở /mailbox/credentials, khoá toàn quyền); gửi lại cùng Idempotency-Key ⇒ phát lại KHÔNG kèm mật khẩu (data.secrets_omitted) và không đổi lần hai. Chỉ hộp đang hoạt động và không bị khoá. Hệ thống email chối ⇒ 503 UNAVAILABLE (chưa đổi — gửi lại được, kể cả cùng Idempotency-Key); mất phản hồi rồi vẫn chưa xác nhận được ⇒ 400 FAILED: mật khẩu có thể đã đổi — đặt lại một mật khẩu mới (Idempotency-Key mới). Nhịp 60 giây / hộp. Lưu ý: hệ thống email có thể còn nhận mật khẩu CŨ thêm một lúc ngắn sau khi đổi (thường vài giây, có lúc tới khoảng 3 phút) — đổi vì lộ mật khẩu thì kiểm lại sau vài phút.

POST https://cloudmoon.net/api/v1/mailbox/change-password
Tham sốVị tríBắt buộcMô tả
Idempotency-Key header không gửi lại cùng khoá không đổi mật khẩu lần hai
order_code body có Mã đơn (order_code) — lấy từ lệnh mua hoặc /list
new_password body không để trống = hệ thống sinh

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) · RENEW_REQUIRED (409) · ORDER_EXPIRED (409) · SUSPENDED (409) · IDEMPOTENCY_PENDING (409) · COOLDOWN (429) · IN_PROGRESS (429) · BUSY (429) · UNAVAILABLE (503) · FAILED (400).

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

r = requests.post(
    "https://cloudmoon.net/api/v1/mailbox/change-password",
    headers={"X-API-Key": "ak_...", "Idempotency-Key": str(uuid.uuid4())},
    json={"order_code": "171026MAILBOXQWERTYUIOPAS"},
    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/mailbox/change-password", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
    "Idempotency-Key": randomUUID(),
  },
  body: JSON.stringify({ order_code: "171026MAILBOXQWERTYUIOPAS" }),
});
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/mailbox/change-password', ['order_code' => '171026MAILBOXQWERTYUIOPAS'], bin2hex(random_bytes(16)));
print_r($kq);
Thân yêu cầu
{
    "order_code": "171026MAILBOXQWERTYUIOPAS"
}
Phản hồi
{
    "status": "success",
    "msg": "Đã đổi mật khẩu",
    "data": {
        "order_code": "171026MAILBOXQWERTYUIOPAS",
        "email": "[email protected]",
        "password": "Qw3eR5t#Y7uI9oP1",
        "note": "Mật khẩu mới chỉ có trong câu trả lời này — đọc lại ở GET /mailbox/credentials (khoá toàn quyền)."
    }
}
POST

/mailbox/webmail

Toàn quyền

Đường đăng nhập webmail MỘT LẦN — mở thẳng hộp thư trong trình duyệt, không cần gõ mật khẩu. webmail_url chứa mã đăng nhập do hệ thống email cấp ⇒ giữ kín như mật khẩu, mở ngay: mã dùng MỘT lần, chưa dùng thì còn hiệu lực ít nhất 15 phút — đổi mật khẩu hộp làm MỌI đường chưa dùng mất hiệu lực; mỗi lượt gọi xin một mã MỚI (mã cũ chưa dùng không bị huỷ — đừng gọi thừa). Chỉ hộp đang hoạt động và không bị khoá. Nhịp 10 giây / hộp.

POST https://cloudmoon.net/api/v1/mailbox/webmail
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) · PROVISIONING (409) · RENEW_REQUIRED (409) · ORDER_EXPIRED (409) · SUSPENDED (409) · COOLDOWN (429) · IN_PROGRESS (429) · BUSY (429) · UNAVAILABLE (503).

Yêu cầu
curl -X POST 'https://cloudmoon.net/api/v1/mailbox/webmail' \
  -H 'X-API-Key: ak_...' \
  -H 'Content-Type: application/json' \
  -d '{"order_code":"171026MAILBOXQWERTYUIOPAS"}'
Yêu cầu
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/mailbox/webmail",
    headers={"X-API-Key": "ak_..."},
    json={"order_code": "171026MAILBOXQWERTYUIOPAS"},
    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/mailbox/webmail", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ order_code: "171026MAILBOXQWERTYUIOPAS" }),
});
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/mailbox/webmail', ['order_code' => '171026MAILBOXQWERTYUIOPAS']);
print_r($kq);
Thân yêu cầu
{
    "order_code": "171026MAILBOXQWERTYUIOPAS"
}
Phản hồi
{
    "status": "success",
    "msg": "OK",
    "data": {
        "webmail_url": "https://mail.example.com/?_task=login&_action=login&direct=1&user=lienhe%40mail-chung.example&pass=M9xT2kQ7wR4zP1yL",
        "order_code": "171026MAILBOXQWERTYUIOPAS",
        "email": "[email protected]"
    }
}
POST

/mailbox/note

Toàn quyền

Ghi chú riêng của tài khoản cho một hộp (≤ 200 ký tự; rỗng = xoá). Đọc lại ở user_note của /mailbox/info · /mailbox/list — lưu nguyên văn (bỏ khoảng trắng đầu / cuối), khi hiển thị nhớ thoát HTML.

POST https://cloudmoon.net/api/v1/mailbox/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) · IN_PROGRESS (429) · BUSY (429) · FAILED (400).

Yêu cầu
curl -X POST 'https://cloudmoon.net/api/v1/mailbox/note' \
  -H 'X-API-Key: ak_...' \
  -H 'Content-Type: application/json' \
  -d '{"order_code":"171026MAILBOXQWERTYUIOPAS","note":"Hop thu ban hang"}'
Yêu cầu
import requests

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

/mailbox/delete

Toàn quyền

XOÁ hẳn một hộp thư — KHÔNG hoàn tiền, không khôi phục được (confirm = order_code). Hộp bị xoá ở hệ thống email trước: chưa xác nhận xoá được ⇒ 503, đơn giữ nguyên (gửi lại an toàn). Hộp cuối cùng của một tên miền riêng ⇒ hệ thống dọn tên miền thư + bộ bản ghi thư đã ghi vào DNS tại đây (có thể xong sau ít phút). Hộp đang khởi tạo ⇒ 409 PROVISIONING. Đường cũ /api/webcon/mailbox/delete trỏ cùng lệnh (thân cũ chỉ order_code vẫn nhận ở đường cũ).

POST https://cloudmoon.net/api/v1/mailbox/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) · IN_PROGRESS (429) · BUSY (429) · UNAVAILABLE (503) · FAILED (400).

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

r = requests.post(
    "https://cloudmoon.net/api/v1/mailbox/delete",
    headers={"X-API-Key": "ak_..."},
    json={"order_code": "171026MAILBOXQWERTYUIOPAS", "confirm": "171026MAILBOXQWERTYUIOPAS"},
    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/mailbox/delete", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ order_code: "171026MAILBOXQWERTYUIOPAS", confirm: "171026MAILBOXQWERTYUIOPAS" }),
});
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/mailbox/delete', ['order_code' => '171026MAILBOXQWERTYUIOPAS', 'confirm' => '171026MAILBOXQWERTYUIOPAS']);
print_r($kq);
Thân yêu cầu
{
    "order_code": "171026MAILBOXQWERTYUIOPAS",
    "confirm": "171026MAILBOXQWERTYUIOPAS"
}
Phản hồi
{
    "status": "success",
    "msg": "Đã xoá hộp thư — không hoàn tiền",
    "data": {
        "order_code": "171026MAILBOXQWERTYUIOPAS",
        "email": "[email protected]",
        "order_status": "cancelled",
        "provision_status": "deleted",
        "refunded": false
    }
}
GET

/mailbox/stats

Chỉ đọc

Số liệu dùng của một hộp. series theo by (day: theo ngày · week: theo tuần · month: theo tháng — số kỳ do hệ thống email trả), mỗi mục: sent (thư gửi) · ham (thư nhận sạch) · spam (thư rác bị chặn) · storage (byte đang dùng) · rcpt (người nhận) · logins (lượt đăng nhập IMAP / POP3 / webmail); kèm tổng và storage_used / storage_quota (byte). Hệ thống nhớ kết quả 30 phút (lượt hệ thống email chưa trả lời: 5 phút). Hệ thống email chưa trả lời ⇒ 503. Chỉ hộp đang hoạt động và không bị khoá.

GET https://cloudmoon.net/api/v1/mailbox/stats
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
by query không day | week | month (mặc định day)

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) · RENEW_REQUIRED (409) · ORDER_EXPIRED (409) · SUSPENDED (409) · BUSY (429) · UNAVAILABLE (503).

Yêu cầu
curl 'https://cloudmoon.net/api/v1/mailbox/stats?order_code=171026MAILBOXQWERTYUIOPAS' \
  -H 'X-API-Key: ak_...'
Yêu cầu
import requests

r = requests.get(
    "https://cloudmoon.net/api/v1/mailbox/stats",
    headers={"X-API-Key": "ak_..."},
    params={"order_code": "171026MAILBOXQWERTYUIOPAS"},
    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/mailbox/stats?order_code=171026MAILBOXQWERTYUIOPAS", {
  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/mailbox/stats?order_code=171026MAILBOXQWERTYUIOPAS');
print_r($kq);
Phản hồi
{
    "status": "success",
    "msg": "OK",
    "data": {
        "order_code": "171026MAILBOXQWERTYUIOPAS",
        "email": "[email protected]",
        "by": "day",
        "series": [
            {
                "period": "20261016",
                "sent": 2,
                "ham": 4,
                "spam": 1,
                "storage": 2097152,
                "rcpt": 2,
                "logins": 2
            },
            {
                "period": "20261017",
                "sent": 3,
                "ham": 5,
                "spam": 1,
                "storage": 3145728,
                "rcpt": 3,
                "logins": 2
            }
        ],
        "sent_total": 5,
        "spam_total": 2,
        "logins_total": 4,
        "sent_today": 3,
        "storage_used": 3145728,
        "storage_quota": 5368709120,
        "storage_pct": 0.1,
        "has_data": true
    }
}
GET

/mailbox/dns

Chỉ đọc

Bộ bản ghi thư (MX · SPF · DKIM · DMARC) của một tên miền RIÊNG có hộp thư + kiểm THẬT từng bản ghi trên DNS công cộng (found · found_values; DMARC sẵn có của bạn cũng tính là đạt). domain_source managed ⇒ hệ thống tự ghi (thiếu thì /mailbox/dns/autowrite) · external ⇒ tự thêm tại nơi quản lý DNS của tên miền. Chỉ tên miền thư thuộc tài khoản (không thấy ⇒ 404); miền chung ⇒ 400 (không cần bản ghi). 20 lượt / phút / tài khoản (lượt chạy thử cũng tính — vẫn kiểm DNS thật). Giá trị bản ghi trong ví dụ chỉ để minh hoạ — dùng đúng value mà endpoint trả cho tên miền của bạn.

GET https://cloudmoon.net/api/v1/mailbox/dns
Tham sốVị tríBắt buộcMô tả
domain query có tên miền riêng có hộp thư
Yêu cầu
curl 'https://cloudmoon.net/api/v1/mailbox/dns?domain=congty.vn' \
  -H 'X-API-Key: ak_...'
Yêu cầu
import requests

r = requests.get(
    "https://cloudmoon.net/api/v1/mailbox/dns",
    headers={"X-API-Key": "ak_..."},
    params={"domain": "congty.vn"},
    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/mailbox/dns?domain=congty.vn", {
  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/mailbox/dns?domain=congty.vn');
print_r($kq);
Phản hồi
{
    "status": "success",
    "msg": "OK",
    "data": {
        "domain": "congty.vn",
        "domain_source": "managed",
        "dns_status": "configured",
        "records": [
            {
                "type": "MX",
                "name": "@",
                "fqdn": "congty.vn",
                "value": "mx.congty.vn.mail.example",
                "priority": 10,
                "found": true,
                "found_values": [
                    "mx.congty.vn.mail.example"
                ]
            },
            {
                "type": "TXT",
                "name": "@",
                "fqdn": "congty.vn",
                "value": "v=spf1 include:_spf.mail.example ~all",
                "priority": 0,
                "found": true,
                "found_values": [
                    "v=spf1 include:_spf.mail.example ~all"
                ]
            },
            {
                "type": "TXT",
                "name": "cm._domainkey",
                "fqdn": "cm._domainkey.congty.vn",
                "value": "v=DKIM1; k=rsa; p=MIIBIjANBgkqh",
                "priority": 0,
                "found": true,
                "found_values": [
                    "v=DKIM1; k=rsa; p=MIIBIjANBgkqh"
                ]
            },
            {
                "type": "TXT",
                "name": "_dmarc",
                "fqdn": "_dmarc.congty.vn",
                "value": "v=DMARC1; p=none;",
                "priority": 0,
                "found": true,
                "found_values": [
                    "v=DMARC1; p=none;"
                ]
            }
        ],
        "all_found": true,
        "can_autowrite": true
    }
}
POST

/mailbox/dns/autowrite

Toàn quyền

Ghi (đồng bộ) bộ bản ghi thư vào DNS tại đây cho một tên miền riêng dùng DNS tại đây (domain_source managed) — chỉ đúng bộ bản ghi hệ thống thư quản lý: MX + SPF ở gốc tên miền (THAY — thư về đây), DKIM, DMARC (chỉ thêm khi chưa có); bản ghi khác của bạn để yên, bản ghi đã đúng giữ nguyên. Tên miền dùng DNS ở nơi khác ⇒ 409 DNS_EXTERNAL (tự thêm theo /mailbox/dns). Chờ vài phút cho DNS lan truyền rồi kiểm bằng /mailbox/dns. Ghi chưa trọn ⇒ 503 (gửi lại sau ít phút). Nhịp 60 giây / tên miền.

POST https://cloudmoon.net/api/v1/mailbox/dns/autowrite
Tham sốVị tríBắt buộcMô tả
domain body có tên miền riêng có hộp thư, dùng DNS tại đây

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): NOT_FOUND (404) · DNS_EXTERNAL (409) · COOLDOWN (429) · UNAVAILABLE (503).

Yêu cầu
curl -X POST 'https://cloudmoon.net/api/v1/mailbox/dns/autowrite' \
  -H 'X-API-Key: ak_...' \
  -H 'Content-Type: application/json' \
  -d '{"domain":"congty.vn"}'
Yêu cầu
import requests

r = requests.post(
    "https://cloudmoon.net/api/v1/mailbox/dns/autowrite",
    headers={"X-API-Key": "ak_..."},
    json={"domain": "congty.vn"},
    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/mailbox/dns/autowrite", {
  method: "POST",
  headers: {
    "X-API-Key": "ak_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ domain: "congty.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/mailbox/dns/autowrite', ['domain' => 'congty.vn']);
print_r($kq);
Thân yêu cầu
{
    "domain": "congty.vn"
}
Phản hồi
{
    "status": "success",
    "msg": "Đã ghi bộ bản ghi thư vào DNS — chờ vài phút để lan truyền rồi kiểm lại bằng GET /mailbox/dns",
    "data": {
        "domain": "congty.vn",
        "domain_source": "managed",
        "records": [
            {
                "type": "MX",
                "name": "@",
                "fqdn": "congty.vn",
                "value": "mx.congty.vn.mail.example",
                "priority": 10
            },
            {
                "type": "TXT",
                "name": "@",
                "fqdn": "congty.vn",
                "value": "v=spf1 include:_spf.mail.example ~all",
                "priority": 0
            },
            {
                "type": "TXT",
                "name": "cm._domainkey",
                "fqdn": "cm._domainkey.congty.vn",
                "value": "v=DKIM1; k=rsa; p=MIIBIjANBgkqh",
                "priority": 0
            },
            {
                "type": "TXT",
                "name": "_dmarc",
                "fqdn": "_dmarc.congty.vn",
                "value": "v=DMARC1; p=none;",
                "priority": 0
            }
        ],
        "dns_status": "configured"
    }
}
Zalo