SHIROSHOP · PARTNER GUIDE

Dokumentasi

Masuk portal →
PANDUAN RESELLER & API V1

Dari toko pertama sampai integrasi API.

Pelajari cara menjual produk, menerima komisi, menarik saldo, atau menghubungkan bot dan website milikmu sendiri.

Saya memakai bot reseller Saya ingin integrasi API

01 · Mulai berjualan

  1. Minta akun kepada pemilik Shiroshop. Akun dibuat oleh pemilik; belum ada pendaftaran mandiri. Kamu akan menerima username dan password portal.
  2. Tentukan cara berjualan. Pakai bot Telegram yang dikelola Shiroshop, atau hubungkan aplikasi sendiri melalui API.
  3. Tunggu produk dan akses diaktifkan. Pemilik mengatur produk yang boleh dijual beserta komisi atau harga reseller. Akun baru nonaktif secara default.
  4. Masuk ke portal. Periksa menu Produk, pastikan harga dan stok sesuai, lalu mulai menjual.
Panduan ini dapat dibaca tanpa login. Data toko, saldo, dan pesanan hanya tersedia setelah autentikasi.

02 · Pilih model transaksi

KOMISI

Pembayaran diproses pusat

Pembeli membayar QRIS dari Shiroshop. Setelah pembayaran terverifikasi dan produk diserahkan, komisi masuk ke saldo reseller.

Contoh: harga Rp20.000 dan komisi Rp3.000 per unit → 2 unit berhasil menghasilkan komisi Rp6.000. Biaya gateway, jika ada, ditampilkan dalam total pembayaran.

DEPOSIT

Pembayaran dikelola reseller

Kamu menerima pembayaran pembeli sendiri. Deposit di Shiroshop dipotong saat membeli produk melalui API. Keuntungan berasal dari selisih harga jualmu dengan harga reseller.

Contoh: harga reseller Rp17.000, kamu menjual Rp20.000 → selisih Rp3.000 berada di sistemmu sendiri, bukan saldo komisi Shiroshop.

Model ditentukan pemilik saat akun dibuat dan tidak dapat diganti dari portal. Komisi berupa nominal Rupiah per unit/kategori, bukan persentase. Harga dan komisi pesanan yang sudah dibuat tetap mengikuti nilai saat pesanan tersebut dibuat.

03 · Menggunakan portal

MenuYang bisa kamu lakukan
RingkasanLihat komisi tersedia, dana WD tertahan, deposit pembelian, dan aktivitas terbaru.
ProdukLihat kategori yang diizinkan, harga, komisi per unit, stok, serta ID produk/kategori untuk integrasi.
PesananLihat status pesanan milik tokomu. Gunakan Muat ulang untuk memperbarui tampilan.
Saldo & WDAjukan penarikan komisi, pantau keputusan pemilik, dan lihat riwayat mutasi.
Panduan APIBaca ringkasan integrasi dan buka dokumentasi lengkap ini.

Portal menampilkan hingga 200 pesanan/WD dan 500 mutasi terbaru. Portal bukan halaman checkout pembeli; pembelian dilakukan melalui bot atau aplikasi yang terintegrasi.

Sesi login berlaku sampai 8 jam. Jika lupa password, hubungi pemilik untuk reset. Reset password membatalkan sesi lama. Tombol Keluar mengakhiri sesi yang sedang dipakai.

04 · Memakai bot Telegram reseller

  1. Buat bot melalui BotFather, lalu berikan tokennya kepada pemilik Shiroshop melalui jalur privat. Token tidak diperlukan jika kamu memakai aplikasi sendiri dengan API key.
  2. Berikan ID Telegram pemilik reseller. Pemilik Shiroshop memasukkan token, identitas toko, ID pemilik, dan mengaktifkan bot melalui panelnya.
  3. Buka bot reseller dan tekan Start. Langkah ini juga diperlukan agar bot dapat mengirim notifikasi kepadamu.
  4. Pembeli memilih produk → kategori → jumlah → Bayar QRIS. Setelah pembayaran terverifikasi, bot mengirim file berisi produk.
  5. Pantau penjualan dan komisi dari bot atau portal.
PerintahFungsi
/start atau /produkBuka katalog produk.
/pesananLihat hingga 10 pesanan terbaru pembeli dari daftar pesanan yang dimuat.
/saldoSaldo pembeli dan top up. Pemilik memakai /komisi untuk saldo komisi dan WD tertahan.
/wd 50000|BCA 123456789 a.n. NamaPemilik reseller: ajukan WD. Ganti nominal dan rekening dengan data yang benar.

Bot reseller mendukung QRIS, Binance, saldo IDR/USDT dan pilihan bahasa. Lihat panduan menu pembeli di bawah.

05 · Menarik saldo komisi

  1. Masuk ke Saldo & WD. Periksa komisi yang tersedia.
  2. Isi nominal Rupiah bulat serta bank/e-wallet, nomor rekening, dan nama pemilik rekening.
  3. Konfirmasi pengajuan. Dana langsung berpindah dari komisi tersedia ke WD tertahan.
  4. Tunggu pemilik memeriksa dan mentransfer dana. Persetujuan belum berarti dana sudah ditransfer.
Status WDArtinya
DiajukanPengajuan tercatat dan dana ditahan.
DisetujuiPemilik menyetujui, pembayaran belum dicatat.
DibayarPemilik telah mencatat transfer beserta referensinya.
DitolakDana dikembalikan ke komisi tersedia. Baca catatan penolakannya.
WD berlaku untuk saldo komisi, bukan saldo deposit pembelian. API key tidak dapat mengajukan WD; gunakan login portal atau perintah pemilik pada bot reseller.

06 · Mulai integrasi API

Semua request client dikirim ke satu base URL:

https://shiroshopreseller.abyte.my.id

Minta API key kepada pemilik setelah akun dan produkmu diaktifkan. Key hanya ditampilkan sekali saat dibuat. Key lama langsung tidak berlaku ketika dirotasi atau dicabut.

Gunakan header Authorization: Bearer API_KEY dan Content-Type: application/json. Simpan key di backend bot/website kamu, bukan di JavaScript browser pembeli.

Request pertama: lihat katalog

Contoh Bash/cURL berikut memakai placeholder. Ganti API key dengan milikmu; jangan kirim key melalui chat publik.

BASE='https://shiroshopreseller.abyte.my.id'
API_KEY='GANTI_DENGAN_API_KEY'

curl --fail-with-body "$BASE/v1/products"   -H "Authorization: Bearer $API_KEY"

Contoh response katalog (data ilustrasi):

{
  "products": [{
    "productId": "produk-contoh",
    "categoryId": "paket-contoh",
    "product": "Produk Contoh",
    "category": "Paket 30 Hari",
    "description": "Petunjuk produk",
    "price": 20000,
    "commission": 3000,
    "stock": 12
  }]
}

price adalah harga per unit untuk akunmu. Pada model deposit, nilai ini merupakan harga reseller dan commission bernilai 0. Stok dapat berubah sebelum pesanan dibuat; respons pembuatan pesanan adalah hasil akhirnya.

07 · Alur pesanan API

1. Buat pesanan dengan referensi unik

Ambil ID dari katalog, bukan dari contoh di bawah. Gunakan qty angka bulat 1–20 dan buyerId identitas pembeli di sistemmu. Harga dan komisi dihitung server.

curl --fail-with-body "$BASE/v1/orders"   -H "Authorization: Bearer $API_KEY"   -H 'Content-Type: application/json'   -H 'Idempotency-Key: toko-pesanan-000001'   --data '{"productId":"ID_DARI_KATALOG","categoryId":"ID_DARI_KATALOG","qty":1,"buyerId":"pelanggan-123"}'
Penting: satu pesanan bisnis = satu Idempotency-Key. Jika request timeout, ulangi body dan key yang sama. Jangan membuat key baru sebelum hasil pesanan pertama diketahui. Key harus 8–100 karakter huruf, angka, _ . : -. Key yang sama dengan body berbeda menghasilkan 409.

Contoh respons model komisi; ID, waktu, dan gambar hanya ilustrasi:

{
  "id": "O_ID_PESANAN",
  "resellerId": "R_ID_RESELLER",
  "reference": "toko-pesanan-000001",
  "buyerId": "pelanggan-123",
  "productId": "produk-contoh",
  "categoryId": "paket-contoh",
  "product": "Produk Contoh",
  "category": "Paket 30 Hari",
  "qty": 1,
  "unitPrice": 20000,
  "amount": 20000,
  "totalAmount": 20100,
  "commission": 3000,
  "mode": "commission",
  "status": "pending",
  "createdAt": 1793600000000,
  "expireAt": 1793603600000,
  "qrImage": "data:image/png;base64,DATA_GAMBAR_DARI_SERVER"
}

Pada model komisi, tampilkan qrImage sebagai gambar, nominal totalAmount, dan batas waktu expireAt. Timestamp menggunakan milidetik Unix. Jangan membuat URL pembayaran sendiri. Pada model deposit, saldo langsung dipotong dan pesanan menjadi paid; tidak ada QRIS.

2. Periksa status pembayaran

# Lihat status yang sudah tersimpan
curl --fail-with-body "$BASE/v1/orders/O_ID_PESANAN"   -H "Authorization: Bearer $API_KEY"

# Minta server memverifikasi pembayaran ke gateway
curl --fail-with-body -X POST "$BASE/v1/orders/O_ID_PESANAN/check"   -H "Authorization: Bearer $API_KEY"   -H 'Content-Type: application/json' --data '{}'

Periksa dengan jeda sekitar 10–15 detik dan berhenti ketika status sudah terminal. GET membaca status tersimpan; POST .../check memverifikasi ke gateway. Jangan menganggap pesanan lunas dari screenshot pembeli atau hanya karena waktu tunggu habis.

3. Ambil produk setelah paid

curl --fail-with-body -X POST "$BASE/v1/orders/O_ID_PESANAN/delivery"   -H "Authorization: Bearer $API_KEY"   -H 'Content-Type: application/json' --data '{}'

Respons berisi order (status delivered) dan array accounts. Contoh struktur kredensial adalah data fiktif:

{
  "order": { "id": "O_ID_PESANAN", "status": "delivered" },
  "accounts": [{
    "username": "CONTOH_USER",
    "password": "CONTOH_PASSWORD",
    "email": "contoh@example.test",
    "deskripsi": "Petunjuk pemakaian"
  }]
}

Objek order sebenarnya juga memuat metadata pesanan. Pemanggilan delivery pertama menyelesaikan serah-terima produk ke aplikasi reseller dan mengkreditkan komisi sekali. Retry menghasilkan produk yang sama; stok dan komisi tidak bertambah lagi. Aplikasi reseller bertanggung jawab meneruskan produk ke pembelinya. Endpoint ini tidak digunakan untuk pesanan bot terkelola, karena bot mengirim file sendiri.

Contoh Node.js di backend reseller

const base = 'https://shiroshopreseller.abyte.my.id';
const key = process.env.SHIRO_RESELLER_API_KEY;

async function shiro(path, options = {}) {
  const response = await fetch(base + path, {
    ...options,
    headers: {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${key}`,
      ...options.headers
    }
  });
  const data = await response.json();
  if (!response.ok) throw new Error(`${response.status}: ${data.error}`);
  return data;
}

// Simpan reference secara permanen di database tokomu.
// Gunakan reference yang sama apabila request ini perlu diulang.
const order = await shiro('/v1/orders', {
  method: 'POST',
  headers: { 'Idempotency-Key': 'toko-pesanan-000001' },
  body: JSON.stringify({
    productId: 'ID_DARI_KATALOG',
    categoryId: 'ID_DARI_KATALOG',
    qty: 1,
    buyerId: 'pelanggan-123'
  })
});
// Simpan order.id. Tampilkan QRIS jika order.status === 'pending'.
// Periksa pembayaran lalu ambil delivery hanya setelah paid.

Contoh ini tidak otomatis mengulang request atau mengirim produk ke pembeli. Tambahkan penyimpanan referensi, penanganan timeout, dan pengiriman sesuai sistem tokomu. Jangan mencatat API key atau isi accounts ke log umum.

08 · Referensi endpoint

Seluruh path di bawah relatif ke base URL domain reseller. Bearer API key diperlukan kecuali endpoint sesi. Sesi portal juga bisa membaca data akun yang sama.

Metode & pathHasil / persyaratan
GET /v1/productsObjek products berisi katalog yang diizinkan, harga, komisi dan stok.
GET /v1/meObjek reseller, orders, withdrawals, ledger milik akun. Saldo: commission (tersedia), held (WD), deposit (pembelian).
POST /v1/ordersBody productId, categoryId, qty, buyerId. Header Idempotency-Key wajib. Maksimal 20 invoice aktif per reseller.
GET /v1/orders/{id}Metadata/status pesanan milik akun; tidak mengandung kredensial produk.
POST /v1/orders/{id}/checkVerifikasi pembayaran untuk pesanan pending. Tidak menerima status lunas dari client.
POST /v1/orders/{id}/deliveryProduk untuk pesanan API yang paid/delivered; tidak bisa mengambil pesanan reseller lain atau pesanan bot terkelola.
POST /v1/sessionBody login dan password. Menghasilkan cookie sesi HttpOnly dan CSRF token, dengan masa sesi 8 jam. Tanpa API key.
DELETE /v1/sessionHapus sesi portal yang sedang dipakai.
POST /v1/withdrawalsHanya sesi portal dan CSRF token, bukan API key. Body amount (Rupiah bulat), destination (maksimal 200 karakter); Idempotency-Key wajib.
GET /healthPemeriksaan ketersediaan API, tanpa login. Respons ok:true bukan bukti bahwa suatu pembayaran sudah berhasil.

Tidak tersedia webhook pesanan reseller pada versi ini. Gunakan polling status. Batas umum API adalah 120 request per menit per IP; login maksimal 8 percobaan per 15 menit per IP. Beberapa client pada IP yang sama dapat berbagi batas tersebut. Perhatikan header rate limit dan kurangi frekuensi saat menerima 429.

09 · Status pesanan & error

StatusTindakan
creatingInvoice sedang dibuat. Periksa kembali pesanan yang sama; jangan buat pengganti. Jika tidak berubah, hubungi pemilik.
pendingMenunggu pembayaran. Tampilkan QRIS dan periksa status berkala.
paidPembayaran/debit deposit terkonfirmasi. Aplikasi reseller dapat mengambil delivery; bot terkelola mengirim otomatis.
deliveredProduk sudah diserahkan. Komisi, jika ada, sudah dikreditkan.
expiredGateway mengonfirmasi invoice berakhir; stok cadangan dilepas. Jangan membayar QRIS lama.
cancelledPesanan ditutup setelah pemeriksaan admin.
invoice_reviewHasil pembuatan invoice belum pasti. Hubungi pemilik dengan ID pesanan sebelum membuat pesanan pengganti.
delivery_reviewHasil pengiriman bot perlu diperiksa admin. Jangan meminta pengiriman berulang tanpa pemeriksaan.

Format error

{ "error": "Stok tidak cukup" }
HTTPArti & tindakan
400Input tidak valid. Periksa tipe angka, qty, ID, dan field wajib.
401Key/sesi tidak valid, kedaluwarsa, dicabut, atau akun nonaktif. Login lagi atau hubungi pemilik.
403Akses tidak diizinkan. Misalnya mencoba WD memakai API key.
404Endpoint, produk, atau pesanan tidak tersedia untuk akunmu.
409Konflik stok/saldo/status, penyimpanan sibuk, atau key idempotensi dipakai dengan body berbeda. Baca pesan error; jangan mengganti referensi secara sembarang.
429Batas request atau invoice aktif tercapai. Tunggu dan kurangi frekuensi.
502 / 503Verifikasi atau layanan sementara belum tersedia. Cek pesanan yang sama sebelum mencoba ulang.

10 · Pertanyaan umum

Produk tidak muncul di portal atau bot?

Pemilik harus mengaktifkan akun dan mengizinkan kategori produk terlebih dahulu. Hubungi pemilik jika katalog kosong.

Sudah bayar tetapi produk belum masuk?

Gunakan Cek pembayaran atau periksa status API. Jika status perlu review, kirim ID pesanan dan bukti pembayaran ke pemilik melalui jalur privat. Jangan membuat pembayaran kedua.

Kenapa komisi belum bertambah saat pembayaran paid?

Komisi dikreditkan setelah produk berhasil dikirim bot atau diserahkan melalui endpoint delivery, bukan hanya setelah pembayaran terkonfirmasi.

Kenapa saldo tersedia berkurang setelah mengajukan WD?

Dana dipindahkan ke saldo tertahan agar tidak ditarik dua kali. Jika pengajuan ditolak, dana kembali ke komisi tersedia.

Bisa mengatur harga atau komisi sendiri?

Harga komisi dan harga reseller di pusat ditetapkan pemilik. Pada model deposit, harga yang kamu kenakan kepada pembeli dikelola di aplikasimu sendiri.

API key hilang atau bocor?

Minta pemilik mencabut atau mengganti key. Key baru hanya ditampilkan sekali. Jangan menggunakan key reseller di frontend publik.

Bot reseller tidak merespons?

Pastikan bot dan akun sudah diaktifkan pemilik, token benar, dan kamu sudah menekan Start. Bot terkelola memakai chat pribadi. Hubungi pemilik untuk memeriksa koneksi bot.

Data apa yang perlu disertakan saat meminta bantuan?

Sertakan ID pesanan, waktu kejadian, kode HTTP atau status, dan referensi transaksi dari sistemmu. Jangan menyertakan API key, password portal, token bot, atau seluruh data produk di chat publik.

Password portal

Admin Shiroshop dapat mengisi password pilihan sendiri saat menambah reseller atau melalui Reseller > Kelola > Ganti password portal. Gunakan 8-128 karakter tanpa spasi di awal atau akhir. Jika kolom dikosongkan, sistem membuat password otomatis. Penggantian password mengakhiri sesi portal lama.

11 · Channel notifikasi reseller

  1. Siapkan channel Telegram milik toko reseller.
  2. Jadikan bot reseller admin dengan izin Posting Pesan. Akun Telegram pemilik reseller juga harus menjadi pemilik atau admin channel.
  3. Buka portal → Channel notifikasi, atau panel Shiroshop → Reseller → Kelola.
  4. Isi @username channel publik atau ID channel privat berawalan -100, aktifkan notifikasi, lalu pilih Periksa & simpan channel.

Fitur memerlukan akun model komisi, token bot, dan ID Telegram pemilik reseller yang sudah diatur admin Shiroshop. Pemeriksaan tidak mengirim pesan percobaan.

Transaksi yang selesai setelah fitur diaktifkan akan menghasilkan rekap dengan nama toko, pembeli tersamarkan, produk, jumlah, total pembayaran, invoice, sisa stok, dan waktu WIB. Komisi, WD, password, serta data akun produk tidak ditampilkan di channel. Transaksi lama tidak dikirim ulang. Status pengiriman tersedia di pengaturan channel.

Menu pembeli: pembayaran, saldo, dan bahasa

Bot reseller menampilkan deskripsi kategori dari Shiroshop, berikut pilihan pembayaran QRIS, saldo IDR, saldo USDT, Binance Pay, dan USDT BEP20 sesuai konfigurasi pusat. Harga USDT mengikuti aturan harga dan kurs Shiroshop. Stok dan harga diperiksa kembali ketika pesanan dibuat.

Gunakan /saldo atau tombol Saldo & Top up untuk melihat saldo pembeli. Saldo IDR dan USDT terpisah per toko reseller, tidak tergabung dengan saldo Shiroshop utama, toko reseller lain, atau komisi reseller. Top up IDR memakai QRIS; top up USDT memakai metode Binance yang aktif. Biaya QRIS tidak masuk saldo; transfer USDT yang cocok, termasuk kode unik, dikreditkan.

Untuk pembayaran Binance, kirim jumlah persis termasuk kode unik, ke UID/alamat dan jaringan yang ditampilkan. Konfirmasi hanya berasal dari riwayat Binance. Pembayaran setelah pesanan kedaluwarsa masuk saldo toko, bukan memesan ulang produk. Jangan mengirim bukti transfer sebagai pengganti verifikasi.

Pilih Bahasa / Language atau kirim /lang untuk mengganti Indonesia/English. Pilihan disimpan per pembeli dan per toko. Deskripsi Inggris memakai terjemahan Shiroshop yang tersedia; jika belum tersedia, teks asli tetap ditampilkan. Pemilik reseller memakai /komisi untuk saldo komisi dan /wd untuk pengajuan penarikan.

Menu menampilkan status memuat dan indikator mengetik. Pemeriksaan klik berjalan terpisah dari pemeriksaan pembayaran, dengan jeda 0,5 detik antarpengecekan; waktu respons tetap bergantung pada Telegram dan jaringan.

Menu bot, pembatalan, dan broadcast

Tombol menu di Telegram memuat perintah /start, /menu, /produk, /pesanan, /saldo dan /lang. Nama produk ditampilkan lengkap di atas tombol bernomor. Tombol Hubungi owner mengikuti username yang diisi di pengaturan reseller.

Pembatalan pembayaran

Pilih Batalkan pembayaran di invoice. Untuk QRIS, permintaan dicatat tetapi kode QR masih dapat dibayar sampai gateway memastikan kedaluwarsa; jangan membayar kode lama. Jika pembayaran sudah masuk, pesanan tetap diproses. Untuk Binance/USDT, invoice dapat ditutup sebelum pembayaran terdeteksi. Dana yang masuk setelah pembatalan dikreditkan ke saldo USDT toko. Pembayaran menggunakan saldo diproses langsung dan tidak memiliki invoice menunggu.

Broadcast oleh pemilik

Pemilik yang ID Telegram-nya terdaftar dapat memilih tombol Broadcast atau mengetik /broadcast, lalu mengirim teks atau foto. Untuk promosi produk, pilih Broadcast produk, pilih produk yang diizinkan, lalu kirim teks atau foto dengan keterangan. Dari portal web reseller, buka menu Broadcast produk, pilih produk, isi teks promosi, lihat pratinjau, lalu konfirmasi pengiriman. Status menampilkan jumlah diproses, terkirim, dan gagal. Foto dapat dikirim lewat bot. Pesan menampilkan harga dan stok serta tombol Beli sekarang. Harga dan stok diperiksa kembali saat pembeli membuka produk. Bot menampilkan pratinjau dan baru mengirim setelah pemilik menekan konfirmasi. Penerima adalah pengguna bot reseller tersebut yang sudah pernah berinteraksi; pengguna dapat berhenti melalui /stopbroadcast. Pemilik mendapat ringkasan terkirim dan gagal. Produk, saldo dan notifikasi transaksi tetap terpisah dari broadcast.