POST /api/v1/addresses
Tạo một địa chỉ, có thể chỉ định domain hoặc tự đặt phần tên. Trả về bản ghi địa chỉ đầy đủ. Không gửi phần tên thì server tự sinh tên ngẫu nhiên mười hai ký tự. Domain premium cần gói trả phí.
Cho developer
Tạo địa chỉ bằng code, đợi thư thật qua một luồng trực tiếp, và đọc mã xác minh ra từ một trường dữ liệu thay vì từ một biểu thức chính quy bạn viết lúc nửa đêm.
# 1. Tạo địa chỉ
curl -X POST https://9inbox.io/api/v1/addresses \
-H "Authorization: Bearer mgw_live_xxx" \
-H "Content-Type: application/json" \
-d '{"domain": "9inbox.io"}'
# 2. Đọc thư đã tới
curl "https://9inbox.io/api/v1/messages?address_id=<uuid>&limit=50" \
-H "Authorization: Bearer mgw_live_xxx"const headers = { Authorization: `Bearer ${process.env.NINEINBOX_KEY}` };
const res = await fetch("https://9inbox.io/api/v1/addresses", {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({}),
});
const { data } = await res.json();
console.log(data.address.address); // [email protected]// Thư đến đẩy thẳng về, không cần polling.
const stream = new EventSource(
`https://9inbox.io/api/v1/messages/stream?address_id=${id}`,
);
stream.addEventListener("message", (event) => {
const msg = JSON.parse(event.data);
// otp_code đã được server trích sẵn — không phải tự regex thân thư.
console.log(msg.subject, msg.otp_code);
});Vì sao cần API
Kiểm thử một luồng đăng ký từ đầu đến cuối nghĩa là phải kiểm thử cả đoạn có một email thật đi tới. Các đội thường né bằng một trong ba cách, và cả ba đều không ổn: giả lập bước gửi thư rồi thôi không test nó nữa, dồn mọi thư về một hộp thư dùng chung rồi tranh nhau xem thư nào của ai, hoặc tạo hộp thư thật bằng tay rồi lặng lẽ ngừng chạy bài test đó sau vài tháng.
Một địa chỉ tạo được bằng một request và đọc được bằng một request nữa xoá bỏ chỗ né đó. Bài test tạo địa chỉ, điền form đăng ký bằng nó, đợi trên luồng cho tới khi thư xác minh tới, rồi đọc mã ra từ thân response. Không có trạng thái dùng chung giữa các lần chạy, vì mỗi lần chạy tự nghĩ ra địa chỉ của mình, và không cần script dọn dẹp, vì địa chỉ tự hết hạn.
Điểm đáng nói là trường otp_code. Mã xác minh được trích khỏi thư ở phía chúng tôi và trả về ngay trong bản tóm tắt thư. Nghĩa là bài test của bạn không phải mang theo một biểu thức chính quy cần sửa mỗi lần nhà cung cấp nào đó đổi mẫu email — mà trên thực tế đó chính là thứ làm hỏng loại test này nhiều nhất.
Endpoint
Tạo một địa chỉ, có thể chỉ định domain hoặc tự đặt phần tên. Trả về bản ghi địa chỉ đầy đủ. Không gửi phần tên thì server tự sinh tên ngẫu nhiên mười hai ký tự. Domain premium cần gói trả phí.
Liệt kê thư của một địa chỉ, hoặc của mọi địa chỉ bạn sở hữu nếu bỏ trống address_id. Phân trang bằng cursor — không có OFFSET ở bất cứ đâu trong API này.
Trả về thư đầy đủ, gồm phần HTML đã sanitize, phần văn bản thuần và thông tin tệp đính kèm. Gọi endpoint này tự đánh dấu thư đã đọc.
File .eml gốc, dùng khi bạn cần soi header, kết quả DKIM, hay đúng cấu trúc MIME mà người gửi tạo ra.
Luồng server-sent events. Phát sự kiện ready kèm danh sách address_id đang theo dõi, sự kiện message mang bản tóm tắt đầy đủ cho mỗi thư mới, và ping mỗi 25 giây để proxy không cắt kết nối.
Các domain khả dụng theo gói của bạn, kèm thông tin domain nào là premium và domain nào đang nhận địa chỉ mới.
Giới hạn
Xác thực bằng bearer token: gửi API key trong header Authorization. Key chỉ hiện đúng một lần lúc tạo và chỉ được lưu dưới dạng hash, nên key bị lộ thì phải thu hồi chứ không lấy lại được. Mỗi key mang scope riêng, và bạn nên phát một key riêng cho từng môi trường để thu hồi key CI bị lộ không kéo theo cả production.
Hạn mức tính theo key và theo phút: sáu mươi request mỗi phút ở gói Pro, sáu trăm ở Business, và sáu mươi mỗi giờ ở gói tài khoản miễn phí. Vượt hạn mức sẽ nhận HTTP 429 kèm header Retry-After tính bằng giây — hãy tôn trọng nó thay vì thử lại ngay, bởi một vòng lặp thử lại dồn dập sẽ giữ bạn ở trạng thái bị chặn vô thời hạn.
Có hai tính chất của luồng SSE cần thiết kế bao quanh. Nó không phát lại: thư tới đúng lúc đang kết nối lại sẽ không sinh ra sự kiện nào, nên một bài test không được phép bỏ sót thư thì phải đối chiếu bằng một lời gọi liệt kê sau khi kết nối, thay vì tin hoàn toàn vào luồng. Và hub chủ động bỏ sự kiện với client quá chậm, nên một bên tiêu thụ chậm sẽ mất sự kiện chứ không làm nghẽn mọi client khác trên cùng một instance.
Webhook có ở gói Pro và Business. Payload được ký bằng HMAC trong header X-MailGW-Signature và thử lại năm lần có backoff. Hãy kiểm tra chữ ký trước khi parse thân request, và làm handler idempotent — một lần thử lại sau timeout sẽ giao cùng một sự kiện tới hai lần.
Những thứ hay gặp trong quá trình tích hợp.
Có. Tài khoản miễn phí đã đăng ký được dùng API với sáu mươi request mỗi giờ, đủ để phát triển và đủ cho một lần chạy test đêm quy mô nhỏ. Gói khách vãng lai hoàn toàn không có API, vì không có key nào để xác thực.
Được, ở gói Business. Bạn trỏ bản ghi MX của domain mình sở hữu về 9inbox, xác minh quyền sở hữu bằng một bản ghi TXT, và mọi địa chỉ dưới domain đó đổ vào tài khoản của bạn theo kiểu catch-all. Bài test khi đó tự nghĩ ra địa chỉ thoải mái mà không phải tạo trước.
Đủ tin để chạy một bài test, nhưng không phải một kênh đảm bảo giao nhận. Khuôn sự kiện không có trường id nên không phát lại được, do đó thư tới đúng lúc kết nối lại sẽ không sinh ra sự kiện. Nếu bài test của bạn không chịu được việc mất thư, hãy gọi liệt kê thư một lần sau sự kiện ready và coi luồng là phần tối ưu chứ không phải nguồn sự thật.
Thông tin tệp đính kèm — tên file, kiểu MIME và dung lượng — trả về kèm chi tiết thư, và nội dung tải xuống được. Giới hạn dung lượng theo gói: 5 MB ở miễn phí, 25 MB ở Pro và 50 MB ở Business. Tệp đính kèm được quét trước khi mở cho tải.
Chúng bị xoá cùng thư của chúng bởi job dọn dẹp định kỳ, và thư gửi tới sau đó bị từ chối ngay ở tầng SMTP. Ở gói Pro và Business, địa chỉ không hết hạn, nên một địa chỉ bộ test của bạn tạo từ một năm trước vẫn dùng được.
Không phải cài gì, không phải điền gì. Cuộn lên đầu trang, bấm Sao chép, rồi dán vào chỗ đang hỏi email của bạn.