Tunaiku Pinjaman Dana Online Data API
Tunaiku - Pinjaman Dana Online is the unsecured cash-loan (KTA) app of PT Bank Amar Indonesia Tbk., an OJK-licensed Indonesian bank. Borrowers apply for IDR 2 million to IDR 30 million over 6–30 months at a published 3–5% flat monthly rate; Play’s sample quotes IDR 5,000,000 over six months at 3% with a 5% administration fee and IDR 550,000 account-maintenance fee, disbursing IDR 4,750,000 and a monthly installment of IDR 1,075,000. The same Android client covers first-time and repeat/top-up loans, early payoff, virtual-account repayment, eKYC, QRIS, and Amar Bank’s Senyumku savings account used as a disbursement rail. Google Play lists a 4.73 rating across 1,457,544 reviews and 10 million-plus installs, competing with Kredivo and Easycash for Indonesian pinjaman users.
Borrower identity lands as custHash, custId and KTP pin on the profile record, with mlpLevel, paymentNumber and flags eligibleToApply / hasActiveLoan. An offer row carries loanAmount, period, monthlyInstallmentAmount and net toBankAmount; an in-force loan adds saldo, totalUnpaid, dueDate and installment sum / partNum.
Repayment rails mint virtualAccount plus accountName; early payoff quotes earlyPaymentAmount and refundAmount against a dedicated VA. Senyumku savings expose averageBalance and nextMonthLevel. Collection desks and lending-stack bots stitch those fields into unpaid monitors and VA matching; openData Studio turns the same surface into callable open data.
Screenshots
API surface
The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.
Password or refresh session
POST
/v1/auth/grantosintOpens or renews the borrower session. Password grant sends username and password; refresh grant sends refreshToken. The JSON returns authToken (and optional resetPasswordToken) that the Android client attaches as Authorization: Bearer.
Auth: JSON body username + password with grantType, or a refresh_token grant with refreshToken. Response authToken is replayed as Authorization: Bearer on all later calls.
- username
- password
- grantType
- refreshToken
- authToken
- resetPasswordToken
POST /v1/auth/grant HTTP/1.1 Content-Type: application/json { "username": "081234567890", "password": "********", "grantType": "password", "refreshToken": null }{ "authToken": "eyJhbGciOiJSUzI1NiJ9.auth", "resetPasswordToken": null, "grantType": "password", "refreshToken": "rt_9f21c0ab" }Request login OTP
POST
/v1/auth/otp/{purpose}/dispatchosintStarts an SMS or WhatsApp OTP for a purpose such as first-login. Body is username; the response mints otpRequestId and rate-limit counters attemptsLeft, retryableAfter, maxAttempt.
Auth: Pre-login; JSON body username. purpose selects the flow such as first-login; medium is sms or whatsapp. No Bearer yet.
- username
- otpRequestId
- attemptsLeft
- retryableAfter
- maxAttempt
POST /v1/auth/otp/first-login/dispatch HTTP/1.1 Content-Type: application/json { "username": "081234567890" }{ "otpRequestId": "otp-7c21ab", "attemptsLeft": 4, "retryableAfter": 60, "maxAttempt": 5 }Verify login OTP
POST
/v1/auth/otp/{purpose}/checkosintConsumes the OTP against otpRequestId and returns authToken (plus optional resetPasswordToken) that subsequent loan and profile calls attach as Bearer.
Auth: Pre-login; JSON body otpRequestId + otp (+ optional transactionId). Returns authToken used as Authorization: Bearer.
- otpRequestId
- otp
- transactionId
- authToken
- resetPasswordToken
POST /v1/auth/otp/first-login/check HTTP/1.1 Content-Type: application/json { "otpRequestId": "otp-7c21ab", "otp": "483920", "transactionId": "txn-pre-11" }{ "authToken": "eyJhbGciOiJSUzI1NiJ9.auth", "resetPasswordToken": null }Borrower profile
GET
/v1/borrower/profileosintLoads the signed-in borrower card: KTP pin, custHash / custId, mlpLevel, paymentNumber, eligibility flags, payout Account (bankName, accountNumber) and Income (jobType, monthlyIncome).
Auth: Authorization: Bearer {authToken} issued by the session grant or the OTP verification.
- pin
- custHash
- custId
- mlpLevel
- currency
- firstName
- name
- phone
- paymentNumber
- hasActiveLoan
- eligibleToApply
- eligibleForTopup
- dateOfBirth
- bankName
- accountNumber
- monthlyIncome
GET /v1/borrower/profile HTTP/1.1 Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.auth{ "pin": "3174010101900001", "custHash": "ch_8f21", "custId": 440192, "mlpLevel": "GOLD", "currency": "IDR", "email": "[email protected]", "firstName": "Siti", "name": "Siti Nurhaliza", "phone": "081234567890", "paymentNumber": "880012345678", "hasActiveLoan": "true", "eligibleToApply": false, "eligibleForTopup": true, "otpEligible": true, "hasAcceptedHistory": true, "newLoanInfo": { "dateOfBirth": "1990-01-01", "gender": "F", "mobilePhoneNumber": "081234567890", "account": { "bankName": "BCA", "accountNumber": "1234567890", "accountType": "SAVINGS", "displayName": "SITI NURHALIZA", "swiftCode": "CENAIDJA" }, "income": { "jobType": "EMPLOYEE", "monthlyIncome": "8000000", "employerName": "PT Contoh", "taxId": "10.20.30.4-567.000" } } }Active loan detail
GET
/v1/loans/currentopenfinanceReturns the in-force KTA: id, amount, period, remaining saldo / totalUnpaid, currentInstallmentValue, and the installment grid (date, sum, partNum, unpaid). loanProgress adds dueDate, totalBill and currentAmountDue for the repayment card.
Auth: Authorization: Bearer {authToken} issued by the session grant or the OTP verification.
- id
- status
- amount
- period
- saldo
- partnerType
- productType
- currentInstallmentValue
- totalUnpaid
- unpaidMonths
- toBankAmount
- dueDate
- currentUnpaidInstallment
- totalBill
- partNum
- sum
GET /v1/loans/current HTTP/1.1 Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.auth{ "priorityLoan": { "id": "LN-440192-01", "status": "ACTIVE", "amount": "5000000", "period": "6", "saldo": "3225000", "partnerType": "TUNAIKU", "productType": "PL", "applicationStatus": "ACCEPTED", "currentInstallmentValue": "1075000", "firstInstallmentValue": "1075000", "totalUnpaid": "3225000", "unpaidMonths": "3", "toBankAmount": "4750000", "loanProcessingFeeAmount": "250000", "installments": [ { "date": "2026-11-14", "sum": "1075000", "partNum": "4", "unpaid": "1075000", "rowType": "INSTALLMENT", "onTime": true, "status": "UNPAID", "mlpPoint": 10 } ] }, "loanProgress": { "dueDate": "2026-11-14", "totalUnpaid": 3225000.0, "status": "IN_DEBT", "totalPrepayment": 0.0, "currentUnpaidInstallment": 1075000.0, "totalBill": 1075000.0, "currentAmountDue": 1075000.0 } }Loan history
GET
/v1/loans/historyopenfinancePages closed and prior loans for the history screen: page / pageCount / totalData wrapping loan rows of id, status, amount, period, saldo and paidOutDate.
Auth: Authorization: Bearer {authToken} issued by the session grant or the OTP verification.
- page
- pageCount
- limit
- totalData
- id
- status
- amount
- period
- saldo
- productType
- paidOutDate
GET /v1/loans/history?page=1&limit=10 HTTP/1.1 Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.auth{ "page": 1, "pageCount": 2, "limit": 10, "totalData": 12, "data": [ { "id": "LN-440192-00", "status": "PAID", "amount": "3000000", "period": "6", "saldo": "0", "productType": "PL", "paidOutDate": "2026-03-01" } ] }Product loan summary
GET
/v1/offers/{productType}/quoteopenfinanceQuotes the chosen productType (PL personal loan, SL smaller loan, LMT line): loanAmount, period, monthlyInstallmentAmount, processingFeeAmount / processingFeePercentage and net toBankAmount.
Auth: Authorization: Bearer {authToken} issued by the session grant or the OTP verification.
- loanAmount
- period
- monthlyInstallmentAmount
- processingFeeAmount
- processingFeePercentage
- provisionFeePercentage
- toBankAmount
- totalFeeAmount
- admissionFee
- interestRate
GET /v1/offers/PL/quote HTTP/1.1 Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.auth{ "loanAmount": "5000000", "period": "6", "monthlyInstallmentAmount": "1075000", "processingFeeAmount": "250000", "processingFeePercentage": 0.05, "provisionFeePercentage": 0.0, "admissionFee": "0", "toBankAmount": "4750000", "totalFeeAmount": "250000", "totalFeePercentage": "5", "interestRate": "0.03" }Loan submission status
GET
/v1/applications/statusopenfinancePolls whether a just-submitted application is still IN_PROCESS, ACCEPTED or REJECTED, keyed by transactionID and product.
Auth: Authorization: Bearer {authToken} issued by the session grant or the OTP verification.
- status
- transactionID
- product
GET /v1/applications/status HTTP/1.1 Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.auth{ "status": "IN_PROCESS", "transactionID": "txn-loan-8821", "product": "PL" }Disburse accepted loan
POST
/v1/disbursementsopenfinancePushes an accepted loan to the borrower’s bank after passwordVerified. The breakdown lists type, loanAmount, processingFeeAmount / processingFeeRate and net toBankAmount.
Auth: Authorization: Bearer {authToken} issued by the session grant or the OTP verification; body includes passwordVerified after a password challenge
- loanID
- loanAmount
- loanPeriod
- passwordVerified
- type
- monthlyInstallmentAmount
- processingFeeAmount
- processingFeeRate
- toBankAmount
- interestRate
POST /v1/disbursements HTTP/1.1 Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.auth Content-Type: application/json { "loanID": "LN-440192-01", "loanAmount": 5000000, "loanPeriod": 6, "passwordVerified": { "verified": true } }{ "disbursement": [ { "type": "bank", "loanAmount": "5000000", "period": "6", "monthlyInstallmentAmount": "1075000", "processingFeeAmount": 250000, "processingFeeRate": 0.05, "provisionFeeAmount": 0, "provisionFeeRate": 0.0, "toBankAmount": "4750000", "interestRate": "0.03", "admissionFee": "0" } ] }Repayment virtual account
GET
/v1/repayments/virtual-account/{productType}openbankingMints the productType-scoped repayment VA shown on How to Pay: accountName plus virtualAccount. A companion customer-scoped call returns the same pair for the customer record.
Auth: Authorization: Bearer {authToken} issued by the session grant or the OTP verification.
- accountName
- virtualAccount
GET /v1/repayments/virtual-account/PL HTTP/1.1 Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.auth{ "accountName": "TUNAIKU SITI NURHALIZA", "virtualAccount": "8800123456789012" }Early-payoff quote
GET
/v1/settlements/quoteopenfinanceQuotes early settlement per loan (earlyPaymentAmount, refundAmount, paymentStatus) and the dedicated VA (virtualAccountName / virtualAccountNumber) plus subTotalEarlyPayment / totalEarlyPayment.
Auth: Authorization: Bearer {authToken} issued by the session grant or the OTP verification.
- loanId
- loanType
- earlyPaymentAmount
- paymentStatus
- refundAmount
- virtualAccountName
- virtualAccountNumber
- subTotalEarlyPayment
- totalEarlyPayment
GET /v1/settlements/quote HTTP/1.1 Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.auth{ "loans": [ { "loanId": "LN-440192-01", "loanType": "PL", "earlyPaymentAmount": 3100000.0, "paymentStatus": "QUOTED", "refundAmount": 0.0 } ], "virtualAccountName": "TUNAIKU EARLY PAIDBACK", "virtualAccountNumber": "880099988877", "subTotalEarlyPayment": 3100000, "totalEarlyPayment": 3100000, "formattedTotalEarlyPayment": "Rp3.100.000" }Submit early payoff
POST
/v1/settlementsopenfinanceLocks the early-payoff basket and returns the VA the borrower must credit for totalEarlyPayment, with paymentStatus PENDING_VA until funds clear.
Auth: Authorization: Bearer {authToken} issued by the session grant or the OTP verification.
- loanId
- loanType
- earlyPaymentAmount
- paymentStatus
- virtualAccountName
- virtualAccountNumber
- totalEarlyPayment
- refundAmount
POST /v1/settlements HTTP/1.1 Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.auth Content-Type: application/json { "loans": [ { "loanId": "LN-440192-01", "loanType": "PL", "earlyPaymentAmount": 3100000.0 } ] }{ "paymentStatus": "PENDING_VA", "virtualAccountName": "TUNAIKU EARLY PAIDBACK", "virtualAccountNumber": "880099988877", "totalEarlyPayment": 3100000, "refundAmount": 0.0 }Senyumku average balance
GET
/v1/savings/summaryopenbankingReads Amar Bank Senyumku savings: averageBalance (and formattedAverageBalance), nextMonthLevel, isNewUser, plus optional snapshot balance. A companion balance call returns the raw balance.
Auth: Authorization: Bearer {authToken} issued by the session grant or the OTP verification.
- averageBalance
- formattedAverageBalance
- isNewUser
- nextMonthLevel
- balance
GET /v1/savings/summary HTTP/1.1 Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.auth{ "averageBalance": 1250000, "formattedAverageBalance": "Rp1.250.000", "isNewUser": false, "nextMonthLevel": "SILVER", "balance": 1800000 }KYC face compare
POST
/v1/identity/face-matchosintRuns liveness/face-compare for a KYC purpose and returns kycToken plus status. Companion calls upload identity documents and return a documentId, then poll for the verification result.
Auth: Authorization: Bearer {authToken} issued by the session grant or the OTP verification.
- kycToken
- status
- documentId
- firstName
- lastName
POST /v1/identity/face-match HTTP/1.1 Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.auth Content-Type: application/json { "imageId": "img-selfie-01", "documentId": "doc-ktp-01" }{ "kycToken": "kyc_4e19ab", "status": "MATCHED", "documentId": "doc-ktp-01", "values": { "firstName": "Siti", "lastName": "Nurhaliza" }, "limit": { "remaining": 2 } }
Data categories
- borrower profile
- loan offers
- active loan saldo
- installment schedule
- repayment VA
- early payoff
- Senyumku balance
- KYC face compare
Where teams use this data
Unpaid-installment monitor
A collection desk polls totalUnpaid, currentUnpaidInstallment and dueDate nightly, then matches inbound credits to virtualAccount / paymentNumber so overdue IDR bills are flagged the same day they age.
Offer and disbursement reconciliation
Finance ops compare quoted loanAmount, processingFeeAmount and toBankAmount on the product summary with the post-passwordVerified disbursement breakdown so net IDR landed in accountNumber equals the accepted offer.
Early-payoff VA matching
Ops take earlyPaymentAmount plus virtualAccountNumber from the early-payoff quote and post bank credits against totalEarlyPayment until paymentStatus leaves PENDING_VA.
Senyumku float check
A lending-stack bot reads averageBalance and nextMonthLevel before routing a disbursement onto the Senyumku rail, and blocks the draw when balance is below toBankAmount.
Frequently asked questions
What loan-balance fields does Tunaiku expose?
The active-loan call returns id, amount, period, remaining saldo and totalUnpaid, currentInstallmentValue, and installment rows of date, sum, partNum and unpaid. A nested loanProgress block adds dueDate, totalBill, currentUnpaidInstallment and currentAmountDue.
How are installments repaid?
The repayment call mints accountName and virtualAccount for the How-to-Pay screen, scoped per product. Early settlement is a separate quote (earlyPaymentAmount, refundAmount) whose submission locks a dedicated virtualAccountNumber for totalEarlyPayment.
How does the app authenticate these calls?
Sign-in accepts username and password (grantType password) or a refreshToken grant. OTP sign-in first requests a code over SMS or WhatsApp, then verifies otpRequestId plus otp to obtain authToken; later calls send Authorization: Bearer {authToken}.
Where does a disbursement land?
The profile's newLoanInfo.account carries bankName and accountNumber. After a password challenge, the disbursement call returns toBankAmount and processingFeeAmount. Amar Bank Senyumku savings can take the same draw; the savings summary returns averageBalance and nextMonthLevel.
Apps similar to Tunaiku - Pinjaman Dana Online
- Kredivo - Paylater & Pinjaman — Kredivo is PT Kredivo Finance Indonesia's paylater and cash-loan line of up to IDR 50 million, repaid in 30 days or in 3- to 24-month installments at partner merchants.
- Easycash - Pinjaman Daring — Easycash is an OJK-licensed Indonesian unsecured cash-loan app offering IDR 100,000 to IDR 100,000,000 over 3–12 months without a credit card.
- Singa Fintech-Digital Loans — Singa Fintech is PT Abadi Sejahtera Finansindo's OJK-licensed Indonesian cash-loan app, with published limits from IDR 1.1 million to IDR 48 million.
- AdaKami — AdaKami is an OJK-licensed Indonesian online cash-loan platform that uses a published 30-day installment cycle with tenors of 1–12 months and states it does not deduct fees up front.
- Akulaku — Akulaku combines shopping installments, cash loans (pinjaman tunai) and digital banking in one Indonesian app, with PayLater operated by PT Akulaku Silvrr Indonesia.
- JULO — JULO is an OJK-supervised Indonesian digital-credit app whose one limit can be drawn as cash, e-wallet top-ups, or paylater spend on Tokopedia, Shopee, Lazada, Blibli and TikTok Shop.
- Indodana PayLater — Indodana PayLater is an OJK-supervised Indonesian buy-now-pay-later line of up to Rp50 million, repaid in 30 days or in 3-, 6-, 12-, 18- or 24-month installments at partner merchants.
- Home Credit Indonesia — Home Credit Indonesia (PT Home Credit Indonesia) finances phones, TVs, laptops, furniture and other goods in store on installment plans, and also offers cash financing (Pembiayaan Tunai).
Topics
- Tunaiku API
- Tunaiku pinjaman data
- custHash
- totalUnpaid
- virtualAccount
- PT Bank Amar Indonesia Tbk
- Indonesia KTA loan API
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