Price and Create Quote
This page covers the first steps of the LQB lock workflow: authenticating, retrieving (or creating) a price quote from a LQB loan, and searching for available pricing.
Step 0: Authenticate
Obtain an OAuth2 access token using the password grant. This token is used as a Bearer token for all subsequent API calls.
Endpoint: POST {{authDomain}}/oauth/token
Headers:
| Header | Value |
|---|---|
| Authorization | Basic {{base64EncodedClientCredentials}} |
| Content-Type | application/x-www-form-urlencoded |
Body (form-encoded):
| Field | Value |
|---|---|
| username | Your Lender Price username |
| password | Your Lender Price password |
| grant_type | password |
| client_id | ppe-lenderprice |
Response:
The response contains an access_token field. Save this — it is your Bearer token for all subsequent requests.
The JWT payload also contains useful fields like userId and companyId that you'll need later.
Step 1: Get or Create Price Quote from LQB Loan
This single call replaces the two-step "pull pipeline + get loan" process used in the Encompass integration. It fetches the loan details from LQB and creates a price quote object on Lender Price in one step. If the price quote already exists, it returns the existing one.
Endpoint: GET /rest/v1/integration/ellie/loan/getPriceQuoteFromLosLoanId/{{lqbLoanReferenceNumber}}
Headers:
| Header | Value |
|---|---|
| Authorization | Bearer {{accessToken}} |
Path Parameters:
| Field | Type | Description |
|---|---|---|
| lqbLoanReferenceNumber | String | The LQB loan reference number (e.g. T-MGJF:L:TEST22025090043) |
How it works:
- The API calls LQB to fetch the loan details.
- A price quote object is created on Lender Price with the fetched details.
Response:
{
"id": "68d680da0fcb420001651baa",
"creationDate": "2025-09-26T12:02:34Z",
"modifiedDate": "2025-09-26T12:02:34Z",
"companyId": "55a82802e4b0a3fb4342ffb9",
"userId": "683dfdb679f048000139cd72",
"name": "TEST22025090043",
"loanInformation": {
"scenario": null
},
"integrationRef": {
"LENDINGQB": "T-MGJF:L:TEST22025090043"
},
"scenarios": [],
"integrationCustomRef": {
"calculationVersion": 3,
"lockExpirationDate": null
}
}
Save the id field — this is your priceQuoteId used throughout the entire lock lifecycle.
Retrieve an Existing Price Quote
You can retrieve a price quote at any time using:
Endpoint: GET /rest/v1/lp-ppe-api/los/price-quote/get/{{priceQuoteId}}
Headers:
| Header | Value |
|---|---|
| Authorization | Bearer {{accessToken}} |
The priceQuoteId is the id from the response above.
Step 2: Get Pricing
Search for available pricing for the loan. The request body and response format are exactly the same as the standard Pricing a Loan guide — the only difference is the endpoint URL.
There are two scenarios depending on whether a lock already exists.
Headers:
| Header | Value |
|---|---|
| Authorization | Bearer {{accessToken}} |
The endpoint URL depends on whether a lock already exists:
| Scenario | Endpoint |
|---|---|
| Initial pricing (no lock) | POST /rest/v1/lp-ppe-api/pricing/search?userIdToUse={{userId}} |
| Repricing (lock exists) | POST /rest/v1/lp-ppe-api/price-quote/{{priceQuoteId}}/search?userIdToUse={{userId}}&lockStatusId={{nextLockStatusId}} |
The repricing URL includes the priceQuoteId in the path and a lockStatusId query parameter — this ensures that all added concessions, extensions, and relock fees are correctly included. The lockStatusId is the next status for the desired action (e.g., relock status ID, reprice status ID).
Both URLs require the full search body in the request. The price quote stores the loan data, but the search body controls how you want to price it — sort strategy, day locks, closing costs, MI criteria, filters, etc. For repricing, you can retrieve the previous search from the price quote (via Get Price Quote) and pass it back with any modifications.
Search Body
The request body is the same for both endpoints. For full details on all available fields, see the Pricing a Loan guide.
Minimal search body example (click to expand)
{
"termsCriteria": [30],
"loanPurposeCriteria": ["Purchase"],
"loanTypeCriteria": ["Fixed"],
"criteria": {
"purchasePrice": 500000,
"loanAmount": 400000,
"fico": 760,
"loanYear": 30,
"loanPurpose": "Purchase",
"loanType": "Fixed",
"mortgageTypes": ["Conventional"],
"propertyUse": "PrimaryResidence",
"ltv": 0.8,
"dti": 0.32
},
"property": {
"address": {
"state": "CA",
"zip": "90001",
"county": "Los Angeles",
"countyName": "Los Angeles"
},
"numberOfUnit": "1",
"propertyType": "SingleFamily"
},
"brokerCriteria": {
"rateTypes": ["AsRetail"],
"view": "LenderPaid",
"sortStrategy": "APR",
"dayLocks": 30,
"dayLocksList": [15, 30, 45, 60]
},
"accessCriteria": {
"dataLog": true,
"companyIds": [],
"overrideNode": 25
},
"miCriteria": {
"mode": "Node",
"duLpDecision": "DU_Approve_Eligible",
"originationChannel": "Retail"
},
"dynamicPropertiesMap": {},
"showDisqualify": true,
"showDisqualifyRules": true,
"sortAscPoints": true,
"userToImpersonate": "{{userId}}"
}
userIdin the URL is the user performing the action.userToImpersonateis the user whose pricing you want (can be a different user).brokerCriteria.adjustmentswill not accept new adjustments directly from the search payload. Adjustments must come from the rate grid.- Add
"current": trueto the search payload when repricing.
Response:
The response contains pricing results with lineResult objects. Save the lineResult you want to lock — you will use it in the next steps.
For a full breakdown of the response structure, fields, and how to interpret the pricing results, see the Pricing Response guide.