Public API untuk Extension

Dokumentasi API publik untuk pengembangan extension

Panduan Public API untuk Extension

Dokumen ini ditujukan untuk developer yang ingin membuat extension, dashboard eksternal, bot, middleware, atau layanan tambahan yang terhubung ke backend Hexaflate.

API ini adalah boundary resmi untuk integrasi. Jangan membaca database Otomax atau database Hexaflate langsung dari extension kecuali extension tersebut memang komponen internal yang dikelola oleh owner server.


Base URL

Gunakan URL backend yang sama dengan aplikasi mobile.

https://backend-domain-anda.com/v1

Contoh endpoint penuh:

https://backend-domain-anda.com/v1/products?limit=100&search_term=telkomsel

Header Umum

Semua endpoint REST publik saat ini berada di bawah /v1. Header legacy seperti X-Token, Session-Key, Auth-Seed tidak dipakai sebagai header publik di /v1. Gunakan satu header Authorization.

Untuk endpoint yang membutuhkan user session:

Authorization: <backend-x-token>:<identifier>:<key>

Format alternatif yang juga diterima adalah Base64 dari nilai di atas:

Authorization: Bearer <base64(backend-x-token-identifier-key)>

Extension mendapatkan identifier dan key dari WebView encrypted authorization yang dikirim oleh aplikasi saat membuka WebView extension (lihat bagian selanjutnya).

Endpoint monitoring seperti /health berada di root backend, bukan /v1, dan tidak membutuhkan header session.

Untuk extension third-party, pola yang disarankan adalah extension menerima identitas user dari WebView encrypted authorization, lalu backend extension memanggil API Hexaflate hanya jika memang diberi akses oleh owner server.


Extension Dibuka dari WebView Screen

Extension Hexaflate umumnya dibuka melalui menu dengan route WebView. Jadi extension tidak perlu membuat flow login sendiri. Data user, session, dan token bisa dikirim dari konfigurasi WebView screen arguments.

Di admin panel, buka konfigurasi menu WebView, lalu isi URL dan Custom Headers. Placeholder bisa dipasang di URL maupun header. Saat user membuka WebView, aplikasi mengganti placeholder tersebut dengan nilai session/user yang sedang aktif.

Peringatan: placeholder sensitif seperti {{identifier}}, {{key}}, dan {{x_token}} hanya boleh dikirim ke URL/domain yang dikenal dan dipercaya. Jangan memasang sensitive header atau query parameter pada URL acak, URL milik pihak yang tidak diverifikasi, atau halaman yang bisa diubah oleh pihak lain.

Placeholder penting untuk extension:

PlaceholderIsi
{{identifier}}Identifier user aktif.
{{key}}Key session user aktif.
{{x_token}}Token backend untuk bagian pertama Authorization.
{{user_id}} atau {{kode}}ID/kode user.
{{nama}}Nama user/toko.
{{email}}Email user jika tersedia.
{{saldo}}Saldo user.
{{komisi}}Komisi user.
{{poin}}Poin user.
{{encrypted_authorization}}Payload authorization terenkripsi untuk integrasi yang tidak ingin menerima session mentah.

Contoh mengirim credential lewat URL:

https://extension.example.com/start?user_id={{kode}}&identifier={{identifier}}&key={{key}}

Contoh mengirim credential lewat Custom Headers:

{
  "X-User-ID": "{{kode}}",
  "Authorization": "{{x_token}}:{{identifier}}:{{key}}"
}

Jika extension perlu memanggil API Hexaflate dari server extension, extension bisa menerima nilai tersebut dari WebView, lalu backend extension meneruskannya sebagai header Authorization API. Jangan expose token dan session ke halaman publik di luar konteks WebView aplikasi.


Response dan Error

Tidak semua endpoint memakai envelope response yang sama. Ada endpoint yang mengembalikan object, array, atau response pass-through dari Otomax/config.

Pola response sukses yang umum:

{
  "success": true,
  "message": "Operation completed"
}

Pola response gagal yang umum:

{
  "success": false,
  "message": "Not found"
}

HTTP status yang perlu ditangani extension:

StatusArti
400Body atau query tidak valid.
401Token atau session tidak valid.
403Akses ditolak.
404Data tidak ditemukan.
429Rate limit.
503Service, database, cache, atau node leader tidak siap.

Untuk transaksi, jangan retry otomatis hanya karena timeout. Cek status transaksi terlebih dahulu dengan /history atau /details_trx.


ID Transaksi

Untuk membuat transaksi dari extension, endpoint transaksi dapat diakses melalui API internal server. Hubungi owner server untuk detail implementasi transaksi dari sisi extension.

trxid dipakai backend untuk mendeteksi transaksi berulang. Jika trxid yang sama dikirim lagi untuk kombinasi transaksi yang sama, misalnya produk dan nomor tujuan yang sama, backend akan menolak transaksi tersebut.

Simpan trxid di database extension sebelum memanggil API. Untuk transaksi baru, naikkan angka tersebut. Jika request timeout, gunakan trxid tersebut untuk rekonsiliasi, bukan membuat transaksi baru tanpa pengecekan.


User dan Profil

GET /infouser

Mengambil data user dari session yang sedang digunakan.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Request:

GET /infouser HTTP/1.1

Response example:

{
  "kode": "OX17",
  "nama": "OX RELOAD",
  "nama_pemilik": null,
  "alamat": "Pdg",
  "email": null,
  "saldo": 2516,
  "kode_level": "MBK00"
}

Catatan: field dapat mengikuti struktur data reseller pada instalasi Otomax.

GET /senders

Mengambil nomor pengirim/sender yang terdaftar untuk user.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Request:

GET /senders HTTP/1.1

Response example:

[
  {
    "pengirim": "+62852656356582",
    "tipe_pengirim": "S",
    "kode_reseller": "OX01"
  },
  {
    "pengirim": "+6285215258485",
    "tipe_pengirim": "W",
    "kode_reseller": "OX17"
  }
]

Produk dan Operator

GET /products

Mengambil daftar produk dan harga final untuk user session.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Query parameters:

ParameterTipeWajibKeterangan
operatorsstringTidakKode operator dipisah koma, contoh TELKOMSEL,INDOSAT.
limitnumberTidakBatas jumlah produk.
search_termstringTidakFilter nama/kode produk.
operator_filterstringTidakFilter operator tambahan.
ignore_freebooleanTidakJika true, produk gratis dapat diabaikan sesuai konfigurasi.

Request:

GET /products?operators=TELKOMSEL&limit=50&search_term=data&ignore_free=true HTTP/1.1

Response example:

[
  {
    "kode": "SCH10",
    "nama": "Telkomsel10",
    "harga_jual": 10120,
    "aktif": 1,
    "gangguan": 0,
    "kode_operator": "S",
    "kosong": 0,
    "harga_tetap": 1,
    "sms_end_user": 0,
    "postpaid": 0,
    "poin": 0,
    "rumus_harga": 0,
    "qty": null,
    "operator_nama": "Telkomsel"
  },
  {
    "kode": "DNF200",
    "nama": "DANA 200.000",
    "harga_jual": 200084,
    "aktif": 1,
    "gangguan": 0,
    "kode_operator": "DANA",
    "kosong": 0,
    "harga_tetap": 1,
    "sms_end_user": 0,
    "postpaid": 0,
    "poin": 0,
    "rumus_harga": 0,
    "qty": null,
    "operator_nama": "DANA"
  }
]

GET /operators

Mengambil data operator.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Query parameters:

ParameterTipeWajibKeterangan
operatorsstringTidakKode operator dipisah koma. Jika kosong, backend dapat mengembalikan semua operator yang tersedia.

Request:

GET /operators?operators=TELKOMSEL,INDOSAT HTTP/1.1

Response example:

[
  {
    "kode": "TELKOMSEL",
    "nama": "Telkomsel",
    "catatan": "TSEL,TELKOMSEL"
  }
]

GET /operator-list

Mengambil list operator yang dapat dipakai untuk filter produk.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Request:

GET /operator-list HTTP/1.1

Response example:

[
  {
    "kode": "TELKOMSEL",
    "nama": "Telkomsel"
  },
  {
    "kode": "INDOSAT",
    "nama": "Indosat"
  }
]

Transaksi

GET /history

Mengambil riwayat transaksi user.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Query parameters:

ParameterTipeWajibKeterangan
cursorstringTidakCursor halaman berikutnya.
page_sizenumberTidakJumlah data per halaman, contoh 30.
tgl_startstringTidakTanggal awal filter.
tgl_endstringTidakTanggal akhir filter.
statusstringTidakFilter status transaksi.
deststringTidakFilter tujuan.

Request:

GET /history?page_size=30&status=&dest= HTTP/1.1

Response example:

{
  "data": [
    {
      "kode": "1234567890",
      "tanggal": "2026-06-27 10:00:00",
      "produk": "TSEL10",
      "tujuan": "628123456789",
      "status": "SUKSES",
      "harga": 10700,
      "sn": "SN123456"
    }
  ],
  "next_cursor": "cursor-value",
  "has_more": true
}

GET /details_trx

Mengambil detail transaksi.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Query parameters:

ParameterTipeWajibKeterangan
kodestringYa jika kode_inbox kosongKode transaksi.
kode_inboxstringTidakKode inbox jika detail dicari dari inbox.

Request:

GET /details_trx?kode=1234567890 HTTP/1.1

Response example:

{
  "kode": "1234567890",
  "status": "SUKSES",
  "produk": "TSEL10",
  "tujuan": "628123456789",
  "harga": 10700,
  "serial_number": "SN123456",
  "message": "Transaksi sukses"
}

GET /receipt

Mengambil receipt transaksi.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Query parameters:

ParameterTipeWajibKeterangan
kodestringYaKode transaksi.

Request:

GET /receipt?kode=1234567890 HTTP/1.1

Response example:

{
  "success": true,
  "data": {
    "title": "Struk Transaksi",
    "kode": "1234567890",
    "tanggal": "2026-06-27 10:00:00",
    "produk": "TSEL10",
    "tujuan": "628123456789",
    "status": "SUKSES",
    "sn": "SN123456",
    "total": 10700
  }
}

Tiket Deposit

GET /tiketstatus

Mengecek status tiket deposit.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Query parameters:

ParameterTipeWajibKeterangan
tiketsstringYaSatu atau beberapa kode tiket dipisah koma.

Request:

GET /tiketstatus?tikets=TKT12345,TKT12346 HTTP/1.1

Response example:

[
  {
    "kode_tiket": "TKT12345",
    "nominal": 100000,
    "status": "PENDING"
  }
]

Saldo, Mutasi, Poin, Komisi, Hadiah

GET /balanceid

Menampilkan saldo dan ID user.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Request:

GET /balanceid HTTP/1.1

Response example:

{
  "balance": 1250000,
  "id": "RS001"
}

GET /estatement

Mengambil mutasi saldo user.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Query parameters:

ParameterTipeWajibKeterangan
cursorstringTidakCursor halaman berikutnya.
page_sizenumberTidakJumlah data per halaman.
tgl_startstringTidakTanggal awal.
tgl_endstringTidakTanggal akhir.
keteranganstringTidakFilter keterangan.

Request:

GET /estatement?page_size=30&keterangan= HTTP/1.1

Response example:

{
  "data": [
    {
      "tanggal": "2026-06-27 10:00:00",
      "keterangan": "TRX TSEL10 628123456789",
      "debet": 10700,
      "kredit": 0,
      "saldo_akhir": 1250000
    }
  ],
  "next_cursor": "cursor-value",
  "has_more": true
}

GET /poinid

Mengambil jumlah poin user.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Response example:

{
  "id": "RS001",
  "poin": 2500
}

GET /poininfo

Mengambil informasi aturan penukaran poin.

Headers:

Authorization: <backend-x-token>

Response example:

{
  "enabled": true,
  "rate": 1,
  "minimum_exchange": 1000,
  "description": "1000 poin dapat ditukar sesuai konfigurasi server"
}

GET /komisi

Mengambil jumlah komisi user.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Response example:

{
  "success": true,
  "message": "Commission exchange submitted",
  "data": {
    "amount": 50000,
    "status": "PENDING"
  }
}

GET /list_hadiah

Mengambil daftar hadiah.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Response example:

[
  {
    "id": 1,
    "nama": "Voucher Belanja",
    "poin": 1000,
    "aktif": true
  }
]

GET /check_exchanged_hadiah

Mengecek hadiah yang sudah ditukar user.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Response example:

[
  {
    "hadiah_id": 1,
    "nama": "Voucher Belanja",
    "status": "PENDING",
    "created_at": "2026-06-27 10:00:00"
  }
]

Referral dan Downline

GET /referral

Mengambil daftar kode referral.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Response example:

[
  {
    "id": "RS001",
    "referal": "REFCODE123",
    "markup": 5
  }
]

GET /listDownline

Mengambil daftar downline dari referral user.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Response example:

[
  {
    "id": "RS010",
    "nama": "Downline 1",
    "referal": "REFCODE123",
    "markup": 5
  }
]

GET /revrefcheck

Mengecek pemilik atau status kode referral.

Headers:

Authorization: <backend-x-token>:<identifier>:<key>

Query parameters:

ParameterTipeWajibKeterangan
referralstringYaKode referral yang dicek.

Request:

GET /revrefcheck?referral=REFCODE123 HTTP/1.1

Response example:

{
  "exists": true,
  "id": "RS001",
  "referral": "REFCODE123"
}

Feedback

POST /feedback

Mengirim feedback dari user atau extension.

Headers:

Content-Type: application/json

Body:

{
  "feedback": "Fitur berjalan baik",
  "name": "Budi",
  "user_id": "RS001"
}

Response example:

{
  "success": true,
  "message": "Feedback submitted successfully"
}

Health

Endpoint monitoring berada di root backend, bukan /v1, dan tidak membutuhkan header session.

GET /health

Basic health check.

Response example:

{
  "status": "healthy",
  "timestamp": "2026-06-27T10:00:00Z"
}

Minimal Client JavaScript

const baseUrl = "https://backend-domain-anda.com/v1";

function authorizationHeader() {
  const parts = [
    process.env.HEXAFLATE_X_TOKEN,
    process.env.HEXAFLATE_IDENTIFIER,
    process.env.HEXAFLATE_KEY,
  ];
  return parts.join(":");
}

async function api(path, options = {}) {
  const response = await fetch(baseUrl + path, {
    ...options,
    headers: {
      "Authorization": authorizationHeader(),
      "Content-Type": "application/json",
      ...options.headers,
    },
  });

  const text = await response.text();
  const body = text ? JSON.parse(text) : null;

  if (!response.ok) {
    throw new Error(body?.message || `Hexaflate API error ${response.status}`);
  }

  return body;
}

const user = await api("/infouser");
const products = await api("/products?limit=100&search_term=telkomsel");

Extension Security Checklist

  • Jangan expose nilai Authorization, x_token, identifier, key, atau App Check token di frontend publik.
  • Simpan credential hanya di backend extension atau secure storage yang disetujui owner server.
  • Gunakan HTTPS untuk semua request.
  • Catat semua transaksi extension dengan trxid, user id, IP, timestamp, dan response backend.
  • Jangan retry endpoint mutasi tanpa idempotency atau pengecekan status.
  • Validasi input user sebelum meneruskan request ke backend Hexaflate.
  • Batasi endpoint yang dapat dipanggil extension sesuai kebutuhan bisnis.