← API Center
ZYREX SHOP
Dokumentasi integrasi · API v1

Mulai terhubung.
Kembangkan layananmu.

Panduan OTP nomor SERVER 1–5 dan SMM, dari request pertama sampai penanganan transaksi.

Langkah pertama

Uji koneksi tanpa membeli

  1. Login sebagai Member, buka API Reseller Center, lalu buat API Key. Simpan key lengkap ketika pertama ditampilkan.
  2. Siapkan saldo akun. Pembelian mengikuti syarat akun dan saldo; beberapa alur mensyaratkan deposit sukses minimal Rp2.000.
  3. Simpan base URL dan key di environment backend. Gunakan HTTPS pada website produksi.
  4. Kirim GET /balance. Setelah berhasil, lanjutkan katalog. Cek saldo tidak membuat order atau memotong saldo.
Terminal · konfigurasi backend
export ZYREX_API_URL='https://zyrexotp.com/api/v1'
export ZYREX_API_KEY='API_KEY_KAMU'

curl --request GET "$ZYREX_API_URL/balance" \
  --header "Authorization: Bearer $ZYREX_API_KEY" \
  --header 'Accept: application/json'

Ganti API_KEY_KAMU secara lokal. Jangan mengirim key ke halaman dokumentasi, menaruhnya di frontend, atau membagikan file environment.

Alternatif autentikasi dan format request

Header X-API-Key: API_KEY_KAMU dapat menggantikan Authorization. Cukup gunakan salah satu. Pembelian menerima body objek JSON dengan Content-Type: application/json. Kirim Idempotency-Key untuk pembelian OTP/SMM. Jangan mengirim user_id: semua data mengikuti akun pemilik key.

Harga promo OTP

Tampilkan produk yang sedang diskon

Offer OTP menyediakan discounted, original_price, discount_amount, promotion_title, dan promotion_expires_at (Unix timestamp). Jika discounted=true, tampilkan label Diskon, coret original_price, dan gunakan price sebagai harga akhir yang dibayar. Diskon sudah termasuk dalam price; jangan memotongnya lagi. Jika beberapa promo berlaku, hanya harga terbaik yang dipakai.

Untuk SERVER 1/3, kirim expected_price dengan nilai price dari offer untuk menolak perubahan harga/promo sebelum membeli (HTTP 409, price_changed). quoted_price tetap disalin apa adanya untuk validasi terpisah. SERVER 2/4/5 mengikat harga melalui quote_id; jika harga naik setelah promo berakhir, ambil quote baru. Pengembalian saldo mengikuti harga yang benar-benar dibayar.

Pilih, tinjau, pesan

Alur OTP untuk setiap server

SERVER 1

Layanan → negara → offer

Pilih service_id, kemudian negara dengan provider abstrak provider_1, provider_2, atau provider_3. Ambil number_id/provider_id, country_code dan quoted_price dari offer.

SERVER 2, 4, 5

Negara → layanan → quote

Pilih country_id, ambil layanan pada negara itu, lalu offer. Kirim quote_id yang terpilih. Quote berlaku 90 detik dan hanya untuk akun, server, layanan dan negara yang sama.

SERVER 3

Layanan → negara → produk

Pilih service_id dan country_id, lalu product_id dari offer. Salin quoted_price dari offer bila dikirim. ID layanan/negara SERVER 3 berupa angka dalam format string.

ID antarserver bisa berbeda. Jangan menyalin ID negara, layanan atau quote dari server lain. Tidak semua server memiliki layanan dan stok yang sama.
  1. Tampilkan harga jual price dari offer kepada pelanggan. Harga memakai rupiah; quoted_price SERVER 1/3 adalah nilai validasi terpisah, jangan dihitung ulang.
  2. Simpan satu Idempotency-Key unik 16–128 karakter dan payload order di database sistem kamu sebelum mengirim POST. UUID adalah pilihan yang sesuai.
  3. Kirim order satu kali, simpan order_id, nomor, harga dan status. Cek status berdasarkan order_id milik akun yang sama.
  4. Poll setiap 5–10 detik dengan batas waktu. Hentikan ketika kode diterima atau status terminal. Hindari polling seluruh pesanan sekaligus.
Referensi kontrak

Endpoint dan parameter

Path berikut relatif terhadap base URL. Semua endpoint memerlukan key; halaman dokumentasi dan file contoh dapat dibuka tanpa key.

GET/balance

Cek saldo

GET/services

Daftar layanan

ParameterLokasiKeterangan
serverqueryPilihan 1–5; tanpa server memberi ringkasan semua server.
country_idqueryOpsional untuk harga/stok layanan SERVER 2, 4, 5.
GET/countries

Daftar negara

ParameterLokasiKeterangan
serverqueryPilihan 1–5; default 1.
service_idqueryWajib khusus SERVER 1; dari katalog layanan.
providerquerySERVER 1: provider_1 (default), provider_2 atau provider_3.
GET/offers

Harga dan pilihan nomor

ParameterLokasiKeterangan
serverqueryPilihan 1–5; default 1.
service_id · wajibqueryID layanan dari server yang dipilih.
country_idqueryWajib salah satu country_id/country_code. SERVER 2–5 memakai country_id.
country_codequeryWajib bila country_id tidak dikirim. SERVER 1 memakai country_code dari katalog.
providerquerySERVER 1: pilihan abstrak provider_1/2/3.
POST/order

Beli OTP

ParameterLokasiKeterangan
Idempotency-KeyheaderWajib 16–128 karakter; alternatif field idempotency_key di JSON. Simpan dan pakai ulang untuk retry order yang sama.

Lihat tabel body per server di bawah. Idempotency-Key wajib melalui header, atau field idempotency_key di body.

GET/order/{order_id}

Status dan kode OTP

ParameterLokasiKeterangan
order_id · wajibpathID order milik akun pemilik key.
POST/order/{order_id}/cancel

Batalkan OTP

ParameterLokasiKeterangan
order_id · wajibpathID order milik akun pemilik key.

Tidak memerlukan body JSON atau Idempotency-Key. Batas pembatalan minimal 3 menit sejak order dibuat. Kode yang sudah diterima tidak dapat dibatalkan untuk refund.

GET/smm/services

Katalog SMM

POST/smm/order

Beli SMM

ParameterLokasiKeterangan
Idempotency-KeyheaderWajib 16–128 karakter; alternatif field idempotency_key di JSON. Simpan dan pakai ulang untuk retry order yang sama.

Body: service_id, target, quantity; untuk layanan komentar custom gunakan comments. Lihat bagian SMM.

GET/smm/order/{order_id}

Status SMM

ParameterLokasiKeterangan
order_id · wajibpathID order milik akun pemilik key.

Body POST /order

FieldBerlakuIsi
serverSemua · wajibAngka 1 sampai 5.
service_idSemua · wajibID layanan dari server yang dipilih.
country_id / country_codeSemua · wajibSERVER 1 memakai country_code; SERVER 2–5 memakai country_id.
providerSERVER 1 · wajib pada alur offerprovider_1, provider_2 atau provider_3 dari pilihan katalog.
number_id / provider_idSERVER 1 · wajibID offer, bukan nomor telepon.
product_idSERVER 3 · wajib pada alur produkID produk dari offer.
quoted_priceSERVER 1/3 · disarankanSalin nilai quoted_price dari offer untuk memeriksa perubahan harga.
quote_idSERVER 2/4/5 · wajibID quote dari offer terbaru, berlaku 90 detik.
idempotency_keySemua · alternatif header16–128 karakter. Utamakan header Idempotency-Key.
service_name, country_nameOpsionalLabel tampilan; bukan penentu harga. Harga selalu divalidasi backend.
Format response katalog

GET /services tanpa server memakai servers[].services. SERVER 1/3 individual juga memakai servers[].services. SERVER 2/4/5 menyediakan data, services dan servers[].services. Countries SERVER 1 memakai countries; SERVER 3 memakai data; SERVER 2/4/5 menyediakan data dan countries. Offers memakai offers; SERVER 2/4/5 juga menyediakan data dan quote_expires_in.

Alias /server2/offers tetap tersedia dan kini mengembalikan quote_id. Pilih satu format response sesuai endpoint; jangan menganggap seluruh endpoint memiliki struktur data yang sama.

Contoh yang bisa disalin

Request builder

Pilih server dan bahasa. Ini hanya membuat contoh kode; tidak mengirim request atau melakukan pembelian.

Isi ID sesuai hasil katalog dan simpan Idempotency-Key sebelum membeli.

Contoh pembelian · ID masih placeholder
Pilih server dan bahasa untuk memuat contoh. File client juga tersedia di bagian Unduhan.

Contoh Python/PHP/Node.js memakai file client yang dapat diunduh. Semua contoh membaca key dari environment, tidak melakukan retry pembelian secara otomatis, dan membiarkan aplikasi kamu memeriksa http_status serta body.

Menjalankan client dari terminal
Cek saldo · pilih client yang dipakai
# Python: pasang dependency terlebih dahulu
python -m pip install requests
python zyrex_client.py GET /balance

# Node.js 18+ (tanpa npm dependency)
node zyrex_client.mjs GET /balance

# PHP 8+ dengan ekstensi cURL
php zyrex_client.php GET /balance

# Pembelian eksplisit: isi request.json dari katalog dan gunakan key tersimpan
python zyrex_client.py POST /order request.json ID_KEY_YANG_DISIMPAN
node zyrex_client.mjs POST /order request.json ID_KEY_YANG_DISIMPAN
php zyrex_client.php POST /order request.json ID_KEY_YANG_DISIMPAN
Simpan hasil, lalu pantau

Respons pembelian dan status

Contoh ilustrasi · bukan transaksi nyata
{
  "success": true,
  "order_id": "ORDER_ID",
  "server": 2,
  "phone": "6281234567890",
  "status": "waiting",
  "price": 2500,
  "balance": 17500
}

Field service dapat muncul pada SERVER 1/3. Status/replay juga dapat menyertakan otp dan received. Field server dapat berupa angka atau string angka pada endpoint lama. Normalisasikan dengan String(server) pada sistem kamu.

GET /order/ORDER_ID
{
  "success": true,
  "order_id": "ORDER_ID",
  "server": 2,
  "status": "received",
  "phone": "6281234567890",
  "otp": "123456",
  "received": true,
  "balance": 17500
}
StatusTindakan integrasi
waiting / pending / processing / in_progress / awaiting_otpMasih aktif. Poll perlahan; jangan membuat pesanan pengganti untuk request yang belum pasti.
received / success / completedTampilkan otp bila ada, simpan hasil, hentikan polling.
cancelled / expired / failedHentikan polling. Jangan menganggap refund sudah masuk hanya dari label; cek hasil pembatalan, saldo dan riwayat.

Jika HTTP 202 tidak memiliki order_id, simpan Idempotency-Key atau reservation_ref yang tersedia. Jangan memanggil /order/null. Ulangi request asli memakai key dan payload yang sama, atau hubungi Admin bila tetap belum pasti.

Layanan sosial media

Integrasi SMM

  1. GET /smm/services memberi id, nama, kategori, min, max, price_per_1000 dan requires_comments.
  2. Gunakan service_id dari katalog. Pastikan target memenuhi ketentuan layanan dan quantity berada dalam min–max.
  3. POST /smm/order dengan Idempotency-Key yang disimpan. Harga dihitung server; jangan mengirim harga sendiri sebagai sumber tagihan.
  4. Simpan order_id yang dikembalikan, lalu GET /smm/order/ORDER_ID. Status SMM dapat berupa Pending, Processing, In progress, Partial, Completed atau Canceled.
Body SMM biasa
{
  "service_id": "SERVICE_ID",
  "target": "TARGET_YANG_VALID",
  "quantity": 1000
}

Jika requires_comments=true, sertakan comments dengan satu komentar per baris, contoh "comments": "Komentar pertama\nKomentar kedua". Jumlah tagihan mengikuti jumlah baris. Harga katalog adalah per 1.000, total mengikuti markup/pembulatan backend. Untuk SMM, respons 202 dapat menyertakan pending=true, reservation_ref dan error.code=order_pending. Simpan semuanya sampai hasil jelas.

Diagnosis lebih cepat

Error dan tindakan berikutnya

31 kode referensi

Kode / HTTPMakna dan solusi
missing_api_keyHTTP 401Header autentikasi belum dikirim.

Kirim Authorization: Bearer KEY atau X-API-Key.

invalid_api_keyHTTP 401Key salah, dicabut, atau diganti.

Periksa key aktif di API Reseller Center.

forbiddenHTTP 403Akun tidak diizinkan memakai API.

Role Staff tidak memiliki akses reseller; hubungi Admin bila perlu.

rate_limitedHTTP 429Batas request tercapai.

Tunggu sesuai detik dalam message, lalu ulang. Jangan polling rapat.

invalid_serverHTTP 400Server di luar 1–5.

Isi server dengan angka 1 sampai 5.

missing_parameterHTTP 400Parameter wajib belum lengkap.

Ikuti tabel parameter per server dan gunakan ID dari katalog.

invalid_parameterHTTP 400Format negara, layanan, atau harga salah.

Salin ID/quoted_price dari response katalog tanpa mengubah format.

invalid_providerHTTP 400Pilihan abstrak SERVER 1 tidak valid.

Gunakan provider_1, provider_2, atau provider_3.

missing_idempotency_keyHTTP 400Key permintaan OTP belum valid.

Simpan satu key unik 16–128 karakter untuk satu order beserta retry.

invalid_idempotency_keyHTTP 400Key permintaan SMM belum valid.

Kirim Idempotency-Key 16–128 karakter.

idempotency_conflictHTTP 409Key sama dipakai dengan payload berbeda.

Untuk retry pertahankan payload asli. Key baru hanya untuk pesanan baru.

duplicate_requestHTTP 409Token pernah dipakai; dapat muncul pada permintaan lama sebelum pembaruan.

Jangan langsung mengulang pembelian dengan key baru; periksa order atau hubungi Admin.

service_not_foundHTTP 404Layanan tidak ditemukan.

Ambil katalog layanan terbaru.

not_foundHTTP 404Pesanan OTP tidak ditemukan pada akun pemilik key.

Periksa order_id dan akun pemilik key.

order_not_foundHTTP 404Pesanan SMM tidak ditemukan pada akun ini.

Gunakan order_id SMM, bukan ID lokal atau ID OTP.

user_not_foundHTTP 404Akun pemilik key tidak ditemukan.

Hubungi Admin.

number_unavailableHTTP 400Offer sudah habis atau tidak tersedia.

Ambil pilihan nomor terbaru, kemudian pilih offer lain.

price_mismatchHTTP 409Harga berubah saat validasi.

Ambil offer/quote baru dan tinjau harga sebelum membuat order baru.

pricing_lockedHTTP 503Pemesanan SERVER 3 sedang dibatasi.

Tunggu atau pilih server lain.

server_unavailableHTTP 503Katalog atau server sementara tidak tersedia.

Ulangi katalog nanti atau pilih server lain.

provider_unavailableHTTP 503Katalog sementara belum dapat dimuat.

Ulangi permintaan baca setelah jeda.

provider_errorHTTP 503Server tidak dapat memproses permintaan.

Untuk GET dapat dicoba lagi. Untuk POST pastikan hasil lama dulu; gunakan key yang sama.

order_rejectedHTTP 409Order ditolak, quote kedaluwarsa, saldo kurang, atau syarat akun belum terpenuhi.

Baca message. Periksa saldo/quote dan hasil order; jangan berasumsi setiap 409 berarti saldo sudah kembali.

invalid_orderHTTP 400Parameter order SMM belum valid.

Periksa target, service_id, quantity dan comments.

order_pendingHTTP 202Pembelian SMM masih diperiksa.

Simpan reservation_ref; pantau order_id bila tersedia. Jangan buat pembelian pengganti.

cancel_waitHTTP 409Belum melewati batas pembatalan 3 menit.

Tunggu dan cek status lagi sebelum membatalkan.

otp_receivedHTTP 409Kode sudah diterima.

Pesanan tidak dapat dibatalkan untuk refund.

insufficient_balanceHTTP 402Saldo reseller tidak cukup.

Tambah saldo lalu tinjau ulang order.

provider_uncertainHTTP 503Hasil pembelian belum pasti.

Jangan ulang dengan key berbeda; simpan request dan hubungi Admin.

provider_missing_order_idHTTP 502Server belum mengembalikan ID order; saldo bisa tertahan.

Jangan melakukan pembelian pengganti. Minta pemeriksaan Admin.

local_persistence_errorHTTP 500Hasil pembelian belum berhasil dicatat lokal.

Saldo dapat ditahan untuk rekonsiliasi. Simpan key permintaan dan hubungi Admin.

Sebagian alur mengirim message langsung, sebagian error.code/error.message. Selalu baca status HTTP, success, status, pending dan pesan. Jangan hanya memeriksa apakah HTTP 200.

{"success": false, "error": {"code": "invalid_api_key", "message": "API key tidak valid atau nonaktif."}}
Transaksi yang dapat ditelusuri

Retry, batas request, dan refund

HTTPArti
200Hasil baca atau pengulangan order yang sudah tersimpan.
201Order baru diterima. Simpan order_id.
202Hasil masih diperiksa. Bukan konfirmasi gagal atau refund.
400 / 401 / 402 / 403 / 404 / 409Periksa kode dan pesan sebelum mengubah request.
429Tunggu sesuai waktu pada message. Jangan terus mengulang request.
500 / 502 / 503 atau timeoutRequest baca dapat diulang setelah jeda. Untuk pembelian, hasil bisa belum pasti; pertahankan Idempotency-Key dan payload.
  • Batas per key: 20 request pembelian per menit (OTP dan SMM berbagi bucket), serta 180 request lainnya per menit. Pembatalan memakai bucket request lainnya. Waktu tunggu rate limit disampaikan dalam message.
  • Satu pesanan = satu Idempotency-Key, juga saat timeout atau koneksi terputus. Key berbeda menandakan pembelian berbeda dan bisa menagih lagi.
  • Pengulangan yang telah tersimpan memberi order yang sama tanpa membeli lagi. Payload berbeda dengan key sama ditolak. Permintaan lama sebelum dukungan receipt dapat menghasilkan duplicate_request; hubungi Admin untuk pemeriksaan.
  • Pembatalan OTP tersedia setelah minimal 3 menit. Bila kode sudah masuk atau pembatalan belum dikonfirmasi, refund tidak langsung diberikan.
  • Refund hanya mengikuti pembatalan/penolakan yang terkonfirmasi dan ledger transaksi. Tidak ada jaminan refund hanya karena waktu polling berakhir.
  • Waktu tunggu OTP aktif pada alur saat ini sekitar 5 menit, lalu sistem memeriksa pembatalan; hasil akhirnya tetap mengikuti konfirmasi server. Jangan membuat timer lokal yang mengkredit saldo pelanggan tanpa memeriksa hasil ZYREX.
Key yang terungkap: buka API Center, nonaktifkan atau buat key pengganti, lalu perbarui environment integrasi. Membuat key pengganti mencabut key aktif sebelumnya.
Siap dipakai di backend

Paket integrasi reseller

Cara memakai koleksi Postman
  1. Impor postman_collection.json lewat Import.
  2. Isi base_url sampai /api/v1 dan api_key pada variabel lokal. Jangan membagikan collection/environment yang sudah berisi key.
  3. Kirim Cek saldo. Pilih server dan isi service_id/country_id dari katalog.
  4. Untuk SERVER 1 isi country_code/provider/number_id/quoted_price; SERVER 3 product_id/quoted_price; SERVER 2/4/5 quote_id.
  5. Isi idempotency_key satu kali per order. Variabel ini sengaja kosong saat diimpor supaya pembelian tidak langsung terkirim.
  6. Setelah membeli, salin order_id ke variabel order_id untuk cek status atau pembatalan. Import tidak menjalankan pembelian otomatis.
Pertanyaan umum

Sebelum menghubungi Admin

API key aktif tetapi server tidak tersedia?

Status key hanya menunjukkan autentikasi. Server juga harus aktif, kredensial toko terkonfigurasi, dan stok tersedia. Coba katalog server lain atau hubungi Admin.

Quote sudah tidak berlaku?

SERVER 2/4/5 membutuhkan quote_id baru setelah 90 detik. Ambil offer lagi dan tinjau harganya. Jika pembelian sebelumnya sudah dikirim, pastikan hasilnya dahulu sebelum membuat order baru.

Mendapat HTML, bukan JSON?

Periksa base URL hingga /api/v1, metode HTTP, halaman error hosting, dan status HTTP. Jangan menampilkan API key atau seluruh header ke log publik. Contoh client tidak menganggap HTML sebagai keberhasilan.

Mendapat 202 tanpa nomor?

Pesanan belum pasti. Simpan request, Idempotency-Key/reservation_ref, dan waktu kejadian. Jangan membuat pembelian pengganti. Ulangi request asli dengan key yang sama atau minta pemeriksaan Admin.

Bisakah memakai key dari JavaScript website pelanggan?

Simpan key hanya di backend kamu. Frontend pelanggan memanggil backend kamu, lalu backend menghubungi ZYREX. Penggunaan langsung di frontend akan membocorkan key.

Ada webhook, OTP email, atau tombol OTP ulang melalui API?

Kontrak reseller publik saat ini mencakup OTP nomor dan SMM. Status dipantau melalui polling. Webhook reseller, OTP email, minta OTP ulang dan refill SMM belum tersedia di endpoint publik ini.

Apa yang dikirim saat meminta bantuan?

Sertakan ID user, endpoint, server, waktu kejadian, status HTTP, error.code/message, order_id atau reservation_ref. Jangan sertakan API key. Idempotency-Key boleh diberikan melalui percakapan bantuan pribadi bila diminta untuk penelusuran.

Hubungi Admin via WhatsApp ↗