Dokumentasi API

API Dongtube

Satu kunci API untuk seluruh layanan: pembayaran QRIS, produk digital premium, media sosial (SMM), sewa nomor OTP, dan database SQL. Ganti setiap {placeholder} dengan nilai sebenarnya, dan pertahankan tipe JSON seperti string, angka, boolean, atau null.

Base URL https://DOMAIN_ANDA
Autentikasi X-API-Key: {api_key}
Format application/json

Mulai di sini

Quickstart, autentikasi, bentuk respons, batas laju, dan aturan retry sebelum memakai endpoint mana pun.

Quickstart

  1. Ambil API Key di halaman Profil pada bagian Keamanan & Integrasi.
  2. Panggil GET /api/v1/balance dengan header X-API-Key. Apabila respons berisi angka saldo, kunci tersebut masih berlaku.
  3. Lanjutkan ke layanan yang diperlukan: buat invoice QRIS, pesan layanan SMM, sewa nomor OTP, atau simpan data di DongtubeDB.

Contoh di bawah ini dapat disalin langsung. Setiap kartu endpoint di halaman ini memiliki tab cURL, JavaScript, Python, dan PHP yang dibuat otomatis dari definisi endpoint yang sama.

Permintaan pertama: cek saldo

GET
{ "balance": 150000 }

Autentikasi

Semua endpoint memerlukan header X-API-Key atau parameter kueri apikey.

X-API-Key: {api_key}

Buat, lihat, dan ganti API Key di halaman Profil pada bagian Keamanan & Integrasi. Jaga kerahasiaannya dan gunakan header autentikasi; parameter kueri mudah tersimpan di log server dan riwayat peramban.

Empat arti kegagalan autentikasi. 401 tanpa header berarti kunci tidak dikirim; 401 dengan header berarti kunci tidak ditemukan atau sudah dirotasi; 403 berarti kunci valid tetapi akun sedang dinonaktifkan admin; kunci yang hilang menimbulkan notifikasi ke pemilik akun, sehingga periksa kotak masuk sebelum menyangka integrasi rusak.

Bentuk respons & kode galat

Sukses: setiap layanan membalas JSON dengan bentuknya sendiri: { "balance": 150000 } untuk saldo, { "success": true, ... } untuk pesanan dan operasi. Contoh lengkapnya ada di kartu tiap endpoint.

Gagal: seluruh endpoint membalas { "error": "pesan" }. Endpoint OTP menyertakan tambahan reason berupa kode penyebab yang stabil (out_of_stock, price_changed, insufficient_balance, rate_limited, provider_down, dll.).

Cabangkan keputusan pada kode status HTTP dan reason, bukan pada teks pesan. Pesan error ditujukan untuk manusia dan bisa berubah sewaktu-waktu; kode status dan reason adalah kontraknya.
KodeMaknaTindakan
400Parameter tidak valid atau permintaan ditolak.Periksa nama, tipe, dan format nilai sesuai contoh endpoint.
401API Key tidak dikirim, salah, atau sudah dirotasi.Salin ulang kunci dari halaman Profil.
402Saldo tidak cukup untuk pesanan/pencairan ini.Deposit, lalu ulangi permintaan identik.
403Kunci valid, tetapi akun dinonaktifkan.Hubungi admin; jangan diulang otomatis.
404Sumber daya tidak ada atau bukan milik Anda.Periksa ID; jangan diulang tanpa perubahan.
409Konflik status: harga berubah, aksi tidak berlaku pada status saat ini, atau guard batch gagal.Ikuti isi pesan; muat ulang katalog lalu coba lagi.
413Ukuran file/data melebihi batas yang diizinkan.Perkecil unggahan.
429Batas laju terlampaui.Tunggu sesuai header Retry-After (detik). Jangan menebak jeda dari isi pesan.
500Kesalahan server tak terduga.Ulangi nanti dengan backoff; periksa /health bila berlanjut.
502Layanan tidak dapat dijangkau.Ulangi dengan backoff; saldo Anda tetap utuh.
503Layanan sedang gangguan atau belum dikonfigurasi.Ulangi nanti; saldo Anda tetap utuh.

Saldo tidak pernah dipotong bila permintaan gagal sebelum pesanan terbentuk; apabila kegagalan terjadi di tengah (pesanan ditolak di sistem, koneksi putus), pengembalian dilakukan otomatis. Tidak ada tagihan yang perlu ditagih sendiri.

Batas laju & retry

LayananBatasCatatan
Jaring global600 / menit / IPBerlaku untuk seluruh permintaan sebagai jaring pengaman.
Payment & Premium120 / menit / IPRute /api/v1 dan /api/prem.
SMM60 / menit / API KeyPemesanan dibatasi 30/menit; 300/menit/IP.
OTP60 / menit / API KeyPemesanan dibatasi 20/menit; 300/menit/IP.
DongtubeDB600 / menit / API KeyBawaan, dapat disesuaikan oleh pengelola (DONGTUBEDB_API_RPM).
  • 429 selalu menyertakan Retry-After dalam detik, termasuk saat pembatas datang dari sistem kami sendiri, yang diteruskan apa adanya. Hormati nilainya sebelum mengulang.
  • Permintaan baca (GET) aman diulang kapan saja. Untuk permintaan tulis, lihat bagian Idempotensi; jangan mengulang membabi buta setelah timeout.
  • Kegagalan 5xx: ulangi dengan backoff (misalnya 1s, 4s, 10s). Gangguan sistem berarti saldo tetap utuh, sehingga pengulangan tidak berisiko double-charge selama memakai aturan idempotensi.
Catatan batas laju OTP. Saat lapisan OTP Dongtube yang membatasi laju, respons 429 diteruskan apa adanya beserta header Retry-After-nya; hormati nilainya, jangan diabaikan.

Idempotensi & jendela duplikat

Permintaan pembuatan pesanan yang identik di dalam jendela 90 detik membalas duplicate: true beserta pesanan yang sudah ada: saldo tidak dipotong dua kali. Ini berlaku untuk POST /api/smm/order, POST /api/otp/order, dan POST /api/prem/order (juga klik ganda pada aktifkan kembali nomor OTP).

SituasiBoleh diulang?Cara aman
Timeout / putus setelah kirimPesanan belum tentu gagal.Tarik status dulu (GET daftar pesanan / status invoice) sebelum membuat baru.
429Ya.Tunggu Retry-After, lalu kirim ulang identik.
502 / 503Ya, dengan backoff.Permintaan biasanya gagal sebelum saldo dipotong; jendela duplikat 90 detik ikut melindungi.
400 / 409Tidak otomatis.Perbaiki isi permintaan sesuai pesan, baru kirim ulang.

Pencairan dana bersifat idempoten per ID pencairan, dan webhook invoice hanya dikirim untuk peristiwa lunas yang sebenarnya. Pengulangan pemeriksaan status tidak pernah menggandakan uang. Pencairan saldo lewat API diproses manual oleh admin: buat satu permintaan, tunggu persetujuan, jangan kirim ulang.

Konsol pengujian API

Permintaan uji dikirim dari peramban langsung ke API Dongtube menggunakan API Key yang dimasukkan. Jangan gunakan konsol ini pada perangkat bersama.

Dongtube Payment

Deposit, pemeriksaan saldo, serta pembuatan dan pemantauan invoice QRIS.

Periksa saldo

GET

Mengembalikan saldo akun yang terkait dengan API Key.

{ "balance": 0 }

Buat invoice QRIS

GET
ParameterTipeWajibKeterangan
amountnumberYaNominal invoice dalam Rupiah.
{
  "success": true,
  "type": "dynamic",
  "invoice_id": "{invoice_id}",
  "amount": 0,
  "fee": 0,
  "total": 0,
  "qris_image": "{qris_image_url}",
  "expired_at": "{expiration_time}"
}

Nilai qris_image berisi path gambar QRIS relatif terhadap origin situs (contoh /img-cache/qris-1234567890.png); gabungkan dengan origin situs untuk memperoleh URL lengkapnya. Pembuatan invoice dibatasi 30 kali per menit.

Periksa status invoice

GET
ParameterTipeWajibKeterangan
invoice_idstringYaID dari respons pembuatan invoice.
{
  "invoice_id": "{invoice_id}",
  "amount": 0,
  "fee": 0,
  "total": 0,
  "status": "{invoice_status}",
  "qris_image": "{qris_image_url}",
  "expired_at": "{expiration_time}",
  "created_at": "{created_at}"
}

Status memberi tahu apakah pembayaran masih menunggu, sudah dibayar, atau sudah kedaluwarsa. Polling endpoint ini aman diulang: pemeriksaan berulang tidak pernah menggandakan tagihan.

Webhook callback (notifikasi lunas)

POST

Atur URL webhook di halaman Profil. Apabila deposit lunas, sistem mengirim POST JSON ke URL tersebut. Verifikasi kebenaran melalui header X-Signature = sha256=HMAC-SHA256(body, API Key) terhadap body mentah, bukan hasil parse ulang JSON. Balas 2xx untuk konfirmasi penerimaan; gagal atau timeout dicoba ulang 1x.

// Body yang dikirim ke URL Anda
{
  "event": "invoice.paid",
  "invoice_id": "{invoice_id}",
  "amount": 0,
  "fee": 0,
  "total": 0,
  "status": "paid",
  "paid_at": "{payment_time}"
}
// Verifikasi (Node.js), hash body MENTAH, bukan hasil parse
const crypto = require('crypto');

const expected = 'sha256=' + crypto
  .createHmac('sha256', API_KEY)
  .update(rawBody)
  .digest('hex');

if (expected !== req.headers['x-signature']) return res.sendStatus(401);
Webhook bersifat pelengkap: status pada GET /api/v1/invoice/status selalu menjadi sumber kebenaran. Apabila webhook terlewat (server down), tetapkan status dari polling. Jangan pernah menarik uang atau membuka akses hanya karena asumsi webhook pasti diterima.

Tarik Saldo

Pencairan saldo ke rekening bank atau e-wallet. Pada API, operasi ini bernama topup.

Alurnya wajib berurutan: methods, lalu inquiry, lalu topup. Nilai account_name pada langkah terakhir harus berasal dari respons inquiry: server memverifikasi ulang nama tujuan saat dana dikirim, jadi nama karangan akan membuat pencairan ditolak dan saldo otomatis dikembalikan. Pengguna juga bisa memakai halaman Tarik Saldo; keduanya memakai saldo dan biaya yang sama.

Tujuan pencairan & biaya

GET

Langkah pertama dan wajib dipanggil setiap kali membangun form pencairan. Tidak ada parameter. Mengembalikan daftar e-wallet beserta batas nominal per e-wallet, daftar kode bank, biaya admin yang berlaku, serta batas nominal bank.

{
  "success": true,
  "fee": 2500,
  "ewallet": [
    { "code": "DANA",      "name": "DANA",      "min": 20000, "max": 2000000 },
    { "code": "GOPAY",     "name": "GoPay",     "min": 10000, "max": 2000000 },
    { "code": "OVO",       "name": "OVO",       "min": 10000, "max": 2000000 },
    { "code": "LINKAJA",   "name": "LinkAja",   "min": 10000, "max": 2000000 },
    { "code": "SHOPEEPAY", "name": "ShopeePay", "min": 10000, "max": 2000000 }
  ],
  "bank": [
    { "code": "008", "name": "Mandiri" },
    { "code": "009", "name": "BNI" },
    { "code": "002", "name": "BRI" }
  ],
  "bank_min": 10000,
  "bank_max": 50000000
}

Nilai code inilah yang nanti dikirim sebagai code pada langkah inquiry dan topup. Daftar bank memuat kode virtual account dan katalog bank nasional, jadi ratusan kode tersedia, jangan di-hardcode, ambil dari endpoint ini.

Cek nama pemilik tujuan

GET
ParameterTipeWajibKeterangan
typestringTidakbank (bawaan) atau ewallet.
codestringYaKode dari methods. Untuk e-wallet berarti kode produk (DANA, GOPAY, dst).
accountstringYaNomor rekening atau nomor e-wallet tujuan.
amountnumberTidakNominal yang dipindahkan ke tujuan. Bawaan mengikuti minimum pencairan akun.

Baca-saja dan tidak menggerakkan uang: pemanggilan ini tidak memotong saldo. Wajib dipanggil lebih dulu untuk memperoleh account_name, yang lalu dikirim apa adanya ke endpoint topup. Tampilkan hasilnya ke pengguna sebagai konfirmasi sebelum konfirmasi pencairan.

{
  "success": true,
  "type": "bank",
  "account_name": "NAMA PEMILIK REKENING",
  "provider": "Bank Mandiri"
}

Eksekusi pencairan

POST
FieldTipeWajibKeterangan
typestringTidakbank (bawaan) atau ewallet.
codestringYaKode tujuan dari methods.
accountstringYaNomor rekening atau e-wallet tujuan.
account_namestringYaHarus sama dengan hasil inquiry.
amountnumberYaNominal yang dikirim ke tujuan, tanpa biaya admin.
{
  "success": true,
  "status": "pending",
  "amount": 50000,
  "fee": 2500,
  "account_name": "NAMA PEMILIK REKENING"
}

Langkah terakhir membuat permintaan pencairan: status mengembalikan pending (permintaan menunggu persetujuan admin), bukan dana yang langsung dikirim. Saldo amount + fee sudah dipotong saat permintaan dibuat dan akan kembali penuh bila admin menolak.

Perhatikan jumlah yang dipotong dari saldo. Saldo dipotong sebesar amount + fee, bukan amount. Jadi untuk mencairkan Rp50.000 ke tujuan dengan biaya Rp2.500, saldo harus tersedia Rp52.500.

Biaya, batas nominal, dan status

JenisMinimumMaksimumKeterangan
DANARp 20.000Rp 2.000.000Minimum e-wallet tertinggi.
E-wallet lainnyaRp 10.000Rp 2.000.000GoPay, OVO, LinkAja, ShopeePay.
BankRp 10.000Rp 50.000.000Nomor di luar rentang dijawab 400.

Minimum aktual bisa lebih besar bila pengaturan minimum pencairan akun lebih tinggi. Selalu baca nilai min, max, bank_min, dan bank_max dari endpoint methods, jangan angka tetap.

  • Biaya admin. Akun non-partner memakai biaya yang disetel admin; akun partner memakai biaya flat. Nilai yang berlaku dikirim sebagai fee pada respons methods.
  • Gating settlement. Hanya saldo yang sudah cair boleh dicairkan. Saldo hasil deposit yang sudah dibayar tapi belum cair tetap dikunci, dan permintaan ditolak dengan pesan yang menyebutkan berapa yang masih tertahan beserta perkiraan waktu cairnya. Tampilkan pesan itu apa adanya ke pengguna, jangan coba mengulanginya.
  • Tujuan tidak valid. Nama tujuan diverifikasi ulang saat permintaan dibuat; nama karangan membuat pencairan ditolak dan saldo dikembalikan. Isi account_name apa adanya dari respons inquiry.
  • Verifikasi manual admin. Dana dikirim oleh admin (bukan otomatis). Permintaan yang ditolak mengembalikan saldo plus biaya penuh, status berubah failed.

Status pencairan

StatusMaknaTindakan integrator
successAdmin sudah menyetujui dan dana dikirim manual ke tujuan.Berhenti memantau, tampilkan selesai ke pengguna.
pendingPermintaan diterima, menunggu persetujuan admin (biasanya < 1×24 jam).Tahan status "diproses". Jangan kirim ulang permintaan.
failedAdmin menolak permintaan. Saldo plus biaya dikembalikan penuh.Tampilkan gagal; saldo pengguna sudah kembali.
Tidak ada endpoint status pencairan di API publik. Untuk pemantauan, andalkan status success/pending pada respons topup, atau pengguna membuka riwayat pencairan di dashboard.

Dongtube Premium

Katalog produk digital premium dengan pemesanan memakai saldo akun.

  • Saldo dipotong saat pesanan dibuat. Pesanan yang berhasil diproses tidak dapat dibatalkan.
  • Sistem pencairan gagal dihubungi atau menolak pesanan: pesanan dibatalkan dan saldo dikembalikan otomatis.
  • Status pending berarti akun sedang diproses, pantau lewat endpoint pemeriksaan status.
  • Data produk, gambar, dan stok realtime tersedia melalui respons endpoint katalog & stok.
  • Pesanan identik (user + produk sama) dalam jendela 90 detik membalas duplikat tanpa debit kedua.

Status pesanan

submittingMengirim submission_unknownPerlu verifikasi pendingDiproses successAkun tersedia failedGagal

Daftar produk premium

GET
{
  "success": true,
  "products": [
    {
      "id": "{product_id}",
      "name": "{product_name}",
      "description": "{product_description}",
      "price": 0,
      "status": "{availability_status}",
      "stock": 0,
      "image": "{image_url}"
    }
  ]
}

Field status dan stock menunjukkan ketersediaan produk.

Pesan produk premium

POST
FieldTipeWajibKeterangan
product_idstringYaID dari endpoint katalog.
qtynumberTidakMaksimal 1. Nilai lain ditolak dengan 400.
{
  "success": true,
  "order": {
    "_id": "{order_id}",
    "productId": 0,
    "productName": "{product_name}",
    "qty": 1,
    "amount": 0,
    "status": "{status_pesanan}",
    "accounts": [],
    "providerInvoice": "{provider_invoice}",
    "createdAt": "{created_at}"
  }
}
Status submission_unknown berarti pesanan ini sudah tercatat di sistem tetapi ID pesanannya belum kami terima (atau belum disertakan), sehingga perlu dicocokkan oleh tim kami. Selama menunggu kepastian, permintaan diulang dengan kunci ref_id yang sama (Auto-Retry) sehingga tidak pernah membuat pesanan ganda. Bila koneksi gagal di tengah jalan, pesanan langsung dibatalkan dan saldo dikembalikan otomatis; pengembalian juga terjadi bila pesanan ditolak dengan tegas.

Periksa status pesanan premium

GET
{
  "success": true,
  "order": {
    "_id": "{order_id}",
    "productName": "{product_name}",
    "amount": 0,
    "status": "{status_pesanan}",
    "accounts": [],
    "providerInvoice": "{provider_invoice}",
    "createdAt": "{created_at}"
  }
}

Field accounts hanya terisi saat status success.

Cek stok produk premium

GET
ParameterTipeWajibKeterangan
product_idnumberYaID produk dari endpoint katalog. ID lain menghasilkan 404.
{
  "success": true,
  "product_id": 0,
  "product": "{product_name}",
  "stock": 0
}

Angka stok diambil segar dari sistem setiap permintaan (tidak memakai cache katalog 5 menit). Sistem tidak dapat dihubungi menghasilkan kode 502, bukan angka karangan.

Dongtube SMM

Memilih layanan, membuat pesanan media sosial, memantau status, dan mengajukan isi ulang.

Seluruh endpoint memakai header X-API-Key dan menarik saldo dari akun yang sama dengan halaman Dongtube SMM. Kredensial penghubung hanya berada di server dan tidak pernah dikirim ke peramban.
  • Saldo dipotong saat pesanan dibuat. Pesanan yang sudah diteruskan ke sistem tidak dapat dibatalkan lewat API.
  • Pesanan kembar otomatis dikembalikan: permintaan identik dalam jendela 90 detik membalas duplicate: true tanpa memotong saldo lagi.
  • Harga pada katalog adalah harga final. Apabila biaya riil lebih mahal, selisihnya ditagihkan ke saldo; apabila saldo tidak cukup, pesanan diteruskan ke tim kami untuk diselesaikan. Apabila lebih murah, selisihnya dikembalikan.
  • Apabila akun layanan kami kehabisan saldo, permintaan dibatalkan dengan 503 dan saldo tetap utuh.

Katalog layanan

GET
ParameterTipeWajibKeterangan
qstringTidakPencarian nama layanan.
categorystringTidakFilter kategori.
typestringTidakFilter tipe layanan (lihat tabel per tipe).
{
  "success": true,
  "count": 2250,
  "services": [
    {
      "id": "1234",
      "name": "{nama_layanan}",
      "category": "{kategori}",
      "type": "default",
      "type_label": "Standar",
      "price_mode": "per_1000",
      "price_per_1000": 11512,
      "min_price": 117,
      "min": 10,
      "max": 300000,
      "refill": false,
      "fields": [
        { "key": "target", "required": true, "label": "Target layanan", "input": "text", "hint": "..." },
        { "key": "quantity", "required": true, "label": "Jumlah pesanan", "input": "number" }
      ],
      "target_format": { "kind": "url", "label": "link channel, grup, atau post", "contoh": "https://t.me/contoh" },
      "description": "{deskripsi}"
    }
  ]
}

Katalog berisi lebih dari 2.000 layanan, simpan cadangan di sisi Anda karena isinya jarang berubah. price_per_1000 adalah harga per 1.000 unit, atau harga total apabila price_mode bernilai total. min_price adalah biaya yang benar-benar dibebankan untuk memesan sesuai min. Keduanya adalah harga final. fields menyebutkan parameter beserta batas karakter yang diterima; kirim hanya field bertanda required.

Buat pesanan

POST
FieldTipeWajibKeterangan
service_idstringYaID layanan dari katalog.
targetstringYaTautan atau identitas akun sesuai layanan.
quantitynumberYa**Tidak dikirim bila memakai comments.
commentsstringYa*Satu komentar per baris; jumlah dihitung otomatis.
{
  "success": true,
  "order": {
    "id": "{order_id}",
    "service_id": "1234",
    "service_name": "{nama_layanan}",
    "category": "{kategori}",
    "target": "{target}",
    "quantity": 1000,
    "amount": 11500,
    "status": "pending",
    "provider_order_id": "56789",
    "provider_status": "Pending",
    "refill": { "supported": false, "id": null, "status": null, "requested_at": null },
    "refund": { "refunded": false, "amount": 0, "partial": false, "partial_amount": 0 },
    "start_count": null,
    "remains": null,
    "created_at": "{tanggal}",
    "updated_at": "{tanggal}"
  },
  "duplicate": false
}

Daftar pesanan

GET

Parameter limit bernilai 1-100 (bawaan 20). Hingga 5 pesanan terbaru yang masih berjalan disegarkan statusnya sebelum dibalas.

{
  "success": true,
  "count": 20,
  "orders": [ { "id": "{order_id}", "status": "completed", "...": "..." } ]
}

Status pesanan

GET

Memakai ID internal pesanan. Apabila status masih pending atau processing, statusnya disegarkan langsung sehingga Anda tidak perlu menunggu pembaruan latar.

{
  "success": true,
  "order": {
    "id": "{order_id}",
    "status": "completed",
    "quantity": 1000,
    "amount": 11500,
    "provider_status": "Completed",
    "start_count": 0,
    "remains": 0,
    "refund": { "refunded": false, "amount": 0, "partial": false, "partial_amount": 0 }
  }
}

Ajukan isi ulang

POST

Tidak ada isi permintaan. Hanya layanan bertanda refill: true dan pesanan berstatus completed/partial yang diterima. Pengajuan kembar dibalas dengan "reused": true beserta refill yang sedang berjalan.

{
  "success": true,
  "reused": false,
  "refill_id": "555",
  "refill_status": "pending",
  "order_id": "66a1f0c2b3d4e5f6a7b8c9d0"
}

Status isi ulang

GET

Selama refill_status masih pending/processing, setiap pemanggilan membaca status terbaru langsung dari sistem. Nilai: pending, processing, success, atau failed (terminal). Bila pengajuan ditolak, nilainya berisi catatan penolakan yang diawali ditolak:.

{
  "success": true,
  "refill_id": "555",
  "refill_status": "success",
  "refill_requested_at": "2026-09-27T08:33:37.056Z",
  "order_status": "completed"
}

Parameter per tipe layanan

Kirim hanya parameter yang terdaftar untuk tipe tersebut; parameter lain diabaikan sistem. Tipe tersedia tercantum pada field type dalam respons katalog.

TipeParameterCatatan
defaulttarget, quantityStandar untuk hampir seluruh katalog.
packagetargetJumlah terkunci pada nilai minimum.
custom_commenttarget, commentsSatu komentar per baris; jumlah dihitung otomatis.
comment_replytarget, username, commentsBalasan ke akun tertentu.
comment_likestarget, quantity, usernameLike pada komentar milik username.
mention_listtarget, usernamesSatu username per baris.
mention_hastagtarget, quantity, hashtagTanpa tanda #.
mention_followertarget, quantity, usernameMenyebut pengikut milik username.
mention_mediatarget, quantity, mediaMenyebut dari unggahan pada tautan media.
polltarget, quantity, answer_numberPilih nomor jawaban yang didukung.

Langkah membuat pesanan di halaman web

  1. Buka halaman Dongtube SMM, lalu cari layanan atau pilih kategori.
  2. Tinjau nama dan deskripsi layanan, batas minimum/maksimum, serta estimasi waktu proses.
  3. Masukkan target sesuai format pada deskripsi layanan. Bergantung pada layanan, target dapat berupa tautan atau identitas akun.
  4. Masukkan jumlah dalam rentang yang ditampilkan. Server memvalidasi ulang layanan, jumlah, dan harga sebelum mengirim pesanan.
  5. Periksa ringkasan dan konfirmasi pesanan. Pantau statusnya pada halaman Riwayat Pesanan.
Batas minimum/maksimum, deskripsi, serta tipe layanan berasal dari katalog resmi kami. Estimasi jumlah dan waktu proses adalah data rata-rata, bukan jaminan hasil. Contoh dan ketentuan format target tersedia pada panduan Dongtube.

Status pesanan

  • queued: pesanan sudah dibuat dan saldo ditahan, tetapi menunggu giliran dikirim ke penyedia. Sesuai ketentuan layanan, hanya satu pesanan yang diproses pada satu waktu; pesanan berikutnya otomatis dikirim setelah pesanan sebelumnya selesai.
  • submitting: pesanan disiapkan sebelum diproses ke sistem OTP.
  • submission_unknown: pesanan sudah tercatat tetapi ID pesanan belum kami terima; saldo ditahan dan tim kami mencocokkannya secara manual.
  • pending: pesanan berada dalam antrean pemrosesan.
  • processing: pesanan sedang diproses dan pengiriman sudah berjalan.
  • completed: pesanan selesai. Apabila hanya sebagian terkirim, sisa biaya dikembalikan otomatis ke saldo.
  • partial: pesanan berakhir sebagian; bagian yang tidak terkirim sudah dikembalikan.
  • failed: pesanan gagal atau dibatalkan. Saldo dikembalikan setelah sistem mengonfirmasi.

Layanan bertanda refill: true dapat diajukan isi ulang setelah pesanan selesai. Untuk penjelasan lengkap, lihat panduan Dongtube atau FAQ Status Pesanan.

Dongtube OTP

Sewa nomor sementara untuk menerima kode verifikasi dari berbagai layanan.

Langkah menyewa nomor

  1. Buka halaman Dongtube OTP, lalu pilih layanan tujuan (aplikasi yang akan menerima kode).
  2. Tinjau harga dan stok pada ringkasan, lalu klik Pesan Nomor. Saldo dipotong saat pesanan dibuat.
  3. Gunakan nomor yang muncul pada layanan tujuan, lalu tekan Periksa OTP untuk memuat kode yang masuk. Halaman riwayat juga memeriksanya otomatis.
  4. Salin kode OTP dan gunakan sebelum masa sewa nomor berakhir.

Ketentuan pembatalan dan pengembalian

  • Selama status masih Menunggu OTP dan belum ada SMS masuk, pesanan dapat dibatalkan melalui halaman riwayat. Saldo dikembalikan setelah pembatalan dikonfirmasi sistem.
  • Setelah SMS masuk (termasuk SMS tanpa kode terdeteksi), pesanan tidak dapat dibatalkan dan saldo tidak dikembalikan; aturan yang berlaku pada sistem.
  • Tanpa SMS sampai batas sewa (maksimal 10 menit), pesanan otomatis berakhir dan saldo dikembalikan penuh tanpa perlu tindakan apa pun.
  • Ketersediaan nomor mengikuti stok layanan pada saat pembelian.
Gunakan nomor hanya untuk verifikasi milik Anda sendiri. Nomor yang dipakai untuk aktivitas yang melanggar ketentuan layanan tujuan berada di luar tanggung jawab Dongtube.

Status pesanan OTP

  • Mengirim pesanan: permintaan nomor sedang diproses.
  • Menunggu OTP: nomor aktif dan siap dipakai; SMS belum tiba.
  • OTP diterima: kode tampil pada halaman riwayat dan pesanan selesai.
  • Berakhir tanpa kode: batas sewa lewat tanpa SMS; saldo dikembalikan otomatis.
  • Dibatalkan: dibatalkan sebelum SMS masuk dan saldo dikembalikan.
  • Gagal: pesanan berakhir gagal; saldo dikembalikan otomatis.

Endpoint OTP

Semua endpoint OTP memakai autentikasi yang sama dengan API Dongtube lainnya: kirim API Key pada header X-API-Key. Harga katalog dan pemotongan saldo mengikuti akun yang bersangkutan, persis seperti pemesanan lewat halaman web.

Negara yang dipakai order

GET

Tidak ada isi permintaan. Respons memuat count, default, dan countries berisi { id, name, flag } untuk semua country_id yang diterima oleh /services dan /order. country_id tetap opsional (bawaan mengikuti pengaturan akun, mis. 7 = Indonesia).

Katalog layanan

GET

Parameter opsional country_id (tanpa parameter memakai default akun). Katalog, harga, dan stok berbeda untuk tiap negara; daftar ID-nya ada di GET /api/otp/countries. Respons memuat success, country yang dipakai ({ id, name }), count, dan services: { service_code, service_name, product_id, price, stock, tiers } urut popularitas. service_code adalah ID platform layanan (contoh 1 = WhatsApp). Harga adalah harga final dalam Rupiah.

product_id menunjuk satu harga/tier pasti, dan tiers memuat SELURUH harga layanan itu di negara terpilih, { product_id, price, stock, operator, operator_id } urut harga menaik, termasuk yang stoknya sedang kosong (stock: 0). Kirim salah satu product_id itu ke /order untuk mengunci harganya. Tier price/stock/product_id di level layanan adalah harga termurah yang sedang berstok, sama dengan pemakaian tanpa product_id.

Operator (carrier) yang tersedia

GET
ParameterTipeWajibKeterangan
country_idnumberYaDari /countries.
platform_idnumberYaNilai service_code dari /services.

Respons memuat count dan operators: { operator_id, code, name, local_name }. Daftar kosong berarti kombinasi itu memang tanpa pilihan carrier, pesanan tetap jalan tanpa operator_id (carrier dipilih otomatis).

Buat pesanan nomor

POST
FieldTipeWajibKeterangan
service_codestringYaID platform layanan, contoh 1 = WhatsApp.
country_idnumberTidakBawaan negara pengaturan akun. Format lain dijawab 400.
qtynumberTidak2-100 untuk memesan beberapa nomor sekaligus.
operator_idnumberTidakMengunci satu carrier. Kosong berarti dipilih otomatis.
product_idstring / numberTidakMengunci satu harga dari tiers di /api/otp/services. Kosong berarti harga termurah yang sedang berstok.
quoted_pricenumberTidakHarga yang sedang Anda tampilkan, untuk mendeteksi perubahan harga.
  • Kode layanan harus ada di katalog negara yang dipilih, bila tidak, dibalas 400 Layanan tidak tersedia.
  • Harga dikunci: pesanan dirutekan dengan plafon max_price sebesar amount yang Anda bayar, sehingga biaya tidak pernah melebihi penerimaan.
  • Satu pesanan = satu percobaan. Apabila slot stok harga yang diminta habis, pesanan langsung dibatalkan, saldo dikembalikan, dan Anda menerima reason: out_of_stock. Tidak ada harga lain yang dicoba diam-diam; muat ulang /api/otp/services lalu pesan ulang dengan harga lain yang dipilih.
  • Balasan galat memuat reason (kode penyebab, untuk ditindaklanjuti program) di samping error (pesan lengkap masalah + solusi, untuk ditampilkan ke pengguna). Nilai reason: out_of_stock (409), price_changed (409), not_found, harga hilang dari katalog (409), insufficient_balance (402), invalid_request (400/422), rate_limited (429 + header Retry-After), abuse_blocked (429, pembatasan sementara dengan retry_after_seconds), provider_account (503), provider_down (502), auth (503).
  • Kesalahan sementara (502/503) tetap membawa pesan yang sudah diterjemahkan, error tidak pernah berupa teks mentah sistem maupun pesan generik selama reason ada.
  • Permintaan identik dalam 90 detik membalas duplicate: true tanpa memotong saldo lagi.
  • Bila harga segar naik melebihi quoted_price, pesanan ditolak 409 dengan pesan Harga berubah dari Rp X menjadi Rp Y. tanpa memotong saldo, muat ulang katalog lalu ulangi.
  • Pada qty > 1, tiap baris pada order.orders yang ok: false memuat reason-nya sendiri. Begitu satu nomor ditolak karena stok habis (kondisi berlaku untuk layanan itu saat ini juga), sisa antrean langsung dihentikan agar tidak membakar panggilan percuma.

Daftar pesanan

GET
ParameterTipeWajibKeterangan
limitnumberTidak1-100, bawaan 20.
offsetnumberTidakPaginasi, urutan terbaru lebih dulu.
statusstringTidaksubmitting|active|received|expired|cancelled|failed maupun gaya status mentah ACTIVE|OTP_RECEIVED|COMPLETED|CANCELED|EXPIRED.

Respons memuat count, limit, offset, dan orders. Nilai status di luar daftar dijawab 400.

Cek pesanan & ambil OTP

GET

Selama pesanan berstatus active, endpoint ini membaca kode terbaru begitu SMS tiba: otp terisi dan status berubah menjadi received. Panggil berulang selama nomor masih menunggu.

Batalkan pesanan

POST

Tidak ada isi permintaan. Hanya pesanan berstatus active yang dapat dibatalkan; status lain menjawab 409. Pembatalan terlalu dini ditolak dengan pesan kapan bisa dicoba lagi. Saldo dikembalikan penuh setelah pembatalan dikonfirmasi; SMS yang sudah diterima membuat pesanan tidak dapat dibatalkan.

Tandai selesai

POST

Tidak ada isi permintaan. Hanya pesanan berstatus received yang bisa ditandai selesai; status lain menjawab 409. Setelah selesai, pesanan keluar dari daftar aktif, kode tetap terlihat di riwayat dan tidak ada pengembalian dana.

Minta SMS ulang

POST

Tidak ada isi permintaan. Hanya berlaku selama pesanan masih berstatus active. Sistem dapat menahan pengiriman ulang sesaat setelah order dibuat, pesan penolakan berisi kapan bisa dicoba lagi. Respons memuat resent (bool): false berarti platform tersebut memang tidak mendukung pengiriman ulang.

Pratinjau biaya aktifkan kembali

GET

Baca-saja dan tanpa biaya. Membalas available: true beserta cost (biaya dasar) dan price (harga yang dibebankan ke saldo Anda). Nomor yang tidak memenuhi syarat membalas available: false beserta alasannya.

Aktifkan kembali nomor

POST

Tidak ada isi permintaan. Mengaktifkan kembali nomor dari pesanan yang sudah selesai untuk verifikasi berikutnya, nomor sama, pesanan baru (saldo dipotong sesuai price dari pratinjau; bila biaya naik saat eksekusi, pesanan dibatalkan otomatis dan saldo kembali utuh). Hanya nomor yang memenuhi syarat; sisanya menjawab 409. Klik ganda dalam hitungan detik membalas duplicate: true.

  • Saldo dipotong saat pesanan dibuat; pengembalian penuh setelah pembatalan dikonfirmasi sistem.
  • Setelah SMS/OTP diterima, pesanan final: tidak dapat dibatalkan dan tidak dikembalikan.
  • Tanpa SMS sampai batas sewa (maksimal 10 menit), pesanan otomatis berakhir dan saldo dikembalikan penuh.
  • Selama gangguan sistem, permintaan dibatasi dengan 503 dan saldo tetap utuh.

Contoh respons pesanan

{
  "success": true,
  "duplicate": false,
  "order": {
    "id": "66f1c2a4b9e7d3a5f8c2d1e0",
    "country_id": "7",
    "country_name": "Indonesia",
    "service_code": "1",
    "service_name": "WhatsApp",
    "product_id": "1369642071",
    "catalog_product_id": "450",
    "phone_number": "6281234567890",
    "otp": null,
    "otp_message": null,
    "expires_at_ms": 1780000000000,
    "amount": 3934,
    "status": "active",
    "provider_status": "Nomor berhasil dipesan; menunggu OTP.",
    "refunded": false,
    "refund_amount": null,
    "can_cancel": true,
    "can_resend": true,
    "can_replace": true,
    "cancel_available_at": null,
    "resend_available_at": null,
    "replace_available_at": null,
    "operator_id": null,
    "created_at": "2026-09-28T08:00:00.000Z",
    "updated_at": "2026-09-28T08:00:05.000Z"
  }
}

Penjelasan field respons

FieldKeterangan
idID internal pesanan.
country_id / country_nameNegara tujuan pesanan.
service_code / service_namePlatform tujuan, mis. 1 = WhatsApp.
product_idTier-slot katalog layanan.
catalog_product_idUmbrella negara+platform yang dirutekan, satu-satunya yang dipakai saat pemesanan.
phone_numberNomor untuk menerima kode OTP.
otp / otp_messageTerisi begitu SMS tiba.
expires_at_msBatas berlaku pesanan (ms epoch), lebih cepat antara batas sewa nomor dan batas keras 10 menit.
amountSaldo yang dipotong.
statussubmitting, active, received, expired, cancelled, failed.
provider_statusKeterangan status tambahan dari sistem.
refunded / refund_amountSenilai amount bila dikembalikan.
can_cancelBisa dibatalkan selama status masih menunggu dan belum ada SMS masuk.
can_resendBisa minta SMS ulang selama menunggu.
can_replaceBisa ganti nomor, syaratnya sama dengan pembatalan.
*_available_atWaktu (ms epoch) aksi boleh dieksekusi saat masih menahan penangguhan; null = sudah bebas.
operator_idCarrier yang dikunci; null = dipilih otomatis.
can_reactivateKandidat reaktivasi, nomor sudah menerima OTP.
can_finish / finished_atStatus dan waktu penandaan selesai.
sms_revisionNomor urut SMS, dipakai mengabaikan SMS yang datang terlambat.

DongtubeDB

Penyimpanan file online (CDN) plus database SQL personal.

Semua endpoint memerlukan header X-API-Key. Kueri SQL, tabel, unggah file, dan pencadangan juga mensyaratkan langganan aktif dari halaman DongtubeDB; daftar/hapus file dan informasi penyimpanan tetap dapat diakses tanpa langganan.

Informasi penyimpanan

GET
{
  "plan": "{plan_name}",
  "planLabel": "{plan_label}",
  "storageLimit": 0,
  "storageUsed": 0,
  "storageAvailable": 0,
  "expiresAt": "{expiration_time}"
}

Daftar file

GET

Parameter limit (bawaan 20, maksimal 100) dan offset.

{
  "success": true,
  "total": 0,
  "data": [{
    "id": "{file_id}",
    "originalName": "{file_name}",
    "mimeType": "{mime_type}",
    "size": 0,
    "isPublic": false,
    "downloads": 0,
    "uploadedAt": "{upload_time}",
    "cdnUrl": "{cdn_file_url}"
  }]
}

Unggah file

POST

Kirim sebagai multipart/form-data. Field wajib file; field opsional public (1 = publik, 0 = privat, bawaan 0). Data melebihi batas ukuran dijawab 413.

{ "success": true, "fileId": "{file_id}", "name": "{file_name}", "size": 0, "cdnUrl": "{cdn_file_url}" }

Hapus file

DELETE
{ "success": true }

Akses file CDN

GET

File publik: langsung diakses tanpa header, cocok untuk gambar di website. File privat: wajib menyertakan header X-API-Key.

Paket langganan

Basic 200 MB Rp 10.000/bln
Standard 500 MB Rp 20.000/bln
Pro 1 GB Rp 30.000/bln

Paket dan harga mengikuti pengaturan terbaru pada halaman DongtubeDB.

Kueri SQL (satu pernyataan)

POST
FieldTipeWajibKeterangan
sqlstringYaSatu pernyataan SQL.
paramsarrayTidakNilai untuk placeholder ?, maksimal 500 elemen.
// SELECT
{ "success": true, "rows": [...], "count": 1 }

// INSERT / UPDATE / DELETE
{ "success": true, "changes": 1, "lastInsertRowid": 7 }
  • Gunakan parameter binding untuk nilai dinamis; nama tabel dan kolom harus berupa identifier valid dari skema, bukan parameter binding. Validasi atau batasi identifier berdasarkan skema yang tepercaya.
  • Pernyataan yang diizinkan: SELECT / INSERT / UPDATE / DELETE / CREATE TABLE / CREATE [UNIQUE] INDEX / DROP TABLE / DROP INDEX / ALTER TABLE.
  • Hasil SELECT dibatasi maksimal 100.000 baris (bawaan). Sertakan LIMIT agar kueri tidak memotong hasil yang dibutuhkan.

Batch, transaksi atomik

POST

Semua pernyataan dijalankan dalam satu transaksi SQLite: perubahan diterapkan seluruhnya jika berhasil, atau dibatalkan bila terjadi kegagalan. Maksimal 100 pernyataan per batch.

expectChanges: true berarti: bila pernyataan tersebut mengubah 0 baris, transaksi dibatalkan dan server mengembalikan 409 { "guardFailed": true, "statementIndex": i }. Gunakan untuk memvalidasi kondisi sebelum perubahan, misalnya saldo mencukupi atau status masih menunggu. Respons sukses: { "success": true, "results": [...] }. last_insert_rowid() dapat dipakai pada pernyataan berikutnya di koneksi yang sama.

Operasi CRUD tanpa SQL

GET

Operasi CRUD melalui /db/api/v2/:table/rows. Filter diberikan sebagai parameter kueri memakai operator eq neq gt gte lt lte like in is. Nama tabel dan kolom adalah identifier yang harus sesuai skema, bukan nilai yang dapat diikat sebagai parameter.

GET    /db/api/v2/{table_name}/rows?{column_name}=eq.{value}&select={column_list}&order={column_name}.desc&limit={limit}&count=exact
POST   /db/api/v2/{table_name}/rows       body: {object_payload} | [{object_payload}, ...]  (maksimal 1.000)
POST   /db/api/v2/{table_name}/rows?on_conflict={column_name}   (upsert)
PATCH  /db/api/v2/{table_name}/rows?{column_name}=eq.{value}   body: {changes_payload}  (filter wajib)
DELETE /db/api/v2/{table_name}/rows?{column_name}=eq.{value}   (filter wajib)
  • in: ?{column_name}=in.{value_1},{value_2}; is: ?{column_name}=is.null atau is.notnull.
  • order={column_name}.asc|{column_name}.desc (boleh beberapa kolom dengan koma), limit maksimal 10.000, dan offset.
  • count=exact menambahkan total pada respons.

Daftar tabel SQL

GET
{ "success": true, "tables": [{ "name": "{table_name}", "rows": 0, "columns": 0 }], "count": 1 }

Data tabel SQL

GET

Parameter limit (bawaan 100, maksimum 1.000) dan offset.

{
  "success": true,
  "table": "{table_name}",
  "schema": [{ "cid": 0, "name": "{column_name}", "type": "{data_type}", "pk": 0 }],
  "rows": [{ "{column_name}": "{value}" }],
  "total": 0,
  "limit": 100,
  "offset": 0
}

Buat tabel SQL

POST

Hapus tabel SQL

DELETE

Nama tabel dibersihkan menjadi identifier (huruf, angka, garis bawah). Tabel yang tidak ada tetap dijawab sukses.

{ "success": true }

Export CSV / JSON

GET

Tambahkan ?format=json untuk JSON. Secara default hasil diekspor sebagai file CSV. Maksimal 100.000 baris.

Sinkronisasi perubahan (delta)

GET

Tidak ada endpoint push, WebSocket dan SSE sudah dihapus. Klien mengikuti perubahan dengan menarik baris yang lebih baru dari kursor terakhir, lalu mengulanginya dengan interval yang menyesuaikan aktivitas.

// 1. Simpan updatedAt terakhir sebagai kursor
cursor = 0

// 2. Tarik baris yang berubah sejak kursor
GET /db/api/v2/{table_name}/rows?updatedAt=gt.{cursor}&select=key,value,updatedAt&order=updatedAt.asc&limit=1000
-> { "success": true, "rows": [ ... ], "count": 3 }

// 3. Naikkan kursor ke updatedAt maksimum hasil, ulangi
cursor = max(rows[].updatedAt)
  • Cara setara lewat SQL: POST /db/api/query dengan WHERE updatedAt > ? ORDER BY updatedAt LIMIT ?. Keduanya membalas JSON.
  • Pada tabel kv, updatedAt adalah nomor urut penulisan yang dinaikkan trigger SQLite, selalu naik dan unik, sehingga aman dipakai sebagai kursor. Pada tabel lain kolom delta dikelola oleh aplikasi.
  • Contoh klien: interval 2 detik ketika ada perubahan, mundur berlipat sampai 30 detik saat sepi, ditambah pembacaan ulang berkala (rekonsiliasi) untuk menutup jeda antar interval.
  • Query selalu terbatas pada database milik API Key tersebut; data antar akun tidak dibagikan.

Cadangkan dan pulihkan database

Ekspor seluruh database (semua tabel dan data) ke satu file .db. File cadangan dapat dipulihkan ke akun yang sama atau akun lain dengan langganan aktif. Proses impor merupakan penggantian penuh: seluruh isi database tujuan akan diganti dengan isi file cadangan. Pencadangan juga tersedia melalui tab Impor/Ekspor di SQL Studio.

Ekspor database

GET

File dongtubedb-backup-YYYY-MM-DD.db akan diunduh. Simpan file tersebut sebagai cadangan.

Impor / pulihkan database

POST

Kirim file cadangan menggunakan multipart/form-data dengan field backup. File divalidasi (header SQLite dan pemeriksaan integritas) serta harus sesuai dengan kapasitas paket.

curl -X POST "https://{host}/db/api/backup/import" \
  -H "X-API-Key: {api_key}" \
  -F "backup=@{backup_file_path}"

Referensi

Resep alur lengkap dari nol sampai selesai, dan riwayat perubahan kontrak API.

Resep: terima pembayaran QRIS

  1. Buat invoice dengan GET /api/v1/invoice?amount={amount}, lalu tampilkan qris_image ke pengguna.
  2. Tunggu peristiwa lunas: siapkan webhook (verifikasi X-Signature atas body mentah) dan polling GET /api/v1/invoice/status sebagai jaring pengaman.
  3. Status paid berarti layanan dibuka. Status kedaluwarsa: buat invoice baru bila pengguna masih ingin bayar.
# 1. buat invoice
curl -H "X-API-Key: {api_key}" "https://{host}/api/v1/invoice?amount=50000"
# 2. polling sampai lunas (aman diulang)
curl -H "X-API-Key: {api_key}" "https://{host}/api/v1/invoice/status?invoice_id={invoice_id}"

Resep: pesan layanan SMM

  1. Cari layanan di GET /api/smm/services; catat id, rentang min/max, dan type-nya.
  2. Buat pesanan dengan POST /api/smm/order; kirim hanya parameter yang terdaftar untuk tipe itu.
  3. Pantau GET /api/smm/status/{order_id} sampai completed/partial. Bila refill: true, ajukan isi ulang setelah selesai.
  4. Uang kembali otomatis bila pesanan gagal atau berakhir sebagian; pantau field refund.
Timeout saat membuat pesanan bukan berarti pesanan gagal: tarik GET /api/smm/orders dulu sebelum mengirim ulang. Jendela duplikat 90 detik akan menahan debit ganda, tapi memeriksa status lebih cepat daripada menunggu.

Resep: sewa nomor OTP

  1. Pilih negara (GET /api/otp/countries), lalu ambil katalog di GET /api/otp/services: pilih product_id dari tiers untuk mengunci harga, atau GET /api/otp/operators bila ingin mengunci carrier.
  2. Pesan dengan POST /api/otp/order sambil mengirim quoted_price (harga yang Anda tampilkan) supaya perubahan harga terdeteksi sebagai 409 price_changed, bukan kejutan debit.
  3. Polling GET /api/otp/orders/{order_id} tiap 3-5 detik sampai status: received. SMS belum masuk sampai batas sewa, saldo dikembalikan otomatis.
  4. Setelah kode terpakai, kirim POST /api/otp/orders/{order_id}/finish. Ingin memakai nomor yang sama lagi? Pratinjau dulu dengan reactivate-options.
# polling ringan: satu endpoint, semua kapabilitas di respons
curl -H "X-API-Key: {api_key}" "https://{host}/api/otp/orders/{order_id}"
-> bila "otp": "123456" dan status "received", pakai kode lalu finish
Keputusan batal/finish harus berbasis field kapabilitas (can_cancel, can_resend, can_finish) beserta *_available_at-nya, bukan perkiraan waktu di sisi klien, itulah aturan yang berlaku di sistem.

Riwayat perubahan kontrak API

TanggalPerubahan yang terlihat oleh integrator
Okt 2026Kontrak OTP diselaraskan: kapabilitas server-authoritative (can_cancel, can_resend, can_replace, can_reactivate + *_available_at) hadir di respons API; endpoint finish, resend, reactivate-options, dan reactivate tersedia di jalur web dan API.
Okt 2026Batas laju diperketat: jaring global 600/menit/IP untuk seluruh rute, termasuk rute yang sebelumnya tanpa limiter.
Sep 2026Sistem SMM dimutakhirkan tanpa menukar status pesanan lama; refill, pengembalian proporsional, dan deteksi pesanan macet mengikuti kontrak baru.
Sep 2026Jendela duplikat 90 detik resmi berlaku untuk pesanan SMM, OTP, dan Premium, retry aman tanpa risiko debit ganda.
Sep 2026Minimum deposit QRIS turun menjadi Rp 100.

Perubahan kontrak yang tidak kompatibel selalu diumumkan lewat halaman pengumuman di dalam aplikasi sebelum berlaku.