QFAST API Documentation
  1. API
  • Authentication
  • Onboarding
    • Overview
    • Reference
      • Area Reference
    • API
      • Onboarding Personal
        POST
      • Get Onboarding Status
        GET
      • Submit Loan
        POST
      • Get Loan
        GET
    • Webhook
      • Onboarding Webhooks
  • Disbursement
    • Overview
    • Webhook
      • Disbursement Webhooks
  • Repayment
    • Overview
    • Webhook
      • Repayment Webhooks
  • Schemas
    • Loan Schema
    • Onboarding Schema
  1. API

Onboarding Personal

Developing
POST
/v1/onboarding/personal

Onboarding Personal API#

This endpoint allows Lenders to register a new personal loan application for an individual borrower. QFAST orchestrates the KYC/KYB verification process with DOKU.
Two-step process: This endpoint registers the borrower and merchant profiles only. The merchant must pass KYB and reach active status before you can submit a loan — see Submit Loan.

1. Endpoint Information#

ItemDescription
MethodPOST
Path/v1/onboarding/personal
AuthOAuth2 Client Credentials (Bearer Token)
Content-Typeapplication/json

2. Request Headers#

HeaderTypeRequiredDescription
AuthorizationStringYesBearer <access_token>

3. Request Body#

3.1. Borrower Details (borrower)#

FieldTypeRequiredDescription
nameStringYesFull name of the borrower as per identity card.
emailStringYesActive email address of the borrower.
phone_numberStringYesBorrower's phone number without country code (e.g., 81234567890).
identity_numberStringYesKTP (NIK) number, 16 digits.
doku_wallet_idStringYesThe DOKU Wallet ID of the borrower.
taxpayer_identification_numberStringNoNPWP number (15 or 16 digits). Must be unique if provided.
business_identification_numberStringNoNIB (business registration number).

3.2. Merchant Details (merchant)#

Represents the business entity of the borrower.
FieldTypeRequiredDescription
nameStringYesRegistered business name.
descriptionStringNoBrief description of the business.
addressesArrayYesList of business locations. At least one required.
contactsArrayYesPIC or Owner details. Exactly one required.
brandsArrayYesBrand or trade name information. At least one required.

Address Object#

FieldTypeRequiredDescription
nameStringYesFull address details.
area_idUUIDYesQFAST Area ID. See the Area Reference for the full list of valid IDs.
primaryBooleanYesSet to true for the main business location.

Contact Object#

FieldTypeRequiredDescription
nameStringYesFull name of the owner/PIC.
owner_liveness_file_urlStringYesPublic URL to the liveness photo (selfie with ID).
owner_identity_file_urlStringYesPublic URL to the identity card (KTP) photo.

Brand Object#

FieldTypeRequiredDescription
nameStringYesBrand or trade name.
categoryStringYesBusiness category. Enum: retail, non_retail.
descriptionStringYesDescription of products or services.
transaction_frequencyStringNoAnnual revenue range. Enum: uke (< 200 Mio IDR), ume (200 Mio – 4 Bio IDR), ube (> 4 Bio IDR).
transaction_quantityStringNoMonthly transaction count. Enum: up_to_100, from_100_to_10k, more_than_10k.
photo_proof_file_urlStringYesPublic URL to a photo proof of the business (e.g., storefront).

4. Example Request#


5. Response#

Success Response (200 OK)#

{
  "data": {
    "merchant_id": "019db2ee-3857-7148-b320-6f6e7c4deedd",
    "identity_number": "3201234567890001",
    "onboarding_status": "pending",
    "kyb_revision_deadline": null,
    "kyb_rejection_details": null,
    "created_at": "2026-05-11 08:00:00",
    "updated_at": "2026-05-11 08:00:00"
  }
}
FieldTypeDescription
merchant_idUUIDUnique identifier for the registered merchant. Store this — it is required for the Loan Submission step.
identity_numberStringThe borrower's KTP number.
onboarding_statusStringCurrent KYB status. See Status Values below.
kyb_revision_deadlineDateTime|nullDeadline to resubmit if KYB needs revision.
kyb_rejection_detailsString|nullRejection reason if status is kyb_rejected.
created_atDateTimeRecord creation timestamp.
updated_atDateTimeLast update timestamp.

Status Values#

StatusDescription
pendingRegistration received, awaiting DOKU KYB submission.
kyb_processingDOKU is actively processing the verification.
kyb_approvedKYB verification passed. Ready for loan submission.
kyb_revision_neededDOKU requires corrections. Resubmit within kyb_revision_deadline.
kyb_rejectedKYB verification permanently failed. See kyb_rejection_details.
activeOnboarding complete and merchant is fully active.
suspendedMerchant account is suspended.

Error Responses#

401 Unauthorized
{
  "error": "invalid_token",
  "error_description": "The access token is missing or invalid.",
  "code": 401
}
422 Unprocessable Entity
{
  "error": "validation_failed",
  "error_description": "Field 'email' must be a valid email address.",
  "code": 422
}
HTTP StatusErrorCause
401invalid_tokenMissing or invalid access token.
422validation_failedMissing required fields or invalid formats.

6. What Happens Next#

Once registration succeeds, QFAST submits the merchant data to DOKU for KYB verification. The process is asynchronous.
1.
Poll status using Get Onboarding Status, or
2.
Receive a webhook when the KYB status changes — see Onboarding Events.
When onboarding_status reaches active, proceed to Get Loan.

Request

Authorization
OAuth 2.0
Client Credentials
Add the parameter
Authorization
to Headers
,whose value is to concatenate the Token after the Bearer.
Example:
Authorization: Bearer ********************
Token URL: https://api.sandbox.qfast.id/v1/oauth2/token
or
Header Params

Body Params application/jsonRequired

Example
{
    "borrower": {
        "name": "Aldo Rusno",
        "email": "aldo.rusno@example.com",
        "phone_number": "81234568765",
        "identity_number": "3201234567898765",
        "doku_wallet_id": "W12348765",
        "taxpayer_identification_number": null
    },
    "merchant": {
        "name": "Warung Kopi Aldo Rusno",
        "description": "Small coffee shop selling local beans",
        "addresses": [
            {
                "name": "Jl. Raya Bogor No. 123, Kel. Cimahpar, Kec. Bogor Utara",
                "area_id": "1ccf1e07-2c1b-4af6-a94c-9b44a8be84a9",
                "primary": true
            }
        ],
        "contacts": [
            {
                "name": "Aldo Rusno",
                "owner_liveness_file_url": "https://www.gstatic.com/webp/gallery/1.jpg",
                "owner_identity_file_url": "https://www.gstatic.com/webp/gallery/1.jpg"
            }
        ],
        "brands": [
            {
                "name": "Warkop Aldo Rusno",
                "category": "retail",
                "description": "Coffee and snacks",
                "transaction_frequency": "uke",
                "transaction_quantity": "up_to_100",
                "photo_proof_file_url": "https://www.gstatic.com/webp/gallery/1.jpg"
            }
        ]
    }
}

Request Code Samples

Shell
JavaScript
Java
Swift
Go
PHP
Python
HTTP
C
C#
Objective-C
Ruby
OCaml
Dart
R
Request Request Example
Shell
JavaScript
Java
Swift
curl --location 'https://api.sandbox.qfast.id/v1/onboarding/personal' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data-raw '{
    "borrower": {
        "name": "Aldo Rusno",
        "email": "aldo.rusno@example.com",
        "phone_number": "81234568765",
        "identity_number": "3201234567898765",
        "doku_wallet_id": "W12348765",
        "taxpayer_identification_number": null
    },
    "merchant": {
        "name": "Warung Kopi Aldo Rusno",
        "description": "Small coffee shop selling local beans",
        "addresses": [
            {
                "name": "Jl. Raya Bogor No. 123, Kel. Cimahpar, Kec. Bogor Utara",
                "area_id": "1ccf1e07-2c1b-4af6-a94c-9b44a8be84a9",
                "primary": true
            }
        ],
        "contacts": [
            {
                "name": "Aldo Rusno",
                "owner_liveness_file_url": "https://www.gstatic.com/webp/gallery/1.jpg",
                "owner_identity_file_url": "https://www.gstatic.com/webp/gallery/1.jpg"
            }
        ],
        "brands": [
            {
                "name": "Warkop Aldo Rusno",
                "category": "retail",
                "description": "Coffee and snacks",
                "transaction_frequency": "uke",
                "transaction_quantity": "up_to_100",
                "photo_proof_file_url": "https://www.gstatic.com/webp/gallery/1.jpg"
            }
        ]
    }
}'

Responses

🟢200Success
application/json
Bodyapplication/json

Example
{
    "data": {
        "merchant_id": "019db2ee-3857-7148-b320-6f6e7c4deedd",
        "identity_number": "3201234567890001",
        "onboarding_status": "pending",
        "kyb_revision_deadline": null,
        "kyb_rejection_details": null,
        "created_at": "2026-05-11 08:00:00",
        "updated_at": "2026-05-11 08:00:00"
    }
}
🟠409Borrower Already Exists
🟠409Wallet Already Exists
Previous
Area Reference
Next
Get Onboarding Status
Built with