Katalog & harga
Baca layanan, negara, dan opsi harga sebelum membuat order. Identitas dan harga selalu berasal dari server.
Unduh OpenAPI 3.1Di halaman ini
Sebelum mengirim request
Katalog memerlukan sesi walaupun hanya dibaca. Jangan mengirim nama layanan, kode ISO negara, atau ID provider sebagai pengganti id dari katalog. Quote bukan reservasi nomor dan dapat berubah saat konfirmasi.
Endpoint, field, dan status HTTP mengikuti implementasi. Nilai ID, nomor, OTP, waktu, saldo, serta quote di contoh adalah ilustrasi, bukan data akun atau pilihan yang bisa langsung dibeli. Ganti dengan data dari instalasimu. Halaman ini tidak mengirim request atau menjalankan transaksi.
JavaScript dijalankan pada origin aplikasi setelah login. Contoh cURL memakai PING_ORIGIN dan cookie jar PING_COOKIE_JAR dari panduan autentikasi. Sukses memakai { ok: true, data }; create juga HTTP 200, bukan 201. Semua endpoint di halaman ini memerlukan sesi aktif dan dapat mengembalikan 401, 403, atau 500.
Daftar layanan
/api/catalog/servicesSession cookieSource : app/api/catalog/services/route.ts
Mengembalikan layanan yang diaktifkan operator. Respons berupa array tanpa pagination. Filter kategori/pencarian pada UI dilakukan client-side, bukan lewat parameter endpoint ini.
const response = await fetch("/api/catalog/services", {
credentials: "same-origin",
cache: "no-store",
});
const body = await response.json();
if (!response.ok || !body.ok) {
throw Object.assign(
new Error(body.error?.message ?? "Request gagal"),
{ code: body.error?.code, status: response.status },
);
}
const data = body.data;Daftar negara
/api/catalog/countriesSession cookieSource : app/api/catalog/countries/route.ts
Mengembalikan negara aktif, diurutkan berdasarkan nama tersimpan. Gunakan id dari respons untuk quote dan order, bukan iso2 atau kode panggilan.
const response = await fetch("/api/catalog/countries", {
credentials: "same-origin",
cache: "no-store",
});
const body = await response.json();
if (!response.ok || !body.ok) {
throw Object.assign(
new Error(body.error?.message ?? "Request gagal"),
{ code: body.error?.code, status: response.status },
);
}
const data = body.data;Ambil penawaran harga
/api/catalog/quotesSession cookieSource : app/api/catalog/quotes/route.ts
Membaca quote satu pasangan layanan/negara, dengan refresh cache provider bila diperlukan. Kedua parameter wajib; parameter query tambahan ditolak. Harga dan opsi tetap divalidasi lagi saat pembelian.
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
| serviceId (query) | string | Ya | Service.id dari katalog. |
| countryId (query) | string | Ya | Country.id dari katalog. |
const response = await fetch("/api/catalog/quotes?serviceId=service-example&countryId=country-example", {
credentials: "same-origin",
cache: "no-store",
});
const body = await response.json();
if (!response.ok || !body.ok) {
throw Object.assign(
new Error(body.error?.message ?? "Request gagal"),
{ code: body.error?.code, status: response.status },
);
}
const data = body.data;| Kode error | HTTP | Tindakan |
|---|---|---|
| VALIDATION_ERROR | 400 | Periksa tipe, field wajib, format UUID, dan field tambahan. |
| SERVICE_UNAVAILABLE | 422 | Muat ulang katalog dan pilih layanan yang tersedia. |
| COUNTRY_UNAVAILABLE | 422 | Muat ulang katalog dan pilih negara yang tersedia. |
| PRICE_UNAVAILABLE | 422 | Tawarkan pasangan lain atau coba baca quote lagi nanti. |
| PROVIDER_ERROR | 502 | Baca ulang status. Jangan retry pembelian upstream secara otomatis. |
Schema · Service
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
| provider | tiger | smscode | Ya | tiger = Server 1 (Tiger SMS); smscode = Server 2 (smscode.gg). Katalog, harga, dan pesanan terikat ke server ini; tidak ada perpindahan otomatis. |
| id | string | Ya | ID internal dari katalog server yang dipilih. Bukan nama layanan atau kode provider. |
| name | string | Ya | Nama layanan untuk ditampilkan. |
| icon | string | Ya | Kunci ikon layanan, bukan URL gambar. |
| category | string | Ya | Label kategori untuk tampilan. |
| description | string | Ya | Sesuai tipe yang ditampilkan. |
Schema · Country
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
| provider | tiger | smscode | Ya | tiger = Server 1 (Tiger SMS); smscode = Server 2 (smscode.gg). Katalog, harga, dan pesanan terikat ke server ini; tidak ada perpindahan otomatis. |
| id | string | Ya | ID internal dari katalog server yang dipilih. Bukan kode ISO atau kode provider. |
| name | string | Ya | Sesuai tipe yang ditampilkan. |
| flag | string | Ya | Label bendera untuk tampilan; jangan dipakai sebagai identifier. |
| dial | string | Ya | Kode panggilan negara untuk tampilan. |
| iso2 | string | Ya | Kode negara yang tersedia pada metadata. |
Schema · Quote
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
| provider | tiger | smscode | Ya | tiger = Server 1 (Tiger SMS); smscode = Server 2 (smscode.gg). Katalog, harga, dan pesanan terikat ke server ini; tidak ada perpindahan otomatis. |
| serviceId | string | Ya | Sesuai tipe yang ditampilkan. |
| countryId | string | Ya | Sesuai tipe yang ditampilkan. |
| price_idr | integer | Ya | Harga opsi pertama. Konfirmasi memakai harga opsi yang dipilih. |
| qualitative_stock | available | limited | Ya | Ketersediaan kualitatif, bukan jumlah stok yang dijamin. |
| options | QuoteOption[] | Ya | Pilihan harga yang tersedia saat quote diambil. |
| fetched_at | string · date-time | Ya | ISO 8601 dengan zona waktu. |
| expires_at | string · date-time | Ya | Masa berlaku cache quote; bukan reservasi harga atau nomor. |
Schema · QuoteOption
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
| id | string | Ya | ID pilihan harga; teruskan sebagai priceOptionId, jangan buat sendiri. |
| price_idr | integer | Ya | Rupiah utuh, bukan sen atau string berformat. |
| qualitative_stock | available | limited | Ya | Ketersediaan kualitatif, bukan jumlah stok yang dijamin. |