Integrasi Layanan OTP ke Aplikasi Kamu
API ini memungkinkan kamu mengintegrasikan layanan virtual number OTP Dongtube ke website, bot, atau aplikasi kamu. Beli nomor OTP, cek kode, kelola saldo — semua lewat REST API.
Autentikasi
Semua endpoint privat memerlukan API key yang dikirim melalui header x-api-key. API key didapatkan setelah registrasi dan bisa dilihat di endpoint /api/user/apikey atau di profil akun.
401 jika token tidak valid.Server OTP
Dongtube menyediakan 2 server OTP yang dapat kamu pilih saat melakukan pemesanan nomor.
Stok besar dan harga kompetitif. Mendukung banyak negara dan platform.
Spesialisasi nomor Indonesia dengan pilihan operator (Telkomsel, Indosat, dll).
Mengembalikan daftar server OTP yang tersedia beserta status aktifnya.
{
"ok": true,
"servers": [
{ "id": "server1", "label": "Server 1", "name": "Dongtube", "active": true },
{ "id": "server2", "label": "Server 2", "name": "Dongtube", "active": true }
]
}Format Respons
Semua endpoint mengembalikan JSON dengan struktur yang konsisten.
{ "ok": true, "data": { /* ... */ } }{ "ok": false, "message": "Pesan error di sini" }Kode HTTP
| Status | Arti |
|---|---|
| 200 | Berhasil |
| 400 | Request tidak valid / parameter salah |
| 401 | Token tidak ada atau tidak valid |
| 403 | Akun diblokir atau tidak punya akses |
| 429 | Terlalu banyak request — tunggu sebentar |
| 500 | Kesalahan server internal |
Akun
Mendaftarkan akun baru untuk mendapatkan akses ke API. Setelah registrasi, gunakan endpoint login untuk masuk.
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
username | string | Ya | 3–20 karakter, huruf kecil, angka, underscore |
password | string | Ya | Minimal 6 karakter |
email | string | Ya | Alamat email valid |
whatsapp | string | Ya | Nomor WhatsApp 8–16 digit |
curl -X POST BASE_URL_PLACEHOLDER/api/user/register \
-H "Content-Type: application/json" \
-d '{
"username": "botku",
"password": "password123",
"email": "bot@example.com",
"whatsapp": "08123456789"
}'const res = await fetch("BASE_URL_PLACEHOLDER/api/user/register", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
username: "botku",
password: "password123",
email: "bot@example.com",
whatsapp: "08123456789"
})
});
const data = await res.json();
// { ok: true, message: "Akun berhasil dibuat. Silakan login." }Mengembalikan API key aktif milik akun. Sudah otomatis digenerate saat register. Gunakan nilai apiKey ini di header x-api-key untuk semua request OTP.
{
"ok": true,
"apiKey": "DOTP-A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6",
"generatedAt": 1716000000000
}Generate API key baru. Key lama akan langsung tidak aktif — semua integrasi yang memakai key lama harus diperbarui.
{
"ok": true,
"apiKey": "DOTP-Z9Y8X7W6V5U4T3S2R1Q0P9O8N7M6L5K4",
"message": "API key berhasil di-generate ulang. Perbarui key di semua integrasi kamu."
}Login dengan username dan password. Kembalikan sesi; sertakan API key di setiap request OTP sebagai header x-api-key.
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
username | string | Ya | Username yang sudah terdaftar |
password | string | Ya | Password akun |
{
"ok": true,
"username": "botku"
}GET /api/user/apikey atau dari response /api/user/me. Sertakan di setiap request: x-api-key: DOTP-xxx...Mengembalikan data profil dan saldo akun yang sedang login.
{
"ok": true,
"data": {
"username": "botku",
"balance": 50000,
"email": "bot@example.com",
"whatsapp": "08123456789",
"createdAt": 1716000000000,
"apiKey": "DOTP-A1B2C3D4E5F6..."
}
}Server 1
Endpoint katalog untuk Server 1. Gunakan data dari sini untuk membeli nomor dengan server: "server1".
Mengembalikan daftar negara yang tersedia di Server 1. Gunakan id dari hasil ini untuk filter layanan dan produk.
{
"ok": true,
"data": [
{
"id": 6,
"code": "ID",
"name": "Indonesia",
"dial_code": "+62",
"emoji": "🇮🇩",
"active": true
}
]
}Mengembalikan daftar platform/layanan (WhatsApp, Telegram, dll). Filter opsional per negara menggunakan country_id.
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
country_id | integer | Tidak | Filter layanan yang tersedia untuk negara ini |
{
"ok": true,
"data": [
{ "id": 3, "code": "wa", "name": "WhatsApp", "active": true },
{ "id": 7, "code": "tg", "name": "Telegram", "active": true }
]
}Mengembalikan daftar produk yang tersedia beserta harga dan stok. Gunakan id dari hasil ini sebagai product_id saat order.
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
country_id | integer | Tidak | Filter berdasarkan negara |
platform_id | integer | Tidak | Filter berdasarkan platform/layanan |
sort | string | Tidak | price_asc (default), price_desc, available_desc |
{
"ok": true,
"data": [
{
"id": 142,
"name": "WhatsApp Indonesia",
"country_id": 6,
"platform_id": 3,
"available": 42,
"price": 3500,
"price_format": "Rp3.500",
"active": true
}
]
}Server 2
Endpoint katalog untuk Server 2. Gunakan data dari sini untuk membeli nomor dengan server: "server2".
Mengembalikan daftar layanan (WhatsApp, Telegram, Facebook, dll) di Server 2. Gunakan service_code untuk langkah berikutnya.
{
"ok": true,
"data": [
{ "service_code": 13, "service_name": "WhatsApp", "service_img": "https://..." },
{ "service_code": 4, "service_name": "Telegram", "service_img": "https://..." }
]
}Mengembalikan daftar negara yang tersedia untuk suatu layanan, beserta harga, stok, number_id dan provider_id yang dibutuhkan untuk order.
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
serviceId | integer | Ya | service_code dari endpoint list layanan |
{
"ok": true,
"data": [
{
"number_id": 340437,
"name": "Indonesia",
"prefix": "+62",
"iso_code": "id",
"pricelist": [
{
"provider_id": "3837",
"stock": 103,
"price": 1100,
"price_format": "Rp1.100",
"available": true
}
]
}
]
}Mengembalikan daftar operator kartu SIM (any, Telkomsel, Indosat, dll). Gunakan id dari hasil ini sebagai operator_id saat order.
| Parameter | Tipe | Keterangan |
|---|---|---|
country | string | Nama negara, misal: Indonesia |
providerId | string | provider_id dari endpoint countries |
{
"ok": true,
"data": [
{ "id": 1, "name": "any", "image": "https://..." },
{ "id": 2, "name": "indosat", "image": "https://..." },
{ "id": 3, "name": "telkomsel", "image": "https://..." }
]
}Pesanan OTP
product_id (S1) atau number_id + provider_id (S2)POST /api/otp/order dengan data dari langkah 1GET /api/otp/order/:id/status setiap 5–10 detik sampai status completedfinish. Jika tidak terima OTP sebelum expired, kirim cancel untuk refundMembeli nomor virtual OTP. Saldo akan dipotong sesuai harga produk. Gunakan parameter sesuai server yang dipilih.
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
provider | string | Ya | Nilai: "server1" |
product_id | integer | Ya | ID produk dari /api/otp/server1/products |
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
provider | string | Ya | Nilai: "server2" |
number_id | integer | Ya | number_id dari /api/otp/countries/:serviceId |
provider_id | string | Ya | provider_id dari pricelist |
operator_id | integer | Tidak | ID operator (default: any) |
{
"ok": true,
"orderId": "OTP-1716000000-a1b2c3d4",
"phoneNumber": "+6281234567890",
"expiresAt": 1716001200000,
"balance": 46500
}expired_at, kirim cancel untuk refund.Cek status pesanan dan dapatkan kode OTP jika sudah diterima. Poll endpoint ini setiap 5–10 detik.
| Status | Keterangan |
|---|---|
| waiting | Menunggu OTP masuk |
| completed | OTP sudah diterima — cek field otp |
| canceled | Dibatalkan, saldo sudah dikembalikan |
| expired | Waktu habis tanpa OTP, saldo dikembalikan |
| canceling | Pembatalan sedang diproses |
{
"ok": true,
"status": "completed",
"otp": "949708",
"otpMsg": "Your WhatsApp code: 949-708\nDon't share this code",
"phoneNumber": "+6281234567890"
}
// Masih menunggu OTP:
{
"ok": true,
"status": "waiting",
"otp": null,
"phoneNumber": "+6281234567890"
}Membatalkan pesanan OTP yang masih aktif. Saldo akan dikembalikan. Hanya bisa cancel pesanan yang statusnya ACTIVE.
{ "ok": true, "message": "Pesanan berhasil dibatalkan." }Menandai pesanan sebagai selesai setelah OTP berhasil digunakan. Memberitahu sistem bahwa nomor sudah tidak digunakan lagi.
{ "ok": true, "message": "Pesanan selesai." }Meminta pengiriman ulang SMS OTP ke nomor yang sama. Hanya tersedia di Server 1.
{ "ok": true, "message": "SMS berhasil dikirim ulang." }Mengembalikan daftar pesanan OTP milik akun yang sedang login, diurutkan terbaru.
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
limit | integer | Tidak | Maks hasil (default 20) |
status | string | Tidak | Filter: waiting, completed, canceled, expired, canceling |
{
"ok": true,
"data": [
{
"id": "OTP-1716000000-a1b2c3d4",
"server": "Dongtube",
"status": "completed",
"phoneNumber": "+6281234567890",
"service": "WhatsApp",
"country": "Indonesia",
"price": 3500,
"otp": "949708",
"createdAt": 1716000000000,
"expiresAt": 1716001200000,
"refunded": false
}
]
}Deposit / Top Up Saldo
Tambah saldo akun melalui QRIS atau metode pembayaran lain yang tersedia.
Membuat transaksi deposit baru. Mengembalikan QR code QRIS yang bisa ditampilkan ke pengguna untuk dibayar.
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
amount | integer | Ya | Jumlah saldo yang ingin ditambahkan (dalam Rupiah) |
{
"ok": true,
"depId": "DEP-1716000000-abc1",
"amount": 50000,
"adminFeeDeposit": 500,
"totalBayarDeposit": 50500,
"qr": "BASE_URL_PLACEHOLDER/image/qr/DEP-...",
"qrString": "00020101021226670016...",
"expiredAt": 1716003600000
}qr sebagai gambar atau gunakan qrString untuk generate QR sendiri. Poll status deposit menggunakan depId.Cek apakah pembayaran deposit sudah diterima. Poll setiap 5 detik sampai status success.
| Status | Keterangan |
|---|---|
| pending | Menunggu pembayaran |
| success | Pembayaran diterima, saldo sudah ditambahkan |
| expired | Waktu habis, QR kadaluarsa |
{
"ok": true,
"status": "success",
"balance": 550000
}
// Jika masih pending:
{
"ok": true,
"status": "pending",
"qr": "https://...",
"qrString": "000201...",
"expiredAt": 1716003600000,
"amount": 50000,
"totalBayarDeposit": 50500
}
WHETTXITR OFC