KKev OTP

Kirim OTP ke email dalam satu request.

API ringan untuk mengirim kode verifikasi dengan nama aplikasi, logo, dan desain email milik Anda sendiri.

Mulai pasangCoba langsung

Pemasangan

Ikuti urutan ini persis. Sebagian besar error deploy berasal dari struktur folder yang salah atau langkah yang terlewat.

1. Siapkan App Password Gmail

Aktifkan verifikasi 2 langkah di akun Gmail, lalu buat App Password di myaccount.google.com/apppasswords. Kode 16 karakter itu yang dipakai, bukan password Gmail biasa.

2. Pastikan struktur repo seperti ini

File harus berada di root repo. Jangan mengunggah foldernya sebagai subfolder.

api-email-otp/
├─ api/
│  └─ send.js
├─ public/
│  └─ index.html
├─ config.json
├─ package.json
├─ vercel.json
└─ .gitignore

3. Isi config.json

Isi gmail.user dan gmail.pass. Pengaturan lain boleh dibiarkan. Setiap kali config.json diubah, push ulang agar Vercel deploy ulang.

4. Push ke GitHub

Gunakan repo private karena config.json berisi App Password.

git init
git add .
git commit -m "api email otp"
git branch -M main
git remote add origin https://github.com/USERNAME/NAMA-REPO.git
git push -u origin main

5. Import ke Vercel

Pilih Add New → Project, lalu pilih repo tadi. Atur seperti ini lalu klik Deploy:

PengaturanNilai
Framework PresetOther
Root Directorykosongkan (./)
Build Command, Output Directory, Install Commandbiarkan default
Environment Variablestidak perlu diisi
Node.js Version24.x (sudah diatur di package.json)

6. Tes setelah deploy

Ganti alamat dan email, lalu jalankan. Hasil yang benar adalah {"ok":true,...} dan email masuk ke penerima.

curl -X POST https://DOMAIN-ANDA.vercel.app/api/send \
  -H "Content-Type: application/json" \
  -d '{"to":"emailanda@gmail.com","app":"Tes","otp":"123456"}'

Kalau ada masalah

GejalaPenyebab dan solusi
Build: Node.js version discontinuedPastikan package.json berisi "engines": { "node": "24.x" }.
/api/send menghasilkan 404Folder api tidak berada di root repo. Perbaiki struktur lalu push ulang.
Respons 405Request memakai GET. Gunakan POST.
smtp_authApp Password salah, verifikasi 2 langkah belum aktif, atau email di gmail.user tidak cocok dengan App Password.
not_configuredgmail.user atau gmail.pass di config.json masih kosong.
send_failedGangguan sementara atau batas kirim harian Gmail tercapai. Coba lagi nanti.
rate_limitedLebih dari batas request per menit. Ubah rateLimit di config.json bila perlu.
Email masuk ke spamWajar pada pengirim Gmail baru. Minta penerima menandai "bukan spam".
Perubahan config tidak berlakuCommit dan push dulu. Vercel hanya membaca config.json saat deploy.

Mode

Endpoint POST /api/send punya dua mode. Pilih lewat field mode. Jika tidak diisi, mode bawaan dari config.json dipakai (otp).

Mengirim email OTP dengan template HTML bawaan. Tampilan template diatur di bagian template pada config.json.

NamaTipeKeterangan
to wajibstringAlamat email penerima.
app wajibstringNama aplikasi. Tampil sebagai nama pengirim dan judul email.
otp wajibstringKode OTP, 3–12 karakter (huruf, angka, atau tanda hubung).
logostringLink gambar logo. Harus diawali https://.
subjectstringJudul email. Bawaan dari email.subject di config.
curl -X POST https://DOMAIN-ANDA.vercel.app/api/send \
  -H "Content-Type: application/json" \
  -d '{
    "to": "user@example.com",
    "app": "Nama Aplikasi",
    "otp": "482913",
    "logo": "https://example.com/logo.png"
  }'

Respons

Semua respons berupa JSON dengan field ok.

Berhasil · 200

{ "ok": true, "mode": "otp", "id": "<message-id>", "to": "user@example.com" }

Gagal

{ "ok": false, "error": { "code": "invalid_otp", "message": "Field 'otp' wajib 3-12 karakter ..." } }
StatusKodePenyebab
400invalid_bodyBody bukan JSON object.
400invalid_modeField mode bukan otp atau html.
400invalid_toEmail penerima tidak valid.
400invalid_appNama aplikasi kosong (mode otp) atau terlalu panjang.
400invalid_otpFormat OTP tidak sesuai.
400invalid_logoLink logo bukan https yang valid.
400invalid_htmlHTML kosong (mode html) atau lebih dari 100 KB.
405method_not_allowedMemakai metode selain POST.
429rate_limitedLebih dari 10 request per menit dari satu IP.
500not_configuredGmail di config.json belum diisi.
502smtp_authLogin Gmail ditolak. Periksa App Password.
502send_failedGmail gagal mengirim. Coba lagi.

Coba langsung

Email yang dikirim dari form ini asli sampai ke penerima.

Hasil request akan muncul di sini.