Katalog publik

GET /api/v1/catalog mengembalikan katalog layanan dan negara terkurasi. Ini data deskriptif, bukan umpan stok penyedia langsung. GET /openapi.json menjelaskan endpoint HTTP saat ini. Kredensial penyedia tidak pernah dikirim ke browser.

Penawaran terkait pengguna

POST /api/v1/quotes menerima layanan dan negara dari sesi terautentikasi dengan origin sama. Penawaran dimiliki pengguna tersebut dan berakhir setelah 60 detik. Jumlah USD dihitung di server menggunakan konversi mata uang sumber terverifikasi, markup, serta harga jual minimum.

Pesanan idempoten

POST /api/v1/orders menerima quoteId dan Idempotency-Key. Percobaan ulang dengan kunci sama mengembalikan pesanan yang sama, bukan membeli nomor lain. Reservasi dompet dicatat secara atomik. Respons penyedia ambigu menahan pesanan untuk peninjauan; itu tidak memicu pembelian kedua otomatis.

Status dan penyelesaian

GET /api/v1/orders/{id} membaca pesanan milik pengguna dan status SMS. POST ke endpoint yang sama dengan tindakan finish atau cancel meminta transisi status. Server menerapkan blokir pembatalan awal 120 detik dan mencatat pengembalian satu kali setelah penyedia mengonfirmasi pembatalan.

Konfirmasi pembayaran

Stripe Checkout hanya mengkreditkan dompet langsung atau uji yang sesuai setelah webhook terverifikasi dan pemeriksaan pembayaran terautentikasi. Kunci langsung dan uji yang diberikan berasal dari akun Stripe berbeda, sehingga kunci, rahasia endpoint, dan setorannya dipisahkan. NOWPayments memakai IPN terverifikasi, pengaitan faktur, dan pemeriksaan pembayaran yang telah diselesaikan dengan toleransi jumlah ±0,50%. Pengalihan berhasil di browser tidak pernah menjadi bukti pembayaran.

Akses dan ketersediaan

Situs utama dan katalog bersifat publik. Dompet, penawaran, dan pesanan membutuhkan autentikasi serta pemeriksaan kepemilikan. Tindakan langsung bergantung pada kredensial terkonfigurasi, akses penyedia, dan konfirmasi terverifikasi; contoh API tidak menyatakan pembelian berbayar atau seluruh siklus pembayaran sudah divalidasi.

GET /api/v1/catalog
GET /api/v1/offers?service=whatsapp&country=usa

POST /api/v1/quotes
Content-Type: application/json
{"service":"whatsapp","country":"usa"}

POST /api/v1/orders
Idempotency-Key: <unique-request-key>
{"quoteId":"<owned-unexpired-quote-id>"}

GET /api/v1/orders/<order-id>
POST /api/v1/orders/<order-id>
{"action":"cancel"}
Kembali ke dasbor