Singa Fintech-Digital Loans icon

Singa Fintech Data API: Loan Quota, KYC & VA

PT Abadi Sejahtera Finansindo · Lending

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

  • Singa Fintech-Digital Loans screenshot 1
  • Singa Fintech-Digital Loans screenshot 2
  • Singa Fintech-Digital Loans screenshot 3
  • Singa Fintech-Digital Loans screenshot 4
  • Singa Fintech-Digital Loans screenshot 5
  • Singa Fintech-Digital Loans screenshot 6
  • Singa Fintech-Digital Loans screenshot 7

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/sms osint

    Starts 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/password osint

    Signs 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/snapshot openfinance

    Loads 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/completeness osint

    Returns 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/sections osint

    Reads 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/ocr osint

    Runs 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/apply openfinance

    Submits 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/detail openfinance

    Loads 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/history openfinance

    Pages 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/schedule openbanking

    Builds 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-account openbanking

    Returns 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/transactions openbanking

    Pages 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/payout openfinance

    Disburses 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/rollover openfinance

    Applies 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/code opendata

    Returns 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

Get a quote