BerandaProdukLacakOTPChatTikTokAPI Masuk / Akun
Dongtube Developer API

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.

Base URL

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.

Header x-api-key: DOTP-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Endpoint tanpa label Auth bisa diakses tanpa token. Request yang memerlukan autentikasi akan mengembalikan 401 jika token tidak valid.

Server OTP

Dongtube menyediakan 2 server OTP yang dapat kamu pilih saat melakukan pemesanan nomor.

Server 1 Dongtube server: "server1"

Stok besar dan harga kompetitif. Mendukung banyak negara dan platform.

Server 2 Dongtube server: "server2"

Spesialisasi nomor Indonesia dengan pilihan operator (Telkomsel, Indosat, dll).

Mengembalikan daftar server OTP yang tersedia beserta status aktifnya.

Respons
response.json
{
  "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.

Sukses
{ "ok": true, "data": { /* ... */ } }
Error
{ "ok": false, "message": "Pesan error di sini" }

Kode HTTP

StatusArti
200Berhasil
400Request tidak valid / parameter salah
401Token tidak ada atau tidak valid
403Akun diblokir atau tidak punya akses
429Terlalu banyak request — tunggu sebentar
500Kesalahan server internal

Akun

Mendaftarkan akun baru untuk mendapatkan akses ke API. Setelah registrasi, gunakan endpoint login untuk masuk.

Body (application/json)
FieldTipeWajibKeterangan
usernamestringYa3–20 karakter, huruf kecil, angka, underscore
passwordstringYaMinimal 6 karakter
emailstringYaAlamat email valid
whatsappstringYaNomor WhatsApp 8–16 digit
register.sh
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"
  }'
register.js
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.

Jangan bagikan API key ke siapapun. Jika bocor, segera regenerate.
response.json
{
  "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.

response.json
{
  "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.

Body (application/json)
FieldTipeWajibKeterangan
usernamestringYaUsername yang sudah terdaftar
passwordstringYaPassword akun
response.json
{
  "ok": true,
  "username": "botku"
}
API key sudah otomatis digenerate saat register. Lihat via 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.

response.json
{
  "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.

response.json
{
  "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.

Query Parameters
ParameterTipeWajibKeterangan
country_idintegerTidakFilter layanan yang tersedia untuk negara ini
response.json
{
  "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.

Query Parameters
ParameterTipeWajibKeterangan
country_idintegerTidakFilter berdasarkan negara
platform_idintegerTidakFilter berdasarkan platform/layanan
sortstringTidakprice_asc (default), price_desc, available_desc
response.json
{
  "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.

response.json
{
  "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.

Path Parameter
ParameterTipeWajibKeterangan
serviceIdintegerYaservice_code dari endpoint list layanan
GET /api/otp/countries/13
{
  "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.

Path Parameters
ParameterTipeKeterangan
countrystringNama negara, misal: Indonesia
providerIdstringprovider_id dari endpoint countries
GET /api/otp/operators/Indonesia/3837
{
  "ok": true,
  "data": [
    { "id": 1, "name": "any",       "image": "https://..." },
    { "id": 2, "name": "indosat",   "image": "https://..." },
    { "id": 3, "name": "telkomsel", "image": "https://..." }
  ]
}

Pesanan OTP

1
Ambil katalog produk
Gunakan endpoint negara & layanan untuk mendapatkan product_id (S1) atau number_id + provider_id (S2)
2
Beli nomor
Kirim request ke POST /api/otp/order dengan data dari langkah 1
3
Poll status OTP
Cek GET /api/otp/order/:id/status setiap 5–10 detik sampai status completed
4
Finish atau Cancel
Setelah OTP diterima, kirim finish. Jika tidak terima OTP sebelum expired, kirim cancel untuk refund

Membeli nomor virtual OTP. Saldo akan dipotong sesuai harga produk. Gunakan parameter sesuai server yang dipilih.

Body — Server 1
FieldTipeWajibKeterangan
providerstringYaNilai: "server1"
product_idintegerYaID produk dari /api/otp/server1/products
Body — Server 2
FieldTipeWajibKeterangan
providerstringYaNilai: "server2"
number_idintegerYanumber_id dari /api/otp/countries/:serviceId
provider_idstringYaprovider_id dari pricelist
operator_idintegerTidakID operator (default: any)
response.json
{
  "ok": true,
  "orderId": "OTP-1716000000-a1b2c3d4",
  "phoneNumber": "+6281234567890",
  "expiresAt": 1716001200000,
  "balance": 46500
}
Saldo dipotong langsung saat order berhasil. Jika OTP tidak diterima sebelum expired_at, kirim cancel untuk refund.

Cek status pesanan dan dapatkan kode OTP jika sudah diterima. Poll endpoint ini setiap 5–10 detik.

Status yang mungkin
StatusKeterangan
waitingMenunggu OTP masuk
completedOTP sudah diterima — cek field otp
canceledDibatalkan, saldo sudah dikembalikan
expiredWaktu habis tanpa OTP, saldo dikembalikan
cancelingPembatalan sedang diproses
response.json (OTP diterima)
{
  "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.

response.json
{ "ok": true, "message": "Pesanan berhasil dibatalkan." }

Menandai pesanan sebagai selesai setelah OTP berhasil digunakan. Memberitahu sistem bahwa nomor sudah tidak digunakan lagi.

response.json
{ "ok": true, "message": "Pesanan selesai." }

Meminta pengiriman ulang SMS OTP ke nomor yang sama. Hanya tersedia di Server 1.

response.json
{ "ok": true, "message": "SMS berhasil dikirim ulang." }

Mengembalikan daftar pesanan OTP milik akun yang sedang login, diurutkan terbaru.

Query Parameters
ParameterTipeWajibKeterangan
limitintegerTidakMaks hasil (default 20)
statusstringTidakFilter: waiting, completed, canceled, expired, canceling
response.json
{
  "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.

Body (application/json)
FieldTipeWajibKeterangan
amountintegerYaJumlah saldo yang ingin ditambahkan (dalam Rupiah)
response.json
{
  "ok": true,
  "depId": "DEP-1716000000-abc1",
  "amount": 50000,
  "adminFeeDeposit": 500,
  "totalBayarDeposit": 50500,
  "qr": "BASE_URL_PLACEHOLDER/image/qr/DEP-...",
  "qrString": "00020101021226670016...",
  "expiredAt": 1716003600000
}
Tampilkan 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 yang mungkin
StatusKeterangan
pendingMenunggu pembayaran
successPembayaran diterima, saldo sudah ditambahkan
expiredWaktu habis, QR kadaluarsa
response.json
{
  "ok": true,
  "status": "success",
  "balance": 550000
}
// Jika masih pending:
{
  "ok": true,
  "status": "pending",
  "qr": "https://...",
  "qrString": "000201...",
  "expiredAt": 1716003600000,
  "amount": 50000,
  "totalBayarDeposit": 50500
}