Authentication

API Keys

Setiap permintaan ke endpoint harus mengirimkan header client-id dan client-secret. Pastikan untuk selalu menggunakan kredensial yang valid.

Content-Type: application/json
client-id: YOUR_CLIENT_ID
client-secret: YOUR_CLIENT_SECRET

Parameters

NameTypeEndpointDescription
Content-TypeHeadersemua endpointapplication/json
client-idHeadersemua endpointstring - di generate oleh server
client-secretHeadersemua endpointstring - di generate oleh server
usernameBodysemua endpointstring - di generate oleh server
passwordBodysemua endpointstring - di generate oleh server
pinBodysemua endpointstring - di generate oleh server
signatureBody/transactionstring (opsional) - di generate oleh client
productBody/transactionstring - diisi dengan kode produk
qtyBody/transactioninteger - default nilai adalah 1. isi sesuai nominal untuk produk open denom seperti e-wallet dan trf-bank
destBody/transactionstring - diisi dengan tujuan transaksi. panjang minimal 5 karakter dan maksimal 25 karakter.
trxidBody/transactionstring - diisi dengan ID transaksi unik untuk setiap transaksi
amountBody/ticketinteger - isi sesuai nominal deposit (endpoint /ticket)

Endpoints

Base URL

http://103.135.49.166:5857

Noted : Silahkan tanyakan ke admin untuk mendapatkan base url

Format Request

POST/transaction

format request transaksi tanpa Signature.

curl --location '{base_url}/api/transaction' \
 -H "Content-Type: application/json" \
 -H "client-id: YOUR_CLIENT_ID" \
 -H "client-secret: YOUR_CLIENT_SECRET" \
 -d '{
   "username": "[username]",
   "password": "[password]",
   "pin": "[pin]",
   "product": "[kode_produk]",
   "qty": "[qty]",
   "dest": "[tujuan]",
   "trxid": "[trxid]"
 }' \
 

format request transaksi dengan Signature.

curl --location '{base_url}/api/transaction' \
 -H "Content-Type: application/json" \
 -H "client-id: YOUR_CLIENT_ID" \
 -H "client-secret: YOUR_CLIENT_SECRET" \
 -d '{
   "username": "[username]",
   "sign": "[signature]",
   "product": "[kode_produk]",
   "qty": "[qty]",
   "dest": "[tujuan]",
   "trxid": "[trxid]"
 }' \
function generateSignatureTransaction(username, product, dest, trxid, pin, password) {

const str = `OtomaX|${username.toUpperCase()}|${product.toUpperCase()}|${dest}|${trxid}|${pin}|${password}`;

// Hash string menggunakan SHA-1 dan konversi ke Base64
const hash = crypto.createHash('sha1').update(str, 'utf8').digest();
const base64UrlSafe = Buffer.from(hash).toString('base64')
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');

return base64UrlSafe;
}
POST/balance

format request cek saldo tanpa Signature.

curl --location '{base_url}/api/balance' \
-H "Content-Type: application/json" \
-H "client-id: YOUR_CLIENT_ID" \
-H "client-secret: YOUR_CLIENT_SECRET" \
-d '{
 "username": "[username]",
 "password": "[password]",
 "pin": "[pin]"
}' \

format request cek saldo dengan Signature.

curl --location '{base_url}/api/balance' \
-H "Content-Type: application/json" \
-H "client-id: YOUR_CLIENT_ID" \
-H "client-secret: YOUR_CLIENT_SECRET" \
-d '{
 "username": "[username]",
 "sign": "[signature]"
}' \
function generateSignatureBalance(username, pin, password) {

const str = `OtomaX|CheckBalance|${username.toUpperCase()}|${pin}|${password}`;

// Hash string menggunakan SHA-1 dan konversi ke Base64
const hash = crypto.createHash('sha1').update(str, 'utf8').digest();
const base64UrlSafe = Buffer.from(hash).toString('base64')
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');

return base64UrlSafe;
}
POST/ticket

format request tiket deposit tanpa Signature.

curl --location '{base_url}/api/ticket' \
-H "Content-Type: application/json" \
-H "client-id: YOUR_CLIENT_ID" \
-H "client-secret: YOUR_CLIENT_SECRET" \
-d '{
 "username": "[username]",
 "password": "[password]",
 "pin": "[pin]",
 "amount": "[amount]"
}' \

format request tiket deposit dengan Signature.

curl --location '{base_url}/api/ticket' \
-H "Content-Type: application/json" \
-H "client-id: YOUR_CLIENT_ID" \
-H "client-secret: YOUR_CLIENT_SECRET" \
-d '{
 "username": "[username]",
 "sign": "[signature]",
 "amount": "[amount]"
}' \ 
function generateSignatureTicket(username, pin, password) {
const str = `OtomaX|Ticket|${username.toUpperCase()}|${pin}|${password}`;

// Hash string menggunakan SHA-1 dan konversi ke Base64
const hash = crypto.createHash('sha1').update(str, 'utf8').digest();
const base64UrlSafe = Buffer.from(hash).toString('base64')
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');

return base64UrlSafe;
}
GET/product

format cek produk.


curl --location '{base_url}/api/product' \
--header 'client-id: xxx' \
--header 'client-secret: xxx'
            

format cek produk berdasarkan operator.


curl --location '{base_url}/api/product?operator=telkomsel' \
--header 'client-id: xxx' \
--header 'client-secret: xxx'
            

format cek produk berdasarkan kode produk.


curl --location '{base_url}/api/product?kode=S5' \
--header 'client-id: xxx' \
--header 'client-secret: xxx'
            

Contoh Response

respon invalid client-id :

{
  "status": "error",
  "message": "Headers client-id are invalid"
}

respon invalid client-secret :

{
  "status": "error",
  "message": "Headers client-secret are invalid"
}

respon member tidak ditemukan :

{
  "status": "error",
  "message": "Transaction not processed",
  "response": {
      "rc": 99,
      "data": null,
      "details": "Member not found"
  }
}

respon invalid signature :

{
  "status": "error",
  "message": "Transaction not processed",
  "response": {
      "rc": 99,
      "data": null,
      "details": "Invalid Signature"
  }
}

respon transaksi pending :

{
  "status": "success",
  "message": "Transaction processed successfully",
  "response": {
      "rc": 00,
      "data": {
          "qty": 1,
          "produk": "xxx",
          "tujuan": "xxx",
          "status": "Pending",
          "sn": null,
          "ket": "Transaksi Sedang Di Proses",
          "hrg": 0,
          "sal": 0,
          "cid": 0,
          "sid": 0
      },
      "details": "xxx"
  }
}

respon transaksi sukses :

{
  "status": "success",
  "message": "Transaction processed successfully",
  "response": {
      "rc": 20,
      "data": {
        "qty": 1,
        "produk": "xxx",
        "tujuan": "xxx",
        "status": "Pending",
        "sn": null,
        "ket": "Transaksi Sedang Di Sukses",
        "hrg": 0,
        "sal": 0,
        "cid": 0,
        "sid": 0
      },
      "details": "xxx"
  }
}
respon transaksi gagal :

{
  "status": "success",
  "message": "Transaction processed successfully",
  "response": {
      "rc": 40,
      "data": {
        "qty": 1,
        "produk": "xxx",
        "tujuan": "xxx",
        "status": "Gagal",
        "sn": null,
        "ket": "Transaksi Sedang Di Gagal",
        "hrg": 0,
        "sal": 0,
        "cid": 0,
        "sid": 0
      },
      "details": "xxx"
  }
}
            
Callback

post to url callback : 
{
  "rc": "20",
  "data": {
    "qty": 1,
    "produk": "xxx",
    "tujuan": "xxx",
    "status": "Sukses",
    "ref": "xxx",
    "ket": null,
    "hrg": 0,
    "sal": 0,
    "cid": "10010002",
    "sid": 32887950
  },
  "details": "xxx"
}
            

Status Codes

CodeStatusDescription
0-5PendingTransaction is being processed
20SuccessTransaction completed successfully
40FailedUndefined biller
44FailedInvalid product
45FailedOut of stock
47FailedProduct error
50FailedCancelled
51FailedInsufficient balance
52FailedInvalid target number
53FailedOut of coverage area
54FailedArea code mismatch
55FailedUndefined biller
56FailedBlacklisted number
58FailedInactive number
59FailedIncorrect price
60FailedNo data available
61FailedIncorrect quantity
62FailedDaily limit reached
63FailedReseller suspended
65FailedInsufficient units
67FailedGroup disallowed
69FailedCutoff
DefaultUnknownStatus not registered