Trên trang này
- Tổng quan
- Mua & theo dõi
- Tên miền & xác minh
- Bản ghi DNS thư
- Kết nối & mật khẩu
- Trạng thái hộp thư
- Gia hạn & hết hạn
- Luật riêng
- Nhịp thao tác
- Mã lỗi riêng
- GET /mailbox/products
- GET /mailbox/check
- POST /mailbox/verify-domain
- POST /mailbox/quote
- POST /mailbox/buy
- GET /mailbox/list
- GET /mailbox/info
- GET /mailbox/credentials
- POST /mailbox/renew
- POST /mailbox/auto-renew
- POST /mailbox/upgrade
- POST /mailbox/change-cycle
- POST /mailbox/change-password
- POST /mailbox/webmail
- POST /mailbox/note
- POST /mailbox/delete
- GET /mailbox/stats
- GET /mailbox/dns
- POST /mailbox/dns/autowrite
Tổng quan
Địa chỉ gốc của các endpoint trên trang này:
https://cloudmoon.net/api/v1| Endpoint | Việc | Quyền khoá |
|---|---|---|
GET /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).
GET /mailbox/productscho 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).POST /mailbox/quotevớ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_eachvàenough(số dư khả dụng đủ chưa).POST /mailbox/buyvới{product_id, billing_cycle, domain_type, shared_domain? | domain?, mailboxes}và headerIdempotency-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ộporder_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ùngIdempotency-Keythì bản phát lại đểpassword: nullkèmsecrets_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).namelà 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ó trongmailboxes. HỏiGET /mailbox/info?order_code=…tới khiready. - Đã 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 ấyinfobáorefunded_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ớiIdempotency-Keymới. Ngoại lệ:400 FAILEDở lệnh mua có thể là giao dịch chưa rõ kết quả — đừng mua lại ngay: đối chiếu/mailbox/listhoặ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-Keycũ ⇒ nhận lại kết quả lần đầu (không kèm mật khẩu), hoặc409 IDEMPOTENCY_PENDINGkhi 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_buylà giá của một hộp ấy). Các trườngorder_code·emailở cấpdatalà của hộp đầu tiên.
{
"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 trongshared_domains; bỏ trốngshared_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.
409 DOMAIN_NOT_VERIFIED+data.record(bản ghi cần thêm;null= chưa có mã — gọiverify-domain) — chưa trừ tiền.
Xác minh bằng bản ghi TXT
POST /mailbox/verify-domainvớ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.- 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ự.
- Gọi lại kèm
check: true⇒verified: true, hoặcverified: false+result(not_found·wrong_value·cname). Đừng gửicheck: truetrướ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à
checknhận409 DOMAIN_IN_USE— liên hệ hỗ trợ (chưa có bằng chứng thì gặp409 DOMAIN_NOT_VERIFIEDtrước). Tên miền thuộc hạ tầng của hệ thống, hoặc gửi miền chung vớiown⇒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 (managedkhi đủ điều kiện) — nên để trống. Tên miền đã có hộp thư: nguồn làmanagedchỉ 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ửimanagedkhi nguồn thật làexternal⇒409 DNS_EXTERNAL; gửiexternalkhi 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ại | Tên | Giá trị |
|---|---|---|
MX | gố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>._domainkey | v=DKIM1; k=rsa; p=… — khoá công khai riêng của tên miền |
TXT (DMARC) | _dmarc | v=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ọiPOST /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ằngGET /mailbox/dns.dns_statuscủ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, xemall_found) ·pending(chưa ghi xong) ·external.GET /mailbox/dnschỉ 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ức | Cổng | Bảo mật |
|---|---|---|
| IMAP (đọc thư) | 993 | SSL/TLS |
| POP3 (tải thư về) | 995 | SSL/TLS |
| SMTP (gửi thư) | 587 | STARTTLS |
| Webmail | 443 | HTTPS — 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-passwordvớ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_limitngườ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_statusorder_status | Nghĩa |
|---|---|
provisioningpending_provision | Đã trả tiền, hộp đang được tạo. Lệnh còn làm được: tự gia hạn, ghi chú. |
failedpending_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ú. |
readyactive | Đ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). |
expiredpending_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). |
expiredexpired | 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). |
failedcancelled | Đơn đã huỷ và hoàn tiền (refunded_amount ở info). |
deletedcancelled | Đã xoá — lệnh nhận 409 ORDER_CANCELLED. |
allowed_actions(ở cảlistlẫninfo) — việc làm được ngay lúc này, cùng luật với các nút trên trang quản lý 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.chargedluô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.listtrả 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=theoprovision_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/renewvớ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á:quotevớ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-Aftertớ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 (
renewvắng trongallowed_actions, lệnh nhận400 NOT_SUPPORTED) — liên hệ hỗ trợ. - Quá hạn: qua
time_expiremà 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ớirestore_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ùngIdempotency-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ằngPOST /mailbox/auto-renewvớienabledlà boolean — lệnh ĐẶT giá trị, gửi lại cùng giá trị không lật ngược): khi còn 7 ngày hoặc ít hơn tớitime_expire— 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/upgradevớ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-cyclevớ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= đúngorder_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:retiredtrên tên miền riêng,takentrê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ận503 SERVICE_DISABLED(GET /services/statusbáomailbox: 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):checkkhông hỏi hệ thống email (status: "simulated"khi địa chỉ chưa có ở đây) ·verify-domainkhông cấp mã, không tra DNS · lệnh mua trả mỗi hộp một mãSANDBOX…(28 ký tự) — hỏiinfobằng mã ấy (vẫn kèmX-Sandbox: 1) ⇒ hộp mẫureadyngay, địa chỉ mẫusbx…@<miền>(tên miền riêng mẫusandbox-….example); kịch bảnPROVISION_FAILED⇒ lệnh mua 202,infoởprovisioning10 giây đầu rồifailed. Mã chỉ chở gói, chu kỳ, miền chung, số hộp và cờ — không chở tên hộp.statstrả số mẫu;webmailtrả địa chỉ webmail không kèm mã đăng nhập;GET /mailbox/dnsvẫ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ó tronglist.
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ệnh | Cá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ẩu | 1 phút (tính riêng) |
Mở webmail (/mailbox/webmail) | 10 giây (tính riêng) |
| Bật/tắt tự gia hạn | 5 giây (tính riêng) |
| Gia hạn | tối đa 1 lượt / ngày / 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.
| HTTP | code | Ý nghĩa | Nê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. |
/mailbox/products
Chỉ đọcDanh 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/productsKhông có tham số — chỉ cần header X-API-Key.
curl 'https://cloudmoon.net/api/v1/mailbox/products' \
-H 'X-API-Key: ak_...'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())// 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());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('GET', '/v1/mailbox/products');
print_r($kq);{
"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"
}
}/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ộc | Mô 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 |
curl 'https://cloudmoon.net/api/v1/mailbox/check?email=lienhe%40systemcloudvps.com' \
-H 'X-API-Key: ak_...'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())// 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());// 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);{
"status": "success",
"msg": "Còn trống",
"data": {
"email": "[email protected]",
"username": "lienhe",
"domain": "mail-chung.example",
"domain_type": "shared",
"available": true,
"status": "available"
}
}/mailbox/verify-domain
Toàn quyềnXá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ộc | Mô 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).
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}'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())// 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());// 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);{
"domain": "congty.vn",
"check": true
}{
"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"
}
}/mailbox/quote
Chỉ đọcBÁO GIÁ — không trừ tiền, không ghi gì, khoá chỉ đọc gọi được. type buy (mặc định): CÙNG thân và CÙNG bộ kiểm đầ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ộc | Mô 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.
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"}]}'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())// 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());// 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);{
"product_id": 1,
"billing_cycle": "onemonth",
"domain_type": "shared",
"mailboxes": [
{
"username": "lienhe"
},
{
"username": "ketoan"
}
]
}{
"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
}
}/mailbox/buy
Toàn quyềnMua 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ộc | Mô tả |
|---|---|---|---|
Idempotency-Key |
header | không | chống trừ tiền hai lần khi gửi lại |
product_id |
body | có | id 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).
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"}]}'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())// 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());// 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);{
"product_id": 1,
"billing_cycle": "onemonth",
"domain_type": "shared",
"mailboxes": [
{
"username": "lienhe",
"name": "Lien he"
}
]
}{
"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)."
}
}/mailbox/list
Chỉ đọcMọ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ộc | Mô 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 |
curl 'https://cloudmoon.net/api/v1/mailbox/list' \
-H 'X-API-Key: ak_...'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())// 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());// cm_api(): xem mục "Client mẫu" ở trang Tổng quan
$kq = cm_api('GET', '/v1/mailbox/list');
print_r($kq);{
"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
}
}/mailbox/info
Chỉ đọcChi 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ộc | Mô tả |
|---|---|---|---|
order_code |
query | có | Mã đơn (order_code) — lấy từ lệnh mua hoặc /list |
Chạy thử Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu.
curl 'https://cloudmoon.net/api/v1/mailbox/info?order_code=171026MAILBOXQWERTYUIOPAS' \
-H 'X-API-Key: ak_...'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())// 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());// 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);{
"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"
]
}
}/mailbox/credentials
Toàn quyềnEmail · 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ộc | Mô tả |
|---|---|---|---|
order_code |
query | có | Mã đơn (order_code) — lấy từ lệnh mua hoặc /list |
Chạy thử Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu.
curl 'https://cloudmoon.net/api/v1/mailbox/credentials?order_code=171026MAILBOXQWERTYUIOPAS' \
-H 'X-API-Key: ak_...'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())// 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());// 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);{
"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"
}
}/mailbox/renew
Toàn quyềnGia 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ộc | Mô tả |
|---|---|---|---|
Idempotency-Key |
header | không | chống trừ tiền hai lần khi gửi lại |
order_code |
body | có | Mã đơn (order_code) — lấy từ lệnh mua hoặc /list |
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).
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"}'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())// 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());// 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);{
"order_code": "171026MAILBOXQWERTYUIOPAS"
}{
"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"
}
}/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ộc | Mô tả |
|---|---|---|---|
order_code |
body | có | Mã đơn (order_code) — lấy từ lệnh mua hoặc /list |
enabled |
body | có | true / false |
Chạy thử Gửi kèm X-Sandbox: 1: máy chủ kiểm như lượt thật rồi trả kết quả mô phỏng cùng khuôn — không trừ tiền, không đổi gì. Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu. Kịch bản lỗi (X-Sandbox-Scenario): ORDER_CANCELLED (409) · ORDER_EXPIRED (409) · COOLDOWN (429) · IN_PROGRESS (429) · BUSY (429) · FAILED (400).
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}'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())// 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());// 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);{
"order_code": "171026MAILBOXQWERTYUIOPAS",
"enabled": false
}{
"status": "success",
"msg": "Đã tắt tự gia hạn",
"data": {
"order_code": "171026MAILBOXQWERTYUIOPAS",
"renew_auto": "off"
}
}/mailbox/upgrade
Toàn quyềnNâ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ộc | Mô tả |
|---|---|---|---|
Idempotency-Key |
header | không | chống trừ tiền hai lần khi gửi lại |
order_code |
body | có | Mã đơn (order_code) — lấy từ lệnh mua hoặc /list |
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).
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}'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())// 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());// 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);{
"order_code": "171026MAILBOXQWERTYUIOPAS",
"product_id": 2
}{
"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
}
}/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ộc | Mô 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).
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"}'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())// 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());// 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);{
"order_code": "171026MAILBOXQWERTYUIOPAS",
"billing_cycle": "sixmonth"
}{
"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"
}
}/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ộc | Mô 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).
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"}'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())// 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());// 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);{
"order_code": "171026MAILBOXQWERTYUIOPAS"
}{
"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)."
}
}/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ộc | Mô tả |
|---|---|---|---|
order_code |
body | có | Mã đơn (order_code) — lấy từ lệnh mua hoặc /list |
Chạy thử Gửi kèm X-Sandbox: 1: máy chủ kiểm như lượt thật rồi trả kết quả mô phỏng cùng khuôn — không trừ tiền, không đổi gì. Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu. Kịch bản lỗi (X-Sandbox-Scenario): ORDER_CANCELLED (409) · PROVISIONING (409) · RENEW_REQUIRED (409) · ORDER_EXPIRED (409) · SUSPENDED (409) · COOLDOWN (429) · IN_PROGRESS (429) · BUSY (429) · UNAVAILABLE (503).
curl -X POST 'https://cloudmoon.net/api/v1/mailbox/webmail' \
-H 'X-API-Key: ak_...' \
-H 'Content-Type: application/json' \
-d '{"order_code":"171026MAILBOXQWERTYUIOPAS"}'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())// 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());// 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);{
"order_code": "171026MAILBOXQWERTYUIOPAS"
}{
"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]"
}
}/mailbox/note
Toàn quyềnGhi 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ộc | Mô tả |
|---|---|---|---|
order_code |
body | có | Mã đơn (order_code) — lấy từ lệnh mua hoặc /list |
note |
body | có | ≤ 200 ký tự |
Chạy thử Gửi kèm X-Sandbox: 1: máy chủ kiểm như lượt thật rồi trả kết quả mô phỏng cùng khuôn — không trừ tiền, không đổi gì. Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu. Kịch bản lỗi (X-Sandbox-Scenario): ORDER_CANCELLED (409) · IN_PROGRESS (429) · BUSY (429) · FAILED (400).
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"}'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())// 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());// 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);{
"order_code": "171026MAILBOXQWERTYUIOPAS",
"note": "Hop thu ban hang"
}{
"status": "success",
"msg": "Đã lưu ghi chú",
"data": {
"order_code": "171026MAILBOXQWERTYUIOPAS",
"user_note": "Hop thu ban hang"
}
}/mailbox/delete
Toàn quyềnXOÁ 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ộc | Mô tả |
|---|---|---|---|
order_code |
body | có | Mã đơn (order_code) — lấy từ lệnh mua hoặc /list |
confirm |
body | có | bằng đúng order_code |
Chạy thử Gửi kèm X-Sandbox: 1: máy chủ kiểm như lượt thật rồi trả kết quả mô phỏng cùng khuôn — không trừ tiền, không đổi gì. Nhận cả mã SANDBOX… của lệnh mua chạy thử ⇒ trả máy mẫu. Kịch bản lỗi (X-Sandbox-Scenario): ORDER_CANCELLED (409) · PROVISIONING (409) · IN_PROGRESS (429) · BUSY (429) · UNAVAILABLE (503) · FAILED (400).
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"}'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())// 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());// 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);{
"order_code": "171026MAILBOXQWERTYUIOPAS",
"confirm": "171026MAILBOXQWERTYUIOPAS"
}{
"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
}
}/mailbox/stats
Chỉ đọcSố 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ộc | Mô 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).
curl 'https://cloudmoon.net/api/v1/mailbox/stats?order_code=171026MAILBOXQWERTYUIOPAS' \
-H 'X-API-Key: ak_...'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())// 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());// 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);{
"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
}
}/mailbox/dns
Chỉ đọcBộ 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ộc | Mô tả |
|---|---|---|---|
domain |
query | có | tên miền riêng có hộp thư |
curl 'https://cloudmoon.net/api/v1/mailbox/dns?domain=congty.vn' \
-H 'X-API-Key: ak_...'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())// 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());// 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);{
"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
}
}/mailbox/dns/autowrite
Toàn quyềnGhi (đồ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ộc | Mô 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).
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"}'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())// 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());// 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);{
"domain": "congty.vn"
}{
"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"
}
}