Developer

Dokumentasi API

Panduan lengkap integrasi semua layanan Dongtube - Payment, OTP, Prem, dan DongtubeDB.

Autentikasi

API Key dari halaman Profil

Semua endpoint memerlukan header X-API-Key atau query param apikey.

X-API-Key: DONGTUBE_xxxxxxxxxxxxxxxx

API Key tersedia di halaman Profil. Jaga kerahasiaan API Key Anda.

API Console (Live Test)

Dongtube Payment

Deposit, cek saldo, buat dan pantau invoice QRIS

Cek Saldo

GET
Memuat...
{ "balance": 100000 }

Buat Invoice QRIS

GET
Memuat...
{
  "success": true,
  "invoice_id": "INV2285c2c",
  "amount": 10000,
  "fee": 218,
  "total": 10218,
  "qris_image": "/img-cache/abc123.png",
  "expired_at": "2026-06-05T12:00:00.000Z"
}

URL gambar QRIS selalu berupa URL internal /img-cache/... - tidak ada URL pihak ketiga.

QRIS Statis (Nominal Bebas)

GET

Satu QRIS reusable tanpa nominal tetap - pelanggan scan lalu mengisi nominal sendiri. Setiap pembayaran otomatis masuk ke saldo dan tercatat di riwayat (tanpa perlu buat invoice per transaksi). Tambahkan parameter source=static pada endpoint invoice.

GET /api/v1/invoice?source=static&apikey=API_KEY_ANDA
{
  "success": true,
  "type": "static",
  "qr_content": "00020101021126...",
  "qris_image": "/img-cache/qris-statis.png",
  "note": "QRIS statis nominal bebas. Pembayaran otomatis masuk saldo (dipotong fee admin)."
}
  • Pembayaran masuk realtime ke saldo (dipotong biaya admin); nominal kecil dikreditkan penuh.
  • QR-nya tetap (bisa dicetak/dibagikan); satu QR untuk banyak pembayaran.
  • Fitur ini khusus akun yang ditetapkan sebagai pemilik QRIS statis - akun lain mendapat 403.

Cek Status Invoice

GET
Memuat...
{
  "invoice_id": "INV2285c2c",
  "amount": 10000,
  "fee": 218,
  "total": 10218,
  "status": "pending",
  "qris_image": "/img-cache/abc123.png",
  "expired_at": "2026-06-05T12:00:00.000Z",
  "created_at": "2026-06-05T10:00:00.000Z"
}

Status: pending - menunggu pembayaran, paid - lunas (saldo masuk), expired - kadaluarsa

Webhook Callback (Notifikasi Lunas)

POST

Atur Webhook URL di halaman Profil. Saat deposit Anda LUNAS, sistem mengirim POST JSON ke URL tersebut. Verifikasi keaslian lewat header X-Signature = sha256=HMAC-SHA256(body, API Key Anda).

Body yang dikirim ke URL Anda:

POST (Webhook URL Anda)
Headers:
  X-Webhook-Event: invoice.paid
  X-Signature: sha256=<hmac>

{
  "event": "invoice.paid",
  "invoice_id": "INV2285c2c",
  "amount": 10000,
  "fee": 218,
  "total": 10218,
  "status": "paid",
  "paid_at": "2026-06-12T16:00:00.000Z"
}

Contoh verifikasi (Node.js):

const crypto = require('crypto');
const expected = 'sha256=' + crypto
  .createHmac('sha256', API_KEY)
  .update(rawBody)            // body MENTAH (string), bukan hasil parse
  .digest('hex');
if (expected !== req.headers['x-signature']) return res.sendStatus(401);

Balas 2xx untuk konfirmasi terima. Gagal/timeout akan dicoba ulang 1×.

Top-up E-Wallet / Bank

Kirim saldo Anda ke e-wallet (DANA/GoPay/OVO/LinkAja/ShopeePay) atau rekening bank.

Alur 2 langkah: (1) panggil Inquiry untuk verifikasi nama pemilik tujuan, lalu (2) panggil Top-up dengan account_name dari inquiry. Saldo Anda dipotong nominal + biaya admin. Memindahkan uang nyata — pastikan tujuan benar.

Daftar Metode

GET
GET /api/v1/topup/methods?apikey=API_KEY
{
  "success": true,
  "fee": 5000,
  "ewallet": [{ "code": "DANA", "name": "DANA", "min": 20000, "max": 2000000 }, ...],
  "bank": [{ "code": "014", "name": "BCA" }, ...],
  "bank_min": 10000, "bank_max": 50000000
}

Pakai code dari daftar ini untuk inquiry & top-up.

Inquiry Tujuan (Cek Nama)

GET
GET /api/v1/topup/inquiry?type=ewallet&code=DANA&account=08123456789&apikey=API_KEY

Param: type = ewallet | bank, code (kode e-wallet/bank), account (no. HP / rekening). Read-only, tidak memotong saldo.

{
  "success": true,
  "type": "ewallet",
  "account_name": "BUDI SANTOSO",
  "provider": "DANA"
}

Eksekusi Top-up

POST
POST /api/v1/topup

Header: X-Api-Key: API_KEY · Body JSON:

{
  "type": "ewallet",            // "ewallet" | "bank"
  "code": "DANA",              // dari /methods
  "account": "08123456789",    // no. HP / rekening
  "account_name": "BUDI SANTOSO", // dari /inquiry
  "amount": 50000
}

Respons:

{
  "success": true,
  "status": "success",   // "success" = terkirim, "pending" = diproses
  "amount": 50000,
  "fee": 5000,
  "account_name": "BUDI SANTOSO"
}
  • Saldo dipotong amount + fee. Jika gagal, saldo otomatis dikembalikan.
  • Hanya dana yang sudah cair (settle) yang bisa di-top-up.
  • status: pending = sedang diproses provider; saldo sudah terpotong.

Dongtube Prem

Beli akun premium - Netflix, Capcut, Spotify, dll

  • Saldo terpotong langsung saat order. Order yang sukses tidak bisa dibatalkan.
  • Jika status pending, akun sedang diproses - gunakan endpoint Cek Status.
  • Gambar produk menggunakan URL internal /img-cache/...

Status Order

pendingDiproses
successAkun tersedia
failedGagal

List Produk Premium

GET
Memuat...
{
  "success": true,
  "products": [
    {
      "id": 5,
      "name": "Alight Motion 1 Tahun",
      "description": "Fitur premium unlocked.",
      "price": 15000,
      "status": "available",
      "stock": 23,
      "image": "/img-cache/abc.png"
    }
  ]
}

status: available = bisa dipesan, unavailable = stok habis.

Order Produk Premium

POST
Memuat...
// Request Body (JSON)
{
  "product_id": 5,
  "qty": 1
}
// Response (objek order lengkap)
{
  "success": true,
  "order": {
    "_id": "...",
    "productId": 5,
    "productName": "...",
    "qty": 1,
    "amount": 15000,
    "status": "success",
    "accounts": [
      { "username": "...", "password": "..." }
    ],
    "providerInvoice": "API-...",
    "createdAt": "2026-06-13T..."
  }
}

Jika status pending → gunakan endpoint Cek Status dengan providerInvoice.

Cek Status Order Premium

GET
Memuat...
{
  "success": true,
  "order": {
    "_id": "...",
    "productName": "...",
    "amount": 15000,
    "status": "success",
    "accounts": [{ "username": "email@x.com", "password": "pass123" }],
    "providerInvoice": "API-...",
    "createdAt": "2026-06-13T..."
  }
}

accounts hanya terisi saat status: success. Objek order berisi field tambahan lain juga.

DongtubeDB

Penyimpanan file online (CDN) + database SQL personal seperti Supabase

Semua endpoint DongtubeDB memerlukan header X-API-Key dan subscription aktif dari halaman DongtubeDB.

Kapasitas & Performa

  • Tanpa batas request - query SELECT/INSERT/UPDATE/DELETE bebas dipakai sebanyak apapun. Tidak ada rate-limit; satu-satunya batas adalah kapasitas penyimpanan plan Anda.
  • Selama kapasitas masih cukup, database bisa terus dipakai untuk trafik tinggi tanpa batasan waktu.
  • Mesin database dituning untuk latensi rendah: mode WAL (baca & tulis paralel), page cache di RAM, memory-mapped I/O, dan koneksi yang di-pool per akun - minim delay walau trafik padat.
  • Pemakaian = total file upload (CDN) + ukuran database SQL. Cek sisa kuota lewat /db/api/storage.

Keamanan SQL

  • Hanya: SELECT, INSERT, UPDATE, DELETE, CREATE TABLE / INDEX, DROP TABLE / INDEX, ALTER TABLE
  • Diblokir: ATTACH, PRAGMA, LOAD_EXTENSION, sqlite_master, dan perintah berbahaya lainnya
  • SELECT max 50.000 baris per query - tambahkan LIMIT untuk hasil besar

Info Storage

GET
Memuat...
{
  "plan": "basic", "planLabel": "Basic",
  "storageLimit": 209715200,
  "storageUsed": 1048576,
  "storageAvailable": 208666624,
  "expiresAt": "2026-07-04T00:00:00.000Z"
}

List File

GET
Memuat...

Params: limit (default 20, max 100), offset

{
  "success": true, "total": 5,
  "data": [{
    "id": "abc...", "originalName": "foto.png",
    "mimeType": "image/png", "size": 102400,
    "isPublic": 1, "downloads": 0,
    "uploadedAt": "2026-06-13T...", "cdnUrl": "/cdn/abc..."
  }]
}

Upload File

POST
Memuat...
fileFile yang diupload (multipart/form-data, wajib)
public1 = publik, 0 = privat (default)
{ "success": true, "fileId": "abc...", "name": "foto.png", "size": 102400, "cdnUrl": "/cdn/abc..." }

Hapus File

DELETE
Memuat...
{ "success": true }

Akses File CDN

GET
Memuat...

File Publik - langsung diakses tanpa header, cocok untuk gambar di website

File Privat - wajib sertakan 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

Contoh paket - daftar & harga terbaru ada di halaman DongtubeDB.

Execute SQL Query

POST
Memuat...
{ "sql": "SELECT * FROM users LIMIT 10" }
{
  "success": true,
  "rows": [{ "id": 1, "name": "Budi" }],
  "count": 1
}

List Tables SQL

GET
Memuat...
{ "success": true, "tables": [{ "name": "users", "rows": 150, "columns": 4 }], "count": 1 }

Data Table SQL

GET
Memuat...

Params: limit (default 100, max 1000), offset

{
  "success": true,
  "table": "users",
  "schema": [{ "cid": 0, "name": "id", "type": "INTEGER", "pk": 1 }],
  "rows": [{ "id": 1, "name": "Budi" }],
  "total": 150, "limit": 100, "offset": 0
}

Create Table SQL

POST
Memuat...
{
  "name": "products",
  "columns": [
    { "name": "id", "type": "INTEGER", "primaryKey": true },
    { "name": "name", "type": "TEXT", "notNull": true },
    { "name": "price", "type": "REAL" }
  ]
}

Export CSV / JSON

GET
Memuat...

Tambahkan ?format=json untuk JSON. Default: file CSV. Max 100.000 baris.

Realtime Perubahan (SSE)

GET
Memuat...

Aliran text/event-stream (Server-Sent Events). Kirim event: ready saat tersambung, lalu event: change setiap database kamu berubah - pakai untuk refresh data tanpa polling.

event: ready
data: {"seq": 1718000000000}

event: change
data: {}

Backup & Restore Database

Cadangkan seluruh database (semua tabel + data) jadi satu file .db, lalu pulihkan kapan saja - di akun yang sama maupun akun berbeda. Alur: Export → simpan file → Import untuk restore. Import bersifat ganti total: isi database tujuan akan diganti sepenuhnya oleh file backup. Bisa juga lewat UI di SQL Studio → tab Import/Export.

Export Database

GET
Memuat...

Mengunduh file dongtubedb-backup-YYYY-MM-DD.db. Simpan sebagai cadangan.

Import / Restore Database

POST
Memuat...

Kirim file backup sebagai multipart/form-data dengan field backup. File divalidasi (header SQLite + integrity check) & harus muat di kapasitas plan.

curl -X POST "/db/api/backup/import" \
  -H "X-API-Key: DONGTUBE_xxxx" \
  -F "backup=@dongtubedb-backup-2026-06-06.db"