K24 Konter 24 Jam

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.

Versi API: v1 · Update terakhir: 24 April 2026

Siapa yang Bisa Pakai?

API ini tersedia untuk akun Reseller yang sudah terverifikasi. Untuk mengakses API, Anda perlu:

  1. Daftar akun di konter24jam.net
  2. Upgrade akun ke tipe Reseller (hubungi admin)
  3. Generate API Key di menu Akun Saya → API Keys
  4. Mulai integrasi!

Memulai

Alur singkat untuk mulai menggunakan API:

1

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.

2

Isi Saldo

Buat deposit melalui dashboard. Saldo ini yang akan dipotong setiap transaksi via API.

3

Lihat Pricelist

Gunakan endpoint /api/v1/public/products untuk melihat daftar produk dan harga.

4

Buat Transaksi

Kirim request ke POST /api/v1/transactions dengan product_code, destination, dan ref_id unik.

5

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
Catatan: Semua request harus menggunakan HTTPS. Request via HTTP akan ditolak.

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
⚠️ PENTING:
  • 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.

GET /api/v1/balance

Headers

HeaderWajibKeterangan
X-API-KeyYaAPI 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).

GET /api/v1/balance/history

Query Parameters

ParameterTipeWajibDefaultKeterangan
limitintegerTidak50Jumlah data (max 100)
typestringTidak-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).

GET /api/v1/public/categories
Catatan: Endpoint ini publik (tidak butuh API Key), tapi bisa dipakai untuk authenticated request juga.

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.

GET /api/v1/public/products

Query Parameters

ParameterTipeWajibKeterangan
categorystringTidakFilter by kategori (e.g., pulsa)
operatorstringTidakFilter by operator (e.g., TELKOMSEL)
searchstringTidakCari nama produk
limitintegerTidakMax 100 (default: 50)
pageintegerTidakHalaman (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.

POST /api/v1/transactions

Headers

HeaderWajibKeterangan
X-API-KeyYaAPI Key Anda
Content-TypeYaapplication/json

Request Body

FieldTipeWajibKeterangan
product_codestringYaKode produk dari pricelist (e.g., TSEL10)
destinationstringYaNomor tujuan (HP, ID PLN, dll)
ref_idstringYaID unik dari sistem Anda (max 100 karakter)
⚠️ PENTING tentang ref_id:
  • ref_id harus unik per reseller. Gunakan ID transaksi dari sistem Anda.
  • Jika Anda kirim ref_id yang 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

FieldKeterangan
invoiceNomor invoice yang dibuat sistem kami. Simpan ini untuk cek status.
ref_idref_id yang Anda kirim
statuspending, processing, success, atau failed
serial_numberUntuk produk seperti token PLN, berisi nomor serinya
messagePesan human-readable dalam Bahasa Indonesia
is_refundedtrue jika transaksi gagal dan saldo sudah dikembalikan

Possible Errors

StatusKodePenyebab
400VALIDATION_ERRORField wajib tidak terisi
400INSUFFICIENT_BALANCESaldo tidak cukup
404PRODUCT_NOT_FOUNDproduct_code tidak valid
409DUPLICATE_REF_IDref_id sudah dipakai (biasanya dikembalikan sebagai sukses, bukan error)
502SUPPLIER_ERRORSupplier sedang bermasalah

Cek Status Transaksi

Melihat status transaksi terbaru. Sistem akan otomatis re-cek ke supplier jika status masih pending/processing.

GET /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"
    }
  }
}
Tip: Lebih baik pakai webhook daripada polling. Lihat bagian Webhook.

Riwayat Transaksi

Melihat semua transaksi reseller. Bisa difilter dan paginated.

GET /api/v1/transactions

Query Parameters

ParameterTipeDefaultKeterangan
pageinteger1Halaman
limitinteger20Data per halaman (max 100)
statusstring-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:

pending

Transaksi diterima, sedang diproses internal

processing

Dikirim ke supplier, menunggu respons

success

Transaksi berhasil

failed

Gagal — saldo dikembalikan otomatis

Status Detail

StatusArtiFinal?
pendingSedang diantreTidak
processingSedang diproses supplierTidak
successBerhasil, produk terkirim ke destinationYa
failedGagal. Cek is_refunded — biasanya trueYa

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.

Coming Soon: Fitur webhook untuk reseller sedang dalam pengembangan. Untuk saat ini, gunakan polling via GET /api/v1/transactions/:ref setiap 5-10 detik untuk transaksi yang masih pending.

Polling Strategy (Sementara)

Rekomendasi strategi polling untuk efisiensi:

  1. Setelah POST /api/v1/transactions, tunggu 5 detik.
  2. Cek status dengan GET /api/v1/transactions/:ref.
  3. Jika masih pending/processing, tunggu 10 detik lagi.
  4. Ulangi max 12x (total ~2 menit).
  5. Jika belum final setelah 2 menit, cukup cek sekali lagi setiap 5 menit.
  6. 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.