GET /products
GET /api/v1/products
Section titled “GET /api/v1/products”Get lender products for specified lenders.
Overview
Section titled “Overview”Retrieves mortgage products (variable basic and variable package) for one or more lenders. Products include rate tables, fees, and product features.
Authentication
Section titled “Authentication”Required: RSA signature-based authentication
X-Auth-Client-ID: {clientId}X-Auth-Access-Token: {accessToken}X-Auth-Timestamp: {timestamp}X-Auth-Nonce: {nonce}X-Auth-Signature: {signature}Request
Section titled “Request”Method: GET
URL: https://api.quickli.com/api/v1/products
Headers:
X-Auth-Client-ID: {clientId}X-Auth-Access-Token: {accessToken}X-Auth-Timestamp: {timestamp}X-Auth-Nonce: {nonce}X-Auth-Signature: {signature}Content-Type: application/jsonQuery Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
lenders | string | string[] | Yes | Single lender or comma-separated list (e.g., cba or cba,westpac,anz) |
Examples:
GET /api/v1/products?lenders=cbaGET /api/v1/products?lenders=cba,westpac,anzResponse
Section titled “Response”Success Response (200 OK)
Section titled “Success Response (200 OK)”See Product Schema for complete field documentation.
{ "data": [ { "_id": "507f1f77bcf86cd799439011", "lender": "cba", "productType": "variable_package", "productName": "Wealth Package", "setupFee": 600, "ongoingFee": 395, "loanAmountThresholds": [150000, 250000, 500000], "lvrThresholds": [60, 70, 80, 90], "rateTableFields": { "baseRate": 6.54, "lvrDiscounts": { "60": -0.20, "80": 0.00 }, "loanAmountDiscounts": { "250000": -0.10 }, "investmentPremium": 0.25, "interestOnlyPremium": 0.30 }, "productFeatures": { "maxLVR": 95, "minLoanAmount": 50000, "offsetAccount": true, "redrawFacility": true }, "isForServicing": true, "lastUpdated": "2025-10-15T00:00:00.000Z" } ], "meta": { "timestamp": "2025-11-03T10:30:00.000Z", "count": 1 }}Error Responses
Section titled “Error Responses”400 Bad Request
Section titled “400 Bad Request”Missing or invalid lenders parameter.
401 Unauthorized
Section titled “401 Unauthorized”Invalid credentials.
403 Forbidden
Section titled “403 Forbidden”User doesn’t have access to one or more specified lenders.
Code Examples
Section titled “Code Examples”# Single lendercurl -X GET 'https://api.quickli.com/api/v1/products?lenders=cba' \-H "X-Auth-Client-ID: {clientId}" \-H "X-Auth-Access-Token: {accessToken}" \-H "X-Auth-Timestamp: {timestamp}" \-H "X-Auth-Nonce: {nonce}" \-H "X-Auth-Signature: {signature}"
# Multiple lenderscurl -X GET 'https://api.quickli.com/api/v1/products?lenders=cba,westpac,anz' \-H "X-Auth-Client-ID: {clientId}" \-H "X-Auth-Access-Token: {accessToken}" \-H "X-Auth-Timestamp: {timestamp}" \-H "X-Auth-Nonce: {nonce}" \-H "X-Auth-Signature: {signature}"// See Authentication Guide for generateAuthHeaders implementationasync function getProducts(lenders: string | string[]) { const lenderParam = Array.isArray(lenders) ? lenders.join(',') : lenders; const path = `/api/v1/products?lenders=${lenderParam}`; const headers = generateAuthHeaders('GET', path, {});
const response = await fetch( `https://api.quickli.com${path}`, { headers } );
if (!response.ok) { const error = await response.json(); throw new Error(error.error.message); }
return (await response.json()).data;}
// Usageconst products = await getProducts(['cba', 'westpac']);
products.forEach(product => { console.log(`${product.lender} - ${product.productName}`); console.log(` Setup: $${product.setupFee}, Ongoing: $${product.ongoingFee}/year`); console.log(` Base rate: ${product.rateTableFields.baseRate}%`);});# See Authentication Guide for generate_auth_headers implementationdef get_products(lenders): if isinstance(lenders, list): lender_param = ','.join(lenders) else: lender_param = lenders
path = f'/api/v1/products?lenders={lender_param}' headers = generate_auth_headers('GET', path, None)
response = requests.get( f'https://api.quickli.com{path}', headers=headers )
response.raise_for_status() return response.json()['data']
# Usageproducts = get_products(['cba', 'westpac'])
for product in products: print(f"{product['lender']} - {product['productName']}") print(f" Setup: ${product['setupFee']}, Ongoing: ${product['ongoingFee']}/year")Use Cases
Section titled “Use Cases”1. Compare Product Fees
Section titled “1. Compare Product Fees”const products = await getProducts(['cba', 'westpac', 'anz']);
const comparison = products.map(p => ({ lender: p.lender, product: p.productName, type: p.productType, firstYearCost: p.setupFee + p.ongoingFee})).sort((a, b) => a.firstYearCost - b.firstYearCost);
console.table(comparison);2. Find Best Rates
Section titled “2. Find Best Rates”const products = await getProducts(['cba', 'westpac']);
const packageProducts = products.filter(p => p.productType === 'variable_package');
packageProducts.forEach(p => { console.log(`${p.lender}: Base ${p.rateTableFields.baseRate}%`);});3. Check Product Features
Section titled “3. Check Product Features”const products = await getProducts('cba');
const packageProduct = products.find(p => p.productType === 'variable_package');
console.log('Features:');console.log(`- Offset account: ${packageProduct.productFeatures.offsetAccount ? 'Yes' : 'No'}`);console.log(`- Redraw: ${packageProduct.productFeatures.redrawFacility ? 'Yes' : 'No'}`);console.log(`- Max LVR: ${packageProduct.productFeatures.maxLVR}%`);Filtering
Section titled “Filtering”Products returned are automatically filtered by:
- Lender access: Only lenders you have permission for
- Product type: Only
variable_basicandvariable_package - Servicing flag: Only products where
isForServicing: true
- Only returns products used in servicing calculations
- Product rates are updated regularly (check
lastUpdatedfield) - Rate tables show base rates and adjustments
- Use products with compute servicing to see effective rates
See Also
Section titled “See Also”- Product Schema - Complete schema documentation
- POST /compute/[scenarioId] - Use products in calculations
- GET /policies - Review lender policies
Last updated: 2025-11-19