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.

Panduan OTP nomor SERVER 1–5 dan SMM, dari request pertama sampai penanganan transaksi.
GET /balance. Setelah berhasil, lanjutkan katalog. Cek saldo tidak membuat order atau memotong saldo.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.
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.
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 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.
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.
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.
price dari offer kepada pelanggan. Harga memakai rupiah; quoted_price SERVER 1/3 adalah nilai validasi terpisah, jangan dihitung ulang.Path berikut relatif terhadap base URL. Semua endpoint memerlukan key; halaman dokumentasi dan file contoh dapat dibuka tanpa key.
/balance/services| Parameter | Lokasi | Keterangan |
|---|---|---|
server | query | Pilihan 1–5; tanpa server memberi ringkasan semua server. |
country_id | query | Opsional untuk harga/stok layanan SERVER 2, 4, 5. |
/countries| Parameter | Lokasi | Keterangan |
|---|---|---|
server | query | Pilihan 1–5; default 1. |
service_id | query | Wajib khusus SERVER 1; dari katalog layanan. |
provider | query | SERVER 1: provider_1 (default), provider_2 atau provider_3. |
/offers| Parameter | Lokasi | Keterangan |
|---|---|---|
server | query | Pilihan 1–5; default 1. |
service_id · wajib | query | ID layanan dari server yang dipilih. |
country_id | query | Wajib salah satu country_id/country_code. SERVER 2–5 memakai country_id. |
country_code | query | Wajib bila country_id tidak dikirim. SERVER 1 memakai country_code dari katalog. |
provider | query | SERVER 1: pilihan abstrak provider_1/2/3. |
/order| Parameter | Lokasi | Keterangan |
|---|---|---|
Idempotency-Key | header | Wajib 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.
/order/{order_id}| Parameter | Lokasi | Keterangan |
|---|---|---|
order_id · wajib | path | ID order milik akun pemilik key. |
/order/{order_id}/cancel| Parameter | Lokasi | Keterangan |
|---|---|---|
order_id · wajib | path | ID 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.
/smm/services/smm/order| Parameter | Lokasi | Keterangan |
|---|---|---|
Idempotency-Key | header | Wajib 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.
/smm/order/{order_id}| Parameter | Lokasi | Keterangan |
|---|---|---|
order_id · wajib | path | ID order milik akun pemilik key. |
| Field | Berlaku | Isi |
|---|---|---|
| server | Semua · wajib | Angka 1 sampai 5. |
| service_id | Semua · wajib | ID layanan dari server yang dipilih. |
| country_id / country_code | Semua · wajib | SERVER 1 memakai country_code; SERVER 2–5 memakai country_id. |
| provider | SERVER 1 · wajib pada alur offer | provider_1, provider_2 atau provider_3 dari pilihan katalog. |
| number_id / provider_id | SERVER 1 · wajib | ID offer, bukan nomor telepon. |
| product_id | SERVER 3 · wajib pada alur produk | ID produk dari offer. |
| quoted_price | SERVER 1/3 · disarankan | Salin nilai quoted_price dari offer untuk memeriksa perubahan harga. |
| quote_id | SERVER 2/4/5 · wajib | ID quote dari offer terbaru, berlaku 90 detik. |
| idempotency_key | Semua · alternatif header | 16–128 karakter. Utamakan header Idempotency-Key. |
| service_name, country_name | Opsional | Label tampilan; bukan penentu harga. Harga selalu divalidasi backend. |
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.
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.
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.
# 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
{
"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.
{
"success": true,
"order_id": "ORDER_ID",
"server": 2,
"status": "received",
"phone": "6281234567890",
"otp": "123456",
"received": true,
"balance": 17500
}| Status | Tindakan integrasi |
|---|---|
| waiting / pending / processing / in_progress / awaiting_otp | Masih aktif. Poll perlahan; jangan membuat pesanan pengganti untuk request yang belum pasti. |
| received / success / completed | Tampilkan otp bila ada, simpan hasil, hentikan polling. |
| cancelled / expired / failed | Hentikan 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.
{
"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.
31 kode referensi
| Kode / HTTP | Makna dan solusi |
|---|---|
missing_api_keyHTTP 401 | Header autentikasi belum dikirim. Kirim Authorization: Bearer KEY atau X-API-Key. |
invalid_api_keyHTTP 401 | Key salah, dicabut, atau diganti. Periksa key aktif di API Reseller Center. |
forbiddenHTTP 403 | Akun tidak diizinkan memakai API. Role Staff tidak memiliki akses reseller; hubungi Admin bila perlu. |
rate_limitedHTTP 429 | Batas request tercapai. Tunggu sesuai detik dalam message, lalu ulang. Jangan polling rapat. |
invalid_serverHTTP 400 | Server di luar 1–5. Isi server dengan angka 1 sampai 5. |
missing_parameterHTTP 400 | Parameter wajib belum lengkap. Ikuti tabel parameter per server dan gunakan ID dari katalog. |
invalid_parameterHTTP 400 | Format negara, layanan, atau harga salah. Salin ID/quoted_price dari response katalog tanpa mengubah format. |
invalid_providerHTTP 400 | Pilihan abstrak SERVER 1 tidak valid. Gunakan provider_1, provider_2, atau provider_3. |
missing_idempotency_keyHTTP 400 | Key permintaan OTP belum valid. Simpan satu key unik 16–128 karakter untuk satu order beserta retry. |
invalid_idempotency_keyHTTP 400 | Key permintaan SMM belum valid. Kirim Idempotency-Key 16–128 karakter. |
idempotency_conflictHTTP 409 | Key sama dipakai dengan payload berbeda. Untuk retry pertahankan payload asli. Key baru hanya untuk pesanan baru. |
duplicate_requestHTTP 409 | Token pernah dipakai; dapat muncul pada permintaan lama sebelum pembaruan. Jangan langsung mengulang pembelian dengan key baru; periksa order atau hubungi Admin. |
service_not_foundHTTP 404 | Layanan tidak ditemukan. Ambil katalog layanan terbaru. |
not_foundHTTP 404 | Pesanan OTP tidak ditemukan pada akun pemilik key. Periksa order_id dan akun pemilik key. |
order_not_foundHTTP 404 | Pesanan SMM tidak ditemukan pada akun ini. Gunakan order_id SMM, bukan ID lokal atau ID OTP. |
user_not_foundHTTP 404 | Akun pemilik key tidak ditemukan. Hubungi Admin. |
number_unavailableHTTP 400 | Offer sudah habis atau tidak tersedia. Ambil pilihan nomor terbaru, kemudian pilih offer lain. |
price_mismatchHTTP 409 | Harga berubah saat validasi. Ambil offer/quote baru dan tinjau harga sebelum membuat order baru. |
pricing_lockedHTTP 503 | Pemesanan SERVER 3 sedang dibatasi. Tunggu atau pilih server lain. |
server_unavailableHTTP 503 | Katalog atau server sementara tidak tersedia. Ulangi katalog nanti atau pilih server lain. |
provider_unavailableHTTP 503 | Katalog sementara belum dapat dimuat. Ulangi permintaan baca setelah jeda. |
provider_errorHTTP 503 | Server tidak dapat memproses permintaan. Untuk GET dapat dicoba lagi. Untuk POST pastikan hasil lama dulu; gunakan key yang sama. |
order_rejectedHTTP 409 | Order 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 400 | Parameter order SMM belum valid. Periksa target, service_id, quantity dan comments. |
order_pendingHTTP 202 | Pembelian SMM masih diperiksa. Simpan reservation_ref; pantau order_id bila tersedia. Jangan buat pembelian pengganti. |
cancel_waitHTTP 409 | Belum melewati batas pembatalan 3 menit. Tunggu dan cek status lagi sebelum membatalkan. |
otp_receivedHTTP 409 | Kode sudah diterima. Pesanan tidak dapat dibatalkan untuk refund. |
insufficient_balanceHTTP 402 | Saldo reseller tidak cukup. Tambah saldo lalu tinjau ulang order. |
provider_uncertainHTTP 503 | Hasil pembelian belum pasti. Jangan ulang dengan key berbeda; simpan request dan hubungi Admin. |
provider_missing_order_idHTTP 502 | Server belum mengembalikan ID order; saldo bisa tertahan. Jangan melakukan pembelian pengganti. Minta pemeriksaan Admin. |
local_persistence_errorHTTP 500 | Hasil 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."}}| HTTP | Arti |
|---|---|
| 200 | Hasil baca atau pengulangan order yang sudah tersimpan. |
| 201 | Order baru diterima. Simpan order_id. |
| 202 | Hasil masih diperiksa. Bukan konfirmasi gagal atau refund. |
| 400 / 401 / 402 / 403 / 404 / 409 | Periksa kode dan pesan sebelum mengubah request. |
| 429 | Tunggu sesuai waktu pada message. Jangan terus mengulang request. |
| 500 / 502 / 503 atau timeout | Request baca dapat diulang setelah jeda. Untuk pembelian, hasil bisa belum pasti; pertahankan Idempotency-Key dan payload. |
Status key hanya menunjukkan autentikasi. Server juga harus aktif, kredensial toko terkonfigurasi, dan stok tersedia. Coba katalog server lain atau hubungi Admin.
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.
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.
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.
Simpan key hanya di backend kamu. Frontend pelanggan memanggil backend kamu, lalu backend menghubungi ZYREX. Penggunaan langsung di frontend akan membocorkan key.
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.
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.