> 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.

# Read Lender Product Catalogue

GET https://credit.aarthiklabs.com/api/lab/features

Backend-only API-key call. Returns the product and lender catalogue for the authenticated API key scope. Use this to decide which products to show, which lenders are available under each product, and what borrower information to collect before creating a Hosted Experience URL or starting a Hybrid Experience journey.

Reference: https://docs.credit.aarthiklabs.com/api-reference/common-ap-is/read-hosted-lender-product-catalogue

## 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)

## Response

### 200

Returns the lender product catalogue for the authenticated API key scope.

- `products` (list of HostedCreditProduct, required)

## Errors

### 401 Unauthorized Error

Missing or invalid API key, bootstrap token, session token, refresh token, or Hosted cookie session.

- `error` (string, required)
- `code` (string, optional) — Machine-readable code is present for selected 4xx responses.
- `details` (map from string to any, optional)

### 404 Not Found Error

Tenant, application, borrower, or journey was not found.

- `error` (string, required)
- `code` (string, optional) — Machine-readable code is present for selected 4xx responses.
- `details` (map from string to any, optional)

### 500 Internal Server Error

Unexpected platform failure. The response intentionally hides internal details for 5xx errors.

- `error` (string, required)
- `code` (string, optional) — Machine-readable code is present for selected 4xx responses.
- `details` (map from string to any, optional)

## Types

### HostedCreditProduct

- `key` (enum, required)
  - Allowed values: `personalLoan`, `businessLoan`, `goldLoan`
- `type` (enum, required)
  - Allowed values: `PERSONAL_LOAN`, `BUSINESS_LOAN`, `GOLD_LOAN`
- `name` (string, required)
- `available` (boolean, required)
- `lenders` (list of HostedLenderProduct, required)
- `description` (string, optional, nullable)
- `unavailableReason` (string, optional, nullable)

### HostedLenderProduct

- `id` (string, required)
- `name` (string, required)
- `available` (boolean, required)
- `highlights` (list of string, required)
- `informationNeeded` (HostedInformationNeeded, required)
- `legalName` (string, optional, nullable)
- `description` (string, optional, nullable)
- `logoURL` (string, optional, nullable)
- `loanTerms` (HostedLoanTerms, optional, nullable)
- `support` (HostedLenderSupport, optional, nullable)

### HostedInformationNeeded

- `required` (list of HostedBorrowerField, required)
- `optional` (list of HostedBorrowerField, required)
- `conditional` (list of HostedBorrowerField, required)

### HostedLoanTerms

- `currency` (enum, required)
  - Allowed values: `INR`
- `amount` (HostedLoanTermsRange, optional, nullable)
- `tenure` (HostedLoanTermsTenure, optional, nullable)
- `interestRate` (HostedLoanTermsInterestRate, optional, nullable)

### HostedLenderSupport

- `customerSupport` (HostedLenderSupportCustomerSupport, optional, nullable)
- `grievance` (HostedLenderSupportGrievance, optional, nullable)

### HostedBorrowerField

- `key` (string, required)
- `label` (string, required)
- `type` (enum, required)
  - Allowed values: `text`, `number`, `boolean`, `date`, `email`, `phone`, `select`
- `sendIn` (string, required)
- `sensitive` (boolean, required)
- `helpText` (string, optional, nullable)
- `options` (list of HostedBorrowerFieldOption, optional)
- `requiredWhen` (map from string to any, optional, nullable)

### HostedLoanTermsRange

- `minimum` (double, optional, nullable)
- `maximum` (double, optional, nullable)
- `displayText` (string, optional, nullable)

### HostedLoanTermsTenure

- `minimumMonths` (double, optional, nullable)
- `maximumMonths` (double, optional, nullable)
- `displayText` (string, optional, nullable)

### HostedLoanTermsInterestRate

- `minimumPercent` (double, optional, nullable)
- `maximumPercent` (double, optional, nullable)
- `displayText` (string, optional, nullable)

### HostedLenderSupportCustomerSupport

- `email` (string, optional, nullable)
- `phone` (string, optional, nullable)
- `url` (string, optional, nullable)

### HostedLenderSupportGrievance

- `name` (string, optional, nullable)
- `email` (string, optional, nullable)
- `phone` (string, optional, nullable)

### HostedBorrowerFieldOption

- `label` (string, required)
- `value` (string, required)

## Examples

**Response**

```json
{
  "products": [
    {
      "key": "personalLoan",
      "type": "PERSONAL_LOAN",
      "name": "Personal Loan",
      "available": true,
      "lenders": [
        {
          "id": "alpha",
          "name": "Alpha Finance",
          "available": true,
          "highlights": [
            "Fast eligibility check"
          ],
          "informationNeeded": {
            "required": [
              {
                "key": "contactNumber",
                "label": "Mobile number",
                "type": "phone",
                "sendIn": "profile.contactNumber",
                "sensitive": true
              },
              {
                "key": "creditReportConsent",
                "label": "Credit report consent",
                "type": "boolean",
                "sendIn": "journey.creditReportConsent",
                "sensitive": false
              }
            ],
            "optional": [],
            "conditional": []
          }
        }
      ]
    },
    {
      "key": "goldLoan",
      "type": "GOLD_LOAN",
      "name": "Gold Loan",
      "available": false,
      "lenders": [],
      "unavailableReason": "No lenders are currently available for this product."
    }
  ]
}
```

**SDK Code**

```python catalogue
import requests

url = "https://credit.aarthiklabs.com/api/lab/features"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript catalogue
const url = 'https://credit.aarthiklabs.com/api/lab/features';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

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

```go catalogue
package main

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

func main() {

	url := "https://credit.aarthiklabs.com/api/lab/features"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

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

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

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

}
```

```ruby catalogue
require 'uri'
require 'net/http'

url = URI("https://credit.aarthiklabs.com/api/lab/features")

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

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

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

```java catalogue
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://credit.aarthiklabs.com/api/lab/features")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php catalogue
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://credit.aarthiklabs.com/api/lab/features', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

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

```csharp catalogue
using RestSharp;

var client = new RestClient("https://credit.aarthiklabs.com/api/lab/features");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift catalogue
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://credit.aarthiklabs.com/api/lab/features")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

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()
```