4.1 Keamanan API key
Peringatan. API key memberi akses penuh ke saldo wallet Anda. Siapa pun yang memegang key bisa membeli produk sampai saldo habis. API tidak punya batas belanja harian.
Pakai key hanya dari server Anda.
- Simpan key di environment variable atau secret manager di server. Jangan tulis di kode atau repositori Git.
- Jangan taruh key di aplikasi browser (JavaScript di halaman web) atau aplikasi mobile (Android, iOS), juga tidak di aplikasi desktop yang dibagikan. Apa pun yang sampai ke perangkat pengguna bisa dibongkar. Pola yang benar: aplikasi pelanggan memanggil server Anda, dan server Anda memanggil API ini.
- Server Anda yang memutuskan siapa boleh membeli apa dan berapa banyak. API hanya melihat satu pemanggil, yaitu Anda.
- Jangan kirim key lewat query string. Request seperti itu ditolak dengan
400 invalid_request(lihat bagian 1.4). - Jangan mencatat header
Authorizationdi log aplikasi, log proxy, atau alat pelacakan error. - Minta toko mengisi allowlist IP key dengan IP server Anda (sampai 10 alamat IPv4, IPv6, atau CIDR). Key yang bocor lalu tidak bisa dipakai dari tempat lain.
Putar key bila diduga bocor.
- Minta toko memutar key (rotate). Key lama langsung ditolak dengan
401 invalid_api_keymulai request berikutnya. Allowlist IP ikut terbawa ke key baru. Toko juga bisa mencabut key atau mematikan Akses API. - Perbarui key di semua aplikasi Anda. Karena satu key dipakai bersama, semua aplikasi berhenti sampai key barunya dipasang.
- Periksa
GET /balance/transactionsdanGET /ordersuntuk pembelian yang tidak Anda kenali, lalu laporkan ke toko.
4.2 IP allowlist
Allowlist IP membatasi key supaya hanya bisa dipakai dari alamat server Anda. Toko mengisinya atas permintaan Anda dengan sampai 10 alamat IPv4, IPv6, atau CIDR, dan allowlist ikut terbawa ke key baru saat key diputar. Isinya terlihat di field ip_allowlist pada GET /me.
Bila allowlist IP key tidak kosong, hanya IP di daftar itu yang diterima. Alamat yang dipakai adalah alamat klien sebagaimana dilihat server API. Bila server Anda keluar lewat NAT atau proxy, daftarkan alamat keluarnya. Allowlist kosong berarti semua IP diizinkan.
Request dari IP di luar allowlist dijawab 403 ip_not_allowed. Kegagalan ini ikut dihitung sebagai kegagalan autentikasi (20 per 5 menit per IP, lihat bagian 4.3).
4.3 Batas rate dan beban
| Batas | Nilai | Dihitung per | Bila terlampaui |
|---|---|---|---|
Request baca (semua GET) | 120 per menit | API key | 429 rate_limited |
POST /orders | 20 per menit | API key | 429 rate_limited |
Kegagalan autentikasi (invalid_api_key, ip_not_allowed) | 20 per 5 menit | Alamat IP per toko | 429 rate_limited sebelum key diperiksa |
| Request yang diproses bersamaan | 2 | Toko, per proses server | Menunggu paling lama 2 detik, lalu 503 server_busy |
Ukuran body POST /orders | 8 KB | Request | 413 payload_too_large |
| Jumlah unit per order | 20 | Request | 422 invalid_request |
Hal yang perlu diketahui:
- Batas baca dan batas order terpisah. Semua
GETmemakai satu jatah,POST /ordersmemakai jatah sendiri. HeaderX-RateLimit-Limitmenunjukkan jatah mana yang berlaku (120 atau 20). - Satu key dipakai semua aplikasi Anda, jadi jatahnya dipakai bersama.
- Jendela bersifat bergulir (rolling), bukan reset pada menit penuh. Setiap request yang sampai ke pembatas dihitung, termasuk yang ditolak dan yang kemudian dijawab
server_busy. Mengulang terus saat menerima429memperpanjang masa tunggu. TungguRetry-After. - Batas request bersamaan dipakai bersama oleh semua reseller di toko yang sama, bukan hanya Anda. Jaga aplikasi Anda pada 1 sampai 2 request paralel, dan antre sisanya di sisi Anda.
- Nilai batas untuk key Anda bisa dibaca dari
GET /me(rate_limits). Jangan menulis angkanya mati di kode.
Contoh jawaban 429:
HTTP/1.1 429 Too Many Requests
X-Request-Id: 66666666-6666-4666-8666-666666666666
Cache-Control: no-store
X-RateLimit-Limit: 20
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 38
Retry-After: 38{
"success": false,
"error": { "code": "rate_limited", "message": "Terlalu banyak permintaan, coba lagi nanti." },
"request_id": "66666666-6666-4666-8666-666666666666"
}4.4 Header respons
| Header | Muncul di | Keterangan |
|---|---|---|
X-Request-Id | Setiap respons | Id unik request, sama dengan request_id di body galat. Dibuat oleh server. X-Request-Id yang Anda kirim diabaikan. Sertakan saat melapor |
Cache-Control: no-store | Setiap respons | Jangan simpan respons di cache. Respons bisa memuat isi produk. Pragma: no-cache ikut dikirim |
X-RateLimit-Limit | Respons yang melewati pembatas per key | Batas jatah yang berlaku (120 untuk GET, 20 untuk POST /orders) |
X-RateLimit-Remaining | Sama | Sisa jatah di jendela saat ini |
X-RateLimit-Reset | Sama | Jumlah detik sampai jatah mulai pulih |
Retry-After | 429 rate_limited, 503 server_busy, 409 request_in_progress | Jumlah detik yang harus ditunggu sebelum mencoba lagi |
Idempotent-Replayed: true | POST /orders yang dijawab 200 | Respons ini mengulang order yang sudah ada. Tidak ada pemotongan baru |
Header X-RateLimit-* tidak ada pada jawaban yang dibuat sebelum pembatas per key, yaitu galat toko, galat autentikasi, channel_disabled, plan_not_eligible, dan not_found.
Header request yang dipakai:
| Header | Dipakai di |
|---|---|
Authorization: Bearer <API key> | Semua request |
Idempotency-Key | POST /orders |
Content-Type: application/json | POST /orders |
4.5 Batasan
- Hanya pembayaran dengan saldo wallet. Tidak ada top up, QRIS, crypto, atau voucher lewat API.
- Tidak ada webhook keluar ke URL Anda dan tidak ada mode sandbox. Setiap pembelian memotong saldo sungguhan.
- Tidak ada notifikasi bot untuk order API. Isi produk hanya ada di respons.
- Order API Anda ikut tampil di riwayat pesanan bot Telegram akun Anda.
- Satu key per reseller, tanpa scope. Key yang bocor dari satu aplikasi membuka seluruh saldo Anda, dan memutar key berarti semua aplikasi diperbarui bersamaan.
- Toko mencatat setiap
POST /ordersyang lolos batas rate dan setiap penolakanip_not_allowedselama 30 hari: waktu, endpoint, status, kode galat, IP, nomor order, dan latensi. HeaderAuthorization, key, serta isi request dan respons tidak dicatat. - Akses bergantung pada layanan toko. Bila toko tidak lagi menyediakan API Reseller, API menjawab
plan_not_eligibletetapi key dan izin Anda tidak dihapus.
Butuh bantuan dengan integrasi?
Sertakan request_id dari respons galat, lalu hubungi tim Ayosel lewat Telegram atau WhatsApp, atau email [email protected].