API OTP Email untuk Testing dan Otomatisasi (Developer/QA)
Saat tes end-to-end Anda mendaftar ke layanan pihak ketiga, kode verifikasinya dikirim ke alamat email sungguhan. Email dummy di server lokal atau penangkap email (mail catcher) hanya menerima email dari aplikasi Anda sendiri, bukan dari layanan luar, dan alamat dari domain acak sering ditolak. API OTPGmail menyelesaikan bagian ini dengan beberapa permintaan HTTP: tes Anda menyewa alamat @gmail.com atau @icloud.com asli dan membaca kodenya, lalu membatalkan pesanan untuk refund jika kode belum masuk saat tes berhenti.
Dokumentasi lengkap ada di Dokumentasi API. Panduan ini merangkum alur yang paling sering dipakai tim developer dan QA.
Alur standar
GET /v1/servicesuntuk melihat kode layanan, harga, stok, dan sumber stok yang tersedia.POST /v1/ordersuntuk menyewa alamat bagi layanan tujuan. Saldo hanya terpotong jika alamat berhasil diberikan.- Tes Anda mengisi alamat itu di formulir pendaftaran.
GET /v1/orders/{id}setiap 3–5 detik sampai arrayotpberisi kode. Kode terbaru selalu ada di akhir array.- Jika kode tidak dibutuhkan lagi,
POST /v1/orders/{id}/cancelmengembalikan 100% harga selama kode pertama belum masuk. Jika dibiarkan, pesanan tanpa kode batal sendiri setelah waktu tunggu (maksimal 25 menit) dan tetap di-refund.
Autentikasi dan format respons
- Setiap akun punya satu API key dengan awalan
og_. Key tidak kedaluwarsa dan bisa dibuat ulang di halaman Akun. - Kirim key lewat header
Authorization: Bearer <key>, atau parameter?api_key=jika header tidak bisa diatur. - Respons yang berhasil berbentuk
{ "success": true, "data": ... }. Respons gagal berbentuk{ "success": false, "error": { "code": ..., "message": ... } }.
Simpan API key seperti kata sandi, misalnya di variabel lingkungan atau secret CI, bukan di repository.
Membuat pesanan
POST /v1/orders
Authorization: Bearer <key>
Idempotency-Key: <UUID baru untuk setiap pesanan>
Content-Type: application/json
{ "service": "git", "domain": "icloud.com" }
serviceadalah kode layanan dariGET /v1/services, misalnyagituntuk GitHub ataudruntuk ChatGPT.domainbernilaigmail.com(bawaan) atauicloud.com.quantityopsional, maksimal 200 alamat per permintaan. Karena itudataselalu berupa array pesanan.warehouseopsional untuk memilih sumber stok. Tanpa parameter ini, pesanan memakai sumber1jika layanan dijual di sana. Nilai0memilih sumber dengan harga terendah yang masih ada stok,1sampai4memilih sumber tertentu, dan99mencoba dari harga terendah ke yang lebih mahal.
Setiap pesanan berisi antara lain orderId, email, status, price, otp, codeDeadlineAt, rentExpiresAt, dan warehouse (sumber stok yang dipakai). Kirim Idempotency-Key baru untuk setiap pesanan: jika permintaan terputus dan Anda mengulang dengan key yang sama, Anda tidak menyewa alamat kedua. Atur batas waktu (timeout) di sisi klien sekitar 15 detik atau lebih.
Mengambil kode dan kode tambahan
Status pesanan adalah waiting_code, completed (kode sudah masuk), atau cancelled. Polling lebih cepat dari 3–5 detik tidak membuat email datang lebih cepat dan hanya menghabiskan batas permintaan Anda.
Kode berikutnya hanya masuk jika layanan tujuan mengirim lebih dari satu kode, dan caranya bergantung pada nilai warehouse pesanan. Untuk warehouse 1 dan 4, kode tambahan muncul sendiri di akhir otp. Untuk warehouse 2, Anda memanggil POST /v1/orders/{id}/next-code; di luar jendela tanpa biaya, permintaan itu harus menyertakan confirmFee: true karena dikenai 50% harga sewa. Untuk warehouse 3, sewa ulang kotak masuk yang sama memakai POST /v1/orders/{id}/rerent. Batas dan durasinya juga tampil di aplikasi sebelum menyewa.
Contoh Python
import time
import uuid
import requests
HOST = "otpgmail.net"
BASE = f"https://{HOST}"
HEADERS = {"Authorization": "Bearer API_KEY_ANDA"}
def sewa(service, domain="gmail.com"):
r = requests.post(
f"{BASE}/v1/orders",
json={"service": service, "domain": domain},
headers={**HEADERS, "Idempotency-Key": str(uuid.uuid4())},
timeout=30,
)
body = r.json()
if not body.get("success"):
raise RuntimeError(body["error"]["code"])
return body["data"][0] # data berupa array pesanan
def tunggu_kode(order_id, batas_detik=600, jeda=4):
selesai = time.time() + batas_detik
while time.time() < selesai:
res = requests.get(f"{BASE}/v1/orders/{order_id}", headers=HEADERS, timeout=30)
order = res.json()["data"]
if order["otp"]:
return order["otp"][-1]["code"] # kode terbaru ada di akhir
if order["status"] == "cancelled":
return None
time.sleep(jeda)
# Batalkan agar saldo langsung kembali (hanya sebelum kode pertama masuk)
requests.post(f"{BASE}/v1/orders/{order_id}/cancel", headers=HEADERS, timeout=30)
return None
order = sewa("git", domain="icloud.com")
print("Alamat:", order["email"])
print("Kode:", tunggu_kode(order["orderId"]))
Pola yang sama mudah dipindahkan ke PHP (misalnya HTTP client Laravel), Node.js, atau bahasa lain: buat pesanan, polling, lalu batalkan jika tes gagal sebelum kode masuk.
Batas permintaan dan kode error
Batas bawaannya adalah 20 permintaan per detik dan 900 permintaan per menit untuk setiap API key, serta maksimal 200 alamat per permintaan. Jumlah pesanan yang menunggu kode secara bersamaan juga dibatasi, jadi batalkan pesanan yang sudah tidak dipakai. Kode error yang perlu ditangani:
NO_MAILS_AVAILABLE,OUT_OF_STOCK,ALL_WAREHOUSES_EXHAUSTED: stok sedang kosong, saldo tidak terpotong. Cobadomainlain atau ulangi nanti.DOMAIN_UNAVAILABLE,WAREHOUSE_UNAVAILABLE: jenis alamat atau sumber stok itu tidak tersedia untuk layanan tersebut.INSUFFICIENT_BALANCE: saldo tidak cukup.ORDER_NOT_CANCELLABLE: kode pertama sudah masuk, jadi pesanan tidak bisa dibatalkan.NEXT_CODE_FEE_CONFIRM: permintaan kode tambahan butuhconfirmFee: true.RATE_LIMITED: terlalu banyak permintaan; beri jeda sebelum mengulang.VALIDATION_ERROR: kode layanan atau parameter tidak valid.
Praktik baik untuk tim QA
- Simpan
orderIdsegera setelah pesanan dibuat agar biaya mudah dicocokkan dan kode tambahan bisa diambil kemudian. - Untuk banyak alamat sekaligus, sewa per paket ("Sewa per paket") hingga 200 alamat per paket. Paket hanya bisa dibeli di web; API dipakai untuk membaca paket dan kodenya. Link kode pada paket Gmail bisa dibaca tanpa API key, jadi rahasiakan link tersebut.
- Akun Gmail masa aktif singkat bisa dibeli di web atau lewat API (endpoint
/v1/mail-shop). - Pakai API untuk akun uji, staging, dan pengujian alur pendaftaran, dan patuhi ketentuan layanan tujuan tentang akun otomatis. Aturan refund lengkapnya ada di kebijakan refund dan garansi.
Pertanyaan yang sering diajukan
Di mana saya mendapatkan API key?
Masuk ke aplikasi OTPGmail lalu buka halaman Akun. Setiap akun punya satu API key yang bisa dibuat ulang kapan saja.
Apakah pesanan bisa dibatalkan setelah kode masuk?
Tidak. Hanya pesanan yang masih menunggu kode pertama yang bisa dibatalkan dengan refund 100%. Setelah kode masuk, cancel menghasilkan ORDER_NOT_CANCELLABLE.
Bisakah memilih iCloud lewat API?
Bisa. Kirim "domain": "icloud.com" saat membuat pesanan. Jika jenis itu tidak tersedia untuk layanan tersebut, Anda mendapat error dan bisa mengulang dengan gmail.com.
Apakah OTP SMS juga tersedia lewat API?
Tidak. OTPGmail hanya menangani email. Bedanya dengan nomor virtual dijelaskan di panduan OTP email atau nokos.
