SKIRK SHOP TOPUP GAME MURAH & CEPAT

Dokumentasi API Reseller

API ini dipakai buat integrasi otomatis dari bot/website kamu sendiri ke SKIRK SHOP -- cek harga, cek saldo, transaksi produk, sampai deposit saldo, semuanya bisa lewat kode tanpa buka browser.

Semua harga produk lewat API ini otomatis harga tier Platinum, berapa pun membership akun kamu sebenarnya. Flash sale tetap menang di atas harga Platinum kalau sedang aktif.

Masuk atau daftar akun dulu, lalu buka halaman Profil untuk generate API key.

Autentikasi

Semua request (kecuali GET /api/v1/) wajib menyertakan API key lewat header berikut:

X-API-Key: nxot_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Ada 2 API key yang TERPISAH (dibuat masing-masing di halaman Profil):

  • nxot_... -- API Key Transaksi: buat /pricelist, /product/:id, /saldo, /profile, dan semua /order/*.
  • nxod_... -- API Key Deposit: KHUSUS buat /deposit dan turunannya.

Key transaksi tidak bisa dipakai buat endpoint deposit, dan sebaliknya -- kalau salah pakai, dapat error 403. Ini sengaja dipisah supaya kebocoran 1 key gak otomatis buka akses ke yang lain.

Tiap key wajib didaftarkan ke 1 alamat IP (IPv4 atau IPv6) saat di-generate. Request yang datang dari IP selain yang terdaftar akan ditolak (403), walau key-nya valid -- update IP terdaftar kapan saja lewat halaman Profil kalau IP kamu berubah.

Base URL: https://www.skirkshop.com/api/v1. Jangan bagikan API key ke siapa pun. Kalau bocor, generate ulang lewat halaman Profil (key lama langsung tidak berlaku).

Rate Limit

Maksimal 60 request per menit untuk masing-masing API key (dihitung terpisah antara key transaksi & deposit). Tiap response menyertakan header berikut buat bantu kamu pantau sisa kuota:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 47

Lewat batas ini, request dibalas 429 Too Many Requests sampai jendela 1 menitnya reset. Kalau butuh limit lebih tinggi buat kebutuhan produksi, hubungi admin.

Format Response

Semua endpoint selalu balas JSON dengan bentuk yang konsisten:

// Berhasil
{ "success": true, "data": { ... }, "message": "..." }

// Gagal
{ "success": false, "message": "Penjelasan error di sini" }

Selalu cek field success dulu sebelum baca data. HTTP status code juga mengikuti (400 = input salah, 401/403 = auth bermasalah, 402 = saldo kurang, 404 = data tidak ditemukan, 500 = error di server).

GET /api/v1/profile

Info akun pemilik API key: username, email, saldo, dan membership asli (membership TIDAK memengaruhi harga di API ini, lihat catatan di atas).

curl https://www.skirkshop.com/api/v1/profile \
  -H "X-API-Key: API_KEY_KAMU"
{
  "success": true,
  "data": { "username": "budi", "email": "budi@mail.com", "saldo": 150000, "membership": "reguler" }
}
GET /api/v1/saldo

Cek saldo cepat -- sama seperti /profile tapi cuma balas angka saldo, cocok dipanggil sesering apapun sebelum transaksi.

curl https://www.skirkshop.com/api/v1/saldo \
  -H "X-API-Key: API_KEY_KAMU"
{ "success": true, "data": { "saldo": 150000 } }
GET /api/v1/pricelist

Daftar semua produk aktif beserta harga (tier Platinum), stok, batas qty, dan field target yang wajib diisi saat order. Ringkas -- tanpa deskripsi/thumbnail/cara pakai (pakai /product/:id kalau butuh itu).

curl https://www.skirkshop.com/api/v1/pricelist \
  -H "X-API-Key: API_KEY_KAMU"
{
  "success": true,
  "data": [
    {
      "product_id": "P123",
      "name": "Mobile Legends 86 Diamond",
      "category": "Top Up Game",
      "group": "mobile-legends",
      "provider": "topup",
      "price": 20500,
      "stock": null,
      "qty_min": 1,
      "qty_max": 10,
      "target_fields": [
        { "key": "user_id", "label": "User ID", "required": true },
        { "key": "zone_id", "label": "Zone ID", "required": true }
      ]
    }
  ]
}

stock: null berarti auto/tidak dibatasi stok fisik (Top Up/Jasa Sosmed), angka berarti sisa stok manual. provider nilainya "topup", "smm", atau "manual" -- sesuai endpoint order yang harus dipakai. qty_max: null berarti tidak ada batas atas selain saldo kamu.

GET /api/v1/product/:id

Detail lengkap 1 produk -- sama seperti di atas ditambah description, thumbnail, dan usage_instructions (cara pakai, khusus produk stok manual).

curl https://www.skirkshop.com/api/v1/product/P123 \
  -H "X-API-Key: API_KEY_KAMU"
POST /api/v1/order/topup · /order/smm · /order/manual

Bikin transaksi baru. Sengaja dipisah jadi 3 endpoint berbeda sesuai jenis produknya (Top Up Game/Pulsa, Jasa Sosmed, Stok Manual) -- bukan 1 endpoint gabungan -- karena bentuk target dan arti qty beda jauh antar jenis. Kirim product_id ke endpoint yang SALAH (mis. produk Top Up dikirim ke /order/smm) akan ditolak dengan error yang jelas. Saldo dipotong otomatis pakai harga tier Platinum.

FieldWajibKeterangan
product_idYaAmbil dari /pricelist atau /product/:id -- cek field provider-nya buat tahu harus pakai endpoint yang mana
qtyTidakDefault 1. Artinya beda-beda tergantung endpoint -- lihat 3 contoh di bawah
targetKondisionalObjek sesuai target_fields produk itu -- boleh dikosongkan/dihilangkan kalau produknya gak butuh data tujuan (lihat contoh Produk Manual)
ref_idSangat disarankanID request unik dari sisi kamu (lihat penjelasan idempotency di bawah)
POST /api/v1/order/topup Top Up Game / Pulsa

provider: "topup" di /pricelist. target isinya ID tujuan (User ID/Zone ID/No. HP, dst -- field persisnya beda tiap produk, cek target_fields). qty = jumlah TRANSAKSI (maksimal 10x per request), BUKAN jumlah diamond/pulsa.

curl -X POST https://www.skirkshop.com/api/v1/order/topup \
  -H "X-API-Key: API_KEY_KAMU" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": "P123",
    "qty": 1,
    "target": { "user_id": "12345", "zone_id": "6789" },
    "ref_id": "topup-ml-00042"
  }'
{
  "success": true,
  "message": "Order berhasil, produk sudah dikirim.",
  "data": [
    {
      "order_id": "ORD456",
      "product_id": "P123",
      "product_name": "Mobile Legends 86 Diamond",
      "qty": 1,
      "price": 20500,
      "total": 20500,
      "status": "completed",
      "detail": "Top up berhasil",
      "note": "Dibayar via API (saldo)",
      "target": "User ID: 12345 | Zone ID: 6789",
      "created_at": "2026-07-25T08:00:00.000Z",
      "updated_at": "2026-07-25T08:00:01.000Z"
    }
  ]
}

Kalau qty > 1, data isinya BEBERAPA order sekaligus (1 order per unit -- sistem Top Up gak punya konsep "quantity" per transaksi). status: completed = langsung sukses, processing = masih dicek ulang otomatis (poll /order/:id), cancelled = gagal & saldo sudah dikembalikan otomatis.

POST /api/v1/order/smm Jasa Sosmed (SMM)

provider: "smm" di /pricelist. target WAJIB isi link (URL postingan/profil/video tujuan). qty = jumlah ASLI yang dipesan (mis. 1000 followers/likes/views), BUKAN "berapa kali beli" -- harga dihitung dari rate per 1000 di /pricelist, batas minimal/maksimal juga beda tiap produk (lihat qty_min/qty_max).

curl -X POST https://www.skirkshop.com/api/v1/order/smm \
  -H "X-API-Key: API_KEY_KAMU" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": "S456",
    "qty": 1000,
    "target": { "link": "https://instagram.com/p/xxxxxxx" },
    "ref_id": "smm-ig-like-00099"
  }'
{
  "success": true,
  "message": "Order diterima, sedang diproses otomatis.",
  "data": [
    {
      "order_id": "ORD789",
      "product_id": "S456",
      "product_name": "Instagram Likes Real & Active",
      "qty": 1000,
      "price": 15,
      "total": 15000,
      "status": "processing",
      "detail": "",
      "note": "Sedang diproses sistem, tunggu beberapa saat",
      "target": "Link Target (postingan/profil/video): https://instagram.com/p/xxxxxxx",
      "created_at": "2026-07-25T08:00:00.000Z",
      "updated_at": "2026-07-25T08:00:00.000Z"
    }
  ]
}

Order Jasa Sosmed SELALU mulai dari processing (gak ada yang instan sukses/gagal kayak Top Up) -- berubah jadi completed belakangan setelah dicek ulang otomatis oleh sistem. data di sini selalu 1 order saja (beda dari Top Up Game yang bisa pecah jadi banyak order kalau qty > 1).

POST /api/v1/order/otp OTP: Nomor Virtual

provider: "otp" di /pricelist. Beda dari endpoint order lain -- gak ada qty/target, cukup product_id. Sewa 1 nomor per request.

curl -X POST https://www.skirkshop.com/api/v1/order/otp \
  -H "X-API-Key: API_KEY_KAMU" \
  -H "Content-Type: application/json" \
  -d '{ "product_id": "OTP123", "ref_id": "otp-wa-00042" }'
{
  "success": true,
  "message": "Nomor berhasil didapat, tunggu SMS masuk lalu poll GET /order/:id untuk kodenya.",
  "data": [
    {
      "order_id": "ORD654",
      "product_id": "OTP123",
      "product_name": "OTP WhatsApp - Indonesia",
      "price": 3500,
      "total": 3500,
      "status": "processing",
      "target": "",
      "created_at": "2026-07-26T09:00:00.000Z"
    }
  ]
}

Nomor virtualnya ada di field target pada respons di atas. Kode OTP-nya BELUM ada di respons awal ini -- poll GET /order/:id tiap beberapa detik sampai status berubah jadi completed (kode masuk di field detail) atau cancelled. Batalkan sewa (selama kode belum masuk) lewat POST /api/v1/order/otp/:id/cancel -- saldo dikembalikan penuh kalau berhasil dibatalkan.

POST /api/v1/order/manual Produk Manual (Stok)

provider: "manual" di /pricelist. Biasanya gak butuh target sama sekali (boleh dihilangkan dari body) -- kecuali admin sengaja pasang field tambahan khusus produk itu, cek target_fields. qty = jumlah item yang diambil dari stok.

curl -X POST https://www.skirkshop.com/api/v1/order/manual \
  -H "X-API-Key: API_KEY_KAMU" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": "M789",
    "qty": 2,
    "ref_id": "manual-akun-00007"
  }'
{
  "success": true,
  "message": "Order berhasil, produk sudah dikirim.",
  "data": [
    {
      "order_id": "ORD321",
      "product_id": "M789",
      "product_name": "Akun Netflix Private 1 Bulan",
      "qty": 2,
      "price": 15000,
      "total": 30000,
      "status": "completed",
      "detail": "1. user1@mail.com:pass123\n2. user2@mail.com:pass456",
      "note": "Dibayar via API (saldo)",
      "target": "",
      "created_at": "2026-07-25T08:00:00.000Z",
      "updated_at": "2026-07-25T08:00:00.000Z"
    }
  ]
}

Kalau stok manual lagi kurang/kosong, status balik processing dengan catatan menunggu admin kirim manual (saldo TETAP terpotong penuh, bukan dianggap gagal) -- detail baru keisi begitu admin selesai kirim, cek ulang lewat /order/:id.

GET /api/v1/order/:id

Cek status 1 order (pakai order_id dari response /order di atas).

curl https://www.skirkshop.com/api/v1/order/ORD456 \
  -H "X-API-Key: API_KEY_KAMU"
GET /api/v1/order?limit=20

Riwayat order milik akun kamu, terbaru duluan. limit opsional, maksimal 100 (default 20).

curl "https://www.skirkshop.com/api/v1/order?limit=10" \
  -H "X-API-Key: API_KEY_KAMU"
Kenapa ref_id penting

Kalau koneksi kamu ke server terputus tepat setelah request POST /order terkirim (jadi kamu gak sempat terima response-nya), padahal order-nya sebenarnya SUDAH diproses & saldo SUDAH terpotong di sisi kami -- lalu sistem kamu retry request yang sama karena mengira gagal, itu bisa bikin pesanan & potongan saldo DOBEL kalau tidak dicegah.

Kirim ref_id unik tiap transaksi (mis. ID order di sistem kamu sendiri). Kalau ada request kedua masuk dengan ref_id yang SAMA, kami tidak proses ulang -- cukup dibalikin hasil persis yang pertama, saldo tidak terpotong lagi.

POST /api/v1/deposit

Bikin transaksi QRIS baru buat isi saldo. Dibalikin QR code (base64 PNG) yang bisa langsung ditampilkan/di-scan dari e-wallet atau m-banking apa saja.

curl -X POST https://www.skirkshop.com/api/v1/deposit \
  -H "X-API-Key: API_KEY_KAMU" \
  -H "Content-Type: application/json" \
  -d '{ "amount": 50000 }'
{
  "success": true,
  "message": "Scan QR berikut untuk membayar...",
  "data": {
    "trxid": "DEP-789",
    "amount": 50000,
    "fee": 350,
    "kode_unik": 27,
    "total": 50377,
    "status": "pending",
    "created_at": "2026-07-25T08:00:00.000Z",
    "expired_at": "2026-07-25T08:10:00.000Z",
    "paid_at": null,
    "qr_image_base64": "data:image/png;base64,iVBORw0KG..."
  }
}

Bayar TEPAT sejumlah total (sudah termasuk biaya QRIS & kode unik pembeda transaksi). Saldo bertambah OTOMATIS begitu pembayaran terdeteksi -- tidak perlu konfirmasi manual, tinggal polling status lewat endpoint di bawah sampai status jadi "paid".

GET /api/v1/deposit/:trxid

Cek status 1 deposit. status: pending (menunggu bayar) → paid (saldo sudah masuk) / expired (lewat batas waktu, tidak dibayar) / cancelled.

curl https://www.skirkshop.com/api/v1/deposit/DEP-789 \
  -H "X-API-Key: API_KEY_KAMU"
GET /api/v1/deposit?limit=20

Riwayat deposit milik akun kamu, terbaru duluan.

curl "https://www.skirkshop.com/api/v1/deposit?limit=10" \
  -H "X-API-Key: API_KEY_KAMU"
Bagaimana cara mendapatkan API key?

Login ke akunmu, buka halaman Profil. Ada 2 card terpisah: "API Key Transaksi" dan "API Key Deposit" -- isi alamat IP kamu (IPv4 atau IPv6) di kolom yang tersedia, lalu klik generate. Key langsung aktif dan bisa dipakai saat itu juga.

Kenapa API key transaksi & deposit dipisah?

Supaya lebih aman. Kalau kamu integrasikan key transaksi ke sistem lain (mis. bot jualan), key itu TIDAK BISA dipakai buat bikin transaksi deposit walau bocor -- begitu juga sebaliknya. Tiap key cuma bisa melakukan apa yang scope-nya izinkan.

Kenapa saya harus daftarin alamat IP?

Sebagai lapisan keamanan tambahan -- request API cuma diterima dari IP yang sudah kamu daftarkan saat generate key. Kalau server/hosting kamu pindah IP, update lagi IP-nya di halaman Profil (tinggal generate ulang dan isi IP baru).

Saya kena error 429, itu kenapa?

Artinya kamu sudah melebihi 60 request/menit untuk API key itu. Tunggu sampai jendela 1 menitnya reset (cek header X-RateLimit-Remaining di response sebelumnya), atau kurangi frekuensi polling di sisi integrasimu.

Apakah harga di API sama dengan harga di website?

Tidak -- harga di API selalu tier Platinum (lebih murah), berapa pun membership akun kamu yang sebenarnya di website. Kalau ada Flash Sale aktif untuk produk itu, harga Flash Sale yang menang.

Kenapa order saya ditolak dengan pesan "produk ini bukan produk ..."?

Karena product_id yang kamu kirim jenisnya beda dari endpoint yang dipakai (mis. produk Jasa Sosmed dikirim ke /order/topup). Cek field provider produk itu lewat /pricelist (nilainya topup, smm, atau manual), lalu pakai endpoint order yang sesuai.

Request saya sempat timeout, apakah saldo saya double kepotong kalau saya ulangi?

Tidak, SELAMA kamu mengirim ref_id yang sama persis di request ulanganmu. Lihat penjelasan lengkap idempotency di bagian Transaksi/Order di atas.

Apa arti status processing, completed, dan cancelled?

completed = produk sudah terkirim tuntas. processing = masih dikerjakan sistem (poll /order/:id secara berkala sampai berubah). cancelled = gagal diproses, saldo yang terpotong untuk order itu otomatis dikembalikan penuh.

Apakah ada batas jumlah request (rate limit)?

Saat ini belum ada batas keras per menit/detik, tapi tetap pakai secara wajar. Untuk cek status berulang, lakukan polling dengan jeda beberapa detik (jangan looping tanpa jeda), dan selalu sertakan ref_id di setiap POST /order/* supaya aman kalau perlu di-retry.

Bagaimana cara isi saldo untuk dipakai bertransaksi lewat API?

Lewat POST /api/v1/deposit (dapat QR code buat di-scan dari e-wallet/m-banking manapun), atau isi manual lewat halaman Deposit / Top Up di website. Saldo sama-sama dipakai baik lewat website maupun API.

Apakah bisa test API tanpa memotong saldo beneran?

Belum ada mode sandbox/testing terpisah saat ini -- setiap POST /order/* yang berhasil akan memotong saldo asli. Pastikan dulu alur integrasimu benar lewat GET /pricelist dan GET /saldo (keduanya aman, tidak memotong apa pun) sebelum coba order sungguhan dengan nominal kecil.