BukuWarung Apps for MSMEs icon

BukuWarung data API: Saldo, Tagih, Bayar and QRIS

PT Buku Usaha Digital · Payments

BukuWarung Apps for MSMEs is the Indonesian warung-and-kiosk bookkeeping app from Jakarta-based PT Buku Usaha Digital. Shopkeepers keep a running Catat Utang credit book, log Catat Transaksi sales, run Mode Kasir at the till and manage Kelola Stok inventory, then collect and pay through Tagih invoices sent to customers, Bayar payouts to suppliers, and a Bank Indonesia QRIS plate. A Saldo wallet funds PPOB counters for Pulsa, listrik tokens, e-wallet top-ups, Paket Data, BPJS, PDAM and Kereta Api tickets; KTP KYC and KYB unlock higher limits, EDC terminals sit next to the till, and BukuPoin loyalty tracks referrals. Copy is Bahasa Indonesia, amounts are IDR, and the app is Indonesia-only — competing with digital ledgers such as Khatabook-style notebooks on one side and merchant QRIS apps such as GoPay Merchant and DANA Bisnis on the other.

Saldo wallets split amount from the subBalance cashback pocket, then gate spends with debitDaily, debitMonthlyLimit and isSaldoFreezed. Tagih collect rows stamp paymentRequestId, invoiceUrl, expiredAt and receivedAmount after a quote of fee, discountFee, totalTransfer, remainingFreeQuota and loyaltyDiscount; Bayar disbursements return disbursementId, checkoutUrl and virtualAccount. KYC-gated caps sit in paymentInLimits, paymentOutLimits and totalTrxCountLimit.

QRIS plates carry qrisCode, kycStatus, kybStatus and qrisStatus, while the settlement dashboard splits disbursedPayments from toBeDisbursedPayments. Destination banks list accountHolderName, bankCode, isQrisBank and matchingStatus. Cash-book sync posts balance, capitalBalance and cashCategoryId so the till matches the cloud ledger. BukuPoin tracks activePoints and tierId; BNPL rows expose availableLimit and maxLoanLimit; PPOB receipts add purchaseType, items and totalBonus. Lending and ERP bots reconcile those collect, payout and QRIS rows nightly; PPOB aggregators read order status and items; treasury watches qrisStatus against the pending split; openData Studio turns the same fields into callable open data.

Screenshots

  • BukuWarung Apps for MSMEs screenshot 1
  • BukuWarung Apps for MSMEs screenshot 2
  • BukuWarung Apps for MSMEs screenshot 3
  • BukuWarung Apps for MSMEs screenshot 4
  • BukuWarung Apps for MSMEs screenshot 5
  • BukuWarung Apps for MSMEs screenshot 6
  • BukuWarung Apps for MSMEs screenshot 7

API surface

The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.

  • OTP verify and session tokens

    POST /v1/session/otp osint

    Exchanges the SMS OTP for idToken and sessionToken that gate later Saldo, Tagih, Bayar and QRIS calls.

    Auth: Unauthenticated. Body carries phone, otp, countryCode, deviceId, userId, action, clientId and clientSecret. Response idToken is sent as X-Authorization-Firebase; sessionToken (and later accessToken) go out as Authorization: Bearer. Expired sessions retry with refreshToken.

    • phone
    • otp
    • countryCode
    • deviceId
    • userId
    • action
    • clientId
    • clientSecret
    • success
    • idToken
    • sessionToken
    • newUser
    • message
    POST /v1/session/otp HTTP/1.1
    Content-Type: application/json
    
    {
      "phone": "081234567890",
      "otp": "123456",
      "countryCode": "+62",
      "deviceId": "dvc-8c21f0ab",
      "userId": "usr-10482",
      "action": "LOGIN",
      "clientId": "<client-id>",
      "clientSecret": "<client-secret>"
    }
    {
      "success": true,
      "idToken": "<id-token>",
      "sessionToken": "<session-token>",
      "newUser": false,
      "message": "ok"
    }
  • Signed-in user profile

    GET /v1/shopkeepers/me osint

    Reads the signed-in shopkeeper card: userId, phone, email, dateOfBirth and profile image used across the book and payments screens.

    Auth: Bearer sessionToken from OTP login; X-Authorization-Firebase idToken.

    • userId
    • userName
    • userPhone
    • userEmail
    • dateOfBirth
    • userProfileImageUrl
    • gender
    • createdAt
    GET /v1/shopkeepers/me HTTP/1.1
    Authorization: Bearer <session-token>
    X-Authorization-Firebase: <id-token>
    {
      "userId": "usr-10482",
      "userName": "Budi Santoso",
      "userPhone": "081234567890",
      "userEmail": "[email protected]",
      "dateOfBirth": "1990-04-12",
      "userProfileImageUrl": "https://cdn.example/u/10482.jpg",
      "gender": "M",
      "createdAt": "2022-07-01T08:00:00Z"
    }
  • Payment account metadata

    GET /v1/ledger/account-flags openfinance

    Loads fee, KYC and QRIS flags plus remainingFreeQuota, remainingFullCbQuota and cashbackAmount shown before a Tagih or Bayar.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • fee
    • kyc
    • qris
    • remainingFreeQuota
    • remainingFullCbQuota
    • cashbackAmount
    GET /v1/ledger/account-flags HTTP/1.1
    Authorization: Bearer <access-token>
    X-Authorization-Firebase: <id-token>
    {
      "fee": {
        "collectFee": 2500
      },
      "kyc": {
        "kycVerified": true
      },
      "qris": {
        "enabled": true
      },
      "remainingFreeQuota": 8,
      "remainingFullCbQuota": 2,
      "cashbackAmount": 10000.0
    }
  • Payment whitelist limits

    GET /v1/ledger/cap-table openfinance

    Returns KYC-gated Tagih (paymentInLimits) and Bayar (paymentOutLimits) caps plus totalTrxCountLimit that block a collect or payout when the ceiling is hit.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • whitelistLimits
    • paymentInLimits
    • paymentOutLimits
    • totalTrxCountLimit
    GET /v1/ledger/cap-table HTTP/1.1
    Authorization: Bearer <access-token>
    X-Authorization-Firebase: <id-token>
    {
      "whitelistLimits": {
        "paymentInLimits": {
          "dailyLimit": 50000000
        },
        "paymentOutLimits": {
          "dailyLimit": 25000000
        },
        "totalTrxCountLimit": 40
      }
    }
  • Create Tagih collect

    POST /v1/invoices/{accountId}/requests/{customerId} openbanking

    Creates a Tagih collect for one customer and returns paymentRequestId, invoiceUrl, expiredAt and status used on the share-and-wait screen.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • accountId
    • customerId
    • customerName
    • transactionId
    • paymentRequestId
    • amount
    • fee
    • discount
    • receivedAmount
    • invoiceUrl
    • shareUrlTemplate
    • expiredAt
    • status
    • description
    • bankAccountId
    • paymentMethod
    • paymentChannel
    • transactionType
    • paymentCategoryId
    • referenceId
    • receiverBank
    POST /v1/invoices/acc-88100214/requests/cust-1a2b HTTP/1.1
    Authorization: Bearer <access-token>
    X-Authorization-Firebase: <id-token>
    Content-Type: application/json
    
    {
      "accountId": "acc-88100214",
      "customerId": "cust-1a2b",
      "customerName": "Mona Said",
      "amount": 150000,
      "description": "Tagihan mingguan",
      "bankAccountId": "ba-991",
      "paymentMethod": "VA",
      "paymentChannel": "BCA"
    }
    {
      "accountId": "acc-88100214",
      "customerId": "cust-1a2b",
      "customerName": "Mona Said",
      "transactionId": "trx-20261012-4419",
      "paymentRequestId": "pr-88c21",
      "amount": 150000,
      "fee": 2500,
      "discount": 0,
      "receivedAmount": 0,
      "invoiceUrl": "https://pay.example/i/pr-88c21",
      "shareUrlTemplate": "https://pay.example/s/{id}",
      "expiredAt": "2026-10-13T17:00:00Z",
      "status": "PENDING",
      "description": "Tagihan mingguan",
      "bankAccountId": "ba-991",
      "paymentMethod": "VA",
      "paymentChannel": "BCA",
      "transactionType": "IN",
      "paymentCategoryId": "cat-utang",
      "referenceId": "ref-10482",
      "receiverBank": {
        "bankName": "BCA"
      }
    }
  • Tagih collect fee overview

    POST /v1/invoices/{accountId}/requests/{customerId}/quote openfinance

    Quotes fee, discountFee, totalTransfer, remainingFreeQuota and saldoCashbackAmount before the shopkeeper confirms a Tagih collect.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • amount
    • fee
    • discountFee
    • discountFeeText
    • totalTransfer
    • remainingFreeQuota
    • saldoCashbackAmount
    • destinationBankInformation
    • loyaltyDiscount
    POST /v1/invoices/acc-88100214/requests/cust-1a2b/quote HTTP/1.1
    Authorization: Bearer <access-token>
    Content-Type: application/json
    
    {
      "amount": 150000,
      "paymentMethod": "VA",
      "paymentChannel": "BCA"
    }
    {
      "amount": 150000,
      "fee": 2500.0,
      "discountFee": 500.0,
      "discountFeeText": "Kuota gratis",
      "totalTransfer": 152000,
      "remainingFreeQuota": 8,
      "saldoCashbackAmount": 1000.0,
      "destinationBankInformation": {
        "bankName": "BCA"
      },
      "loyaltyDiscount": {
        "amount": 500.0
      }
    }
  • Create Bayar disbursement

    POST /v1/payouts/{accountId}/transfers/{customerId} openbanking

    Creates a Bayar payout to a supplier or customer bank and returns disbursementId, checkoutUrl, virtualAccount and status.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • disbursementId
    • customerId
    • status
    • amount
    • fee
    • discount
    • transactionId
    • invoiceUrl
    • checkoutUrl
    • paymentInstructionsUrl
    • paymentMethod
    • paymentChannel
    • transactionType
    • description
    • virtualAccount
    • receiverBank
    • refundBankAccount
    • progress
    POST /v1/payouts/acc-88100214/transfers/cust-9c3d HTTP/1.1
    Authorization: Bearer <access-token>
    Content-Type: application/json
    
    {
      "customerId": "cust-9c3d",
      "amount": 275000,
      "description": "Bayar supplier beras",
      "paymentMethod": "BANK_TRANSFER",
      "paymentChannel": "MANDIRI"
    }
    {
      "disbursementId": "disb-20261012-19",
      "customerId": "cust-9c3d",
      "status": "PENDING",
      "amount": 275000,
      "fee": 3500,
      "discount": 0,
      "transactionId": "trx-out-7712",
      "invoiceUrl": "https://pay.example/d/disb-20261012-19",
      "checkoutUrl": "https://pay.example/c/disb-20261012-19",
      "paymentInstructionsUrl": "https://pay.example/i/disb-20261012-19",
      "paymentMethod": "BANK_TRANSFER",
      "paymentChannel": "MANDIRI",
      "transactionType": "OUT",
      "description": "Bayar supplier beras",
      "virtualAccount": {
        "vaNumber": "8800123456789012"
      },
      "receiverBank": {
        "bankName": "Mandiri"
      }
    }
  • QRIS plate status

    GET /v1/plates/qris opendata

    Reads the shop QRIS plate: qrisCode, virtualAccountId, and the kycStatus / kybStatus / qrisStatus gates that hide or show the printable code.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • virtualAccountId
    • kyc
    • qrisCode
    • kycStatus
    • kybStatus
    • qrisStatus
    • matchingStatus
    • finalStatus
    • metadata
    GET /v1/plates/qris HTTP/1.1
    Authorization: Bearer <access-token>
    X-Authorization-Firebase: <id-token>
    {
      "virtualAccountId": "va-qris-4419",
      "kyc": true,
      "qrisCode": "00020101021226680016COM.NOBUE.WWW01189360091400000012340214QRIS4419",
      "kycStatus": "APPROVED",
      "kybStatus": "APPROVED",
      "qrisStatus": "ACTIVE",
      "matchingStatus": "MATCHED",
      "finalStatus": "ACTIVE",
      "metadata": {
        "nmid": "ID1021234567890"
      }
    }
  • QRIS batch settlement dashboard

    GET /v1/plates/qris/settlements openbanking

    Splits settled QRIS scans (disbursedPayments) from still-pending payouts (toBeDisbursedPayments) and totals incoming transactionCount / transactionAmount.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • disbursedPayments
    • toBeDisbursedPayments
    • totalIncomingPayments
    • transactionCount
    • transactionAmount
    • percentage
    GET /v1/plates/qris/settlements HTTP/1.1
    Authorization: Bearer <access-token>
    X-Authorization-Firebase: <id-token>
    {
      "disbursedPayments": {
        "transactionCount": 42,
        "transactionAmount": 8750000.0,
        "percentage": 70.0
      },
      "toBeDisbursedPayments": {
        "transactionCount": 18,
        "transactionAmount": 3125000.0,
        "percentage": 30.0
      },
      "totalIncomingPayments": {
        "transactionCount": 60,
        "transactionAmount": 11875000.0
      }
    }
  • Payment and PPOB order history

    GET /v1/ledger/{accountId}/history opendata

    Lists Tagih, Bayar, QRIS, Saldo and PPOB rows (type IN / OUT / QRIS / SALDO / PULSA / LISTRIK / BPJS / PDAM) with status PENDING through COMPLETED or REFUNDED.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • orderId
    • customerId
    • displayName
    • amount
    • timestamp
    • status
    • type
    • serialNumber
    • ledgerAccountId
    GET /v1/ledger/acc-88100214/history HTTP/1.1
    Authorization: Bearer <access-token>
    X-Authorization-Firebase: <id-token>
    [
      {
        "orderId": "ord-20261012-01",
        "customerId": "cust-1a2b",
        "displayName": "Mona Said",
        "amount": 150000,
        "timestamp": "2026-10-12T09:14:00Z",
        "status": "COMPLETED",
        "type": "IN",
        "serialNumber": "SN-4419",
        "ledgerAccountId": "led-8810"
      },
      {
        "orderId": "ord-20261012-02",
        "customerId": "cust-ppob",
        "displayName": "Pulsa Telkomsel",
        "amount": 50500,
        "timestamp": "2026-10-12T10:02:00Z",
        "status": "PAID",
        "type": "PULSA"
      }
    ]
  • Finpro order detail

    GET /v1/ledger/{accountId}/history/{orderId} openfinance

    Loads one PPOB or payment order: items, payments, kybStatus, totalBonus and loyalty used on the receipt and poll screens.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • orderId
    • transactionId
    • status
    • amount
    • fee
    • cost
    • description
    • createdAt
    • purchaseType
    • kybStatus
    • totalBonus
    • items
    • payments
    • customer
    • loyalty
    • progress
    • refunds
    GET /v1/ledger/acc-88100214/history/ord-20261012-02 HTTP/1.1
    Authorization: Bearer <access-token>
    X-Authorization-Firebase: <id-token>
    {
      "orderId": "ord-20261012-02",
      "transactionId": "trx-ppob-7712",
      "status": "COMPLETED",
      "amount": 50500.0,
      "fee": 500.0,
      "cost": 50000.0,
      "description": "Pulsa Telkomsel 50rb",
      "createdAt": "2026-10-12T10:02:00Z",
      "purchaseType": "PULSA",
      "kybStatus": "APPROVED",
      "totalBonus": 1000.0,
      "items": [
        {
          "productName": "Telkomsel 50rb"
        }
      ],
      "payments": [
        {
          "paymentMethod": "SALDO"
        }
      ],
      "customer": {
        "customerId": "cust-ppob"
      },
      "loyalty": {
        "amount": 500.0
      }
    }
  • Cash-book transaction sync

    POST /v1/till/entries/sync opendata

    Pushes Catat Transaksi cash rows so the till balance and capitalBalance stay in sync with the cloud book once the network returns.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • id
    • cashCategoryId
    • customerTransactionId
    • customerId
    • orderId
    • balance
    • capitalBalance
    • date
    • paymentStatus
    • image
    • note
    POST /v1/till/entries/sync HTTP/1.1
    Authorization: Bearer <access-token>
    Content-Type: application/json
    
    {
      "id": "cash-9c3d",
      "cashCategoryId": "cat-expense-beli",
      "customerTransactionId": "ct-4419",
      "customerId": "cust-9c3d",
      "orderId": "ord-20261012-03",
      "balance": 1250000.0,
      "capitalBalance": 800000.0,
      "date": "2026-10-12T11:30:00Z",
      "paymentStatus": "PAID",
      "image": "https://cdn.example/r/cash-9c3d.jpg",
      "note": "Beli beras 25kg"
    }
    {
      "id": "cash-9c3d",
      "cashCategoryId": "cat-expense-beli",
      "customerTransactionId": "ct-4419",
      "customerId": "cust-9c3d",
      "orderId": "ord-20261012-03",
      "balance": 1250000.0,
      "capitalBalance": 800000.0,
      "date": "2026-10-12T11:30:00Z",
      "paymentStatus": "PAID",
      "image": "https://cdn.example/r/cash-9c3d.jpg",
      "note": "Beli beras 25kg"
    }
  • Payment history month categories

    GET /v1/ledger/{accountId}/months/breakdown opendata

    Breaks a month of Tagih, Bayar and PPOB activity into categories with amount, count, mainCategory and type, plus saving and totalTransaction for the filter chips.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • accountId
    • saving
    • totalTransaction
    • categories
    • id
    • name
    • mainCategory
    • type
    • amount
    • count
    GET /v1/ledger/acc-88100214/months/breakdown HTTP/1.1
    Authorization: Bearer <access-token>
    X-Authorization-Firebase: <id-token>
    {
      "accountId": "acc-88100214",
      "saving": 125000.0,
      "totalTransaction": 60,
      "categories": [
        {
          "id": 1,
          "name": "Tagih",
          "mainCategory": "IN",
          "type": "IN",
          "amount": 8750000.0,
          "count": 42
        },
        {
          "id": 2,
          "name": "Bayar",
          "mainCategory": "OUT",
          "type": "OUT",
          "amount": 3125000.0,
          "count": 18
        }
      ]
    }
  • Saldo wallet balance

    GET /v1/wallet/float openbanking

    Reads Saldo wallet amount, the subBalance cashback pocket, daily/monthly debit caps and the isSaldoFreezed flag that blocks top-up or spend.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • amount
    • visible
    • limit
    • subBalance
    • saldo
    • cashback
    • debitDaily
    • debitDailyLimit
    • debitMonthly
    • debitMonthlyLimit
    • bmsRegistered
    • isSaldoFreezed
    GET /v1/wallet/float HTTP/1.1
    Authorization: Bearer <access-token>
    X-Authorization-Firebase: <id-token>
    {
      "amount": 1850000.0,
      "visible": true,
      "limit": 20000000.0,
      "subBalance": {
        "saldo": 1750000.0,
        "cashback": 100000.0
      },
      "debitDaily": 125000.0,
      "debitDailyLimit": 5000000.0,
      "debitMonthly": 2750000.0,
      "debitMonthlyLimit": 20000000.0,
      "bmsRegistered": true,
      "isSaldoFreezed": false
    }
  • Top up Saldo wallet

    POST /v1/wallet/float/credit openbanking

    Starts a Saldo top-up for amount via the chosen paymentMethods and returns orderId, status and progress used on the pending-VA screen; cancelUnpaidTopupId drops a stuck earlier top-up first.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • accountId
    • amount
    • cancelUnpaidTopupId
    • paymentMethods
    • orderId
    • transactionId
    • status
    • fee
    • cost
    • description
    • createdAt
    • purchaseType
    • type
    • payments
    • progress
    POST /v1/wallet/float/credit HTTP/1.1
    Authorization: Bearer <access-token>
    X-Authorization-Firebase: <id-token>
    Content-Type: application/json
    
    {
      "accountId": "acc-88100214",
      "amount": 500000.0,
      "cancelUnpaidTopupId": null,
      "paymentMethods": [
        {
          "paymentMethod": "VA",
          "paymentChannel": "BCA"
        }
      ]
    }
    {
      "orderId": "ord-saldo-topup-19",
      "transactionId": "trx-saldo-in-19",
      "status": "PENDING",
      "amount": 500000.0,
      "fee": 0.0,
      "cost": 500000.0,
      "description": "Top up Saldo",
      "createdAt": "2026-10-12T11:05:00Z",
      "purchaseType": "SALDO",
      "type": "SALDO",
      "payments": [
        {
          "paymentMethod": "VA",
          "paymentChannel": "BCA"
        }
      ],
      "progress": [
        {
          "status": "CREATED"
        }
      ]
    }
  • Merchant bank accounts

    GET /v1/payouts/{accountId}/destinations openbanking

    Lists the shop's destination banks for QRIS settlement and Bayar, including accountHolderName, isQrisBank and matchingStatus after name-check.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • bankAccountId
    • accountId
    • bankCode
    • bankName
    • accountNumber
    • accountHolderName
    • customerId
    • isQrisBank
    • proposedQrisBank
    • matchingStatus
    • matchingScore
    • isDisabled
    • status
    GET /v1/payouts/acc-88100214/destinations HTTP/1.1
    Authorization: Bearer <access-token>
    X-Authorization-Firebase: <id-token>
    [
      {
        "bankAccountId": "ba-991",
        "accountId": "acc-88100214",
        "bankCode": "CENAIDJA",
        "bankName": "BCA",
        "accountNumber": "1234567890",
        "accountHolderName": "Budi Santoso",
        "customerId": "cust-self",
        "isQrisBank": true,
        "proposedQrisBank": false,
        "matchingStatus": true,
        "matchingScore": 0.98,
        "isDisabled": false,
        "status": "VERIFIED"
      }
    ]
  • BukuPoin loyalty account

    GET /v1/rewards/account opendata

    Reads BukuPoin activePoints, usedPoints, expiredPoints and tierId that drive referral leaderboard and Tagih loyaltyDiscount.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • isWhitelisted
    • loyaltyAccount
    • activePoints
    • usedPoints
    • expiredPoints
    • levelScore
    • tierId
    • userId
    • deleted
    • loyaltyAccountTier
    • loyaltyTiers
    GET /v1/rewards/account HTTP/1.1
    Authorization: Bearer <access-token>
    X-Authorization-Firebase: <id-token>
    {
      "isWhitelisted": true,
      "loyaltyAccount": {
        "id": 4419,
        "userId": "usr-10482",
        "activePoints": 1250,
        "usedPoints": 400,
        "expiredPoints": 50,
        "levelScore": 80,
        "tierId": "gold",
        "deleted": false
      },
      "loyaltyAccountTier": {
        "tierId": "gold"
      },
      "loyaltyTiers": [
        {
          "tierId": "silver"
        },
        {
          "tierId": "gold"
        }
      ]
    }
  • BNPL user loan limits

    GET /v1/credit/bnpl/eligibility openfinance

    Returns BNPL whitelist and availableLimit / maxLoanLimit / maxTransactionLimit used on the till when a shopkeeper pays a supplier or PPOB bill on credit.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • status
    • message
    • data
    • userId
    • whitelisted
    • availableLimit
    • maxLoanLimit
    • maxTransactionLimit
    • minTransactionLimit
    GET /v1/credit/bnpl/eligibility HTTP/1.1
    Authorization: Bearer <access-token>
    X-Authorization-Firebase: <id-token>
    {
      "status": "OK",
      "message": "ok",
      "data": [
        {
          "userId": "usr-10482",
          "whitelisted": true,
          "availableLimit": 2500000,
          "maxLoanLimit": 5000000,
          "maxTransactionLimit": 1000000,
          "minTransactionLimit": 50000
        }
      ]
    }
  • Saldo cashback redemptions

    GET /v1/wallet/cashback/claims openfinance

    Lists Saldo cashback redemptions (id, amount, externalId, status) credited after Tagih, QRIS or PPOB rows that qualify for the cashback pocket.

    Auth: Bearer accessToken from OTP login; X-Authorization-Firebase idToken.

    • id
    • amount
    • externalId
    • status
    • createdDate
    • lastModifiedDate
    GET /v1/wallet/cashback/claims HTTP/1.1
    Authorization: Bearer <access-token>
    X-Authorization-Firebase: <id-token>
    [
      {
        "id": "cb-4419",
        "amount": 10000.0,
        "externalId": "ord-20261012-01",
        "status": "COMPLETED",
        "createdDate": "2026-10-12T09:20:00Z",
        "lastModifiedDate": "2026-10-12T09:21:00Z"
      }
    ]

Data categories

  • balances
  • transactions
  • payments
  • kyc
  • invoices

Where teams use this data

  • MSME AR/AP reconciliation

    Nightly jobs pull Tagih paymentRequestId rows against Bayar disbursementId payouts so an ERP can match receivedAmount and status without opening the till.

  • QRIS settlement ops

    Treasury dashboards split disbursedPayments from toBeDisbursedPayments and watch qrisStatus / kybStatus so a warung knows when the printable plate is live and when the 8pm bank credit should land.

  • Saldo and PPOB working capital

    Lenders read amount, debitDailyLimit and isSaldoFreezed next to PPOB order status and items to size a float against Pulsa, listrik and BPJS volume.

  • Cash-book to ledger bridge

    Accounting bots ingest cash-book balance, capitalBalance and cashCategoryId so Catat Transaksi notes and receipt images land in the same period as the collect and payout history.

Frequently asked questions

What payment flows sit behind BukuWarung?

Tagih collects (IN) send an invoiceUrl to a customer, Bayar disbursements (OUT) pay a supplier via checkoutUrl or virtualAccount, and a QRIS plate identified by qrisCode settles scans into disbursedPayments versus toBeDisbursedPayments.

How is the Saldo wallet structured?

amount is the visible float, subBalance splits saldo from cashback, and debitDaily / debitMonthlyLimit plus isSaldoFreezed decide whether a PPOB purchase or payout can debit the wallet.

Does the cash book stay separate from Tagih and Bayar?

Yes. Catat Transaksi rows sync id, cashCategoryId, balance and capitalBalance on their own till ledger so the counter can keep running offline, then match orderId when a collect or payout later lands.

What KYC and QRIS gates sit on Tagih, Bayar and the plate?

paymentInLimits and paymentOutLimits plus totalTrxCountLimit cap collects and payouts after verification; remainingFreeQuota and remainingFullCbQuota discount the Tagih fee; qrisStatus, kycStatus and kybStatus hide the printable qrisCode until they are APPROVED.

Apps similar to BukuWarung Apps for MSMEs

  • BukuKas — TechCrunch names BukuKas as a BukuWarung competitor; both began as digital bookkeeping apps for Indonesian MSMEs before adding payments and commerce tools.
  • GoPay Merchant: QRIS — GoPay Merchant is GoTo's Indonesian shop app for issuing a QRIS plate, accepting scans from GoPay, DANA, OVO, ShopeePay and banks, and withdrawing settlements to a bank account.
  • DANA Kasir — DANA Kasir is the till app for DANA Bisnis merchants, used to share static or dynamic DANA QR codes, log in-and-out transactions in real time, and skip a separate EDC terminal.
  • majoo — majoo is an Indonesian UMKM POS and operations app that puts an online cashier, accounting, inventory, CRM and business reports in one console.
  • Kledo — Kledo is cloud accounting software used by Indonesian companies and UMKM for invoicing, purchasing, inventory, expenses, a cashier add-on and financial reports.
  • Mekari Jurnal — Mekari Jurnal is Indonesian online accounting software for bookkeeping, invoicing, inventory and tax, with a Mekari POS cashier that posts sales into the same ledger.
  • Accurate Online — Accurate Online is Indonesian accounting and business software covering sales, inventory, cash and reports, with Accurate POS at the till and Accurate Lite on the phone.
  • Warung Pintar — CompassList lists Warung Pintar beside BukuKas as a local BukuWarung competitor; the startup partners with Indonesian warung owners and uses a Juragan app for inventory orders and stall tracking.

Topics

  • BukuWarung API
  • Tagih collect
  • Bayar disbursement
  • QRIS MSME
  • Saldo wallet
  • Indonesian warung payments
  • PPOB Pulsa BPJS
  • cash book sync

Need this app's data API integrated?

We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.

  • NDA + SOW on every engagement
  • Delivery in 3–7 days
  • Payment only after acceptance
  • Work scoped to authorized use

Get a quote