DOKUMENTASI INTEGRASI

SABA STORE API H2H

API VERSION

V1.0.0

Dokumentasi API Cek Saldo

Endpoint

POST https://api.sabastore.top/v1/saldo

Content-Type: application/json

Deskripsi

API Cek Saldo digunakan untuk melihat saldo akun reseller yang terdaftar pada sistem.

API ini dapat digunakan untuk memastikan ketersediaan saldo sebelum melakukan transaksi.

Autentikasi

Setiap request wajib menyertakan:

  • member_code
  • sign

Signature dibuat menggunakan algoritma SHA256:

SHA256(member_code + api_key)

Contoh:

member_code = MEMBER001
api_key = abc123xyz
sign = SHA256(MEMBER001abc123xyz)

Request Parameter

ParameterTipeWajibKeterangan
member_codestringYaKode member API
signstringYaSignature SHA256

Contoh Request

{ "member_code": "MEMBER001", "sign": "e3b0c44298fc1c149afbf4c8996fb924..." }

Response Sukses

HTTP Status: 200 OK

Body Response:

{ "status_code": 200, "status": "success", "message": "Cek saldo berhasil", "data": { "member_code": "MEMBER001", "username": "reseller01", "saldo": 1500000, "timestamp": "2026-06-09 18:30:00" } }

Keterangan Response

FieldKeterangan
member_codeKode member akun
usernameUsername akun
saldoSaldo saat ini
timestampWaktu saat pengecekan saldo dilakukan

Response Error

Parameter Tidak Lengkap

{ "status_code": 400, "status": "error", "message": "Parameter yang diperlukan tidak lengkap: member_code", "data": null }

Format JSON Tidak Valid

{ "status_code": 400, "status": "error", "message": "Format JSON tidak valid", "data": null }

Member Code Tidak Ditemukan

{ "status_code": 401, "status": "error", "message": "Member code tidak ditemukan", "data": null }

Signature Tidak Valid

{ "status_code": 401, "status": "error", "message": "Signature (sign) tidak valid", "data": null }

Akun Tidak Aktif

{ "status_code": 403, "status": "error", "message": "Akun anda sedang ditangguhkan atau tidak aktif", "data": null }

IP Tidak Diizinkan

{ "status_code": 403, "status": "error", "message": "IP Tidak Diizinkan", "data": null }

Metode Request Tidak Diizinkan

{ "status_code": 405, "status": "error", "message": "Metode request tidak diizinkan", "data": null }

Gangguan Sistem

{ "status_code": 500, "status": "error", "message": "Terjadi kesalahan pada sistem internal.", "data": null }

Contoh cURL

curl --location 'https://api.sabastore.top/cek-saldo' \ --header 'Content-Type: application/json' \ --data '{ "member_code":"MEMBER001", "sign":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }'

Catatan

  • API hanya menerima metode POST.
  • Request wajib menggunakan format application/json.
  • Pastikan signature dibuat sesuai format yang telah ditentukan.
  • Saldo yang ditampilkan merupakan saldo terkini pada saat request diproses.
  • Jika menggunakan whitelist IP, pastikan request dikirim dari IP yang telah terdaftar.
  • Simpan API Key dengan aman dan jangan dibagikan kepada pihak lain.

Dokumentasi API Pricelist

Endpoint

POST https://api.sabastore.top/v1/pricelist

Content-Type: application/json

Deskripsi

API Pricelist digunakan untuk mengambil daftar produk yang tersedia beserta harga terbaru.

API ini mendukung filter berdasarkan:

  • Kategori
  • Brand
  • Kode Produk

Jika tidak menggunakan filter, sistem akan mengementerian seluruh daftar produk aktif.

Autentikasi

Setiap request wajib menyertakan:

  • member_code
  • sign

Signature dibuat menggunakan algoritma SHA256:

SHA256(member_code + api_key)

Contoh:

member_code = MEMBER001
api_key = abc123xyz
sign = SHA256(MEMBER001abc123xyz)

Request Parameter

ParameterTipeWajibKeterangan
member_codestringYaKode member API
signstringYaSignature SHA256
kategoristringTidakFilter berdasarkan nama kategori
brandstringTidakFilter berdasarkan nama brand
kode_produkstringTidakFilter berdasarkan kode produk

Contoh Request

Ambil Semua Produk

{ "member_code": "MEMBER001", "sign": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }

Filter Berdasarkan Kategori

{ "member_code": "MEMBER001", "sign": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "kategori": "Game" }

Filter Berdasarkan Brand

{ "member_code": "MEMBER001", "sign": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "brand": "Mobile Legends" }

Filter Berdasarkan Kode Produk

{ "member_code": "MEMBER001", "sign": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "kode_produk": "ML86" }

Response Sukses

HTTP Status: 200 OK

Body Response:

{ "status_code": 200, "status": "success", "message": "Berhasil mengambil data pricelist", "data": [ { "nama_kategori": "Game", "nama_brand": "Mobile Legends", "nama_produk": "Mobile Legends 86 Diamonds", "kode_produk": "ML86", "harga": 20000, "deskripsi": "86 Diamonds Mobile Legends", "status": "aktif" }, { "nama_kategori": "Game", "nama_brand": "Mobile Legends", "nama_produk": "Mobile Legends 172 Diamonds", "kode_produk": "ML172", "harga": 39000, "deskripsi": "172 Diamonds Mobile Legends", "status": "aktif" } ] }

Keterangan Response

FieldKeterangan
nama_kategoriNama kategori produk
nama_brandNama brand produk
nama_produkNama produk
kode_produkKode produk
hargaHarga produk
deskripsiDeskripsi produk
statusStatus produk

Response Produk Tidak Ditemukan

Jika filter yang digunakan tidak menemukan produk yang sesuai.

{ "status_code": 200, "status": "success", "message": "Tidak ada produk yang ditemukan untuk kriteria ini", "data": [] }

Response Error

Parameter Tidak Lengkap

{ "status_code": 400, "status": "error", "message": "Parameter yang diperlukan tidak lengkap: member_code", "data": null }

Format JSON Tidak Valid

{ "status_code": 400, "status": "error", "message": "Format JSON tidak valid", "data": null }

Member Code Tidak Ditemukan

{ "status_code": 401, "status": "error", "message": "Member code tidak ditemukan", "data": null }

Signature Tidak Valid

{ "status_code": 401, "status": "error", "message": "Signature tidak valid", "data": null }

Akun Tidak Aktif

{ "status_code": 403, "status": "error", "message": "Akun anda tidak aktif", "data": null }

IP Tidak Diizinkan

{ "status_code": 403, "status": "error", "message": "IP tidak diizinkan", "data": null }

Metode Request Tidak Diizinkan

{ "status_code": 405, "status": "error", "message": "Metode request tidak diizinkan", "data": null }

Gangguan Sistem

{ "status_code": 500, "status": "error", "message": "Terjadi kesalahan sistem internal.", "data": null }

Contoh cURL

Ambil Seluruh Pricelist

curl --location 'https://api.sabastore.top/pricelist' \ --header 'Content-Type: application/json' \ --data '{ "member_code":"MEMBER001", "sign":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }'

Ambil Produk Berdasarkan Brand

curl --location 'https://api.sabastore.top/pricelist' \ --header 'Content-Type: application/json' \ --data '{ "member_code":"MEMBER001", "sign":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "brand":"Mobile Legends" }'

Catatan

  • API hanya menerima metode POST.
  • Request wajib menggunakan format application/json.
  • Signature wajib dibuat sesuai format yang ditentukan.
  • Hanya produk aktif yang akan ditampilkan.
  • Filter dapat digunakan secara terpisah maupun dikombinasikan.
  • Harga yang ditampilkan merupakan harga yang berlaku saat request diproses.
  • Disarankan melakukan sinkronisasi pricelist secara berkala untuk mendapatkan data produk terbaru.

Dokumentasi API Transaksi

Endpoint

POST https://api.sabastore.top/v1/transaksi

Content-Type: application/json

Deskripsi

API Transaksi digunakan untuk melakukan pembelian produk digital menggunakan saldo akun reseller.

Setiap transaksi harus memiliki ref_id yang unik agar tidak terjadi duplikasi transaksi.

Autentikasi

Setiap request wajib menyertakan:

  • member_code
  • sign

Signature dibuat menggunakan algoritma SHA256:

SHA256(member_code + api_key + ref_id)

Contoh:

member_code = MEMBER001
api_key = abc123xyz
ref_id = INV12345
sign = SHA256(MEMBER001abc123xyzINV12345)

Request Parameter

ParameterTipeWajibKeterangan
member_codestringYaKode member API
product_codestringYaKode produk yang akan dibeli
customer_nostringYaTujuan transaksi
ref_idstringYaID referensi unik dari sistem client
signstringYaSignature SHA256

Contoh Request

{ "member_code": "MEMBER001", "product_code": "ML86", "customer_no": "123456789", "ref_id": "INV12345", "sign": "e3b0c44298fc1c149afbf4c8996fb924..." }

Response Sukses

HTTP Status: 200 OK

Body Response:

{ "status_code": 200, "status": "success", "message": "Transaksi diproses.", "data": { "trx_id": "TRX-20260609A1B2C3D4E5", "ref_id": "INV12345", "customer_no": "123456789", "product_code": "ML86", "product_name": "Mobile Legends 86 Diamonds", "category": "Game", "brand": "Mobile Legends", "price": 20000, "last_saldo": 500000, "status": "pending", "message": "transaksi berhasil diterima dan sedang diproses" } }

Response Error

Parameter Tidak Lengkap

{ "status_code": 400, "status": "error", "message": "Parameter yang diperlukan tidak lengkap atau kosong: product_code", "data": null }

Format JSON Tidak Valid

{ "status_code": 400, "status": "error", "message": "Format JSON tidak valid", "data": null }

Member Code Tidak Ditemukan

{ "status_code": 401, "status": "error", "message": "Member code tidak ditemukan", "data": null }

Signature Tidak Valid

{ "status_code": 401, "status": "error", "message": "sign tidak valid", "data": null }

IP Tidak Diizinkan

{ "status_code": 403, "status": "error", "message": "IP Tidak Diizinkan", "data": null }

Produk Tidak Ditemukan

{ "status_code": 404, "status": "error", "message": "Produk tidak ditemukan atau tidak aktif", "data": null }

Saldo Tidak Mencukupi

{ "status_code": 400, "status": "error", "message": "Saldo tidak mencukupi untuk melakukan transaksi", "data": null }

Ref ID Sudah Digunakan

{ "status_code": 400, "status": "error", "message": "Ref ID sudah digunakan", "data": null }

Gagal Diproses

{ "status_code": 400, "status": "error", "message": "Gagal memproses transaksi", "data": null }

Gangguan Sistem

{ "status_code": 500, "status": "error", "message": "Terjadi kesalahan pada sistem internal.", "data": null }

Dokumentasi Transaksi Bebas Nominal

Khusus untuk produk dengan jenis Bebas Nominal (contoh: produk Topup di mana jumlah bayar ditentukan oleh client), request wajib menyertakan parameter tambahan nominal.

Request Parameter Tambahan
ParameterTipeWajibKeterangan
nominalintegerYaJumlah nominal transaksi yang diinginkan (angka valid)
Contoh Request (Bebas Nominal)
{ "member_code": "MEM12345", "product_code": "TOPUP01", "customer_no": "081234567890", "ref_id": "INV-10002", "nominal": 50000, "sign": "hasil_sha256_signature" }
Response Sukses (Bebas Nominal)

HTTP Status: 200 OK

{ "status_code": 200, "status": "success", "message": "Transaksi diproses.", "data": { "trx_id": "TRX-20260624Z9X8Y7W6V5", "ref_id": "INV-10002", "customer_no": "081234567890", "product_code": "TOPUP01", "product_name": "Topup Pulsa", "category": "PPOB", "brand": "TELKOMSEL", "price": 50000, "nominal": 50000, "last_saldo": 200000, "status": "sukses", "message": "transaksi berhasil" } }
Response Error (Bebas Nominal)

Parameter Nominal Tidak Valid / Kosong

{ "status_code": 400, "status": "error", "message": "Parameter 'nominal' wajib diisi dengan angka valid untuk produk bebas nominal", "data": null }

Catatan

  • Gunakan ref_id yang berbeda untuk setiap transaksi.
  • Simpan trx_id yang diterima pada response untuk kebutuhan tracking transaksi.
  • Status awal transaksi yang berhasil diterima adalah pending.
  • Pastikan signature dibuat sesuai format yang ditentukan.
  • Semua request wajib menggunakan metode POST.
  • Request harus dikirim dalam format application/json.

Contoh cURL

curl --location 'https://api.sabastore.top/transaksi' \ --header 'Content-Type: application/json' \ --data '{ "member_code":"MEMBER001", "product_code":"ML86", "customer_no":"123456789", "ref_id":"INV12345", "sign":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }'

Dokumentasi Webhook Transaksi

Deskripsi

Webhook adalah fitur notifikasi otomatis yang akan dikirimkan ke URL webhook anda ketika terjadi perubahan status transaksi.

Dengan webhook, anda tidak perlu melakukan pengecekan status transaksi secara berulang karena sistem akan mengirimkan update secara otomatis.

Metode Pengiriman

Method: POST

Content-Type: application/json

Header Request

Setiap webhook akan menyertakan header berikut:

Content-Type: application/json
X-SABA-Authorization: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Verifikasi Signature

Untuk memastikan data webhook benar-benar berasal dari sistem, lakukan verifikasi terhadap header: X-SABA-Authorization

Format signature:

SHA256(member_code + api_key + ref_id)

Jika hasil perhitungan signature sama dengan nilai yang diterima pada header "X-SABA-Authorization", maka webhook dapat dianggap valid.

Status Webhook

Webhook akan dikirim ketika transaksi mendapatkan hasil akhir:

StatusKeterangan
SuksesTransaksi berhasil diproses
GagalTransaksi gagal diproses

Payload Webhook Sukses

{ "trx_id": "TRX-20260609ABC123", "ref_id": "INV12345", "status": "Sukses", "SN": "1234567890", "message": "Transaksi Berhasil", "customer_no": "081234567890", "product_code": "PLN20", "price": 20000 }

Payload Webhook Gagal

{ "trx_id": "TRX-20260609ABC123", "ref_id": "INV12345", "status": "Gagal", "SN": "", "message": "Transaksi Gagal", "customer_no": "081234567890", "product_code": "PLN20", "price": 20000, "refund": 20000 }

Keterangan Field

FieldKeterangan
trx_idID transaksi
ref_idReferensi transaksi dari sistem pengguna
statusStatus akhir transaksi
SNSerial Number / Token / Data hasil transaksi (jika tersedia)
messageInformasi hasil transaksi
customer_noTujuan transaksi
product_codeKode produk
priceNominal transaksi
refundNominal pengembalian saldo jika transaksi gagal

Contoh Penerimaan Webhook PHP

<?php $headers = getallheaders(); $signature = $headers['X-SABA-Authorization'] ?? ''; $body = file_get_contents('php://input'); $data = json_decode($body, true); // Lakukan validasi signature sesuai akun Anda if (!$data) { http_response_code(400); exit; } $trx_id = $data['trx_id']; $status = $data['status']; if ($status === 'Sukses') { // Update transaksi berhasil } elseif ($status === 'Gagal') { // Update transaksi gagal } http_response_code(200); echo "OK";

Contoh Penerimaan Webhook NodeJS

app.post('/webhook', (req, res) => { const signature = req.headers['x-saba-authorization']; const data = req.body; console.log(data); res.status(200).send('OK'); });

Response yang Disarankan

Server penerima webhook disarankan mengembalikan response:

200 OK

Contoh:

OK

Best Practice

  1. Simpan URL webhook yang dapat diakses publik.
  2. Selalu lakukan verifikasi signature.
  3. Jangan memproses webhook yang gagal diverifikasi.
  4. Simpan data webhook untuk kebutuhan audit dan troubleshooting.
  5. Gunakan "ref_id" sebagai referensi utama untuk mencocokkan transaksi.
  6. Pastikan endpoint webhook dapat menerima request POST dengan format JSON.
  7. Hindari memproses transaksi yang sama lebih dari satu kali (idempotent processing).

Ringkasan Alur

  1. Pengguna membuat transaksi.
  2. Transaksi diproses oleh sistem.
  3. Status transaksi berubah menjadi Sukses atau Gagal.
  4. Sistem mengirimkan webhook ke URL yang telah didaftarkan.
  5. Server pengguna menerima dan memverifikasi webhook.
  6. Server pengguna memperbarui status transaksi berdasarkan data yang diterima.