Bills

Inquire and pay customer bills (currently Telkomsel OMNI).

Connection settings
No credentials set.

Bill payment flow

Illustrates the two steps used to pay a bill rather than a top-up.

  1. Inquiry: send the bill product + customer number. The platform returns the amount owed, fees, and a payment window (expiredTime).
  2. Pay: re-send the same transactionId + customerId + productId to settle the pending inquiry. It is accepted as Pending from 201 and finishes via webhook.
Match the inquiry

The platform only accepts a Pay when a matching Inquiry status bill exists for the same transactionId and customerId. Always inquire first, then pay within the returned expiry.

POST /api/v2/bill/inquiry Requires auth

Queries the biller for the outstanding amount of a customer's bill.

Headers

HeaderRequiredDescription
useridRequiredAccount user ID.
api-keyRequiredAccount client API key.

Body parameters

FieldTypeRequiredDescription
transactionIdstringRequiredIdentifier for this billing request.
customerIdstringRequiredCustomer number / account to inquire (e.g. Telkomsel number for OMNI).
productIdstringRequiredBill product code, e.g. telkomselomni.
curl -X POST "http://localhost:4907/api/v2/bill/inquiry" \
  -H "userid: " \
  -H "api-key: " \
  -H "Content-Type: application/json" \
  -d '{
    "transactionId": "BILL-20260907-0001",
    "customerId": "+628123456789",
    "productId": "telkomselomni"
  }'
Example response
{
  "code": 200,
  "status": "Success",
  "data": {
    "action": "Inquiry",
    "balance": 984000,
    "category": "Mobile",
    "date": "2026-09-07T08:00:00.000Z",
    "customerId": "+628123456789",
    "id": "B220907000001",
    "message": "",
    "notes": "",
    "status": "Inquiry",
    "transactionId": "BILL-20260907-0001",
    "type": "Bill",
    "userId": "",
    "product": {
      "paymentCode": "09123456",
      "customerId": "+628123456789",
      "customerName": "BUDI SANTOSO",
      "price": 150000,
      "expiredTime": "2026-09-07T09:00:00.000Z",
      "name": "OMNI Paket Serba 1",
      "info": "Paket Serba 1",
      "detail": "Rp 150.000",
      "allowance": "Bulanan",
      "validity": "30 Hari",
      "fee": 2000
    },
    "price": 150000,
    "priceAdminFee": 1000,
    "priceDisclaimer": 1000,
    "priceSubTotal": 152000,
    "user": {
      "userId": "",
      "name": "",
      "email": "ops@example.com",
      "status": "Active",
      "validate": true,
      "platform": { "key": "***", "balance": 984000 }
    }
  }
}
FieldTypeDescription
product.paymentCodestringBiller payment code for this bill.
product.customerNamestringBill holder name as registered at the biller.
product.pricenumberOutstanding bill amount in IDR.
product.expiredTimestringISO 8601 deadline; pay before this time.
product.feenumberTotal admin fee (priceAdminFee + priceDisclaimer).
priceSubTotalnumberTotal charged from the account balance on pay.
statusstringInquiry, later Pending, Success, or Error.
Try it
POST /api/v2/bill/pay Requires auth

Pays a bill that was previously confirmed with an inquiry. Accepted as Pending; finishes via webhook.

Body parameters

FieldTypeRequiredDescription
transactionIdstringRequiredSame value used in the inquiry.
customerIdstringRequiredCustomer number from the inquiry.
productIdstringRequiredBill product code from the inquiry.
curl -X POST "http://localhost:4907/api/v2/bill/pay" \
  -H "userid: " \
  -H "api-key: " \
  -H "Content-Type: application/json" \
  -d '{
    "transactionId": "BILL-20260907-0001",
    "customerId": "+628123456789",
    "productId": "telkomselomni"
  }'
Example response
{
  "code": 201,
  "status": "Pending",
  "data": {
    "action": "Pay",
    "balance": 832000,
    "category": "Mobile",
    "date": "2026-09-07T08:05:00.000Z",
    "customerId": "+628123456789",
    "id": "B220907000001",
    "message": "",
    "notes": "",
    "status": "Pending",
    "transactionId": "BILL-20260907-0001",
    "type": "Bill",
    "userId": "",
    "product": {
      "paymentCode": "09123456",
      "customerId": "+628123456789",
      "customerName": "BUDI SANTOSO",
      "price": 150000,
      "expiredTime": "2026-09-07T09:00:00.000Z",
      "name": "OMNI Paket Serba 1",
      "info": "Paket Serba 1",
      "detail": "Rp 150.000",
      "allowance": "Bulanan",
      "validity": "30 Hari",
      "fee": 2000
    },
    "price": 150000,
    "priceAdminFee": 1000,
    "priceDisclaimer": 1000,
    "priceSubTotal": 152000,
    "user": {
      "userId": "",
      "name": "",
      "email": "ops@example.com",
      "status": "Active",
      "validate": true,
      "platform": { "key": "***", "balance": 832000 }
    }
  }
}
Try it