Buat API key
Masuk sebagai member, buka menu API Settings, lalu buat key baru.
Ambil daftar produk, buat pesanan, dan terima data akun langsung dari sistemmu sendiri. Empat endpoint, semuanya JSON.
Mulai cepat
Masuk sebagai member, buka menu API Settings, lalu buat key baru.
Isi IP whitelist dengan IP server yang akan memanggil API. Tanpa ini semua request ditolak.
Semua endpoint memakai POST. Coba dulu dengan mode sandbox supaya saldo tidak terpotong.
Sertakan API key sebagai parameter api_key di isi (body) setiap request. Tidak ada header khusus.
Base URL
https://juragan.digitals.id/api/v1
IP whitelist wajib diisi. Request dari IP yang belum terdaftar dijawab 403, dan pesannya menyebutkan IP yang terbaca — tinggal salin ke API Settings. Beberapa IP dipisahkan dengan koma.
Panggil API hanya dari server. Jangan menaruh API key di aplikasi atau halaman yang bisa dibuka pengunjung — key ini bisa membelanjakan saldomu.
Isi request berupa JSON (Content-Type: application/json) atau form biasa. Jawaban selalu JSON dengan success, message, dan — bila berhasil — data.
| Kode HTTP | Artinya |
|---|---|
| 401 | api_key tidak dikirim, salah, atau akunnya nonaktif. |
| 403 | IP server belum didaftarkan di IP whitelist. |
| 405 | Bukan metode POST. |
| 422 | Parameter tidak sah (mis. variant_id kosong, voucher tidak berlaku). Rinciannya di errors. |
| 400 | Permintaan ditolak: varian tidak ditemukan, stok habis, atau saldo tidak cukup. |
{
"success": false,
"message": "Validation failed",
"errors": {
"variant_id": "Variant ID is required"
}
}
/balance
Saldo akun kamu saat ini. Pesanan lewat API dibayar dari saldo ini.
curl -X POST https://juragan.digitals.id/api/v1/balance \
-H "Content-Type: application/json" \
-d '{
"api_key": "YOUR_API_KEY"
}'
<?php
$payload = [
'api_key' => 'YOUR_API_KEY',
];
$ch = curl_init('https://juragan.digitals.id/api/v1/balance');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_TIMEOUT => 30,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
const res = await fetch('https://juragan.digitals.id/api/v1/balance', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"api_key": "YOUR_API_KEY"
}),
});
const result = await res.json();
{
"success": true,
"message": "Balance fetched successfully",
"data": {
"balance": 250000,
"currency": "IDR"
}
}
/products
Semua produk aktif beserta varian, harga, dan stoknya. id varian dipakai sebagai variant_id saat membuat pesanan.
Varian yang disembunyikan admin tidak muncul di sini, dan muncul lagi begitu ditampilkan kembali. Ambil ulang daftar ini secara berkala untuk menyamakan produk dan stok di sistemmu.
curl -X POST https://juragan.digitals.id/api/v1/products \
-H "Content-Type: application/json" \
-d '{
"api_key": "YOUR_API_KEY"
}'
<?php
$payload = [
'api_key' => 'YOUR_API_KEY',
];
$ch = curl_init('https://juragan.digitals.id/api/v1/products');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_TIMEOUT => 30,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
const res = await fetch('https://juragan.digitals.id/api/v1/products', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"api_key": "YOUR_API_KEY"
}),
});
const result = await res.json();
{
"success": true,
"message": "Products fetched successfully",
"data": [
{
"id": "c6c25743-f544-11f0-abb4-246e9691c22c",
"name": "CapCut Pro",
"category": "Productivity",
"description": "Deskripsi produk...",
"variants": [
{
"id": "1e43001c-f5e2-11f0-abb4-246e9691c22c",
"name": "Pro",
"price": 5000,
"duration": "7 Hari",
"type": "Private",
"warranty": "7 Hari",
"stock": 50,
"terms": "Syarat & ketentuan checkout",
"delivery_terms": null,
"delivery_mode": "auto"
}
]
}
]
}
Isi tiap varian
| Field | Tipe | Keterangan |
|---|---|---|
| id | string | ID varian — dipakai sebagai variant_id di /order. |
| name | string | Nama varian. |
| price | number | Harga dalam Rupiah. |
| duration | string | Masa aktif, mis. "30 Hari". |
| type | string | Tipe akun, mis. "Private", "Sharing". |
| warranty | string | Masa garansi, atau "No Garansi". |
| stock | int | Stok yang tersedia. |
| terms | string | null | Syarat & ketentuan saat checkout. |
| delivery_terms | string | null | Ketentuan pengiriman akun. |
| delivery_mode | string | Cara pengiriman: "auto" = dikirim otomatis oleh sistem begitu lunas, "manual" = dikirim admin (perlu waktu), "mixed" = bisa otomatis atau manual tergantung ketersediaan. |
/order
Membeli satu varian produk. Saldo langsung dipotong saat pesanan dibuat; data akunnya diambil lewat /transactions.
Parameter
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
| api_key | string | Wajib | API key kamu. |
| variant_id | string | Wajib | ID varian dari /products. |
| quantity | int | Opsional | Jumlah yang dibeli. Bawaan: 1. |
| email_invite | string | Opsional | Email yang akan diundang. Wajib untuk produk bertipe invite. |
| voucher_code | string | Opsional | Kode voucher. Bila kodenya tidak berlaku, pesanan ditolak — kirim ulang tanpa parameter ini untuk harga normal. |
| is_test | boolean | Opsional | true = mode coba (sandbox), lihat di bawah. |
curl -X POST https://juragan.digitals.id/api/v1/order \
-H "Content-Type: application/json" \
-d '{
"api_key": "YOUR_API_KEY",
"variant_id": "1e43001c-f5e2-11f0-abb4-246e9691c22c",
"quantity": 1
}'
<?php
$payload = [
'api_key' => 'YOUR_API_KEY',
'variant_id' => '1e43001c-f5e2-11f0-abb4-246e9691c22c',
'quantity' => 1,
];
$ch = curl_init('https://juragan.digitals.id/api/v1/order');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_TIMEOUT => 30,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
const res = await fetch('https://juragan.digitals.id/api/v1/order', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"api_key": "YOUR_API_KEY",
"variant_id": "1e43001c-f5e2-11f0-abb4-246e9691c22c",
"quantity": 1
}),
});
const result = await res.json();
{
"success": true,
"message": "Order created successfully",
"data": {
"order_id": "ORD-20260126-X8Y9Z",
"status": "processing",
"payment_status": "paid",
"total_amount": 5000,
"current_balance": 245000
}
}
Mode sandbox
Tambahkan "is_test": true untuk mencoba tanpa memotong saldo. Semua pemeriksaan tetap berjalan (varian, stok, voucher), tetapi tidak ada pesanan yang dibuat. Nomornya berawalan TEST-ORD-.
{
"success": true,
"message": "Order created successfully (Sandbox Mode)",
"data": {
"order_id": "TEST-ORD-A7X9K2",
"status": "processing",
"payment_status": "paid",
"total_amount": 5000,
"current_balance": 250000,
"is_test": true
}
}
/transactions
50 pesanan terakhir beserta data akunnya. Selama akun masih disiapkan, details bernilai null.
curl -X POST https://juragan.digitals.id/api/v1/transactions \
-H "Content-Type: application/json" \
-d '{
"api_key": "YOUR_API_KEY"
}'
<?php
$payload = [
'api_key' => 'YOUR_API_KEY',
];
$ch = curl_init('https://juragan.digitals.id/api/v1/transactions');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_TIMEOUT => 30,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
const res = await fetch('https://juragan.digitals.id/api/v1/transactions', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"api_key": "YOUR_API_KEY"
}),
});
const result = await res.json();
{
"success": true,
"message": "Orders fetched successfully",
"data": [
{
"order_id": "ORD-20260123-B5F739",
"total_amount": 5000,
"status": "completed",
"payment_status": "paid",
"products": [
{
"product_name": "CapCut Pro",
"variant_name": "Pro",
"type": "Private",
"duration": "7 Hari",
"warranty": "7 Hari",
"price": 5000,
"quantity": 1
}
],
"account_details": [
{
"product": "CapCut Pro - Pro",
"details": [
{ "title": "Akun 1", "credentials": "email@contoh.com | password123" }
]
}
],
"created_at": "2026-01-23 09:30:19"
}
]
}
Isi tiap pesanan
| Field | Tipe | Keterangan |
|---|---|---|
| order_id | string | Nomor pesanan. |
| total_amount | number | Total yang dibayar. |
| status | string | Status pesanan, mis. "processing", "completed". |
| payment_status | string | "paid" atau "unpaid". |
| products | array | Varian yang dibeli: nama, tipe, durasi, garansi, harga, jumlah. |
| account_details | array | Data akun per produk. details berisi daftar akun (title + credentials), teks, atau null bila masih diproses. |
| created_at | string | Waktu pesanan dibuat (YYYY-MM-DD HH:MM:SS). |
order.completed
Isi Webhook URL di API Settings. Setiap kali pesanan yang kamu buat lewat API selesai, akunnya diganti, atau di-refund, kami mengirim POST berisi JSON ke alamat itu — jadi kamu tidak perlu terus-menerus memanggil /transactions.
{
"id": "0b6f6c1e-5a2d-4c7e-9d0a-3f1c2b4a5d6e",
"event": "order.completed",
"timestamp": "2026-01-26T14:05:11+07:00",
"data": {
"order_id": "ORD-20260126-X8Y9Z",
"status": "completed",
"payment_status": "paid",
"product_name": "Netflix Premium",
"variant_name": "Private 1 Bulan",
"quantity": 1,
"total_amount": 35000,
"accounts": [
{
"product": "Netflix Premium - Private 1 Bulan",
"details": "email@contoh.com | password123"
}
],
"delivery_terms": "Jangan ganti password."
}
}
Tanda tangan ada di header X-Digitals-Signature: HMAC-SHA256 (hex) dari isi mentah request, dengan API key terbaru kamu sebagai kuncinya. Selalu cocokkan sebelum memproses.
Integrasi lama yang membaca X-Premify-Signature atau X-Rebahan-Signature tetap berjalan — keduanya masih dikirim dengan nilai yang sama, tapi gunakan X-Digitals-Signature untuk integrasi baru.
Balas dengan cepat (batas 5 detik) dan kode 2xx. Kalau gagal, kami mengulang setelah 1 menit, 5 menit, 30 menit, lalu 2 jam (total 5 percobaan). Kabar yang sama bisa tiba lebih dari sekali — pakai id (juga di header X-Digitals-Delivery) supaya tidak diproses dua kali. /transactions tetap bisa dipakai sebagai cadangan.
Event yang dikirim
| Event | Kapan dikirim |
|---|---|
| order.completed | Akun sudah terisi dan pesanan selesai — baik diisi otomatis dari stok maupun oleh admin. data.accounts berisi data akunnya. |
| order.account_updated | Data akun pada pesanan yang sudah selesai diganti admin (mis. klaim garansi). data.accounts berisi akun terbaru. |
| order.refunded | Pesanan di-refund dan dananya kembali ke saldo kamu. Ada tambahan data.refunded (jumlah, Rupiah) dan data.note (catatan admin, bisa null). |
| order.processing | Pembayaran QRIS untuk pesanan yang kamu buat di website (bukan lewat API) diterima. Isinya ringkas: order_id, status, total_amount, product_name, note; tanpa id dan tanpa pengulangan. |
Contoh penerima (PHP)
<?php
// 1. Ambil tanda tangan dan isi mentah (JANGAN yang sudah di-decode)
$signature = $_SERVER['HTTP_X_DIGITALS_SIGNATURE'] ?? '';
$raw = file_get_contents('php://input');
// 2. Cocokkan tanda tangan — kuncinya API key terbaru kamu
$expected = hash_hmac('sha256', $raw, 'API_KEY_KAMU');
if (!hash_equals($expected, $signature)) {
http_response_code(401);
exit('Invalid signature');
}
// 3. Proses. Kabar yang sama bisa datang lebih dari sekali (kirim ulang):
// simpan $payload['id'] dan lewati yang sudah pernah diproses.
$payload = json_decode($raw, true);
$data = $payload['data'] ?? [];
$orderId = $data['order_id'] ?? '';
switch ($payload['event'] ?? '') {
case 'order.completed': // akun siap: teruskan $data['accounts'] ke pembelimu
case 'order.account_updated': // akun diganti: teruskan akun terbaru
$accounts = $data['accounts'];
break;
case 'order.refunded': // dana kembali ke saldomu: kembalikan uang pembelimu
$refunded = $data['refunded'];
break;
}
http_response_code(200);
echo json_encode(['status' => 'ok']);
Daftar sebagai member untuk mendapatkan API key.