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 API01 · Mulai berjualan
- Minta akun kepada pemilik Shiroshop. Akun dibuat oleh pemilik; belum ada pendaftaran mandiri. Kamu akan menerima username dan password portal.
- Tentukan cara berjualan. Pakai bot Telegram yang dikelola Shiroshop, atau hubungkan aplikasi sendiri melalui API.
- Tunggu produk dan akses diaktifkan. Pemilik mengatur produk yang boleh dijual beserta komisi atau harga reseller. Akun baru nonaktif secara default.
- Masuk ke portal. Periksa menu Produk, pastikan harga dan stok sesuai, lalu mulai menjual.
02 · Pilih model transaksi
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.
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
| Menu | Yang bisa kamu lakukan |
|---|---|
| Ringkasan | Lihat komisi tersedia, dana WD tertahan, deposit pembelian, dan aktivitas terbaru. |
| Produk | Lihat kategori yang diizinkan, harga, komisi per unit, stok, serta ID produk/kategori untuk integrasi. |
| Pesanan | Lihat status pesanan milik tokomu. Gunakan Muat ulang untuk memperbarui tampilan. |
| Saldo & WD | Ajukan penarikan komisi, pantau keputusan pemilik, dan lihat riwayat mutasi. |
| Panduan API | Baca 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
- Buat bot melalui BotFather, lalu berikan tokennya kepada pemilik Shiroshop melalui jalur privat. Token tidak diperlukan jika kamu memakai aplikasi sendiri dengan API key.
- Berikan ID Telegram pemilik reseller. Pemilik Shiroshop memasukkan token, identitas toko, ID pemilik, dan mengaktifkan bot melalui panelnya.
- Buka bot reseller dan tekan Start. Langkah ini juga diperlukan agar bot dapat mengirim notifikasi kepadamu.
- Pembeli memilih produk → kategori → jumlah → Bayar QRIS. Setelah pembayaran terverifikasi, bot mengirim file berisi produk.
- Pantau penjualan dan komisi dari bot atau portal.
| Perintah | Fungsi |
|---|---|
/start atau /produk | Buka katalog produk. |
/pesanan | Lihat hingga 10 pesanan terbaru pembeli dari daftar pesanan yang dimuat. |
/saldo | Saldo pembeli dan top up. Pemilik memakai /komisi untuk saldo komisi dan WD tertahan. |
/wd 50000|BCA 123456789 a.n. Nama | Pemilik 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
- Masuk ke Saldo & WD. Periksa komisi yang tersedia.
- Isi nominal Rupiah bulat serta bank/e-wallet, nomor rekening, dan nama pemilik rekening.
- Konfirmasi pengajuan. Dana langsung berpindah dari komisi tersedia ke WD tertahan.
- Tunggu pemilik memeriksa dan mentransfer dana. Persetujuan belum berarti dana sudah ditransfer.
| Status WD | Artinya |
|---|---|
| Diajukan | Pengajuan tercatat dan dana ditahan. |
| Disetujui | Pemilik menyetujui, pembayaran belum dicatat. |
| Dibayar | Pemilik telah mencatat transfer beserta referensinya. |
| Ditolak | Dana dikembalikan ke komisi tersedia. Baca catatan penolakannya. |
06 · Mulai integrasi API
Semua request client dikirim ke satu base URL:
https://shiroshopreseller.abyte.my.idMinta 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"}'_ . : -. 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 & path | Hasil / persyaratan |
|---|---|
GET /v1/products | Objek products berisi katalog yang diizinkan, harga, komisi dan stok. |
GET /v1/me | Objek reseller, orders, withdrawals, ledger milik akun. Saldo: commission (tersedia), held (WD), deposit (pembelian). |
POST /v1/orders | Body 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}/check | Verifikasi pembayaran untuk pesanan pending. Tidak menerima status lunas dari client. |
POST /v1/orders/{id}/delivery | Produk untuk pesanan API yang paid/delivered; tidak bisa mengambil pesanan reseller lain atau pesanan bot terkelola. |
POST /v1/session | Body login dan password. Menghasilkan cookie sesi HttpOnly dan CSRF token, dengan masa sesi 8 jam. Tanpa API key. |
DELETE /v1/session | Hapus sesi portal yang sedang dipakai. |
POST /v1/withdrawals | Hanya sesi portal dan CSRF token, bukan API key. Body amount (Rupiah bulat), destination (maksimal 200 karakter); Idempotency-Key wajib. |
GET /health | Pemeriksaan 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
| Status | Tindakan |
|---|---|
creating | Invoice sedang dibuat. Periksa kembali pesanan yang sama; jangan buat pengganti. Jika tidak berubah, hubungi pemilik. |
pending | Menunggu pembayaran. Tampilkan QRIS dan periksa status berkala. |
paid | Pembayaran/debit deposit terkonfirmasi. Aplikasi reseller dapat mengambil delivery; bot terkelola mengirim otomatis. |
delivered | Produk sudah diserahkan. Komisi, jika ada, sudah dikreditkan. |
expired | Gateway mengonfirmasi invoice berakhir; stok cadangan dilepas. Jangan membayar QRIS lama. |
cancelled | Pesanan ditutup setelah pemeriksaan admin. |
invoice_review | Hasil pembuatan invoice belum pasti. Hubungi pemilik dengan ID pesanan sebelum membuat pesanan pengganti. |
delivery_review | Hasil pengiriman bot perlu diperiksa admin. Jangan meminta pengiriman berulang tanpa pemeriksaan. |
Format error
{ "error": "Stok tidak cukup" }| HTTP | Arti & tindakan |
|---|---|
| 400 | Input tidak valid. Periksa tipe angka, qty, ID, dan field wajib. |
| 401 | Key/sesi tidak valid, kedaluwarsa, dicabut, atau akun nonaktif. Login lagi atau hubungi pemilik. |
| 403 | Akses tidak diizinkan. Misalnya mencoba WD memakai API key. |
| 404 | Endpoint, produk, atau pesanan tidak tersedia untuk akunmu. |
| 409 | Konflik stok/saldo/status, penyimpanan sibuk, atau key idempotensi dipakai dengan body berbeda. Baca pesan error; jangan mengganti referensi secara sembarang. |
| 429 | Batas request atau invoice aktif tercapai. Tunggu dan kurangi frekuensi. |
| 502 / 503 | Verifikasi 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
- Siapkan channel Telegram milik toko reseller.
- Jadikan bot reseller admin dengan izin Posting Pesan. Akun Telegram pemilik reseller juga harus menjadi pemilik atau admin channel.
- Buka portal → Channel notifikasi, atau panel Shiroshop → Reseller → Kelola.
- 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.