Integrasi bot
Pakai ARUX Mail dari bot.
Alur lengkap: ambil alamat, tunggu email masuk, baca OTP atau link verifikasi, lalu simpan token untuk pemulihan sesi.
Daftar isi
Model akses
Tidak ada akun, cookie, atau login. Setiap mailbox punya alamat dan token. Alamat bersifat permanen; pesan dihapus otomatis 24 jam setelah diterima.
| Base URL | https://aruxmail.tech (HTTP dan www dialihkan ke sini) |
|---|---|
| Domain email | Lihat GET /api/domains. aruxmail.tech adalah domain web/API, bukan domain penerima email. |
| Auth | Header Authorization: Bearer <token>. Inbox juga butuh ?email=; token saja cukup untuk /api/session. |
| Token | Ditampilkan sekali saat mailbox dibuat. Server hanya menyimpan hash SHA-256. Token bisa dipakai untuk menemukan alamat lewat /api/session. |
| Alamat | Dua mode: random (aru + 12 hex) atau nama sendiri (3–32 karakter: huruf kecil, angka, titik, _, -). |
| Retensi pesan | 24 jam sejak diterima, dibersihkan cron tiap jam. |
Token = kunci inbox. Siapa pun yang punya token bisa membaca inbox tersebut. Simpan di tempat aman dan jangan tulis ke log.
Endpoint publik
| Method | Path | Fungsi |
|---|---|---|
| GET | /api/domains | Daftar domain aktif yang bisa dipakai. |
| POST | /api/mailboxes | Buat mailbox. Body: {"domain":"aruxshop.my.id"} atau tambah "name":"namakamu". |
| GET | /api/session | Cari alamat dari token saja. Butuh header Bearer; balas { email, name, expires_at, permanent }. |
| GET | /api/inbox?email= | Daftar pesan (maks 100). Butuh token. |
| GET | /api/messages/:id?email= | Detail pesan: teks, OTP, links, raw email. Butuh token. |
| GET | /api/health | Cek status service. |
Tidak ada endpoint untuk reset token. Token yang hilang hanya bisa diganti manual oleh pemilik server (update token_hash di D1).
Alur bot (contoh: daftar CapCut)
- Ambil domain —
GET /api/domains, pilih salah satu yang aktif. - Buat mailbox —
POST /api/mailboxesdengan domain tadi, tambahkan"name"kalau ingin alamat sendiri (kalau tidak, alamat random). Simpanemaildantoken. - Isi form pendaftaran — masukkan
emailke form signup CapCut, submit, lalu tunggu halaman minta verifikasi. - Polling inbox —
GET /api/inbox?email=...tiap 5–10 detik (batas 120 req/menit). Berhenti saatmessages.length > 0. - Baca pesan —
GET /api/messages/:id?email=.... Ambilotpkalau ada; kalau tidak, pilih link verifikasi darilinks. - Lanjutkan pendaftaran — isi OTP atau buka link. Simpan
email+tokendi database bot untuk pemulihan sesi nanti.
CapCut bisa mengirim OTP 6 digit atau link verifikasi, tergantung alur dan region. Kode contoh di bawah menangani keduanya: pakai otp jika ada, jika tidak cari link yang host-nya cocok.
Contoh kode
1 · Buat mailbox (curl)
# alamat random
curl -s -X POST https://aruxmail.tech/api/mailboxes \
-H "Content-Type: application/json" \
-d '{"domain":"aruxshop.my.id"}'
# nama sendiri (3–32 karakter)
curl -s -X POST https://aruxmail.tech/api/mailboxes \
-H "Content-Type: application/json" \
-d '{"domain":"aruxshop.my.id","name":"capcutbot"}'
Respons 201:
{
"email": "capcutbot@aruxshop.my.id",
"token": "64 karakter hex — simpan sekarang",
"expires_at": 0,
"permanent": true,
"retention_hours": 24,
"message_retention_hours": 24
}
2 · Node.js (fetch)
const BASE = "https://aruxmail.tech";
async function createMailbox(domain) {
const res = await fetch(`${BASE}/api/mailboxes`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ domain })
});
if (!res.ok) throw new Error(`create ${res.status}: ${await res.text()}`);
return res.json(); // { email, token, ... }
}
async function waitForMessage(email, token, { timeoutMs = 180000, intervalMs = 5000 } = {}) {
const deadline = Date.now() + timeoutMs;
while (Date.now() < deadline) {
const res = await fetch(`${BASE}/api/inbox?email=${encodeURIComponent(email)}`, {
headers: { Authorization: `Bearer ${token}` }
});
if (res.status === 429) {
const retry = Number(res.headers.get("Retry-After") || 5);
await new Promise((r) => setTimeout(r, retry * 1000));
continue;
}
if (!res.ok) throw new Error(`inbox ${res.status}: ${await res.text()}`);
const { messages } = await res.json();
if (messages.length) return messages[0];
await new Promise((r) => setTimeout(r, intervalMs));
}
throw new Error("Timeout menunggu email");
}
async function readMessage(id, email, token) {
const res = await fetch(
`${BASE}/api/messages/${id}?email=${encodeURIComponent(email)}`,
{ headers: { Authorization: `Bearer ${token}` } }
);
if (!res.ok) throw new Error(`message ${res.status}: ${await res.text()}`);
return (await res.json()).message; // { otp, links, text, ... }
}
3 · CapCut: email → OTP/link
const box = await createMailbox("aruxshop.my.id");
// ... isi form signup CapCut dengan box.email, submit ...
const summary = await waitForMessage(box.email, box.token);
const msg = await readMessage(summary.id, box.email, box.token);
const otp = msg.otp || null; // contoh: "482913"
const verifyLink = msg.links.find((item) => {
try {
return /(^|\.)capcut\.com$/i.test(new URL(item.url).host);
} catch {
return false;
}
}) || msg.links[0] || null;
if (otp) {
// isi input OTP di halaman verifikasi
} else if (verifyLink) {
// buka verifyLink.url
} else {
throw new Error("Email masuk tapi tidak ada OTP/link yang cocok");
}
4 · Python (requests)
import time
import requests
BASE = "https://aruxmail.tech"
box = requests.post(
f"{BASE}/api/mailboxes",
json={"domain": "aruxshop.my.id"},
timeout=20,
).json()
email, token = box["email"], box["token"]
headers = {"Authorization": f"Bearer {token}"}
deadline = time.time() + 180
message = None
while time.time() < deadline:
res = requests.get(
f"{BASE}/api/inbox",
params={"email": email},
headers=headers,
timeout=20,
)
if res.status_code == 429:
time.sleep(int(res.headers.get("Retry-After", 5)))
continue
res.raise_for_status()
messages = res.json()["messages"]
if messages:
message = messages[0]
break
time.sleep(5)
detail = requests.get(
f"{BASE}/api/messages/{message['id']}",
params={"email": email},
headers=headers,
timeout=20,
).json()["message"]
print("OTP:", detail.get("otp"))
print("Links:", detail.get("links"))
OTP & link
Dua hal yang biasanya dibutuhkan bot ada di detail pesan.
otp | String 4–8 digit hasil deteksi otomatis dari subjek/teks/HTML. Bisa null. |
|---|---|
links | Array { url, text }. Diambil dari <a href> di HTML dan URL telanjang di teks. Label anchor dipertahankan (mis. “Verification Link”). |
text | Isi email sebagai teks biasa (HTML di-strip). |
raw | Email mentah RFC822, untuk debugging. |
HTML tidak pernah dirender di UI. Link diekstrak dan ditampilkan sebagai daftar yang bisa diklik — aman dari XSS dan tetap menangkap link yang “dibalut” teks seperti di email Netflix/Alight Motion.
// Pilih link berdasarkan host, jangan asal ambil links[0]
const target = msg.links.find(({ url }) => {
try { return new URL(url).host.endsWith("netflix.com"); } catch { return false; }
});
Pemulihan sesi
Sesi bot tidak disimpan di server. Yang perlu disimpan hanya email + token; kapan pun bisa dipakai lagi.
Via UI
Buka halaman inbox → bagian Pulihkan sesi → tempel token saja → Buka inbox. Alamat email ditemukan otomatis dari token.
Via API (token → alamat)
curl -s https://aruxmail.tech/api/session \ -H "Authorization: Bearer <TOKEN>"
Balasan: {"email":"capcutbot@aruxshop.my.id","name":"capcutbot","expires_at":0,"permanent":true}. 401 = token tidak valid.
Via API (buka inbox)
curl -s "https://aruxmail.tech/api/inbox?email=capcutbot@aruxshop.my.id" \ -H "Authorization: Bearer <TOKEN>"
Via browser (localStorage)
localStorage.setItem("aruxmail_inbox_v1", JSON.stringify({
email: "capcutbot@aruxshop.my.id",
token: "<TOKEN>",
expires_at: 0
}));
location.reload();
Token tidak bisa di-recover dari server. Kalau hilang, minta pemilik server mengganti token_hash mailbox; token lama otomatis tidak berlaku.
Batas & retensi
| Aksi | Batas |
|---|---|
| Buat mailbox | 3 / menit dan 10 / jam per IP |
| Percobaan buat mailbox (termasuk format salah) | 30 / menit per IP |
| Baca inbox | 120 / menit per IP |
| Baca detail pesan | 120 / menit per IP |
| Ukuran email | Maks 5 MiB |
| Umur pesan | 24 jam sejak diterima |
| Umur alamat | Permanen sampai dihapus admin |
Kalau kena 429, hormati header Retry-After. Untuk bot dengan banyak akun, jangan membuat mailbox lebih cepat dari batas — siapkan antrean dan jeda.
Error umum
| Status | Arti | Solusi |
|---|---|---|
400 | Body/domain tidak valid | Kirim JSON {"domain":"..."} yang benar. |
401 | Email/token salah | Pakai token asli; cek alamat tidak typo. |
409 | Domain belum aktif/verified | Hubungi admin untuk aktivasi domain. |
429 | Rate limit | Tunggu sesuai Retry-After. |
413 | Body terlalu besar | Kirim JSON kecil (maks 16 KiB). |
404 | Pesan tidak ditemukan / sudah dihapus | Cek ID; pesan mungkin lewat 24 jam. |
502 | Pemeriksaan DNS admin gagal | Hanya untuk endpoint admin; coba lagi. |
Keamanan
- Perlakukan token seperti password. Jangan kirim ke log, screenshot, atau chat publik.
- Jangan pakai alamat ini untuk akun penting, perbankan, atau pemulihan akun.
- Email berisi HTML tidak dirender; hanya teks dan daftar link yang diekstrak.
- Admin tidak bisa membaca isi inbox; admin hanya melihat metadata (pengirim, subjek, OTP, ukuran).
- Pesan dihapus permanen setelah 24 jam — kalau bot butuh data lebih lama, simpan OTP/link ke database sendiri.