Developer Hub

API Access & Documentation

Integrasikan sistem pembayaran secara instan dan otomatis.

Your API Keys
Production
API_KEY_ANDA_DISINI_XYZ
Sandbox
SB_API_KEY_ANDA_DISINI
Anda harus Masuk (Login) untuk melihat dan membuat Secret Key milik Anda.
Pengaturan Webhook URL

Masukkan URL server Anda untuk menerima notifikasi otomatis (JSON) saat pembayaran sukses.

Login diperlukan untuk mengatur Webhook.

Panduan Integrasi (REST API)

Setiap request ke server wajib menyertakan API Key pada Header HTTP Anda.

Base URLhttps://www.app.digitalolshop.com/api
Header WajibX-API-KEY: API_KEY_ANDA_DISINI (Gunakan Sandbox Key untuk testing)
Content-Typeapplication/json
POST /api/topup

Membuat tagihan QRIS baru (Topup) dan mengenerate kode unik secara otomatis.

PENTING: Endpoint ini HANYA untuk membuat tagihan (menampilkan QRIS). Jangan memproses saldo/pembelian pelanggan sebagai lunas setelah memanggil endpoint ini. Tunggu konfirmasi status paid dari Webhook!
Body Parameter (JSON) Request
ParameterTipeWajibDeskripsi
amountIntegerYaNominal topup (contoh: 10000)
curl -X POST https://www.app.digitalolshop.com/api/topup \
-H "X-API-KEY: API_KEY_ANDA_DISINI" \
-H "Content-Type: application/json" \
-d '{"amount": 50000}'
fetch('https://www.app.digitalolshop.com/api/topup', {
    method: 'POST',
    headers: {
        'X-API-KEY': 'API_KEY_ANDA_DISINI',
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({ amount: 50000 })
}).then(res => res.json()).then(console.log);
$ch = curl_init('https://www.app.digitalolshop.com/api/topup');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'X-API-KEY: API_KEY_ANDA_DISINI',
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['amount' => 50000]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
echo $response;
import requests
headers = {'X-API-KEY': 'API_KEY_ANDA_DISINI'}
res = requests.post('https://www.app.digitalolshop.com/api/topup', json={'amount': 50000}, headers=headers)
print(res.json())
Contoh Respon (Balasan) dari Server

Ini adalah format JSON yang akan dikembalikan oleh server kami setelah Anda menjalankan script di atas.

{
    "status": "pending",
    "invoice_code": "INV-1718901234-567",
    "total_amount": 50245,
    "qr_url": "https://www.app.digitalolshop.com/uploads/qris/INV-1718901234-567.png",
    "payment_type": "otomatis"
}
Cara Menampilkan QRIS (Sangat Penting):
Data pada qr_url di atas adalah tautan (URL) gambar kode QR murni. Untuk menampilkannya di website Anda, masukkan langsung ke dalam atribut src pada tag <img> HTML Anda:
<img src="<?= $response['qr_url'] ?>" alt="QRIS Pembayaran">
GET /api/topup/status/{invoice}

Mengecek status tagihan QRIS secara manual berdasarkan Invoice.

URL Parameter
ParameterTipeWajibDeskripsi
invoiceStringYaKode invoice (contoh: INV-12345)
curl -X GET https://www.app.digitalolshop.com/api/topup/status/INV-12345 \
-H "X-API-KEY: API_KEY_ANDA_DISINI"
fetch('https://www.app.digitalolshop.com/api/topup/status/INV-12345', {
    headers: { 'X-API-KEY': 'API_KEY_ANDA_DISINI' }
}).then(res => res.json()).then(console.log);
$ch = curl_init('https://www.app.digitalolshop.com/api/topup/status/INV-12345');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-API-KEY: API_KEY_ANDA_DISINI']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
echo $response;
import requests
headers = {'X-API-KEY': 'API_KEY_ANDA_DISINI'}
res = requests.get('https://www.app.digitalolshop.com/api/topup/status/INV-12345', headers=headers)
print(res.json())
Contoh Respon dari Server
{
    "status": "pending",
    "invoice": "INV-12345",
    "payment_status": "pending",
    "amount": 50000,
    "total_amount": 50245
}

Status / Payment Status dapat berupa: pending, paid, atau not_found.

GET /api/balance

Mengambil informasi sisa saldo (balance) akun Anda saat ini secara real-time. Sangat berguna untuk sinkronisasi saldo di website/aplikasi *reseller* Anda.

curl -X GET https://www.app.digitalolshop.com/api/balance \
-H "X-API-KEY: API_KEY_ANDA_DISINI"
$ch = curl_init('https://www.app.digitalolshop.com/api/balance');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-API-KEY: API_KEY_ANDA_DISINI']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
echo $response;
Contoh Respon Sukses
{
    "status": "success",
    "balance": 1500000
}
GET /api/ewallet

Mengambil daftar produk E-Wallet (DANA, OVO, GoPay, dll) yang sedang aktif langsung dari server, beserta Kode SKU dan harga total potongannya. Anda bisa menggunakan ini untuk menampilkan pilihan otomatis (Dropdown) di form website Anda.

curl -X GET https://www.app.digitalolshop.com/api/ewallet \
-H "X-API-KEY: API_KEY_ANDA_DISINI"
$ch = curl_init('https://www.app.digitalolshop.com/api/ewallet');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-API-KEY: API_KEY_ANDA_DISINI']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
echo $response;
Contoh Respon (Daftar SKU & Harga)
{
    "status": "success",
    "total_products": 2,
    "data": [
        {
            "brand": "DANA",
            "sku": "DANA25",
            "product_name": "Saldo DANA 25.000",
            "nominal": 25000,
            "total_deduction": 26500,
            "status": "Aktif"
        },
        {
            "brand": "OVO",
            "sku": "OVO50",
            "product_name": "Saldo OVO 50.000",
            "nominal": 50000,
            "total_deduction": 51500,
            "status": "Aktif"
        }
    ]
}
Tips Implementasi: Gunakan data sku dari respon ini untuk dikirimkan sebagai parameter pada saat memanggil fungsi Tarik Instan di bawah.
POST /api/withdrawal

Melakukan permintaan penarikan saldo (Withdrawal) secara manual melalui API.

Body Parameter (JSON) Request
ParameterTipeWajibDeskripsi
ewallet_nameStringYaNama tujuan (Contoh: DANA, BCA)
ewallet_numberStringYaNomor rekening / Nomor HP
account_nameStringYaNama pemilik rekening
amountIntegerYaNominal penarikan (Contoh: 50000)
curl -X POST https://www.app.digitalolshop.com/api/withdrawal \
-H "X-API-KEY: API_KEY_ANDA_DISINI" \
-H "Content-Type: application/json" \
-d '{"ewallet_name": "DANA", "ewallet_number": "0812345", "account_name": "Budi", "amount": 50000}'
fetch('https://www.app.digitalolshop.com/api/withdrawal', {
    method: 'POST',
    headers: {
        'X-API-KEY': 'API_KEY_ANDA_DISINI',
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({ ewallet_name: "DANA", ewallet_number: "0812345", account_name: "Budi", amount: 50000 })
}).then(res => res.json()).then(console.log);
$payload = json_encode([
    "ewallet_name" => "DANA", 
    "ewallet_number" => "0812345", 
    "account_name" => "Budi", 
    "amount" => 50000
]);
$ch = curl_init('https://www.app.digitalolshop.com/api/withdrawal');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'X-API-KEY: API_KEY_ANDA_DISINI',
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($ch);
import requests
headers = {'X-API-KEY': 'API_KEY_ANDA_DISINI'}
data = {'ewallet_name': 'DANA', 'ewallet_number': '0812345', 'account_name': 'Budi', 'amount': 50000}
res = requests.post('https://www.app.digitalolshop.com/api/withdrawal', json=data, headers=headers)
print(res.json())
Contoh Respon dari Server
{
    "status": "success",
    "message": "Permintaan withdrawal berhasil dibuat"
}
POST /api/withdrawal/instant

Melakukan penarikan saldo instan / otomatis (E-Wallet) yang terintegrasi langsung dengan API Provider.

Body Parameter (JSON) Request
ParameterTipeWajibDeskripsi
skuStringYaKode SKU Produk (Contoh: DANA25, OVO50)
destinationStringYaNomor rekening / e-Wallet tujuan
curl -X POST https://www.app.digitalolshop.com/api/withdrawal/instant \
-H "X-API-KEY: API_KEY_ANDA_DISINI" \
-H "Content-Type: application/json" \
-d '{"sku": "DANA25", "destination": "08123456789"}'
$payload = json_encode([
    "sku" => "DANA25", 
    "destination" => "08123456789"
]);
$ch = curl_init('https://www.app.digitalolshop.com/api/withdrawal/instant');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'X-API-KEY: API_KEY_ANDA_DISINI',
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($ch);
Contoh Respon Sukses
{
    "status": "success",
    "message": "Penarikan instan berhasil diproses.",
    "ref_id": "WD-1718901234-999",
    "trx_status": "Sukses",
    "total_deduction": 26500
}
Contoh Respon Gagal (Otomatis Refund)

Jika sistem provider gangguan atau nomor tujuan salah, sistem kami akan memberikan HTTP Code 400 dan saldo dikembalikan otomatis (Refund).

{
    "status": "error",
    "message": "Penarikan instan gagal: Nomor tujuan tidak terdaftar."
}
Webhook Notification (Kunci Pembayaran)

Webhook adalah "Kurir" otomatis dari sistem kami. Ketika pelanggan Anda selesai mentransfer uang via QRIS, server kami akan langsung mengirimkan pesan (JSON) ke URL Webhook milik Anda.

SANGAT PENTING: Proses penambahan saldo atau konfirmasi pesanan pelanggan Anda HANYA BOLEH dilakukan di dalam script Webhook ini. Jangan pernah memproses pesanan hanya karena Anda berhasil membuat tagihan API di awal.
Format Data (JSON) yang Kami Kirim ke Webhook Anda:
{
    "event": "topup_success",
    "invoice": "INV-123456789",
    "amount": 50000,
    "status": "paid"
}
Contoh Script Penerima (Pasang di Server Anda):
<?php
$payload = file_get_contents('php://input');
$data = json_decode($payload, true);

if (isset($data['event']) && $data['event'] === 'topup_success') {
    $invoice = $data['invoice']; 
    $status = $data['status']; 
    
    if($status === 'paid'){
    }

    http_response_code(200);
    echo json_encode(['status' => 'success']);
} else {
    http_response_code(400);
    echo json_encode(['status' => 'failed']);
}
app.post('/webhook', express.json(), (req, res) => {
    const data = req.body;

    if (data && data.event === 'topup_success') {
        const invoice = data.invoice;
        const status = data.status;
        
        if (status === 'paid') {
        }

        res.status(200).json({ status: 'success' });
    } else {
        res.status(400).json({ status: 'failed' });
    }
});