Documentation API Reference
Support Status
Sandbox ▾
Introduction

Finfra API Reference

The Finfra API is a RESTful interface for managing borrower KYC, loan origination, disbursement, and repayment. It accepts JSON and form-encoded requests and returns JSON responses. All actions are performed per object - bulk operations are not supported. The API key type used determines whether requests hit the production environment or are restricted to test mode.

REST
Architecture
JSON responses
2
Environments
Sandbox + Production
JWT
Auth method
Bearer + Basic + ApiKey

Base URLs

Sandbox
https://sandbox-partner-service.elp.finfra.io
Production
https://partner-service.elp.finfra.io
💡 Use your sandbox credentials for all development and testing. Actions in sandbox do not connect to banking infrastructure and have no effect on real data.

Endpoints at a glance

Authentication

Authentication

Finfra uses three authentication schemes. Which one to use depends on the endpoint. Keep your API keys confidential - never expose them in public repositories or client-side code. All API interactions must be over HTTPS.

SchemeHeaderUsed for
BasicAuthAuthorization: Basic …Generating access tokens
BearerAuthAuthorization: Bearer JWTBorrower, document, and loan endpoints
ApiKeyAuthfinfra-auth-key: …Callback / webhook endpoints

Generate access token

POST/api/auth/token/v2200 OK
Exchange Basic credentials for a JWT access token. Include this token as a Bearer on all subsequent requests.
⚠️/api/auth/token (v1) will be deprecated. Use /api/auth/token/v2 for all new integrations.

Request

curl -X POST https://sandbox-partner-service.elp.finfra.io/api/auth/token/v2 \
  -H "Authorization: Basic $(echo -n 'clientId:clientSecret' | base64)"

Response

JSON
{
  "access_token":  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type":    "Bearer",
  "expires_in":    3600
}
✅Use POST /api/auth/refresh with headers x-access-token and x-refresh-token to refresh your session without re-authenticating with Basic credentials.
Errors & Health

Error Handling & Healthcheck

All errors return a consistent JSON body. Use the healthcheck endpoints to verify service availability before integration testing.

Error response format

JSON
{
  "status":  400,
  "error":   "Bad Request",
  "message": "Validation failed: email is required"
}

HTTP status codes

CodeMeaning
200Success
201Resource created
400Validation error - check request body or params
401Unauthorized - invalid or missing token
403Forbidden - insufficient permissions
409Conflict - resource already exists
415Unsupported media type
429Rate limited - slow down and retry
500Internal server error

Healthcheck

GET/healthcheck/productionness200 OK
Returns 200 if the service process is aproduction. No authentication required.
GET/healthcheck/readiness200 OK
Returns 200 if the service is ready to handle traffic and all dependencies are connected. No authentication required.
Borrower

Create Borrower

Finfra supports two borrower types: PERSONAL (individual) and BUSINESS (entity). The type provided drives a different KYC procedural workflow, so ensure the correct value is supplied.

POST/api/core/users200 OK
Creates a partner borrower profile. Requires Bearer token authentication.

Headers

HeaderTypeRequiredDescription
AuthorizationstringrequiredBearer JWT from /api/auth/token/v2
kyc-idstringoptionalKYC session token for linking existing KYC context

Request body (JSON)

Top-level fields

FieldTypeRequiredDescription
typestringrequiredPERSONAL or BUSINESS. Determines the KYC workflow applied to this borrower.
entityobjectoptionalBusiness entity details. Required when type is BUSINESS.
authorised_signatoryobjectrequiredIndividual person details. For PERSONAL borrowers this is the borrower themselves. For BUSINESS borrowers this is the authorised signatory of the entity.

entity object

FieldTypeRequiredDescription
namestringrequiredRegistered company name
addressobjectrequiredCompany registered address. See address object below.
phone_numberstringrequiredCompany phone number in international format, e.g. +6287711998822
faxstringoptionalCompany fax number in international format
emailstringrequiredCompany email address
business_typestringrequiredType of business. e.g. OTHER
industrystringrequiredIndustry classification. e.g. PRIVATE_PERSON_NAME
nationalitystringrequiredISO 3166-1 alpha-2 country code of company nationality, e.g. ID
residencestringrequiredISO 3166-1 alpha-2 country code of company residence, e.g. ID
npwpstringrequiredCompany tax identification number (NPWP)
phone_extstringoptionalAdditional phone number or extension
legal_entitystringrequiredLegal entity type, e.g. PT, CV
establishment_datestringrequiredDate of establishment in YYYY-MM-DD format
establishment_placestringrequiredCity or place of establishment
deed_datestringrequiredDate of the establishment deed in YYYY-MM-DD format
deed_numberstringrequiredEstablishment deed reference number
managementsarrayrequiredList of company management personnel. See management object below.

entity.managements[] object

FieldTypeRequiredDescription
namestringrequiredFull name of the management person
positionstringrequiredRole in the company, e.g. OWNER_MANAGEMENT
email_addressstringrequiredEmail address
mobile_numberstringrequiredMobile number in international format
addressstringrequiredResidential address
genderstringrequiredMALE or FEMALE
identity_numberstringrequiredNIK (national identity number), 16 digits

authorised_signatory object

FieldTypeRequiredDescription
first_namestringrequiredFirst name
last_namestringrequiredLast name
birth_datestringrequiredDate of birth in YYYY-MM-DD format
birth_placestringrequiredCity or place of birth
emailstringrequiredEmail address
mother_maiden_namestringrequiredMother's maiden name
marital_statusstringrequiredMARRIED, SINGLE, DIVORCED, or WIDOWED
genderstringrequiredMALE or FEMALE
titlestringrequiredSalutation, e.g. BPK (Bapak), IBU
domicilestringrequiredISO 3166-1 alpha-2 country code of domicile
religionstringrequiredReligion, e.g. ISLAM, CHRISTIAN, CATHOLIC, HINDU, BUDDHIST, CONFUCIAN
jobstringrequiredOccupation type, e.g. PRIVATE_SECTOR_EMPLOYEE
educationstringrequiredHighest education level, e.g. ELEMENTARY_SCHOOL
addressobjectrequiredResidential address. See address object below. Also accepts country field (ISO 3166-1 alpha-2).
mobile_numberstringrequiredMobile number in international format
bank_accountarrayoptionalList of bank accounts. See bank_account object below.
documentsobjectrequiredKYC documents. See documents object below.
business_typestringoptionalType of business (if self-employed), e.g. OTHER
monthly_income_rangestringrequiredMonthly income bracket, e.g. LESS_THAN_3_MILLION
emergency_contact_namestringrequiredEmergency contact full name
emergency_contact_numberstringrequiredEmergency contact phone number
housing_statusstringrequiredHousing ownership status, e.g. OWN_HOME
source_of_fundstringrequiredPrimary source of income, e.g. SALARY
place_of_workstringrequiredEmployer or company name
work_addressstringrequiredWorkplace address
work_phone_numberstringrequiredWorkplace phone number
number_of_dependentsintegeroptionalNumber of financial dependents
spouse_identification_numberstringoptionalSpouse NIK. Applicable when marital_status is MARRIED.
spouse_namestringoptionalSpouse full name
spouse_date_of_birthstringoptionalSpouse date of birth in YYYY-MM-DD format
prenuptial_agreementstringoptionaltrue or false. Whether a prenuptial agreement exists.

address object

FieldTypeRequiredDescription
street_addressstringrequiredFull street address
rtstringrequiredRT (neighbourhood unit) number
rwstringrequiredRW (community unit) number
provincestringrequiredProvince code, e.g. JAWA_BARAT, DKI_JAKARTA
citystringrequiredCity or regency name
districtstringrequiredDistrict (kecamatan) name
villagestringrequiredVillage (kelurahan) name
postal_codestringrequiredPostal code
countrystringoptionalISO 3166-1 alpha-2 country code. Used in authorised_signatory.address.

bank_account[] object

FieldTypeRequiredDescription
holder_namestringrequiredAccount holder full name
numberstringrequiredBank account number
swift_codestringrequiredBank SWIFT/BIC code

documents object

FieldTypeRequiredDescription
ktpobjectrequiredIndonesian national ID card (KTP). Contains number (16-digit NIK), file (base64 or URL), issuing_city, and expiry_date (YYYY-MM-DD).
selfieobjectrequiredSelfie photo. Contains file (base64 or URL).
npwpobjectoptionalTax ID document. Contains number (NPWP number) and file (base64 or URL).
selfie_with_ktpobjectoptionalSelfie holding KTP. Contains file (base64 or URL).
stock_imagesobjectoptionalBusiness stock/inventory images. Contains file (base64 or URL).
finance_reportobjectoptionalFinancial report document. Contains file (base64 or URL).

Example request body

JSON
{
  "type": "PERSONAL",
  "authorised_signatory": {
    "first_name": "Budi",
    "last_name": "Santoso",
    "birth_date": "1995-11-01",
    "birth_place": "Jakarta",
    "email": "budi@example.com",
    "mother_maiden_name": "Sari",
    "marital_status": "MARRIED",
    "gender": "MALE",
    "title": "BPK",
    "domicile": "ID",
    "religion": "ISLAM",
    "job": "PRIVATE_SECTOR_EMPLOYEE",
    "education": "ELEMENTARY_SCHOOL",
    "address": {
      "street_address": "Jl. Sudirman No. 1",
      "rt": "01",
      "rw": "01",
      "province": "JAWA_BARAT",
      "city": "Bandung",
      "district": "Coblong",
      "village": "Dago",
      "postal_code": "40135",
      "country": "ID"
    },
    "mobile_number": "+6281234567890",
    "bank_account": [
      {
        "holder_name": "Budi Santoso",
        "number": "123123123213",
        "swift_code": "BNINIDJA"
      }
    ],
    "documents": {
      "ktp": {
        "number": "3275062009921981",
        "file": "base64_or_url",
        "issuing_city": "Jakarta",
        "expiry_date": "2099-11-01"
      },
      "selfie": { "file": "base64_or_url" }
    },
    "monthly_income_range": "LESS_THAN_3_MILLION",
    "emergency_contact_name": "Humairah",
    "emergency_contact_number": "08123456789",
    "housing_status": "OWN_HOME",
    "source_of_fund": "SALARY",
    "place_of_work": "Finfra",
    "work_address": "Mega Kuningan",
    "number_of_dependents": 3,
    "spouse_name": "Mia",
    "spouse_identification_number": "3275062309984412",
    "spouse_date_of_birth": "1999-03-01",
    "prenuptial_agreement": "true"
  }
}

Response

💡Borrower creation is processed asynchronously. The response confirms the request was accepted. The borrower status update will be delivered via webhook to your registered callback URL.
JSON
{
  "status": "success",
  "message": "Borrower creation request accepted"
}
Borrower

Create Borrower (KYC Path)

POST/api/core/{kycIdPath}/users200 OK
Creates a borrower profile directly linked to a KYC session via the path parameter. Identical request body to POST /api/core/users.

Path Parameters

ParameterTypeRequiredDescription
kycIdPathstringrequiredJWT-formatted KYC session ID e.g. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Borrower

Get Borrower

GET/api/core/users/{userId}200 OK
Returns a single borrower profile by user ID. Remove user ID if you expecting borrower data list

Path Parameters

ParameterTypeRequiredDescription
userIdstringrequiredBorrower user ID
nikstringrequiredBorrower's NIK (national identity number). Can be used as an alternative to userId.

Response fields

FieldTypeDescription
idstringUnique borrower identifier
partner_idstringPartner identifier (UUID) the borrower belongs to
statusstringCurrent borrower status, e.g. PENDING, APPROVED_BY_PARTNER, BLOCKED
typestringPERSONAL or BUSINESS
authorised_signatoryobjectIndividual person details. Same structure as the Create Borrower request. Includes all personal info, address, bank accounts, documents, employment, and spouse details.
created_atstringISO 8601 timestamp of when the borrower was created

Response

JSON
{
  "id": "6a41ff87dda4eefd0b7b0300",
  "partner_id": "1507b694-e78e-4fc9-ac28-68d72fba45e9",
  "status": "APPROVED_BY_PARTNER",
  "type": "PERSONAL",
  "authorised_signatory": {
    "first_name": "FERDIAN",
    "last_name": "HENDRI SISWORO",
    "birth_date": "1987-11-23T00:00:00.000Z",
    "birth_place": "MALANG",
    "email": "sarengmalang@gmail.com",
    "mother_maiden_name": "Lilik Ariani",
    "documents": {
      "ktp": {
        "number": "3573032311870003",
        "file": "6a41fddddda4eefd0b7b0274"
      },
      "selfie": {},
      "npwp": {},
      "selfie_with_ktp": {}
    },
    "marital_status": "MARRIED",
    "domicile": "ID",
    "religion": "CHRISTIAN",
    "gender": "MALE",
    "job": "BUSINESS_OWNER",
    "education": "BACHELORS_DEGREE",
    "address": {
      "street_address": "JL. DANDELION D2 PERUM DE GREEN PAVILLION",
      "city": "MALANG",
      "district": "LOWOKWARU",
      "postal_code": "65142",
      "province": "JAWA_TIMUR",
      "rt": "002",
      "rw": "003",
      "village": "TUNGGULWULUNG"
    },
    "mobile_number": "+6281339933711",
    "bank_account": [
      {
        "holder_name": "FERDIAN HENDRI SISWORO",
        "number": "7353740141",
        "swift_code": "BBIJIDJA"
      }
    ],
    "business_type": "RESTAURANT",
    "monthly_income_range": "GTE_20_AND_LT_50_MILLION",
    "emergency_contact_name": "Doni",
    "emergency_contact_number": "+6287854595905",
    "housing_status": "OWN_HOME",
    "source_of_fund": "SALARY",
    "place_of_work": "Sareng Indonesian Culinary & Coffee Space",
    "work_address": "",
    "number_of_dependents": 2,
    "spouse_identification_number": "3573012208890003",
    "spouse_name": "Yessi Puspitasari",
    "spouse_date_of_birth": "1989-08-22T00:00:00.000Z",
    "prenuptial_agreement": false
  },
  "created_at": "2026-06-29T05:15:51.591Z"
}

Error Responses

StatusError CodeDescription
404USER_ID_NOT_FOUNDThe provided userId or NIK does not match any borrower
400INVALID_USER_IDThe provided userId or NIK has an incorrect format
404 — User not found
{
  "error_code": "USER_ID_NOT_FOUND",
  "message": "Provided userId is not found"
}
400 — Invalid format
{
  "error_code": "INVALID_USER_ID",
  "message": "Invalid user id format"
}
Borrower

Update Borrower

PATCH/api/core/users/{userId}200 OK
Partially updates a borrower profile. Only include fields you wish to change.

Path Parameters

ParameterTypeRequiredDescription
userIdstringrequiredBorrower user ID to update
Borrower

Approve Borrower

POST/api/core/users/{userId}/approve200 OK
Approves a borrower after KYC verification is complete. No auth required on this endpoint.

Path Parameters

ParameterTypeRequiredDescription
userIdstringrequiredBorrower user ID to approve
💡A borrower must be in APPROVED status before a loan can be created for them.
Borrower

Block Borrower

POST/api/core/users/{userId}/block200 OK
Blocks a borrower, preventing them from accessing loan services. No auth required.

Path Parameters

ParameterTypeRequiredDescription
userIdstringrequiredBorrower user ID to block
e-KYC

OCR Documents

POST/api/core/users/ocr200 OK
Performs OCR on uploaded KYC documents (e.g. KTP/ID card) to extract borrower data automatically.

Headers

HeaderTypeRequiredDescription
data-sourcestringrequiredizidata | VERIHUBS | ASLIRI | VIDA
kyc-idstringoptionalKYC session token
AuthorizationstringRequiredAuthorization Token

Body Request

FieldTypeRequiredDescription
document_idstringrequiredUploaded ktp document_id
e-KYC

KYC

POST/api/core/users/biometric200 OK
Submit an image to identified a selfie and challanges againts government database.
Below are the example payload if the data-source is VERIHUBS.

Headers

HeaderTypeRequiredDescription
kyc-idstringoptionalId received from consent API
data-sourcestringrequiredVERIHUBS

Request Body

FieldTypeRequiredDescription
namestringrequiredBorrower full name, must match with ID
birth_datestringrequiredborrower's birth date, must match with ID
selfie_photostringrequiredborrower's selfie photo
files_photostringrequiredborrower ID photo
nikstringrequiredKTP number
emailstringrequiredborrower's email
phone_numberstringrequiredborrower's phone number

cURL Example

bash
      --request POST \
      --url https://sandbox-partner-service.elp.finfra.io/api/core/users/biometric \
      --header 'Accept: application/json' \
      --header 'Content-Type: application/json' \
      --header 'data-source: VERIHUBS' \
      --header 'kyc_id: ' \
      --header 'x-refresh-token: ' \
      --header 'x-access-token: ' \
      --data '{
              {
                "name": "John Doe",
                "birth_date": "1995-11-01",
                "selfie_photo": "",
                "files_photo": "",
                "nik": "3275062009921981",
                "email": "john.doe@example.com",
                "phone": "+6281234567890"
              }
          }'
          
💡Both checks must independently report SUCCESS before the borrower can proceed past the biometric stage, a failure in either one (not necessarily the failure of one blocking the other) is enough to block borrower creation with BIOMETRIC_NOT_PASSED.

Response Example

bash
          {
            "verihubs": {
              "check_id_status": "SUCCESS",
              "check_id_result": { "message": "...", "data": { "status": "...", "id": "...", "reject_field": [], "reference_id": "..." } },
              "liveness_status": "SUCCESS",
              "liveness_result": {
                "status_code": "...",
                "message": "...",
                "session_id": "...",
                "liveness": { "status": true, "probability": "0.98" },
                "attributes": { "sunglasses_on": false, "mask_on": false, "veil_on": false, "hat_on": false },
                "image_quality": { "blur": false, "dark": false, "grayscale": false },
                "bounding_box": { ... },
                "face_landmark": { ... },
                "nface": 1,
                "timestamp": 1758...
              }
            },
            "asliri": null,
            "vida": null
          }
          
e-KYC

CLIK Credit Report

POST/api/core/users/clik/credit-report200 OK
Requests a credit report from AFPI/CLIK for a borrower. Returns either an individual or company credit report depending on the borrower type.

Headers

HeaderTypeRequiredDescription
Acceptstringrequiredapplication/json
Content-Typestringrequiredapplication/json
borrower-typestringrequiredBorrower type
x-access-tokenstringrequiredAccess token for authentication
x-refresh-tokenstringrequiredRefresh token for authentication

Request Body

FieldTypeRequiredDescription
full_namestringrequiredFull name of the borrower
birth_datestringrequiredDate of birth in YYYY-MM-DD format
genderstringrequiredGender: l (male) or p (female)
address_dataobjectrequiredBorrower address details
address_data.street_addressstringrequiredStreet address
address_data.rtstringrequiredRT number
address_data.rwstringrequiredRW number
address_data.provincestringrequiredProvince code
address_data.citystringrequiredCity code
address_data.districtstringrequiredDistrict name
address_data.villagestringrequiredVillage name
address_data.postal_codestringrequiredPostal code
address_data.countrystringrequiredCountry code (e.g. ID)
ktp_numberstringrequiredKTP (NIK) number
phone_numberstringrequiredPhone number with country code

cURL Example

bash
curl --request POST \
  --url https://sandbox-partner-service.elp.finfra.io/api/core/users/clik/credit-report \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'borrower-type: ' \
  --header 'x-access-token: ' \
  --header 'x-refresh-token: ' \
  --data '{
  "full_name": "NISA RANI",
  "birth_date": "1992-09-02",
  "gender": "l",
  "address_data": {
    "street_address": "JL. PASAR ANYAR",
    "rt": "01",
    "rw": "01",
    "province": "JAWA_BARAT",
    "city": "0394",
    "district": "BOGOR",
    "village": "CIBOGOR",
    "postal_code": "12573",
    "country": "ID"
  },
  "ktp_number": "3275062309980012",
  "phone_number": "+6281111555777"
}'

Response

The response contains the full CLIK credit report. Arrays with multiple items are truncated below for brevity — only the first item is shown.

JSON
{
  "name": "MGUNAWAN",
  "error": null,
  "gender": "Female",
  "id_code": "3173084900000001",
  "id_type": "ID CARD",
  "currency": "Indonesian Rupiah",
  "birthdate": "1985-07-09",
  "birthplace": "JAKARTA",
  "mother_name": "SRI MADIATI SYUKUR",
  "bond_overdue": "0",
  "flag_matched": "1",
  "subject_code": "201648833",
  "currency_code": "IDR",
  "enquired_data": {
    "subject": {
      "individual": {
        "individual_name": {
          "name_as_id": "MGUNAWAN",
          "full_name": "MGUNAWAN"
        },
        "birthdata": {
          "date": "1985-07-09",
          "place": "JAKARTA"
        },
        "address": {
          "address": {
            "address": "UNDEFINED",
            "sub_district": "UNDEFINED",
            "district": "KEMBANGAN",
            "city": "0394",
            "postal_code": "11620",
            "country": "ID"
          },
          "address_desc": {
            "city_desc": "Wil. Kota Jakarta Selatan",
            "country_desc": "INDONESIA"
          }
        },
        "identification_code": {
          "identity_type": "1",
          "identity_number": "3173084907850001"
        },
        "identification_code_desc": {
          "identity_type_desc": "ID CARD"
        },
        "contact": {
          "cell_phone_number": "+628179975831",
          "email_address": null
        },
        "resident": null,
        "resident_desc": null,
        "gender": "P",
        "gender_desc": "Female"
      },
      "application": {
        "credit": {
          "application_amount": null
        },
        "contract_type_code": null,
        "contract_phase": null,
        "contract_request_date": null,
        "currency": null
      },
      "application_desc": {
        "contract_type_desc": null,
        "contract_phase_desc": null,
        "currency_desc": null
      },
      "link": {
        "role": null
      },
      "link_desc": {
        "role": null
      },
      "subject_ref_date": null
    }
  },
  "import_status": "success",
  "total_overdue": "672916583",
  "credit_overdue": "672916583",
  "marital_status": "SINGLE",
  "address_history": [
    {
      "address": {
        "address": "TMN MERUYA ILIR G9 NO 8",
        "sub_district": "MERUYA UTARA (ILIR)",
        "district": "KEMBANGAN",
        "city": "0393",
        "postal_code": "11620",
        "country": "ID"
      },
      "address_desc": {
        "city_desc": "Wil. Kota Jakarta Barat",
        "country_desc": "INDONESIA"
      },
      "flag_current": "1",
      "last_update_date": "2026-03-16"
    }
    // ... 13 more items
  ],
  "bg_credit_limit": "0",
  "cb_subject_code": "201648833",
  "contact_history": [
    {
      "contact": {
        "phone_number": "08179975831",
        "cell_phone_number": "+628179975831",
        "email_address": "MARLENE.GUNAWAN@YAHOO.COM"
      },
      "flag_current": "1",
      "last_update_date": "2026-03-16"
    }
    // ... 9 more items
  ],
  "bg_debit_balance": "0",
  "last_update_date": "2026-03-16",
  "subject_ref_date": null,
  "iloc_credit_limit": "0",
  "bond_debit_balance": "0",
  "educational_status": "Masters Degree",
  "employment_history": [
    {
      "flag_current": "1",
      "employment_data": {
        "workplace": "BANK ARTHA GRAHA",
        "employer_sector": "730000",
        "occupation_code": "008",
        "workplace_address": "NA"
      },
      "last_update_date": "2026-01-31",
      "employment_data_desc": {
        "occupation_desc": "Marketing",
        "employer_sector_desc": "ADVERTISING AND MARKET RESEARCH"
      }
    }
    // ... 7 more items
  ],
  "iloc_debit_balance": "0",
  "risk_level_partner": "Very High Risk",
  "credit_credit_limit": "2420870078",
  "identification_code": {
    "last_update_data": "2026-03-16",
    "identification_code": {
      "identity_type": "1",
      "identity_number": "3173084907850001"
    },
    "identification_code_desc": {
      "identity_type_desc": "ID CARD"
    }
  },
  "bg_contracts_counter": "0",
  "credit_debit_balance": "2058272172",
  "latest_hundred_loans": [
    {
      "maximum": {
        "max_days_past_due": "0",
        "worst_status_code": "1",
        "worst_status_date": "2026-02-28",
        "worst_status_desc": "Current",
        "max_days_past_due_date": null,
        "max_overdue_payments_amount": "0",
        "max_overdue_payments_number": "4",
        "max_overdue_payments_number_date": "2026-02-28"
      },
      "common_data": {
        "reference_no": "1",
        "cb_contract_code": "I66308707",
        "provider_type_code": "0801",
        "provider_type_code_desc": "Fintech",
        "provider_code": "016392",
        "provider_code_desc": "PT Kredit Pintar Indonesia",
        "reference_date": "2026-02-28",
        "contract_phase": "AC",
        "contract_phase_desc": "Active",
        "role": "B",
        "role_desc": "Borrower",
        "contract_type_code": "Q99",
        "contract_type_code_desc": "Others - Fintech",
        "start_date": "2025-12-17",
        "due_date": "2026-03-17",
        "currency_code": "IDR",
        "currency_code_desc": "Indonesian Rupiah",
        "past_due_staus_code": "1",
        "past_due_staus_desc": "Current",
        "contract_status_code": "00",
        "contract_status_desc": "Active Facilities"
      },
      "guarantors": {
        "guarantors_summary": {
          "guarantors_counter": "0"
        }
      },
      "collaterals": {
        "collaterals_summary": {
          "collaterals_counter": "0",
          "total_collateral_value": "0"
        }
      },
      "credit_profile": [
        {
          "reference_year": "2026",
          "reference_month": "2",
          "days_past_due": "2026",
          "overdue": "0",
          "overdue_payments_number": "4",
          "quality_code": "1",
          "quality_code_desc": "Current",
          "debit_balance": "1580266",
          "current_month_realization": "0",
          "contract_status_code": "00",
          "contract_status_desc": "Active Facilities"
        },
        {
          "reference_year": "2026",
          "reference_month": "1",
          "days_past_due": "2026",
          "overdue": "0",
          "overdue_payments_number": "4",
          "quality_code": "1",
          "quality_code_desc": "Current",
          "debit_balance": "3078859",
          "current_month_realization": "0",
          "contract_status_code": "00",
          "contract_status_desc": "Active Facilities"
        },
        {
          "reference_year": "2025",
          "reference_month": "12",
          "days_past_due": "2025",
          "overdue": "0",
          "overdue_payments_number": "4",
          "quality_code": "1",
          "quality_code_desc": "Current",
          "debit_balance": "4500000",
          "current_month_realization": "4500000",
          "contract_status_code": "00",
          "contract_status_desc": "Active Facilities"
        }
      ],
      "granted_credit": {
        "code_characteristic_credit": "9",
        "code_characteristic_credit_desc": "Others",
        "code_agreement_credit": "000",
        "code_agreement_credit_desc": "Conventional",
        "original_agreement_number": "A17659433742165883",
        "original_agreement_date": "2025-12-17",
        "final_agreement_number": "A17659433742165883",
        "final_agreement_date": "2025-12-17",
        "frequency_of_credit": "0",
        "start_date_of_credit": "2025-12-17",
        "debtor_category_code": "NU",
        "debtor_category_code_desc": "Not a Debtor of Micro, Small and Medium Enterprises",
        "usage_type_code": "3",
        "usage_type_code_desc": "Consumption",
        "usage_orientation_code": "3",
        "usage_orientation_code_desc": "Other",
        "economic_sector_code": "004190",
        "economic_sector_code_desc": "HOUSEHOLD FOR MULTIPURPOSES",
        "city_code": "0393",
        "city_code_desc": "Wil. Kota Jakarta Barat",
        "project_value": "0",
        "interest_rate": "5.32",
        "type_of_interest_rate": "1",
        "type_of_interest_rate_desc": "Fixed Interest Rates",
        "financig_program": "10",
        "financig_program_desc": "Non Government Program Loans",
        "initial_credit_limit": "4500000",
        "credit_limit": "1580266",
        "current_month_realization": "0",
        "penalty": "0",
        "debit_balance": "1580266",
        "value_in_original_currency": "0",
        "principal_overdue_amount": "0",
        "interest_overdue_amount": "0",
        "days_past_due": "0",
        "overdue_payments_number": "4",
        "frequency_of_restructuring": "0",
        "initial_restructuring_date": null,
        "final_restructuring_date": null,
        "code_of_restructuring": null,
        "code_of_restructuring_desc": null
      },
      "join_account_number": {
        "subject_sequence_member": null
      }
    }
    // ... 76 more items
  ],
  "iloc_active_contracts": "0",
  "of_aggregated_details": {
    "requested": "0",
    "active": "0",
    "refused": "0",
    "renounced": "0",
    "closed": "0"
  },
  "bond_contracts_counter": "0",
  "loc_aggregated_details": {
    "requested": "0",
    "active": "0",
    "refused": "0",
    "renounced": "0",
    "closed": "0"
  },
  "active_credit_financing": "28",
  "bond_aggregated_details": {
    "requested": "0",
    "active": "0",
    "refused": "0",
    "renounced": "0",
    "closed": "0"
  },
  "provider_application_no": "GG0001",
  "total_potential_exposure": "2075085809",
  "clik_credit_score_partner": "288",
  "credit_aggregated_details": {
    "requested": "6",
    "active": "28",
    "refused": "0",
    "renounced": "0",
    "closed": "49"
  },
  "outstanding_limit_partner": [
    "1580266"
    // ... 76 more items
  ],
  "guarantee_aggregated_details": {
    "requested": "0",
    "active": "0",
    "refused": "0",
    "renounced": "0",
    "closed": "0"
  },
  "footprints_count1month_partner": "1",
  "footprints_count3month_partner": "3",
  "footprints_count6month_partner": "5",
  "footprints_count12month_partner": "15",
  "contractshistory_credit_numberssummary_active_partner": "28",
  "contractshistory_credit_numberssummary_closed_partner": "49",
  "contractshistory_aggregateddata_contractsnumber_partner": "83",
  "contractshistory_aggregateddata_totalcreditlimit_partner": "2952172111",
  "contractshistory_credit_numberssummary_renounced_partner": "0",
  "contractshistory_credit_numberssummary_requested_partner": "6",
  "contractshistory_aggregateddata_totaldebitbalance_partner": "2069085809",
  "contractshistory_aggregateddata_reportingprovidersnumber_partner": "26"
}
e-KYC

AFPI Credit History

GET/api/core/users/{identityNumber}/{reffid}/afpi/credit-report200 OK
Retrieves the AFPI credit history for a borrower by identity number and reference ID.

Path Parameters

ParameterTypeRequiredDescription
identityNumbernumberrequiredBorrower NIK
reffidstringrequiredReference ID from AFPI

Headers

HeaderTypeRequiredDescription
Acceptstringrequiredapplication/json
borrower-typestringrequiredBorrower type
x-access-tokenstringrequiredAccess token for authentication
x-refresh-tokenstringrequiredRefresh token for authentication

cURL Example

bash
curl --request GET \
  --url https://sandbox-partner-service.elp.finfra.io/api/core/users/{identityNumber}/{reffid}/afpi/credit-report \
  --header 'Accept: application/json' \
  --header 'borrower-type: ' \
  --header 'x-access-token: ' \
  --header 'x-refresh-token: '

Response

JSON
{
  "data_source": "AFPI",
  "borrower_type": "personal",
  "data_result": {
    "no_identitas": "5103050101660002",
    "no_hp": "",
    "mail": "",
    "user_id": "m@danabijak.com",
    "user_name": "DANABIJAK",
    "inquiry_reason": "1 - Applying loan via Platform",
    "member_id": "820056",
    "member_name": "DANABIJAK",
    "refference_id": "checking",
    "inquiry_date": "2026-03-31",
    "status": "SUCCESS",
    "pinjaman": [
      {
        "id_penyelenggara": "AFDC111",
        "jenis_pengguna": 1,
        "nama_borrower": "FIRA DIYANKA",
        "no_identitas": "5103050101660002",
        "no_npwp": "000000000000000",
        "no_hp": "6208******1841",
        "email": "off****ika@gmail.com",
        "tgl_perjanjian_borrower": "2025-04-03",
        "tgl_penyaluran_dana": "2025-04-03",
        "nilai_pendanaan": 82125,
        "tgl_pelaporan_data": "2025-04-04",
        "sisa_pinjaman_berjalan": 0,
        "tgl_jatuh_tempo_pinjaman": "2025-04-30",
        "kualitas_pinjaman": "1",
        "dpd_terakhir": 0,
        "dpd_max": 0,
        "status_pinjaman": "L",
        "jenis_pengguna_ket": "Individual",
        "kualitas_pinjaman_ket": "Lancar",
        "status_pinjaman_ket": "Fully Paid",
        "penyelesaian_w_oleh": "Default",
        "pendanaan_syariah": false,
        "tipe_pinjaman": "Multiguna",
        "sub_tipe_pinjaman": "Paylater/ Line Of Credit",
        "reference": "",
        "id": "352d9fc3e624e9fd46d3b7847fd0be58",
        "agunan": "Tidak Memiliki Agunan",
        "tgl_agunan": null,
        "nama_penjamin": "",
        "no_agunan": "",
        "pendapatan": 0
      },
      {
        "id_penyelenggara": "AFDC111",
        "jenis_pengguna": 1,
        "nama_borrower": "FIRA DIYANKA",
        "no_identitas": "5103050101660002",
        "no_npwp": "000000000000000",
        "no_hp": "6208******1841",
        "email": "off****ika@gmail.com",
        "tgl_perjanjian_borrower": "2025-04-01",
        "tgl_penyaluran_dana": "2025-04-01",
        "nilai_pendanaan": 51800,
        "tgl_pelaporan_data": "2025-04-04",
        "sisa_pinjaman_berjalan": 0,
        "tgl_jatuh_tempo_pinjaman": "2025-04-30",
        "kualitas_pinjaman": "1",
        "dpd_terakhir": 0,
        "dpd_max": 0,
        "status_pinjaman": "L",
        "jenis_pengguna_ket": "Individual",
        "kualitas_pinjaman_ket": "Lancar",
        "status_pinjaman_ket": "Fully Paid",
        "penyelesaian_w_oleh": "Default",
        "pendanaan_syariah": false,
        "tipe_pinjaman": "Multiguna",
        "sub_tipe_pinjaman": "Paylater/ Line Of Credit",
        "reference": "",
        "id": "f0a6c1e466208e8e7739b70a172d6234",
        "agunan": "Tidak Memiliki Agunan",
        "tgl_agunan": null,
        "nama_penjamin": "",
        "no_agunan": "",
        "pendapatan": 0
      },
      {
        "id_penyelenggara": "AFDC111",
        "jenis_pengguna": 1,
        "nama_borrower": "FIRA DIYANKA",
        "no_identitas": "5103050101660002",
        "no_npwp": "000000000000000",
        "no_hp": "6208******1841",
        "email": "off****ika@gmail.com",
        "tgl_perjanjian_borrower": "2025-03-31",
        "tgl_penyaluran_dana": "2025-03-31",
        "nilai_pendanaan": 72250,
        "tgl_pelaporan_data": "2025-04-04",
        "sisa_pinjaman_berjalan": 0,
        "tgl_jatuh_tempo_pinjaman": "2025-04-30",
        "kualitas_pinjaman": "1",
        "dpd_terakhir": 0,
        "dpd_max": 0,
        "status_pinjaman": "L",
        "jenis_pengguna_ket": "Individual",
        "kualitas_pinjaman_ket": "Lancar",
        "status_pinjaman_ket": "Fully Paid",
        "penyelesaian_w_oleh": "Default",
        "pendanaan_syariah": false,
        "tipe_pinjaman": "Multiguna",
        "sub_tipe_pinjaman": "Paylater/ Line Of Credit",
        "reference": "",
        "id": "71b49d03f7cc298e286f91dcf46d1595",
        "agunan": "Tidak Memiliki Agunan",
        "tgl_agunan": null,
        "nama_penjamin": "",
        "no_agunan": "",
        "pendapatan": 0
      }
    ],
    "history_inquiry": {
      "statistic": {
        "3_hari": 0,
        "7_hari": 0,
        "30_hari": 0,
        "90_hari": 0,
        "180_hari": 0,
        "360_hari": 0,
        ">360_hari": 1
      },
      "last_3_days_inquiry": []
    },
    "platform_aktif": {
      "jumlah_platform_aktif": 0,
      "platform": []
    }
  }
}
e-KYC

Get KYC Submission

GET/api/core/kyc/{kycIdPath}/submission200 OK
Returns the KYC submission status and data for a given KYC session.

Path Parameters

ParameterTypeRequiredDescription
kycIdPathstringrequiredKYC session JWT token
e-KYC

Submit KYC

POST/api/core/kyc/{kycIdPath}/submit200 OK
Finalizes and submits a KYC session for processing.

Path Parameters

ParameterTypeRequiredDescription
kycIdPathstringrequiredKYC session JWT token
Documents

Create Document

The KYC document flow is two steps: (1) create a document object to receive a presigned upload URL, then (2) upload the file content to that URL. These steps must be executed in sequence.

POST/api/documents201 Created
Creates a document object and returns a presigned URL for file upload. No auth required.

Request body: multipart/form-data with document metadata and the file.

✅After creating the document object, PUT the file content directly to the returned presigned_url. The document is not usable until the file upload is complete.

Response

JSON
{
  "id":            "doc_01j4abc",
  "type":          "KTP",
  "presigned_url": "https://storage.finfra.io/upload?token=...",
  "expires_at":    "2025-06-29T09:00:00Z"
}
Documents

Get Document

GET/api/documents/{documentId}200 OK
Returns document metadata by document ID.

Path Parameters

ParameterTypeRequiredDescription
documentIdstringrequiredDocument ID (min 6 chars)
Documents

Get Document File

GET/api/documents/{documentId}/file200 OK
Streams the raw file binary for a document. Returns application/octet-stream.

Path Parameters

ParameterTypeRequiredDescription
documentIdstringrequiredDocument ID (min 6 chars)
Documents

Update Documents

PATCH/api/documents200 OK
Updates the description and type of multiple documents in a single request. Returns an array of updated document objects.
Loan Services

List Loans

GET/api/core/loans200 OK
Returns a paginated list of loans with optional filters by borrower, amount range, and date range.

Query Parameters

ParameterTypeRequiredDescription
userIdstringoptionalFilter by borrower user ID
uniqueIdstringoptionalFilter by loan unique ID (min 6 chars)
pageNumberintegeroptionalPage number (default: 1)
pageSizeintegeroptionalResults per page
startDatestringoptionalFilter from date
endDatestringoptionalFilter to date
startRangeAmountstringoptionalMinimum loan amount filter
endRangeAmountstringoptionalMaximum loan amount filter
Loan Services

Create Single Payment Loan

POST/api/core/loans/{userId}200 OK
Creates a single-repayment loan. Ideal for project financing or cash loans repaid in one lump sum at maturity.

Path Parameters

ParameterTypeRequiredDescription
userIdstringrequiredApproved borrower user ID
💡The borrower must be in APPROVED status before a loan can be created. Call POST /api/core/users/{userId}/approve first if needed.
Loan Services

Create BNPL (Installment Loan)

POST/api/core/loans/{userId}/bnpl200 OK
Creates an installment loan repaid in regular weekly, biweekly, or monthly payments. Each payment covers both principal and interest. Ideal for Buy Now, Pay Later (BNPL) flows.

Path Parameters

ParameterTypeRequiredDescription
userIdstringrequiredApproved borrower user ID
Loan Services

Loan Detail

GET/api/core/loans/details/{uniqueId}200 OK
Returns full loan details including repayment schedule by loan unique ID.

Path Parameters

ParameterTypeRequiredDescription
uniqueIdstringrequiredLoan unique ID (min 6 chars)

Headers

HeaderTypeRequiredDescription
Acceptstringrequiredapplication/json
x-access-tokenstringrequiredAccess token for authentication
x-refresh-tokenstringrequiredRefresh token for authentication

cURL Example

bash
curl --request GET \
  --url https://sandbox-partner-service.elp.finfra.io/api/core/loans/details/{uniqueId} \
  --header 'Accept: application/json' \
  --header 'x-access-token: ' \
  --header 'x-refresh-token: '

Response fields

FieldTypeDescription
idstringInternal loan identifier
partner_idstringPartner identifier (UUID) that owns the loan
userstringBorrower user ID
unique_idstringLoan unique ID, formatted as {partner_id}:{user_id}:{uuid}. Use this value as the uniqueId path parameter.
productstringLoan product code, e.g. finfra_production_wr_il_monthly
statusstringCurrent loan status: CREATED, ACTIVE, DISBURSE or CLOSED. See Loan Status below.
amountnumberLoan principal amount (IDR)
termnumberNumber of repayment installments
dataobjectLoan terms and contract metadata
data.annual_interest_ratenumberAnnual interest rate
data.disbursement_feenumberFee deducted at disbursement
data.cs_payment_daynumberConfigured payment day of month (0 if not set)
data.request_effective_onstringISO 8601 timestamp when the loan request became effective
data.grace_termnumberNumber of grace-period installments
data.interest_feenumberInterest fee amount
data.risk_levelstringRisk level assigned to the loan, e.g. LOW
data.contract_numberstringLoan contract number
data.distribution_channelstringChannel the loan was distributed through, e.g. OLS
detailsobjectDisbursement, repayment account and schedule details
details.va_numberstringVirtual account number for repayment
details.va_number_swift_codestringSWIFT code of the virtual account bank
details.disbursement_amountnumberAmount disbursed to the borrower (IDR)
details.balance_holdnumberAmount currently held from the balance
details.reference_numberstringLoan reference number
details.invoice_draftarrayRepayment schedule. One item per invoice.
details.invoice_draft[].due_onstringDue date (YYYY-MM-DD)
details.invoice_draft[].fee_amountnumberFee portion of the invoice
details.invoice_draft[].interest_amountnumberInterest portion of the invoice
details.invoice_draft[].principal_amountnumberPrincipal portion of the invoice
details.invoice_draft[].total_amountnumberTotal invoice amount
details.invoice_draft[].paidobjectAmounts already paid: amount, fee_amount, interest_amount, penalty_amount, principal_amount
details.invoice_draft[].unpaidobjectOutstanding amounts, same structure as paid
details.invoice_draft[].written_offobjectWritten-off amounts: fee_amount, interest_amount, penalty_amount, principal_amount
details.invoice_draft[].type_keystringInvoice type: capitalized_fee (upfront fee) or schedule (regular installment)
disbursement_statusobjectaccepted (boolean) and triggered (boolean) flags for the disbursement
money_movementarrayLedger of all fund movements on the loan
money_movement[].payment_idstringPayment identifier. A disbursement may have several entries with the same ID as its status changes.
money_movement[].account_holder_namestringAccount holder name, or INTERNAL for repayments
money_movement[].datestringISO 8601 timestamp of the movement
money_movement[].descriptionstringHuman-readable description of the movement
money_movement[].source_accountstringSource account or provider
money_movement[].destination_accountstringDestination account or provider
money_movement[].amountnumberAmount moved (IDR)
money_movement[].channel_namestringBank or channel used, e.g. BCA, PERMATA
money_movement[].statusstringMovement status, e.g. PENDING, SUCCESS
money_movement[].typestringTRANSFER_OUT (disbursement) or TRANSFER_IN (repayment)
pre_approved.extra_infoobjectPre-approval data from the partner: app, contract, merchant and destination bank account details
created_atstringISO 8601 timestamp of when the loan was created
payment_typestringRepayment method, e.g. manual
bank_accountobjectBorrower's disbursement bank account: bank_account_number, bank_account_holder_name, bank_account_swift_code

Loan Status

A loan moves through the following statuses in order: CREATED → ACTIVE → DISBURSE → CLOSED.

StatusDescription
CREATEDThe loan request has been received from the partner and is waiting to be written into the LMS (Loan Management System).
ACTIVEFinfra has received a callback from the LMS confirming the loan was written successfully. The loan is now ready for signing and disbursement.
DISBURSEThe loan funds have been disbursed to the borrower's bank account. Repayments are tracked in details.invoice_draft and money_movement.
CLOSEDThe loan has been closed.

Response

Arrays with multiple items are truncated below for brevity. All amounts are in IDR.

JSON
{
  "id": "68d1ef67112cb7e895f40b5a",
  "partner_id": "1507b694-e78e-4fc9-ac28-68d72fba45e9",
  "user": "68d1ef5c112cb7e895f40b51",
  "unique_id": "1507b694-e78e-4fc9-ac28-68d72fba45e9:68d1ef5c112cb7e895f40b51:98e4fb03-ab59-4eea-9eba-d962bf14d600",
  "product": "finfra_production_wr_il_monthly",
  "status": "PAID",
  "amount": 200000000,
  "term": 6,
  "data": {
    "annual_interest_rate": 0,
    "disbursement_fee": 0,
    "cs_payment_day": 0,
    "request_effective_on": "2025-09-23T07:52:44.649Z",
    "grace_term": 0,
    "interest_fee": 0,
    "risk_level": "LOW",
    "contract_number": "1088172581",
    "distribution_channel": "OLS"
  },
  "details": {
    "va_number": "892511004694324",
    "va_number_swift_code": "BMRIIDJA",
    "disbursement_amount": 200000000,
    "balance_hold": 0,
    "reference_number": "LA215748608015",
    "invoice_draft": [
      {
        "due_on": "2025-09-23",
        "fee_amount": 43600000,
        "interest_amount": 0,
        "principal_amount": 0,
        "total_amount": 43600000,
        "paid": {
          "amount": 43600000,
          "fee_amount": 43600000,
          "interest_amount": 0,
          "penalty_amount": 0,
          "principal_amount": 0
        },
        "unpaid": {
          "amount": 0,
          "fee_amount": 0,
          "interest_amount": 0,
          "penalty_amount": 0,
          "principal_amount": 0
        },
        "written_off": {
          "fee_amount": 0,
          "interest_amount": 0,
          "penalty_amount": 0,
          "principal_amount": 0
        },
        "type_key": "capitalized_fee"
      },
      {
        "due_on": "2025-10-23",
        "fee_amount": 0,
        "interest_amount": 0,
        "principal_amount": 40600000,
        "total_amount": 40600000,
        "paid": {
          "amount": 40600000,
          "fee_amount": 0,
          "interest_amount": 0,
          "penalty_amount": 0,
          "principal_amount": 40600000
        },
        "unpaid": {
          "amount": 0,
          "fee_amount": 0,
          "interest_amount": 0,
          "penalty_amount": 0,
          "principal_amount": 0
        },
        "written_off": {
          "fee_amount": 0,
          "interest_amount": 0,
          "penalty_amount": 0,
          "principal_amount": 0
        },
        "type_key": "schedule"
      }
      // ... 5 more "schedule" items (2025-11-23 to 2026-03-23)
    ]
  },
  "disbursement_status": {
    "accepted": true,
    "triggered": true
  },
  "money_movement": [
    {
      "payment_id": "68d2afacb75eeb41c97b9ad0",
      "account_holder_name": "JOHN DOE ",
      "additional_info": "",
      "date": "2025-09-23T14:33:16+00:00",
      "description": "sending money to borrower",
      "destination_account": "5220XXXXXX",
      "amount": 200000000,
      "channel_name": "BCA",
      "source_account": "INSTAMONEY",
      "status": "PENDING",
      "type": "TRANSFER_OUT"
    },
    {
      "payment_id": "68d2afacb75eeb41c97b9ad0",
      "account_holder_name": "JOHN DOE ",
      "additional_info": "",
      "date": "2025-09-23T14:33:24+00:00",
      "description": "money disbursed",
      "destination_account": "5220XXXXXX",
      "amount": 200000000,
      "channel_name": "BCA",
      "source_account": "INSTAMONEY",
      "status": "SUCCESS",
      "type": "TRANSFER_OUT"
    },
    {
      "payment_id": "68df209ab00192e895a9344d",
      "account_holder_name": "INTERNAL",
      "additional_info": "",
      "date": "2025-10-06T03:03:40+00:00",
      "description": "repayment success from xendit",
      "destination_account": "XENDIT",
      "amount": 15829682,
      "channel_name": "PERMATA",
      "source_account": "XENDIT",
      "status": "SUCCESS",
      "type": "TRANSFER_IN"
    }
    // ... more "TRANSFER_IN" repayment entries
  ],
  "pre_approved": {
    "extra_info": {
      "app_id": "80E1175A-C6D1-4479-BBF1-D260CB999385",
      "contract_id": "5d2a57ba-9e70-44dc-ac25-187ec56a1dbe",
      "merchant_id": "206370",
      "merchant_name": "JOHN DOE",
      "bank_account_name": "JOHN DOE ",
      "bank_account_number": "5220XXXXXX",
      "bank_name": "BANK CENTRAL ASIA",
      "disbursement_amount": "200000000.00",
      "request_id": "8e083454-15af-4d7e-8527-55b576be4eb2",
      "request_date": 1758637993
    }
  },
  "created_at": "2025-09-23T00:52:55.391Z",
  "payment_type": "manual",
  "bank_account": {
    "bank_account_number": "5220XXXXXX",
    "bank_account_holder_name": "JOHN DOE ",
    "bank_account_swift_code": "CENAIDJA"
  }
}
Loan Services

Initiate Loan Signing

POST/api/core/loans/signing/initiate200 OK
Initiates the loan agreement signing process. Must be completed before disbursement.
⚠️Signing must be completed before calling the disbursement endpoint. Disbursement will fail if the agreement is unsigned.
Loan Services

Disburse Loan

POST/api/core/loans/{loanUniqueId}/disbursement200 OK
Initiates disbursement of loan funds to the borrower's registered bank account.

Path Parameters

ParameterTypeRequiredDescription
loanUniqueIdstringrequiredLoan unique ID
⚠️Disbursement is irreversible once initiated. Ensure the loan agreement has been signed via POST /api/core/loans/signing/initiate before proceeding.
Loan Services

Reject Loan

POST/api/core/loans/{loanUniqueId}/reject200 OK
Rejects a pending loan application. Provide a rejection reason in the request body.

Path Parameters

ParameterTypeRequiredDescription
loanUniqueIdstringrequiredLoan unique ID
Loan Services

Create Virtual Account

POST/api/core/virtual-account/request200 OK
Generates a virtual account number for loan repayment via bank transfer.
Callbacks

Borrower Status Callback

Finfra sends callbacks to your registered endpoint when borrower status, credit score, loan, or BNPL status changes. Secure these endpoints with the finfra-auth-key header.

POSTRegistered Partner URL200 OK
Receives real-time status updates for user creation.

Path Parameters

ParameterTypeRequiredDescription
typestringrequiredEvent type identifier user-creation
statusstringrequiredStatus of the event SUCCESS
detailsobjectrequired
user_idstringrequiredInformation of the user_id e.g 6a94f951721bebf8455c6ab5
ktp_numberstringrequiredIndonesia ID number information
messagestringrequiredWebhook message SUCCESS

Headers

HeaderTypeRequiredDescription
finfra-auth-keystringrequiredAPI key for callback authentication (from dashboard)

Response

JSON
{
  "type":"user_creation",
  "status":"SUCCESS",
  "details": {
    "user_id":"6a94f951721bebf8455c6ab5",
    "ktp_number":"36710660118xxxxx"
  },
  "message":"SUCCESS"
}
Callbacks

Loan Status Callback

Finfra sends callbacks to your registered endpoint when loan status changes. Secure these endpoints with the finfra-auth-key header.

POSTRegistered Partner URL200 OK
Receives real-time status updates for loan creation.

Path Parameters

ParameterTypeRequiredDescription
typestringrequiredEvent type identifier loan-status
statusstringrequiredStatus of the event SUCCESS
detailsobjectrequired
ktp_numberstringrequiredIndonesia ID number information
loan_unique_idstringrequiredInformation of the loan id e.g 1507b694-e78e-4fc9-ac28-68d72fba45e9:69fb04a6af4f60846c63be81:f9611cc4-b716-475f-a51a-3a9365bea885
messagestringrequiredWebhook message SUCCESS

Headers

HeaderTypeRequiredDescription
finfra-auth-keystringrequiredAPI key for callback authentication (from dashboard)

Response

JSON
{
  "type":"loan-status",
  "status":"SUCCESS",
  "details": {
    "ktp_number":"36710660118xxxxx",
    "loan_unique_id":"1507b694-e78e-4fc9-ac28-68d72fba45e9:69fb04a6af4f60846c63be81:f9611cc4-b716-475f-a51a-3a9365bea885"
  },
  "message":"Your loan has been Created successfully"
}
Callbacks

Disbursement Callback

Finfra sends callbacks to your registered endpoint when disbursement are happening. Secure these endpoints with the finfra-auth-key header.

POSTRegistered Partner URL200 OK
Receives real-time status updates for loan creation.

Path Parameters

ParameterTypeRequiredDescription
typestringrequiredEvent type identifier disbursement-creation
statusstringrequiredStatus of the event SUCCESS
detailsobjectrequired
partner_codestringoptional
loan_unique_idstringrequiredInformation of the loan id e.g 1507b694-e78e-4fc9-ac28-68d72fba45e9:69fb04a6af4f60846c63be81:f9611cc4-b716-475f-a51a-3a9365bea885
messagestringrequiredWebhook message settled

Headers

HeaderTypeRequiredDescription
finfra-auth-keystringrequiredAPI key for callback authentication (from dashboard)

Response

JSON
{
  "type":"disbursement-creation",
  "status":"SUCCESS",
  "details": {
    "partner_code":null,
    "loan_unique_id":"1507b694-e78e-4fc9-ac28-68d72fba45e9:69fb04a6af4f60846c63be81:f9611cc4-b716-475f-a51a-3a9365bea885"
  },
  "message":"settled"
}