Skip to main content

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:

HeaderValue
AuthorizationBasic {{base64EncodedClientCredentials}}
Content-Typeapplication/x-www-form-urlencoded

Body (form-encoded):

FieldValue
usernameYour Lender Price username
passwordYour Lender Price password
grant_typepassword
client_idppe-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:

HeaderValue
AuthorizationBearer {{accessToken}}

Path Parameters:

FieldTypeDescription
lqbLoanReferenceNumberStringThe LQB loan reference number (e.g. T-MGJF:L:TEST22025090043)

How it works:

  1. The API calls LQB to fetch the loan details.
  2. 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:

HeaderValue
AuthorizationBearer {{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:

HeaderValue
AuthorizationBearer {{accessToken}}

The endpoint URL depends on whether a lock already exists:

ScenarioEndpoint
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 endpoints require a search body

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}}"
}
Important Notes
  • userId in the URL is the user performing the action. userToImpersonate is the user whose pricing you want (can be a different user).
  • brokerCriteria.adjustments will not accept new adjustments directly from the search payload. Adjustments must come from the rate grid.
  • Add "current": true to 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.