TempMail API v1

REST API để tạo email tạm thời, đọc thư và lấy mã OTP tự động.

Xác thực & Rate limit

Mọi endpoint (trừ /domains) yêu cầu API key trong header:

X-API-Key: tm_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

API key được cấp trong trang quản trị, có thể đặt thời hạn hoặc vô thời hạn.

Rate limit: 2000 request / giây / IP (cấu hình được 1000–2000 qua biến môi trường RATE_LIMIT). Header chuẩn RateLimit-* được trả kèm mỗi response.

Endpoints

POST/api/v1/email/create

Tạo một địa chỉ email mới. Bỏ trống username để random; bỏ trống domain để chọn ngẫu nhiên.

curl -X POST https://yourdomain.com/api/v1/email/create \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"username": "thuan123", "domain": "tempmail.local"}'

Response:

{
  "success": true,
  "email": "thuan123@tempmail.local",
  "id": 42,
  "created_at": 1751788800000
}
GET/api/v1/domains

Danh sách domain đang hoạt động. Không cần API key.

{ "success": true, "domains": ["tempmail.local", "quickinbox.local"] }
GET/api/v1/emails

Danh sách email đã tạo bởi API key hiện tại (tối đa 500, mới nhất trước).

{
  "success": true,
  "count": 2,
  "emails": [
    { "address": "thuan123@tempmail.local", "created_at": 1751788800000, "message_count": 3 }
  ]
}
GET/api/v1/messages?email=...

Đọc toàn bộ thư của một địa chỉ (tối đa 100, mới nhất trước). Thư sẽ được đánh dấu đã đọc.

curl "https://yourdomain.com/api/v1/messages?email=thuan123@tempmail.local" \
  -H "X-API-Key: YOUR_KEY"
{
  "success": true,
  "email": "thuan123@tempmail.local",
  "count": 1,
  "messages": [
    {
      "id": 7,
      "sender": "no-reply@service.com",
      "subject": "Mã xác minh của bạn",
      "body_text": "Mã OTP của bạn là: 493201",
      "body_html": "

Mã OTP của bạn là: 493201

", "received_at": 1751788912000, "is_read": 0 } ] }
GET/api/v1/otp?email=...&since_minutes=15

Tự động trích xuất mã OTP từ thư mới nhất. Logic ưu tiên:

  1. Số 4–8 chữ số nằm cùng dòng với từ khoá (OTP, code, mã xác minh, verify, PIN…) — hỗ trợ cả mã có khoảng trắng/gạch nối như 123 456.
  2. Số 4–8 chữ số đứng riêng một dòng (kiểu mail in mã to giữa trang).
  3. Fallback: số 6 chữ số đầu tiên trong nội dung.

since_minutes (mặc định 15): chỉ quét thư nhận trong N phút gần nhất — tránh lấy nhầm mã cũ.

{
  "success": true,
  "otp": "493201",
  "source": {
    "message_id": 7,
    "sender": "no-reply@service.com",
    "subject": "Mã xác minh của bạn",
    "received_at": 1751788912000
  }
}

Nếu chưa có mã: { "success": true, "otp": null } — hãy poll lại sau vài giây.

POST/api/v1/dev/simulate-mail

Endpoint phát triển: bơm một thư giả vào hộp để test khi chưa cấu hình MX record.

{ "to": "thuan123@tempmail.local", "from": "test@x.com", "subject": "Test", "text": "OTP: 123456" }

Mã lỗi

HTTPÝ nghĩa
401Thiếu API key, key sai hoặc đã hết hạn / bị thu hồi
400Tham số không hợp lệ (username sai định dạng, thiếu ?email=…)
404Email không tồn tại
409Địa chỉ email đã có người dùng
429Vượt rate limit (2000 req/s)

Ví dụ luồng lấy OTP tự động (Python)

import requests, time

BASE = "https://yourdomain.com/api/v1"
H = {"X-API-Key": "YOUR_KEY"}

email = requests.post(f"{BASE}/email/create", json={}, headers=H).json()["email"]
print("Dùng email:", email)  # đăng ký dịch vụ bằng email này...

for _ in range(30):          # poll tối đa 60s
    r = requests.get(f"{BASE}/otp", params={"email": email}, headers=H).json()
    if r["otp"]:
        print("OTP:", r["otp"]); break
    time.sleep(2)