Singa Fintech Data API: Loan Quota, KYC & VA
Singa Fintech-Digital Loans is the Indonesian cash-loan app of PT Abadi Sejahtera Finansindo (ASF). Borrowers sign in with a mobile number over SMS or WhatsApp OTP, set a password, then complete KTP, work, bank-account and emergency-contact forms before applying; approved funds are withdrawn to a named bank account and repaid through a virtual account, with in-app rollover when a tenor needs extending. The same Android client covers Privy identity handoff, TekenAja e-signed loan contracts, face liveness, coupons and a referral program, and it points users at Instagram @singa.id, TikTok @singa.fintech and LinkedIn Abadi Sejahtera Finansindo. It competes with Kredivo, Easycash and Tunaiku for pinjaman-online users in Indonesia.
Approved quota and waitRepaymentTotalAmount sit on the home snapshot next to product duration and interest_rate, while each live order carries payable_amount, order_status and a virtual-account va_num. KYC records store ktp_number, ktp_image_url and completeness scores for personal, work, bank and contacts; repayment screens add coupon totalReduction and rollover is_pass.
Collections teams reconcile outstanding tenor against VA credits, underwriting desks ingest KTP OCR into the same borrower file, and openData Studio turns those fields 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.
Send login SMS code
POST
/v1/auth/otp/smsosintStarts the SMS OTP step of phone sign-in before password login. Body is the mobile number; the JSON returns timeLimit (and optional incoming_call_phone for the voice-call fallback).
Auth: Pre-login. JSON body with the borrower's mobile number. No Bearer yet. WhatsApp OTP uses the sibling path /v1/auth/otp/whatsapp.
- mobilePhone
- incoming_call_phone
- timeLimit
POST /v1/auth/otp/sms HTTP/1.1 Content-Type: application/json platform: android { "mobilePhone": "081234567890" }{ "code": 0, "message": "OK", "data": { "incoming_call_phone": null, "timeLimit": 60 } }Password login
POST
/v1/auth/passwordosintSigns the borrower in with mobile_phone and an AES-wrapped password. The login response returns token and user_id, which every later call attaches as Authorization: Bearer and a userId header.
Auth: JSON body mobile_phone plus AES-encrypted password (ky is the MD5 wrap key). The response token is stored on device and replayed as Authorization: Bearer; user_id is sent as the userId header.
- mobile_phone
- password
- token
- user_id
- name
- phone
- is_new_user
- isRegister
- phone_verified
- email_verified
- role
POST /v1/auth/password HTTP/1.1 Content-Type: application/json platform: android { "mobile_phone": "081234567890", "password": "<aes>", "ky": "<md5>", "imei": "uuid-device", "uuid": "uuid-device", "long": 0.0, "accuracy": 0.0 }{ "code": 0, "message": "OK", "data": { "token": "eyJhbGciOiJIUzI1NiJ9.sess", "user_id": "882144", "name": "Siti Nurhaliza", "phone": "081234567890", "is_new_user": false, "isRegister": true, "phone_verified": 1, "email_verified": 0, "role": 1 } }Home loan snapshot
POST
/v1/home/snapshotopenfinanceLoads the home screen: product duration and interest_rate, per-merchant UserQuota (quota, available, waitRepaymentTotalAmount), credit-audit status, and any live order summary.
Auth: Authorization: Bearer token from POST /v1/auth/password. Body includes user_id when signed in.
- IsNewUser
- name
- duration
- interest_rate
- quota
- available
- waitRepaymentTotalAmount
- isMakeLoan
- status
- order_id
- auditStatus
- rejectExpiredAt
POST /v1/home/snapshot HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.sess userId: 882144 uuId: uuid-device Content-Type: application/json { "user_id": "882144" }{ "code": 0, "message": "OK", "data": { "IsNewUser": 0, "UserInfo": { "name": "Siti Nurhaliza" }, "Product": { "duration": 90, "interest_rate": "0.3" }, "UserQuota": { "default": { "quota": 5000000, "available": 3500000, "waitRepaymentTotalAmount": 1500000, "isMakeLoan": true, "status": 1, "order_id": "ord-882144" } }, "CreditAuditInfo": { "auditStatus": 2, "rejectExpiredAt": null }, "Order": {} } }KYC completeness
GET
/v1/profile/completenessosintReturns percent-complete scores for personal, work, bank and contacts plus ktp_image_url. The loan application flow stays blocked until these sections are filled.
Auth: Authorization: Bearer token from POST /v1/auth/password; userId header.
- personal
- work
- bank
- contacts
- is_new_user
- ktp_image_url
- faceComparison
GET /v1/profile/completeness HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.sess userId: 882144{ "code": 0, "message": "OK", "data": { "personal": 100, "work": 100, "bank": 80, "contacts": 100, "is_new_user": false, "ktp_image_url": "https://files.example.com/ktp/882144.png", "faceComparison": 1 } }Borrower profile sections
GET
/v1/profile/sectionsosintReads one KYC section as labeled key/value rows. Query type selects user_basic_info, user_work_info, user_contacts_info or user_bank_card_info.
Auth: Authorization: Bearer token from POST /v1/auth/password. Query type selects the section: user_basic_info, user_work_info, user_contacts_info or user_bank_card_info.
- type
- user_basic_info
- user_work_info
- user_contacts_info
- user_bank_card_info
- ktp_number
- name
- birthday
- mothers_name
GET /v1/profile/sections?type=user_basic_info HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.sess userId: 882144{ "code": 0, "message": "OK", "data": { "user_basic_info": [ { "key": "name", "value": "Siti Nurhaliza", "type": "text" }, { "key": "ktp_number", "value": "3174010101900001", "type": "text" }, { "key": "birthday", "value": "1990-01-01", "type": "date" }, { "key": "mothers_name", "value": "Aisyah", "type": "text" } ], "user_work_info": [], "user_contacts_info": [], "user_bank_card_info": [] } }OCR KTP image
POST
/v1/kyc/idcard/ocrosintRuns OCR on an uploaded KTP image and returns identity fields used to prefill the personal-info form.
Auth: Authorization: Bearer token from POST /v1/auth/password. Body img_url is AES-wrapped with ky; optional isWrite flags a KTP update on an existing order.
- img_url
- ky
- isWrite
- ktp_number
- name
- birthday
- birthplace
- ktp_image_url
POST /v1/kyc/idcard/ocr HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.sess userId: 882144 Content-Type: application/json { "img_url": "<aes>", "ky": "<md5>", "isWrite": "2" }{ "code": 0, "message": "OK", "data": { "ktp_number": "3174010101900001", "name": "Siti Nurhaliza", "birthday": "1990-01-01", "birthplace": "Jakarta", "ktp_image_url": "https://files.example.com/ktp/882144.png" } }Submit merchant loan
POST
/v1/loans/applyopenfinanceSubmits the selected merchant product (amount, duration, merchantId) after KYC. The response returns orderId and isHightRisk; high-risk files open an in-app credit-assessment page.
Auth: Authorization: Bearer token from POST /v1/auth/password. Body products is the selected tenor list from the apply screen.
- products
- amount
- duration
- merchantId
- loanId
- couponId
- refPurposeId
- invitation_code
- orderId
- isHightRisk
- have_comment
- userQuota
- loan_info
POST /v1/loans/apply HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.sess userId: 882144 Content-Type: application/json { "products": [ { "amount": 2000000, "duration": 90, "merchantId": 12, "loanId": 901, "couponId": null, "refPurposeId": 3 } ], "uuid": "uuid-device", "versionName": "3.2.3", "app_instance_id": "fi-instance", "model": "Pixel 8", "invitation_code": "SG-9F21", "media_source": "googleplay", "campaign": "organic" }{ "code": 0, "message": "OK", "data": { "merchantId": 12, "orderId": "ord-882144", "isHightRisk": false, "have_comment": false, "userQuota": { "quota": 5000000, "available": 3000000 }, "loan_info": { "amount": 2000000, "duration": 90 } } }Loan order detail
GET
/v1/loans/detailopenfinanceLoads the loan detail screen: principal and fee breakdown, order_status, disbursement bank_info, and the current virtual-account va_info used to repay.
Auth: Authorization: Bearer token from POST /v1/auth/password. Query carries the order id shown on the loan detail screen.
- id
- order_num
- amount
- contract_amount
- payable_amount
- repayment_amount
- interest_amount
- mgmtfee_amount
- penalty_amount
- interest_rate
- order_status
- apply_at
- repay_at
- va_num
- due_amount
- account_name
- account_number
- is_allow_extension
- protocol_url
GET /v1/loans/detail?order_id=ord-882144 HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.sess userId: 882144{ "code": 0, "message": "OK", "data": { "order": [ { "id": "ord-882144", "order_num": "SG20261016001", "amount": 2000000, "contract_amount": 2300000, "payable_amount": 2300000, "repayment_amount": 0, "interest_amount": 180000, "mgmtfee_amount": 120000, "penalty_amount": 0, "interest_rate": "0.3", "order_status": 4, "apply_at": "2026-09-01T09:00:00+07:00", "repay_at": "2026-12-01T00:00:00+07:00", "va_info": { "va_num": "8800123456789012", "due_amount": "2300000", "repayment_va_expire_at": "2026-12-02T23:59:59+07:00" } } ], "bank_info": { "account_name": "SITI NURHALIZA", "account_number": "1234567890" }, "is_allow_extension": 1, "protocol_url": "https://h5.example.com/agreement/ord-882144" } }Loan history list
GET
/v1/loans/historyopenfinancePages closed and in-flight loans for the history screen. Each row carries id, amount, order_status and dates.
Auth: Authorization: Bearer token from POST /v1/auth/password. Query page and offset=10.
- page
- offset
- loans
- id
- order_num
- amount
- final_amount
- order_status
- apply_at
- repay_at
GET /v1/loans/history?page=1&offset=10 HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.sess userId: 882144{ "code": 0, "message": "OK", "data": { "loans": [ { "id": "ord-882144", "order_num": "SG20261016001", "amount": 2000000, "final_amount": 2300000, "order_status": 7, "apply_at": "2026-06-01T09:00:00+07:00", "repay_at": "2026-09-01T00:00:00+07:00" } ] } }Repayment detail
POST
/v1/repayments/scheduleopenbankingBuilds the repay screen: parent order amounts, selectable child installments, coupon eligibility and early-settlement flags.
Auth: Authorization: Bearer token from POST /v1/auth/password.
- order_id
- payable_amount
- repayment_amount
- penalty_amount
- is_allow_extension
- children
- due_amount
- interest_amount
- mgmtfee_amount
- expire_at
- can_use
- is_can_settled
POST /v1/repayments/schedule HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.sess userId: 882144 Content-Type: application/json { "order_id": "ord-882144" }{ "code": 0, "message": "OK", "data": { "order": { "id": "ord-882144", "payable_amount": 2300000, "repayment_amount": 0, "penalty_amount": 0, "is_allow_extension": 1 }, "children": [ { "id": "stg-1", "index": 1, "due_amount": 2300000, "interest_amount": 180000, "mgmtfee_amount": 120000, "penalty_amount": 0, "order_status": 4, "expire_at": "2026-12-01T00:00:00+07:00" } ], "coupon": { "can_use": true }, "early_settlement_judgment": { "is_can_settled": 1 } } }Virtual-account detail
POST
/v1/repayments/virtual-accountopenbankingReturns the payable virtual-account number, bank channel and expiry for the VA screen, plus any coupon totalReduction already applied.
Auth: Authorization: Bearer token from POST /v1/auth/password.
- va_num
- due_amount
- repayment_va_expire_at
- payment_va
- payment_time
- bank_code
- bank_name
- bank_logo
- expire_at
- totalReduction
- is_extension
POST /v1/repayments/virtual-account HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.sess userId: 882144 Content-Type: application/json { "order_id": "ord-882144" }{ "code": 0, "message": "OK", "data": { "va_info": { "va_num": "8800123456789012", "due_amount": "2300000", "repayment_va_expire_at": "2026-12-02T23:59:59+07:00" }, "payment_info": { "payment_va": "8800123456789012", "payment_time": null, "payment_methods": { "bank_code": "BCA", "bank_name": "Bank Central Asia", "bank_logo": "https://files.example.com/bank/bca.png" } }, "expire_at": "2026-12-02T23:59:59+07:00", "totalReduction": 0, "is_extension": 0 } }VA payment history
POST
/v1/repayments/transactionsopenbankingPages virtual-account payment rows for the payment history screen (issued VA, amount due, amount paid, repay_at).
Auth: Authorization: Bearer token from POST /v1/auth/password.
- page
- offset
- order_id
- id
- repayment_va
- due_amount
- repayment_amount
- repay_at
- created_at
- is_extension_info
POST /v1/repayments/transactions HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.sess userId: 882144 Content-Type: application/json { "page": 1, "offset": 10, "order_id": "ord-882144" }{ "code": 0, "message": "OK", "data": [ { "id": "va-1001", "repayment_va": "8800123456789012", "due_amount": "2300000", "repayment_amount": 2300000, "repay_at": "2026-11-28T14:22:00+07:00", "created_at": "2026-11-01T09:00:00+07:00", "is_extension_info": 0 } ] }Withdraw to bank
POST
/v1/disbursements/payoutopenfinanceDisburses the approved loan to the borrower's bank account from the withdrawal screen. Body is amount plus bank_info (ref_bank_id, account_name, account_number, reserved_phone_number).
Auth: Authorization: Bearer token from POST /v1/auth/password.
- amount
- ref_bank_id
- account_name
- account_number
- reserved_phone_number
- order_id
POST /v1/disbursements/payout HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.sess userId: 882144 Content-Type: application/json { "amount": 2000000, "bank_info": { "ref_bank_id": "014", "account_name": "SITI NURHALIZA", "account_number": "1234567890", "reserved_phone_number": "081234567890" } }{ "code": 0, "message": "OK", "data": { "order_id": "ord-882144", "amount": 2000000 } }Apply loan extension
POST
/v1/loans/rolloveropenfinanceApplies a rollover from the extension preview screen. is_pass is pass or reject; reject_reason is shown when the extension is denied.
Auth: Authorization: Bearer token from POST /v1/auth/password.
- order_id
- is_pass
- reject_reason
- after_order_id
POST /v1/loans/rollover HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.sess userId: 882144 Content-Type: application/json { "order_id": "ord-882144" }{ "code": 0, "message": "OK", "data": { "is_pass": "pass", "reject_reason": null, "order_id": "ord-882144", "after_order_id": "ord-882145" } }Referral code
POST
/v1/referrals/codeopendataReturns the borrower's referral_code shown on the invite screen and later sent as invitation_code on loan submit.
Auth: Authorization: Bearer token from POST /v1/auth/password.
- referral_code
POST /v1/referrals/code HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.sess userId: 882144{ "code": 0, "message": "OK", "data": { "referral_code": "SG-9F21" } }
Data categories
- loan quotas
- KYC profiles
- loan orders
- virtual-account repayments
- disbursements
- referrals
Where teams use this data
Quota vs outstanding reconciliation
Nightly jobs pull home UserQuota.quota, available and waitRepaymentTotalAmount, then match them to live OrderDetail payable_amount and order_status so a lender ledger does not drift from the borrower screen.
Virtual-account payment matching
Collections bots read va_num, due_amount and repayment_va_expire_at from getVaDetail and append getOrderVa rows (repayment_va, repayment_amount, repay_at) to close installments when a BCA or other VA credit lands.
KTP onboarding into CRM
Underwriting desks take ktp_number, name and birthday from getUserInfoByKtp plus completeness scores personal/work/bank/contacts so a new file is not opened twice for the same NIK.
Rollover and disbursement ops
Ops consoles watch submitWithdraw bank_info (account_name, account_number) and extensionApply is_pass so payouts and tenor extensions stay in the same case as the in-app WithDrawAct and RolloverPreviewAct flows.
Frequently asked questions
How does Singa authenticate borrowers?
Sign-in starts with an SMS or WhatsApp one-time code sent to the borrower's mobile number, followed by password login with mobile_phone plus an AES-wrapped password. The JSON response returns token and user_id; later calls attach the token as an Authorization: Bearer header and the user id as a userId header.
Which fields describe a live loan?
Loan detail returns amount, contract_amount, payable_amount, interest_amount, mgmtfee_amount, penalty_amount, order_status, apply_at and repay_at, plus the repayment virtual account va_num and the disbursement bank_info account_name / account_number.
How is Indonesian KYC represented?
Completeness scores for personal, work, bank and contacts gate an application. Profile sections are labeled key/value rows (ktp_number, birthday, mothers_name), and uploading a KTP card image runs OCR that fills those same identity fields.
How is repayment collected?
The repayment screen issues va_num, due_amount and repayment_va_expire_at for a bank channel (bank_code, bank_name); a separate feed pages historical virtual-account payments; and a rollover request records is_pass or a reject_reason when the extension is denied.
Apps similar to Singa Fintech-Digital Loans
- Kredivo - Paylater & Pinjaman — Kredivo is PT Kredivo Finance Indonesia's OJK-licensed credit line, with a 30-day pay-in-full option and 3–24 month installments at more than 10,000 Indonesian merchants plus a personal-loan (pinjaman) draw.
- 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 at a published maximum 36% APR.
- Tunaiku - Pinjaman Dana Online — Tunaiku is PT Bank Amar Indonesia Tbk's OJK-licensed unsecured cash-loan (KTA) app, disbursing IDR 2 million to IDR 30 million over 6–30 months.
- Akulaku — Akulaku combines cash loans of Rp300,000–Rp40,000,000, PayLater of up to Rp25,000,000, and merchant installments in one Indonesian app, with financing from OJK-licensed PT Akulaku Finance Indonesia.
- AdaKami — AdaKami is an OJK-licensed Indonesian digital cash-loan app with published limits of IDR 3,000,000 to IDR 80,000,000 over 3-, 6- or 12-month installments and a stated maximum APR of 36%.
- JULO — JULO is an OJK-supervised Indonesian digital-credit app whose one limit of up to Rp50,000,000 can be drawn as bank cash, e-wallet top-ups, bill pay, or paylater spend.
- Indodana PayLater — Indodana PayLater is an OJK-supervised Indonesian buy-now-pay-later line of up to Rp50,000,000, repaid over 3–12 months at partner merchants such as Tokopedia, Cermati and iBox.
- Home Credit Indonesia — Home Credit Indonesia finances phones, laptops and other goods in more than 20,000 stores, and also offers cash financing and a paylater line under OJK supervision.
Topics
- Singa API
- Singa Fintech loan data
- PT Abadi Sejahtera Finansindo
- Indonesian pinjaman KYC
- virtual account repayment
- KTP OCR fields
- loan quota 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