API Documentation
Dokumentasi resmi API Konter 24 Jam untuk reseller. Integrasikan layanan pulsa, paket data, token PLN, e-wallet, voucher game, dan PPOB ke sistem atau aplikasi Anda.
Siapa yang Bisa Pakai?
API ini tersedia untuk akun Reseller yang sudah terverifikasi. Untuk mengakses API, Anda perlu:
- Daftar akun di konter24jam.net
- Upgrade akun ke tipe Reseller (hubungi admin)
- Generate API Key di menu Akun Saya → API Keys
- Mulai integrasi!
Memulai
Alur singkat untuk mulai menggunakan API:
Generate API Key
Login ke dashboard, buka Akun Saya → API Keys, klik Generate Key. Simpan key dengan aman — key tidak bisa dilihat lagi setelah ditutup.
Isi Saldo
Buat deposit melalui dashboard. Saldo ini yang akan dipotong setiap transaksi via API.
Lihat Pricelist
Gunakan endpoint /api/v1/public/products untuk melihat daftar produk dan harga.
Buat Transaksi
Kirim request ke POST /api/v1/transactions dengan product_code, destination, dan ref_id unik.
Cek Status
Poll status transaksi, atau setup webhook untuk menerima notifikasi real-time.
Base URL
Semua endpoint API berada di bawah base URL berikut:
https://api.konter24jam.net
Contoh URL lengkap untuk cek saldo:
https://api.konter24jam.net/api/v1/balance
Autentikasi
API menggunakan API Key untuk autentikasi. Sertakan API Key di setiap request via salah satu header berikut:
Opsi 1: Header X-API-Key (Recommended)
X-API-Key: YOUR_API_KEY
Opsi 2: Header Authorization
Authorization: ApiKey YOUR_API_KEY
- API Key bersifat rahasia. Jangan pernah di-commit ke repo publik atau dikirim via pesan yang tidak aman.
- Jika API Key bocor, segera reset dari dashboard Akun Saya → API Keys.
- Gunakan HTTPS untuk semua request — API Key dikirim via header.
Contoh Request dengan API Key
curl -X GET "https://api.konter24jam.net/api/v1/balance" \
-H "X-API-Key: YOUR_API_KEY"
<?php
$apiKey = "YOUR_API_KEY";
$ch = curl_init("https://api.konter24jam.net/api/v1/balance");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-API-Key: " . $apiKey,
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
print_r($data);
const API_KEY = "YOUR_API_KEY";
const response = await fetch(
"https://api.konter24jam.net/api/v1/balance",
{
headers: { "X-API-Key": API_KEY }
}
);
const data = await response.json();
console.log(data);
import requests
API_KEY = "YOUR_API_KEY"
response = requests.get(
"https://api.konter24jam.net/api/v1/balance",
headers={"X-API-Key": API_KEY}
)
print(response.json())
Format Respons
Semua respons API menggunakan format JSON dengan struktur yang konsisten.
Respons Sukses
{
"success": true,
"data": {
// ... data spesifik endpoint
}
}
Respons Error
{
"success": false,
"error": {
"code": "ERROR_CODE",
"message": "Pesan error dalam Bahasa Indonesia",
"details": {
// ... informasi tambahan (opsional)
}
}
}
Error Handling
API menggunakan standar HTTP status code:
| Status | Kode Error | Arti |
|---|---|---|
200 |
- | Sukses |
400 |
VALIDATION_ERROR, INSUFFICIENT_BALANCE |
Request tidak valid |
401 |
UNAUTHORIZED, INVALID_API_KEY |
API Key tidak valid atau tidak ada |
403 |
FORBIDDEN, ACCOUNT_SUSPENDED |
Akses ditolak |
404 |
NOT_FOUND, PRODUCT_NOT_FOUND |
Resource tidak ditemukan |
409 |
DUPLICATE_REF_ID |
ref_id sudah digunakan |
429 |
RATE_LIMIT_EXCEEDED |
Terlalu banyak request |
500 |
INTERNAL_ERROR |
Server error — hubungi support |
502 |
SUPPLIER_ERROR |
Supplier bermasalah — coba lagi nanti |
Contoh Error Response
{
"success": false,
"error": {
"code": "INSUFFICIENT_BALANCE",
"message": "Saldo tidak cukup. Saldo saat ini: Rp 5.000, dibutuhkan: Rp 11.500",
"details": {
"current_balance": 5000,
"required": 11500
}
}
}
Rate Limiting
Untuk melindungi stabilitas sistem, API memiliki limit:
- 60 request per menit per API Key untuk endpoint baca (GET)
- 30 transaksi per menit per API Key untuk
POST /api/v1/transactions
Jika limit terlampaui, Anda akan menerima respons 429 Too Many Requests.
Untuk limit yang lebih tinggi, hubungi admin.
Cek Saldo
Mendapatkan saldo reseller saat ini.
/api/v1/balance
Headers
| Header | Wajib | Keterangan |
|---|---|---|
X-API-Key | Ya | API Key Anda |
Contoh Request
curl -X GET "https://api.konter24jam.net/api/v1/balance" \
-H "X-API-Key: YOUR_API_KEY"
<?php
$ch = curl_init("https://api.konter24jam.net/api/v1/balance");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["X-API-Key: YOUR_API_KEY"]);
$response = curl_exec($ch);
$data = json_decode($response, true);
echo "Saldo: Rp " . number_format($data['data']['balance'], 0, ',', '.');
const res = await fetch("https://api.konter24jam.net/api/v1/balance", {
headers: { "X-API-Key": "YOUR_API_KEY" }
});
const { data } = await res.json();
console.log("Saldo:", data.balance_formatted);
import requests
res = requests.get(
"https://api.konter24jam.net/api/v1/balance",
headers={"X-API-Key": "YOUR_API_KEY"}
)
data = res.json()["data"]
print(f"Saldo: {data['balance_formatted']}")
Contoh Respons
{
"success": true,
"data": {
"balance": 250000,
"balance_formatted": "Rp 250.000",
"currency": "IDR",
"updated_at": "2026-04-24T10:30:00Z"
}
}
Riwayat Saldo
Melihat mutasi saldo (deposit, transaksi, refund, penyesuaian admin).
/api/v1/balance/history
Query Parameters
| Parameter | Tipe | Wajib | Default | Keterangan |
|---|---|---|---|---|
limit | integer | Tidak | 50 | Jumlah data (max 100) |
type | string | Tidak | - | Filter: deposit, purchase, refund, admin_credit, admin_debit |
Contoh Request
curl -X GET "https://api.konter24jam.net/api/v1/balance/history?limit=10" \
-H "X-API-Key: YOUR_API_KEY"
Contoh Respons
{
"success": true,
"data": {
"items": [
{
"id": 123,
"type": "purchase",
"amount": 11500,
"balance_before": 261500,
"balance_after": 250000,
"reference_type": "transaction",
"reference_id": 456,
"description": "Pembelian Telkomsel 10K",
"created_at": "2026-04-24T10:30:00Z"
},
{
"id": 122,
"type": "deposit",
"amount": 100000,
"balance_before": 161500,
"balance_after": 261500,
"reference_type": "deposit",
"reference_id": 45,
"description": "Deposit approved",
"created_at": "2026-04-24T09:00:00Z"
}
],
"total": 2
}
}
Lihat Kategori
Mendapatkan daftar kategori produk yang tersedia (Pulsa, Paket Data, Token PLN, dll).
/api/v1/public/categories
Contoh Request
curl -X GET "https://api.konter24jam.net/api/v1/public/categories"
Contoh Respons
{
"success": true,
"data": {
"items": [
{
"code": "pulsa",
"name": "Pulsa",
"product_count": 145
},
{
"code": "paket_data",
"name": "Paket Data",
"product_count": 892
},
{
"code": "token_pln",
"name": "Token PLN",
"product_count": 6
}
]
}
}
Lihat Produk
Mendapatkan daftar produk. Bisa difilter per kategori atau operator.
/api/v1/public/products
Query Parameters
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
category | string | Tidak | Filter by kategori (e.g., pulsa) |
operator | string | Tidak | Filter by operator (e.g., TELKOMSEL) |
search | string | Tidak | Cari nama produk |
limit | integer | Tidak | Max 100 (default: 50) |
page | integer | Tidak | Halaman (default: 1) |
Contoh Request
curl -X GET "https://api.konter24jam.net/api/v1/public/products?category=pulsa&operator=TELKOMSEL"
Contoh Respons
{
"success": true,
"data": {
"items": [
{
"code": "TSEL10",
"name": "Telkomsel 10.000",
"category": "pulsa",
"operator": "TELKOMSEL",
"price": 11500,
"price_formatted": "Rp 11.500",
"status": "active"
},
{
"code": "TSEL25",
"name": "Telkomsel 25.000",
"category": "pulsa",
"operator": "TELKOMSEL",
"price": 26000,
"price_formatted": "Rp 26.000",
"status": "active"
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 2,
"has_more": false
}
}
}
Buat Transaksi
Melakukan pembelian produk. Saldo Anda akan langsung dipotong.
/api/v1/transactions
Headers
| Header | Wajib | Keterangan |
|---|---|---|
X-API-Key | Ya | API Key Anda |
Content-Type | Ya | application/json |
Request Body
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
product_code | string | Ya | Kode produk dari pricelist (e.g., TSEL10) |
destination | string | Ya | Nomor tujuan (HP, ID PLN, dll) |
ref_id | string | Ya | ID unik dari sistem Anda (max 100 karakter) |
ref_id:
ref_idharus unik per reseller. Gunakan ID transaksi dari sistem Anda.- Jika Anda kirim
ref_idyang sama 2x dalam waktu dekat, transaksi pertama akan diproses normal, yang kedua akan mengembalikan data transaksi yang sama (idempotent). - Format bebas, tapi disarankan pakai format yang mudah ditelusuri, contoh:
INV-20260424-001.
Contoh Request
curl -X POST "https://api.konter24jam.net/api/v1/transactions" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_code": "TSEL10",
"destination": "081234567890",
"ref_id": "INV-20260424-001"
}'
<?php
$data = [
"product_code" => "TSEL10",
"destination" => "081234567890",
"ref_id" => "INV-" . date("Ymd") . "-" . uniqid()
];
$ch = curl_init("https://api.konter24jam.net/api/v1/transactions");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-API-Key: YOUR_API_KEY",
"Content-Type: application/json"
]);
$response = curl_exec($ch);
$result = json_decode($response, true);
if ($result['success']) {
echo "Transaksi: " . $result['data']['invoice'];
echo "\nStatus: " . $result['data']['status'];
} else {
echo "Error: " . $result['error']['message'];
}
const response = await fetch(
"https://api.konter24jam.net/api/v1/transactions",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
product_code: "TSEL10",
destination: "081234567890",
ref_id: `INV-${Date.now()}`
})
}
);
const result = await response.json();
if (result.success) {
console.log("Invoice:", result.data.invoice);
console.log("Status:", result.data.status);
} else {
console.error("Error:", result.error.message);
}
import requests
import time
data = {
"product_code": "TSEL10",
"destination": "081234567890",
"ref_id": f"INV-{int(time.time())}"
}
res = requests.post(
"https://api.konter24jam.net/api/v1/transactions",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json"
},
json=data
)
result = res.json()
if result["success"]:
print(f"Invoice: {result['data']['invoice']}")
print(f"Status: {result['data']['status']}")
else:
print(f"Error: {result['error']['message']}")
Contoh Respons Sukses
{
"success": true,
"data": {
"invoice": "INV-20260424-A1B2C3",
"ref_id": "INV-20260424-001",
"product_code": "TSEL10",
"product_name": "Telkomsel 10.000",
"destination": "081234567890",
"price": 11500,
"price_formatted": "Rp 11.500",
"status": "pending",
"serial_number": null,
"message": "Transaksi sedang diproses",
"is_refunded": false,
"created_at": "2026-04-24T10:30:00Z",
"completed_at": null
}
}
Field Respons
| Field | Keterangan |
|---|---|
invoice | Nomor invoice yang dibuat sistem kami. Simpan ini untuk cek status. |
ref_id | ref_id yang Anda kirim |
status | pending, processing, success, atau failed |
serial_number | Untuk produk seperti token PLN, berisi nomor serinya |
message | Pesan human-readable dalam Bahasa Indonesia |
is_refunded | true jika transaksi gagal dan saldo sudah dikembalikan |
Possible Errors
| Status | Kode | Penyebab |
|---|---|---|
| 400 | VALIDATION_ERROR | Field wajib tidak terisi |
| 400 | INSUFFICIENT_BALANCE | Saldo tidak cukup |
| 404 | PRODUCT_NOT_FOUND | product_code tidak valid |
| 409 | DUPLICATE_REF_ID | ref_id sudah dipakai (biasanya dikembalikan sebagai sukses, bukan error) |
| 502 | SUPPLIER_ERROR | Supplier sedang bermasalah |
Cek Status Transaksi
Melihat status transaksi terbaru. Sistem akan otomatis re-cek ke supplier jika status masih pending/processing.
/api/v1/transactions/:ref_or_invoice
Parameter :ref_or_invoice bisa diisi dengan ref_id Anda atau invoice dari sistem kami.
Contoh Request
curl -X GET "https://api.konter24jam.net/api/v1/transactions/INV-20260424-001" \
-H "X-API-Key: YOUR_API_KEY"
Contoh Respons
{
"success": true,
"data": {
"transaction": {
"invoice": "INV-20260424-A1B2C3",
"ref_id": "INV-20260424-001",
"product_code": "TSEL10",
"product_name": "Telkomsel 10.000",
"destination": "081234567890",
"price": 11500,
"price_formatted": "Rp 11.500",
"status": "success",
"serial_number": null,
"message": "Transaksi berhasil",
"is_refunded": false,
"created_at": "2026-04-24T10:30:00Z",
"completed_at": "2026-04-24T10:30:15Z"
}
}
}
Riwayat Transaksi
Melihat semua transaksi reseller. Bisa difilter dan paginated.
/api/v1/transactions
Query Parameters
| Parameter | Tipe | Default | Keterangan |
|---|---|---|---|
page | integer | 1 | Halaman |
limit | integer | 20 | Data per halaman (max 100) |
status | string | - | Filter: pending, processing, success, failed, refunded |
Contoh Request
curl -X GET "https://api.konter24jam.net/api/v1/transactions?status=success&limit=10" \
-H "X-API-Key: YOUR_API_KEY"
Contoh Respons
{
"success": true,
"data": {
"items": [
{
"invoice": "INV-20260424-A1B2C3",
"ref_id": "INV-20260424-001",
"product_code": "TSEL10",
"product_name": "Telkomsel 10.000",
"destination": "081234567890",
"price": 11500,
"price_formatted": "Rp 11.500",
"status": "success",
"created_at": "2026-04-24T10:30:00Z",
"completed_at": "2026-04-24T10:30:15Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 1,
"has_more": false
}
}
}
Lifecycle Transaksi
Setiap transaksi melalui beberapa status sebelum final:
Transaksi diterima, sedang diproses internal
Dikirim ke supplier, menunggu respons
Transaksi berhasil
Gagal — saldo dikembalikan otomatis
Status Detail
| Status | Arti | Final? |
|---|---|---|
| pending | Sedang diantre | Tidak |
| processing | Sedang diproses supplier | Tidak |
| success | Berhasil, produk terkirim ke destination | Ya |
| failed | Gagal. Cek is_refunded — biasanya true | Ya |
Timeout Handling
Jika transaksi pending/processing lebih dari 6 jam, sistem otomatis cek ulang ke supplier dan auto-refund jika memang gagal. Anda tidak perlu melakukan apa-apa.
Webhook / Callback
Dibanding polling status, lebih efisien jika Anda setup webhook. Sistem kami akan otomatis kirim notifikasi HTTP POST saat status transaksi berubah ke success atau failed.
GET /api/v1/transactions/:ref setiap 5-10 detik untuk transaksi yang masih pending.
Polling Strategy (Sementara)
Rekomendasi strategi polling untuk efisiensi:
- Setelah
POST /api/v1/transactions, tunggu 5 detik. - Cek status dengan
GET /api/v1/transactions/:ref. - Jika masih
pending/processing, tunggu 10 detik lagi. - Ulangi max 12x (total ~2 menit).
- Jika belum final setelah 2 menit, cukup cek sekali lagi setiap 5 menit.
- Status akan final otomatis max 6 jam.
Contoh Polling (Node.js)
async function waitForTransaction(refId) {
const MAX_ATTEMPTS = 12;
let delay = 5000; // 5 seconds
for (let i = 0; i < MAX_ATTEMPTS; i++) {
await new Promise(r => setTimeout(r, delay));
const res = await fetch(
`https://api.konter24jam.net/api/v1/transactions/${refId}`,
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const { data } = await res.json();
if (data.transaction.status === "success" ||
data.transaction.status === "failed") {
return data.transaction;
}
delay = 10000; // 10 seconds for subsequent polls
}
throw new Error("Transaction timed out (still pending after 2 minutes)");
}
FAQ
Bagaimana cara dapat akun Reseller?
Daftar akun biasa dulu di konter24jam.net, lalu hubungi admin via WhatsApp di nomor yang tertera di halaman Kontak. Admin akan upgrade akun Anda setelah verifikasi.
Apa bedanya harga reseller dan retail?
Akun reseller dapat harga lebih murah dibanding retail. Margin lebih besar = keuntungan lebih tinggi untuk bisnis Anda.
Berapa minimum deposit?
Minimum deposit Rp 50.000. Maximum Rp 10.000.000 per deposit.
Apakah ada biaya bulanan?
Tidak ada. Anda hanya bayar per transaksi (harga produk). API akses gratis untuk semua reseller.
Apa yang terjadi jika transaksi gagal?
Saldo Anda otomatis dikembalikan (refund). Cek field is_refunded di respons untuk memastikan.
Berapa lama transaksi biasanya selesai?
Mayoritas transaksi selesai dalam 5-30 detik. Jika ada gangguan supplier, bisa sampai beberapa menit. Maksimum 6 jam sebelum auto-timeout/refund.
Bagaimana cara reset API Key jika bocor?
Login ke dashboard → Akun Saya → API Keys → klik Reset Key. Key lama langsung tidak valid. Generate key baru dan update di sistem Anda.
Bisa tes sandbox/staging?
Belum tersedia environment sandbox. Untuk testing, disarankan mulai dari transaksi kecil (pulsa Rp 5.000) ke nomor HP sendiri.
Ada bug atau butuh bantuan?
Hubungi admin via halaman Kontak. Sertakan invoice/ref_id jika pertanyaan tentang transaksi tertentu.