> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.credit.aarthiklabs.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.credit.aarthiklabs.com/_mcp/server.

# Create A Journey — Personal Loans

POST https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/{borrowerProviderID}/journey
Content-Type: application/json

Backend-only API-key call. The platform starts a Hybrid personal-loan application attempt for the borrower, stores the supplied profile prefill, and starts the offer-fetch pipeline. The `address` object is required with a six-digit `pincode`; `addressL1`, `addressL2`, `city`, and `state` are optional. A missing or invalid pincode is rejected before journey creation. `borrowerProviderID` is client-scoped and must remain stable for the same borrower across sessions and application attempts. Prefer sending a fresh `Idempotency-Key` for each new Start attempt; reuse the same key only to retry the same Start request. If omitted, the platform creates a fresh non-idempotent attempt with a server-generated internal key.

Store `data.journey.id` from the response and pass it as `journeyID` on Offers and Hosted handoff calls.

Optionally, buyer-apps can include buyer-supplied bureau data in the top-level `bureau` object. When `bureau` is provided, `journey.bureauConsent` must be `true`.

Reference: https://docs.credit.aarthiklabs.com/api-reference/hybrid-experience/personal-loans/start-or-resume-hybrid-personal-loan-journey

## Authentication

- `Authorization` header (bearer token, required) — Send `Authorization: Bearer <PLATFORM_API_KEY>` from a trusted back-end.

## Servers

- `https://credit.aarthiklabs.com` (Production, default)
- `https://preprod.credit.aarthiklabs.com` (PreProduction)

## Request

### Path parameters

- `borrowerProviderID` (string, required) — Stable borrower identity from the partner system. Keep a 1:1 mapping between the borrower and `borrowerProviderID` across sessions and application attempts to preserve resume, history, and post-disbursal continuity.

### Headers

- `Idempotency-Key` (string, optional) — Start-attempt retry key. Use a fresh key for each new application attempt. Reuse the same key only when retrying the same Start request after a timeout or temporary failure. If omitted, the platform creates a fresh non-idempotent attempt with a server-generated internal key for compatibility; retries without a client key can create duplicate attempts.
- `x-correlation-id` (string, optional) — Optional caller-supplied trace identifier. When omitted, the API generates one and mirrors it as `correlation_id`.

### Body (application/json)

This endpoint expects a HybridStartJourneyRequest.

- `personal` (HybridPersonalLoanProfile, required) — Personal Loan borrower profile fields for Hybrid journey start.
- `address` (HybridAddress, required)
- `journeyType` (enum, optional) — Optional credit product discriminator. Omit it or send PERSONAL_LOAN on the personal-loan Hybrid path.
  - Allowed values: `PERSONAL_LOAN`
- `work` (HybridWorkProfile, optional)
- `bankingInformation` (HybridBankingInformationCamelCase, optional) — Optional complete bank prefill. If supplied, send the full object.
- `banking_information` (HybridBankingInformationSnakeCase, optional) — Optional complete bank prefill. This snake_case shape is accepted and normalized to the platform banking model.
- `journey` (HybridJourneyPrefill, optional)
- `bureau` (BuyerSuppliedBureau, optional, nullable) — Optional buyer-supplied bureau data. When this object is provided, `journey.bureauConsent` must be `true`.

## Response

### 200

Hybrid journey accepted and offer fetch started. Replays of the same Start attempt return the same journey.

- `request_id` (string, required)
- `correlation_id` (string, required)
- `timestamp` (datetime, required)
- `data` (HybridStartJourneyData, required)
- `error` (any, required)

## Errors

### 400 Bad Request Error

Request body or path validation failed.

- `request_id` (string, required)
- `correlation_id` (string, required)
- `timestamp` (datetime, required)
- `data` (any, required)
- `error` (HybridError, required)

### 401 Unauthorized Error

Missing or invalid platform API key.

- `request_id` (string, required)
- `correlation_id` (string, required)
- `timestamp` (datetime, required)
- `data` (any, required)
- `error` (HybridError, required)

### 409 Conflict Error

The current journey or offer state does not allow the requested transition.

- `request_id` (string, required)
- `correlation_id` (string, required)
- `timestamp` (datetime, required)
- `data` (any, required)
- `error` (HybridError, required)

### 422 Unprocessable Entity Error

Request body or path validation failed.

- `request_id` (string, required)
- `correlation_id` (string, required)
- `timestamp` (datetime, required)
- `data` (any, required)
- `error` (HybridError, required)

### 429 Too Many Requests Error

Too many requests. For offer polling, retry at the returned `polling.nextPoll` timestamp.

- `StartOrResumeHybridPersonalLoanJourneyRequestTooManyRequestsError`
  - HybridErrorResponse: HybridErrorResponse
  - HybridOfferPollingRateLimitedResponse: HybridOfferPollingRateLimitedResponse

### 500 Internal Server Error

Temporary upstream or platform failure.

- `request_id` (string, required)
- `correlation_id` (string, required)
- `timestamp` (datetime, required)
- `data` (any, required)
- `error` (HybridError, required)

## Types

### HybridPersonalLoanProfile

Personal Loan borrower profile fields for Hybrid journey start.

- `contactNumber` (string, required) — Indian mobile number. The platform normalizes valid Indian numbers for storage.
- `pan` (string, optional) — Borrower PAN, normalized uppercase.
- `panName` (string, optional)
- `dob` (date, optional)
- `gender` (enum, optional)
  - Allowed values: `male`, `female`, `transgender`
- `personalemail` (string, optional)
- `contact_number` (string, optional) — Accepted alias for `contactNumber`.

### HybridAddress

- `pincode` (string, required)
- `addressL1` (string, optional)
- `addressL2` (string, optional)
- `city` (string, optional)
- `state` (string, optional)

### HybridWorkProfile

- `employmentType` (enum, required)
  - Allowed values: `salaried`, `selfEmployed`
- `income` (HybridWorkProfileIncome, required) — Income value. Unit defaults to monthly when `incomeType` is omitted.
- `companyName` (string, required)
- `officialemail` (string, optional, nullable)
- `incomeType` (enum, optional, default: monthly)
  - Allowed values: `monthly`, `annual`
- `udyamNumber` (string, optional, nullable) — Conditionally required by Personal Loan and Business Loan Hybrid Start requests when `employmentType` is `selfEmployed`. A value supplied for `salaried` is ignored. Optional for other Hybrid products.

### HybridBankingInformationCamelCase

Optional complete bank prefill. If supplied, send the full object.

- `accHolderName` (string, optional)
- `acctype` (enum, optional)
  - Allowed values: `saving`, `current`
- `accNo` (string, optional)
- `ifscCode` (string, optional)

### HybridBankingInformationSnakeCase

Optional complete bank prefill. This snake_case shape is accepted and normalized to the platform banking model.

- `bank_account_holder_name` (string, optional)
- `bank_account_type` (enum, optional)
  - Allowed values: `saving`, `current`
- `bank_account_number` (string, optional)
- `bank_ifsc` (string, optional)

### HybridJourneyPrefill

- `endUse` (enum, required)
  - Allowed values: `consumerDurablePurchase`, `education`, `travel`, `health`, `marriage`, `familyFunctions`, `medicalTreatmentAndEmergencies`, `travelEducationExpenses`, `businessExpansion`, `agricultureAndFarmRelatedNeeds`, `purchaseOfEquipment`, `other`
- `bureauConsent` (boolean, required) — Borrower bureau consent flag. This must be `true` when top-level `bureau` data is provided.
- `end_use` (enum, optional)
  - Allowed values: `consumerDurablePurchase`, `education`, `travel`, `health`, `marriage`, `familyFunctions`, `medicalTreatmentAndEmergencies`, `travelEducationExpenses`, `businessExpansion`, `agricultureAndFarmRelatedNeeds`, `purchaseOfEquipment`, `other`
- `bureau_consent` (boolean, optional) — Snake-case alias for `bureauConsent`. This must be `true` when top-level `bureau` data is provided.

### BuyerSuppliedBureau

Buyer-supplied bureau data collected by the buyer-app. The raw payload is stored with provenance and is not forwarded into headless profiling.

- `type` (enum, required) — Credit bureau that produced the supplied report.
  - Allowed values: `EXPERIAN`, `CIBIL`, `CRIF`, `EQUIFAX`
- `data` (map from string to any, required) — Raw bureau report payload supplied by the buyer-app. Arrays are not accepted at the top level, and the payload must be within the supported size limit.
- `pulledAt` (datetime, optional) — Optional timestamp for when the buyer-app pulled or received the bureau report.
- `reportReference` (string, optional) — Optional partner-side report reference for reconciliation and support.
- `consentReference` (string, optional) — Optional partner-side borrower consent reference for audit and reconciliation.

### HybridStartJourneyData

- `profile` (HybridNormalizedProfile, required)
- `journey` (HybridNormalizedJourney, required)
- `operation` (HybridOperation, required)

### HybridError

- `code` (enum, required)
  - Allowed values: `VALIDATION_FAILED`, `AUTH_INVALID_API_KEY`, `AUTH_INVALID_SESSION`, `ACCESS_SCOPE_MISMATCH`, `RESOURCE_NOT_FOUND`, `OFFER_LOCK_CONFLICT`, `STATE_PRECONDITION_FAILED`, `OFFER_POLL_RATE_LIMITED`, `HYBRID_JOURNEY_NOT_READY`, `RATE_LIMITED`, `UPSTREAM_TEMPORARY_FAILURE`
- `message` (string, required)
- `retryable` (boolean, required) — Whether retrying the same operation can make progress. A persisted final primary-form failure is not retryable, including HTTP 500; reconcile the accepted operation before any resubmission. Correct invalid input before retrying validation failures.
- `details` (map from string to any, required, nullable)

### HybridErrorResponse

- `request_id` (string, required)
- `correlation_id` (string, required)
- `timestamp` (datetime, required)
- `data` (any, required)
- `error` (HybridError, required)

### HybridOfferPollingRateLimitedResponse

- `request_id` (string, required)
- `correlation_id` (string, required)
- `timestamp` (datetime, required)
- `data` (HybridOfferPollingRateLimitedResponseData, required)
- `error` (HybridError, required)

### HybridWorkProfileIncome

Income value. Unit defaults to monthly when `incomeType` is omitted.

- double
- string

### HybridNormalizedProfile

- `personal` (HybridPersonalProfileEcho, optional)
- `workProfile` (HybridWorkProfileEcho, optional)
- `address` (HybridAddressEcho, optional)
- `bankingInformation` (HybridBankingInformationEcho, optional)

### HybridNormalizedJourney

- `id` (string, required) — Aarthik Labs journey ID. Matches `data.journey.id` in lifecycle web-hooks for the same borrower journey.
- `end_use` (enum, optional, nullable)
  - Allowed values: `consumerDurablePurchase`, `education`, `travel`, `health`, `marriage`, `familyFunctions`, `medicalTreatmentAndEmergencies`, `travelEducationExpenses`, `businessExpansion`, `agricultureAndFarmRelatedNeeds`, `purchaseOfEquipment`, `other`
- `bureau_consent` (boolean, optional, nullable)

### HybridOperation

- `type` (enum, required)
  - Allowed values: `OFFERS_FETCH`
- `status` (enum, required)
  - Allowed values: `SUCCESS`, `ACCEPTED`, `FAILURE`
- `polling` (HybridPolling, optional)

### HybridOfferPollingRateLimitedResponseData

- `polling` (HybridPolling, required)

### HybridPersonalProfileEcho

- `pan` (string, optional, nullable)
- `panName` (string, optional, nullable)
- `dob` (string, optional, nullable)
- `gender` (enum, optional, nullable)
  - Allowed values: `male`, `female`, `transgender`
- `personalemail` (string, optional, nullable)
- `contactNumber` (string, optional, nullable)

### HybridWorkProfileEcho

- `employmentType` (enum, optional, nullable)
  - Allowed values: `salaried`, `selfEmployed`
- `officialemail` (string, optional, nullable)
- `income` (string, optional, nullable)
- `income_annualized` (string, optional, nullable)
- `companyName` (string, optional, nullable)
- `udyamNumber` (string, optional, nullable) — Returned when available for self-employed borrowers.

### HybridAddressEcho

- `addressL1` (string, optional, nullable)
- `addressL2` (string, optional, nullable)
- `city` (string, optional, nullable)
- `state` (string, optional, nullable)
- `pincode` (string, optional, nullable)

### HybridBankingInformationEcho

- `accHolderName` (string, optional, nullable)
- `acctype` (string, optional, nullable)
- `accNo` (string, optional, nullable)
- `ifscCode` (string, optional, nullable)

### HybridPolling

- `shouldPoll` (boolean, required)
- `lastPoll` (datetime, required)
- `nextPoll` (datetime, required)

## Examples

### Personal Loan (salaried)

**Request**

```json
{
  "personal": {
    "contactNumber": "9876543210",
    "pan": "ABCPE1234F",
    "panName": "John Doe",
    "dob": "1970-01-01",
    "gender": "male",
    "personalemail": "john_doe@foobar.com"
  },
  "address": {
    "pincode": "360001",
    "addressL1": "101, Sunshine Heights",
    "addressL2": "Gold Coast Road",
    "city": "Rajkot",
    "state": "Gujarat"
  },
  "work": {
    "employmentType": "salaried",
    "income": 75000,
    "companyName": "Acme Pvt. Ltd.",
    "officialemail": "john.doe@company.com",
    "incomeType": "monthly"
  },
  "journey": {
    "endUse": "travel",
    "bureauConsent": true
  },
  "bureau": {
    "type": "EXPERIAN",
    "data": {
      "score": 742,
      "accounts": [
        {
          "id": "account-1",
          "status": "active"
        }
      ]
    },
    "pulledAt": "2026-05-04T10:00:00.000Z",
    "reportReference": "experian-report-1",
    "consentReference": "borrower-consent-1"
  }
}
```

**Response**

```json
{
  "request_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "correlation_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "timestamp": "1970-01-01T00:00:00.000Z",
  "data": {
    "profile": {
      "personal": {
        "pan": "ABCPE1234F",
        "panName": "John Doe",
        "dob": "1990-01-01",
        "gender": "male",
        "personalemail": "john_doe@foobar.com",
        "contactNumber": "+919876543210"
      },
      "workProfile": {
        "employmentType": "salaried",
        "officialemail": "john.doe@company.com",
        "income": "75000",
        "income_annualized": "900000",
        "companyName": "Acme Pvt. Ltd.",
        "udyamNumber": null
      },
      "address": {
        "addressL1": "101, Sunshine Heights",
        "addressL2": "Gold Coast Road",
        "city": "Rajkot",
        "state": "Gujarat",
        "pincode": "360001"
      },
      "bankingInformation": {
        "accHolderName": null,
        "acctype": null,
        "accNo": null,
        "ifscCode": null
      }
    },
    "journey": {
      "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "end_use": "travel",
      "bureau_consent": true
    },
    "operation": {
      "type": "OFFERS_FETCH",
      "status": "SUCCESS"
    }
  },
  "error": null
}
```

**SDK Code**

```python Personal Loan (salaried)
import requests

url = "https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey"

payload = {
    "personal": {
        "contactNumber": "9876543210",
        "pan": "ABCPE1234F",
        "panName": "John Doe",
        "dob": "1970-01-01",
        "gender": "male",
        "personalemail": "john_doe@foobar.com"
    },
    "address": {
        "pincode": "360001",
        "addressL1": "101, Sunshine Heights",
        "addressL2": "Gold Coast Road",
        "city": "Rajkot",
        "state": "Gujarat"
    },
    "work": {
        "employmentType": "salaried",
        "income": 75000,
        "companyName": "Acme Pvt. Ltd.",
        "officialemail": "john.doe@company.com",
        "incomeType": "monthly"
    },
    "journey": {
        "endUse": "travel",
        "bureauConsent": True
    },
    "bureau": {
        "type": "EXPERIAN",
        "data": {
            "score": 742,
            "accounts": [
                {
                    "id": "account-1",
                    "status": "active"
                }
            ]
        },
        "pulledAt": "2026-05-04T10:00:00.000Z",
        "reportReference": "experian-report-1",
        "consentReference": "borrower-consent-1"
    }
}
headers = {
    "Idempotency-Key": "start-attempt-20260408-001",
    "x-correlation-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Personal Loan (salaried)
const url = 'https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey';
const options = {
  method: 'POST',
  headers: {
    'Idempotency-Key': 'start-attempt-20260408-001',
    'x-correlation-id': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
    Authorization: 'Bearer <token>',
    'Content-Type': 'application/json'
  },
  body: '{"personal":{"contactNumber":"9876543210","pan":"ABCPE1234F","panName":"John Doe","dob":"1970-01-01","gender":"male","personalemail":"john_doe@foobar.com"},"address":{"pincode":"360001","addressL1":"101, Sunshine Heights","addressL2":"Gold Coast Road","city":"Rajkot","state":"Gujarat"},"work":{"employmentType":"salaried","income":75000,"companyName":"Acme Pvt. Ltd.","officialemail":"john.doe@company.com","incomeType":"monthly"},"journey":{"endUse":"travel","bureauConsent":true},"bureau":{"type":"EXPERIAN","data":{"score":742,"accounts":[{"id":"account-1","status":"active"}]},"pulledAt":"2026-05-04T10:00:00.000Z","reportReference":"experian-report-1","consentReference":"borrower-consent-1"}}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Personal Loan (salaried)
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey"

	payload := strings.NewReader("{\n  \"personal\": {\n    \"contactNumber\": \"9876543210\",\n    \"pan\": \"ABCPE1234F\",\n    \"panName\": \"John Doe\",\n    \"dob\": \"1970-01-01\",\n    \"gender\": \"male\",\n    \"personalemail\": \"john_doe@foobar.com\"\n  },\n  \"address\": {\n    \"pincode\": \"360001\",\n    \"addressL1\": \"101, Sunshine Heights\",\n    \"addressL2\": \"Gold Coast Road\",\n    \"city\": \"Rajkot\",\n    \"state\": \"Gujarat\"\n  },\n  \"work\": {\n    \"employmentType\": \"salaried\",\n    \"income\": 75000,\n    \"companyName\": \"Acme Pvt. Ltd.\",\n    \"officialemail\": \"john.doe@company.com\",\n    \"incomeType\": \"monthly\"\n  },\n  \"journey\": {\n    \"endUse\": \"travel\",\n    \"bureauConsent\": true\n  },\n  \"bureau\": {\n    \"type\": \"EXPERIAN\",\n    \"data\": {\n      \"score\": 742,\n      \"accounts\": [\n        {\n          \"id\": \"account-1\",\n          \"status\": \"active\"\n        }\n      ]\n    },\n    \"pulledAt\": \"2026-05-04T10:00:00.000Z\",\n    \"reportReference\": \"experian-report-1\",\n    \"consentReference\": \"borrower-consent-1\"\n  }\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Idempotency-Key", "start-attempt-20260408-001")
	req.Header.Add("x-correlation-id", "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")
	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Personal Loan (salaried)
require 'uri'
require 'net/http'

url = URI("https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = 'start-attempt-20260408-001'
request["x-correlation-id"] = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"personal\": {\n    \"contactNumber\": \"9876543210\",\n    \"pan\": \"ABCPE1234F\",\n    \"panName\": \"John Doe\",\n    \"dob\": \"1970-01-01\",\n    \"gender\": \"male\",\n    \"personalemail\": \"john_doe@foobar.com\"\n  },\n  \"address\": {\n    \"pincode\": \"360001\",\n    \"addressL1\": \"101, Sunshine Heights\",\n    \"addressL2\": \"Gold Coast Road\",\n    \"city\": \"Rajkot\",\n    \"state\": \"Gujarat\"\n  },\n  \"work\": {\n    \"employmentType\": \"salaried\",\n    \"income\": 75000,\n    \"companyName\": \"Acme Pvt. Ltd.\",\n    \"officialemail\": \"john.doe@company.com\",\n    \"incomeType\": \"monthly\"\n  },\n  \"journey\": {\n    \"endUse\": \"travel\",\n    \"bureauConsent\": true\n  },\n  \"bureau\": {\n    \"type\": \"EXPERIAN\",\n    \"data\": {\n      \"score\": 742,\n      \"accounts\": [\n        {\n          \"id\": \"account-1\",\n          \"status\": \"active\"\n        }\n      ]\n    },\n    \"pulledAt\": \"2026-05-04T10:00:00.000Z\",\n    \"reportReference\": \"experian-report-1\",\n    \"consentReference\": \"borrower-consent-1\"\n  }\n}"

response = http.request(request)
puts response.read_body
```

```java Personal Loan (salaried)
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey")
  .header("Idempotency-Key", "start-attempt-20260408-001")
  .header("x-correlation-id", "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"personal\": {\n    \"contactNumber\": \"9876543210\",\n    \"pan\": \"ABCPE1234F\",\n    \"panName\": \"John Doe\",\n    \"dob\": \"1970-01-01\",\n    \"gender\": \"male\",\n    \"personalemail\": \"john_doe@foobar.com\"\n  },\n  \"address\": {\n    \"pincode\": \"360001\",\n    \"addressL1\": \"101, Sunshine Heights\",\n    \"addressL2\": \"Gold Coast Road\",\n    \"city\": \"Rajkot\",\n    \"state\": \"Gujarat\"\n  },\n  \"work\": {\n    \"employmentType\": \"salaried\",\n    \"income\": 75000,\n    \"companyName\": \"Acme Pvt. Ltd.\",\n    \"officialemail\": \"john.doe@company.com\",\n    \"incomeType\": \"monthly\"\n  },\n  \"journey\": {\n    \"endUse\": \"travel\",\n    \"bureauConsent\": true\n  },\n  \"bureau\": {\n    \"type\": \"EXPERIAN\",\n    \"data\": {\n      \"score\": 742,\n      \"accounts\": [\n        {\n          \"id\": \"account-1\",\n          \"status\": \"active\"\n        }\n      ]\n    },\n    \"pulledAt\": \"2026-05-04T10:00:00.000Z\",\n    \"reportReference\": \"experian-report-1\",\n    \"consentReference\": \"borrower-consent-1\"\n  }\n}")
  .asString();
```

```php Personal Loan (salaried)
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey', [
  'body' => '{
  "personal": {
    "contactNumber": "9876543210",
    "pan": "ABCPE1234F",
    "panName": "John Doe",
    "dob": "1970-01-01",
    "gender": "male",
    "personalemail": "john_doe@foobar.com"
  },
  "address": {
    "pincode": "360001",
    "addressL1": "101, Sunshine Heights",
    "addressL2": "Gold Coast Road",
    "city": "Rajkot",
    "state": "Gujarat"
  },
  "work": {
    "employmentType": "salaried",
    "income": 75000,
    "companyName": "Acme Pvt. Ltd.",
    "officialemail": "john.doe@company.com",
    "incomeType": "monthly"
  },
  "journey": {
    "endUse": "travel",
    "bureauConsent": true
  },
  "bureau": {
    "type": "EXPERIAN",
    "data": {
      "score": 742,
      "accounts": [
        {
          "id": "account-1",
          "status": "active"
        }
      ]
    },
    "pulledAt": "2026-05-04T10:00:00.000Z",
    "reportReference": "experian-report-1",
    "consentReference": "borrower-consent-1"
  }
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
    'Idempotency-Key' => 'start-attempt-20260408-001',
    'x-correlation-id' => 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
  ],
]);

echo $response->getBody();
```

```csharp Personal Loan (salaried)
using RestSharp;

var client = new RestClient("https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey");
var request = new RestRequest(Method.POST);
request.AddHeader("Idempotency-Key", "start-attempt-20260408-001");
request.AddHeader("x-correlation-id", "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"personal\": {\n    \"contactNumber\": \"9876543210\",\n    \"pan\": \"ABCPE1234F\",\n    \"panName\": \"John Doe\",\n    \"dob\": \"1970-01-01\",\n    \"gender\": \"male\",\n    \"personalemail\": \"john_doe@foobar.com\"\n  },\n  \"address\": {\n    \"pincode\": \"360001\",\n    \"addressL1\": \"101, Sunshine Heights\",\n    \"addressL2\": \"Gold Coast Road\",\n    \"city\": \"Rajkot\",\n    \"state\": \"Gujarat\"\n  },\n  \"work\": {\n    \"employmentType\": \"salaried\",\n    \"income\": 75000,\n    \"companyName\": \"Acme Pvt. Ltd.\",\n    \"officialemail\": \"john.doe@company.com\",\n    \"incomeType\": \"monthly\"\n  },\n  \"journey\": {\n    \"endUse\": \"travel\",\n    \"bureauConsent\": true\n  },\n  \"bureau\": {\n    \"type\": \"EXPERIAN\",\n    \"data\": {\n      \"score\": 742,\n      \"accounts\": [\n        {\n          \"id\": \"account-1\",\n          \"status\": \"active\"\n        }\n      ]\n    },\n    \"pulledAt\": \"2026-05-04T10:00:00.000Z\",\n    \"reportReference\": \"experian-report-1\",\n    \"consentReference\": \"borrower-consent-1\"\n  }\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Personal Loan (salaried)
import Foundation

let headers = [
  "Idempotency-Key": "start-attempt-20260408-001",
  "x-correlation-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "personal": [
    "contactNumber": "9876543210",
    "pan": "ABCPE1234F",
    "panName": "John Doe",
    "dob": "1970-01-01",
    "gender": "male",
    "personalemail": "john_doe@foobar.com"
  ],
  "address": [
    "pincode": "360001",
    "addressL1": "101, Sunshine Heights",
    "addressL2": "Gold Coast Road",
    "city": "Rajkot",
    "state": "Gujarat"
  ],
  "work": [
    "employmentType": "salaried",
    "income": 75000,
    "companyName": "Acme Pvt. Ltd.",
    "officialemail": "john.doe@company.com",
    "incomeType": "monthly"
  ],
  "journey": [
    "endUse": "travel",
    "bureauConsent": true
  ],
  "bureau": [
    "type": "EXPERIAN",
    "data": [
      "score": 742,
      "accounts": [
        [
          "id": "account-1",
          "status": "active"
        ]
      ]
    ],
    "pulledAt": "2026-05-04T10:00:00.000Z",
    "reportReference": "experian-report-1",
    "consentReference": "borrower-consent-1"
  ]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Personal Loan (self-employed)

**Request**

```json
{
  "personal": {
    "contactNumber": "9876543210",
    "pan": "ABCPE1234F",
    "panName": "Jane Doe",
    "dob": "1970-01-01",
    "gender": "female",
    "personalemail": "jane_doe@foobar.com"
  },
  "address": {
    "pincode": "360001",
    "addressL1": "101, Sunshine Heights",
    "addressL2": "Gold Coast Road",
    "city": "Rajkot",
    "state": "Gujarat"
  },
  "work": {
    "employmentType": "selfEmployed",
    "income": 80000,
    "companyName": "Acme Engineering & Trade",
    "incomeType": "monthly",
    "udyamNumber": "UDYAM-XX-00-1234567"
  },
  "journey": {
    "endUse": "businessExpansion",
    "bureauConsent": true
  }
}
```

**Response**

```json
{
  "request_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "correlation_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "timestamp": "1970-01-01T00:00:00.000Z",
  "data": {
    "profile": {
      "personal": {
        "pan": "ABCPE1234F",
        "panName": "John Doe",
        "dob": "1990-01-01",
        "gender": "male",
        "personalemail": "john_doe@foobar.com",
        "contactNumber": "+919876543211"
      },
      "workProfile": {
        "employmentType": "selfEmployed",
        "officialemail": null,
        "income": "80000",
        "income_annualized": "960000",
        "companyName": "Acme Engineering & Trade",
        "udyamNumber": "UDYAM-XX-00-1234567"
      },
      "address": {
        "addressL1": "101, Sunshine Heights",
        "addressL2": "Gold Coast Road",
        "city": "Rajkot",
        "state": "Gujarat",
        "pincode": "360001"
      },
      "bankingInformation": {
        "accHolderName": null,
        "acctype": null,
        "accNo": null,
        "ifscCode": null
      }
    },
    "journey": {
      "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "end_use": "businessExpansion",
      "bureau_consent": true
    },
    "operation": {
      "type": "OFFERS_FETCH",
      "status": "SUCCESS"
    }
  },
  "error": null
}
```

**SDK Code**

```python Personal Loan (self-employed)
import requests

url = "https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey"

payload = {
    "personal": {
        "contactNumber": "9876543210",
        "pan": "ABCPE1234F",
        "panName": "Jane Doe",
        "dob": "1970-01-01",
        "gender": "female",
        "personalemail": "jane_doe@foobar.com"
    },
    "address": {
        "pincode": "360001",
        "addressL1": "101, Sunshine Heights",
        "addressL2": "Gold Coast Road",
        "city": "Rajkot",
        "state": "Gujarat"
    },
    "work": {
        "employmentType": "selfEmployed",
        "income": 80000,
        "companyName": "Acme Engineering & Trade",
        "incomeType": "monthly",
        "udyamNumber": "UDYAM-XX-00-1234567"
    },
    "journey": {
        "endUse": "businessExpansion",
        "bureauConsent": True
    }
}
headers = {
    "Idempotency-Key": "start-attempt-20260408-001",
    "x-correlation-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Personal Loan (self-employed)
const url = 'https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey';
const options = {
  method: 'POST',
  headers: {
    'Idempotency-Key': 'start-attempt-20260408-001',
    'x-correlation-id': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
    Authorization: 'Bearer <token>',
    'Content-Type': 'application/json'
  },
  body: '{"personal":{"contactNumber":"9876543210","pan":"ABCPE1234F","panName":"Jane Doe","dob":"1970-01-01","gender":"female","personalemail":"jane_doe@foobar.com"},"address":{"pincode":"360001","addressL1":"101, Sunshine Heights","addressL2":"Gold Coast Road","city":"Rajkot","state":"Gujarat"},"work":{"employmentType":"selfEmployed","income":80000,"companyName":"Acme Engineering & Trade","incomeType":"monthly","udyamNumber":"UDYAM-XX-00-1234567"},"journey":{"endUse":"businessExpansion","bureauConsent":true}}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Personal Loan (self-employed)
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey"

	payload := strings.NewReader("{\n  \"personal\": {\n    \"contactNumber\": \"9876543210\",\n    \"pan\": \"ABCPE1234F\",\n    \"panName\": \"Jane Doe\",\n    \"dob\": \"1970-01-01\",\n    \"gender\": \"female\",\n    \"personalemail\": \"jane_doe@foobar.com\"\n  },\n  \"address\": {\n    \"pincode\": \"360001\",\n    \"addressL1\": \"101, Sunshine Heights\",\n    \"addressL2\": \"Gold Coast Road\",\n    \"city\": \"Rajkot\",\n    \"state\": \"Gujarat\"\n  },\n  \"work\": {\n    \"employmentType\": \"selfEmployed\",\n    \"income\": 80000,\n    \"companyName\": \"Acme Engineering & Trade\",\n    \"incomeType\": \"monthly\",\n    \"udyamNumber\": \"UDYAM-XX-00-1234567\"\n  },\n  \"journey\": {\n    \"endUse\": \"businessExpansion\",\n    \"bureauConsent\": true\n  }\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Idempotency-Key", "start-attempt-20260408-001")
	req.Header.Add("x-correlation-id", "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")
	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Personal Loan (self-employed)
require 'uri'
require 'net/http'

url = URI("https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = 'start-attempt-20260408-001'
request["x-correlation-id"] = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"personal\": {\n    \"contactNumber\": \"9876543210\",\n    \"pan\": \"ABCPE1234F\",\n    \"panName\": \"Jane Doe\",\n    \"dob\": \"1970-01-01\",\n    \"gender\": \"female\",\n    \"personalemail\": \"jane_doe@foobar.com\"\n  },\n  \"address\": {\n    \"pincode\": \"360001\",\n    \"addressL1\": \"101, Sunshine Heights\",\n    \"addressL2\": \"Gold Coast Road\",\n    \"city\": \"Rajkot\",\n    \"state\": \"Gujarat\"\n  },\n  \"work\": {\n    \"employmentType\": \"selfEmployed\",\n    \"income\": 80000,\n    \"companyName\": \"Acme Engineering & Trade\",\n    \"incomeType\": \"monthly\",\n    \"udyamNumber\": \"UDYAM-XX-00-1234567\"\n  },\n  \"journey\": {\n    \"endUse\": \"businessExpansion\",\n    \"bureauConsent\": true\n  }\n}"

response = http.request(request)
puts response.read_body
```

```java Personal Loan (self-employed)
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey")
  .header("Idempotency-Key", "start-attempt-20260408-001")
  .header("x-correlation-id", "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"personal\": {\n    \"contactNumber\": \"9876543210\",\n    \"pan\": \"ABCPE1234F\",\n    \"panName\": \"Jane Doe\",\n    \"dob\": \"1970-01-01\",\n    \"gender\": \"female\",\n    \"personalemail\": \"jane_doe@foobar.com\"\n  },\n  \"address\": {\n    \"pincode\": \"360001\",\n    \"addressL1\": \"101, Sunshine Heights\",\n    \"addressL2\": \"Gold Coast Road\",\n    \"city\": \"Rajkot\",\n    \"state\": \"Gujarat\"\n  },\n  \"work\": {\n    \"employmentType\": \"selfEmployed\",\n    \"income\": 80000,\n    \"companyName\": \"Acme Engineering & Trade\",\n    \"incomeType\": \"monthly\",\n    \"udyamNumber\": \"UDYAM-XX-00-1234567\"\n  },\n  \"journey\": {\n    \"endUse\": \"businessExpansion\",\n    \"bureauConsent\": true\n  }\n}")
  .asString();
```

```php Personal Loan (self-employed)
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey', [
  'body' => '{
  "personal": {
    "contactNumber": "9876543210",
    "pan": "ABCPE1234F",
    "panName": "Jane Doe",
    "dob": "1970-01-01",
    "gender": "female",
    "personalemail": "jane_doe@foobar.com"
  },
  "address": {
    "pincode": "360001",
    "addressL1": "101, Sunshine Heights",
    "addressL2": "Gold Coast Road",
    "city": "Rajkot",
    "state": "Gujarat"
  },
  "work": {
    "employmentType": "selfEmployed",
    "income": 80000,
    "companyName": "Acme Engineering & Trade",
    "incomeType": "monthly",
    "udyamNumber": "UDYAM-XX-00-1234567"
  },
  "journey": {
    "endUse": "businessExpansion",
    "bureauConsent": true
  }
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
    'Idempotency-Key' => 'start-attempt-20260408-001',
    'x-correlation-id' => 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
  ],
]);

echo $response->getBody();
```

```csharp Personal Loan (self-employed)
using RestSharp;

var client = new RestClient("https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey");
var request = new RestRequest(Method.POST);
request.AddHeader("Idempotency-Key", "start-attempt-20260408-001");
request.AddHeader("x-correlation-id", "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"personal\": {\n    \"contactNumber\": \"9876543210\",\n    \"pan\": \"ABCPE1234F\",\n    \"panName\": \"Jane Doe\",\n    \"dob\": \"1970-01-01\",\n    \"gender\": \"female\",\n    \"personalemail\": \"jane_doe@foobar.com\"\n  },\n  \"address\": {\n    \"pincode\": \"360001\",\n    \"addressL1\": \"101, Sunshine Heights\",\n    \"addressL2\": \"Gold Coast Road\",\n    \"city\": \"Rajkot\",\n    \"state\": \"Gujarat\"\n  },\n  \"work\": {\n    \"employmentType\": \"selfEmployed\",\n    \"income\": 80000,\n    \"companyName\": \"Acme Engineering & Trade\",\n    \"incomeType\": \"monthly\",\n    \"udyamNumber\": \"UDYAM-XX-00-1234567\"\n  },\n  \"journey\": {\n    \"endUse\": \"businessExpansion\",\n    \"bureauConsent\": true\n  }\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Personal Loan (self-employed)
import Foundation

let headers = [
  "Idempotency-Key": "start-attempt-20260408-001",
  "x-correlation-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "personal": [
    "contactNumber": "9876543210",
    "pan": "ABCPE1234F",
    "panName": "Jane Doe",
    "dob": "1970-01-01",
    "gender": "female",
    "personalemail": "jane_doe@foobar.com"
  ],
  "address": [
    "pincode": "360001",
    "addressL1": "101, Sunshine Heights",
    "addressL2": "Gold Coast Road",
    "city": "Rajkot",
    "state": "Gujarat"
  ],
  "work": [
    "employmentType": "selfEmployed",
    "income": 80000,
    "companyName": "Acme Engineering & Trade",
    "incomeType": "monthly",
    "udyamNumber": "UDYAM-XX-00-1234567"
  ],
  "journey": [
    "endUse": "businessExpansion",
    "bureauConsent": true
  ]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://credit.aarthiklabs.com/api/v1/hybrid/personal-loan/borrowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/journey")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```