Export Pricing and Lock
This page covers how to set a scenario from your pricing result, lock the loan, push the pricing information back to LQB, and retrieve the available next actions. These steps follow after you have priced a loan.
Step 3: Set Scenario From Pricing Result
Export the selected pricing result as a scenario on the price quote. This prepares the price quote for locking.
Endpoint: POST /rest/v1/lp-ppe-api/price-quote/setScenarioFromResult/EllieMaeQuoteRequest
Headers:
| Header | Value |
|---|---|
| Authorization | Bearer {{accessToken}} |
Body:
{
"priceQuoteId": "{{priceQuoteId}}",
"search": {},
"lineResult": {}
}
| Field | Description |
|---|---|
| priceQuoteId | The id from step 1 (getPriceQuoteFromLosLoanId response) |
| search | The full search object (or baseSearch) from step 2 |
| lineResult | The selected pricing line result from step 2's response |
Response:
{
"id": "65a1b2c3d4e5f6a7b8c9d061",
"createdBy": "username",
"creationDate": "2026-03-31T18:37:26Z",
"modifiedDate": "2026-03-31T18:37:30Z",
"genTk": "65a1b2c3d4e5f6a7b8c9d060",
"search": {},
"pricingScenarioForQuoteRequest": {},
"pricingScenarioForBuyRequest": {},
"conversionLog": {
"version": 3,
"lockEventFeesAdded": false
},
"hedging": false
}
Step 4: Lock With Scenario
Lock the price quote with the selected scenario. This places a lock (or lock request, depending on the locking policy) on the price quote.
Make sure your user is assigned to a Lock Policy within a User Group Workflow before calling this endpoint. Without this, the lock will fail.
Endpoint: POST /rest/v1/lp-ppe-api/price-quote/lockWithScenario
Headers:
| Header | Value |
|---|---|
| Authorization | Bearer {{accessToken}} |
Body:
{
"priceQuoteId": "{{priceQuoteId}}",
"search": {},
"lineResult": {},
"exportAndLock": false,
"impersonateUserId": "{{userId}}",
"overrideSetting": {
"relock": { "relockFee": null },
"extension": { "extensionFee": null },
"concession": { "concessionFee": null }
},
"timezone": "America/Los_Angeles"
}
| Field | Description |
|---|---|
| priceQuoteId | The price quote ID from step 1 |
| search | The full search object from step 2 |
| lineResult | The selected pricing line result from step 2 |
| exportAndLock | Set to false for standard lock flow |
| impersonateUserId | The user ID to lock on behalf of |
| overrideSetting | Fee overrides for relock, extension, and concession (null = use company defaults) |
| timezone | IANA timezone string (e.g. America/Los_Angeles) |
Response:
The response contains the full price quote with the lock details under currentLock:
{
"id": "65a1b2c3d4e5f6a7b8c9d001",
"companyId": "65a1b2c3d4e5f6a7b8c9d010",
"name": "Test1",
"integrationRef": {
"LQB": "65a1b2c3d4e5f6a7b8c9d001"
},
"currentLock": {
"id": "65a1b2c3d4e5f6a7b8c9d002",
"priceQuoteId": "65a1b2c3d4e5f6a7b8c9d001",
"lockExpirationDateMarker": "2025-03-20T19:05:21.710Z",
"lastStatus": {},
"lockEvents": [
{
"id": "65a1b2c3d4e5f6a7b8c9d003",
"scenario": {},
"status": {},
"lockId": "65a1b2c3d4e5f6a7b8c9d002",
"userId": "65a1b2c3d4e5f6a7b8c9d011",
"overrideSetting": {}
}
]
}
}
Save the following values from the response — you'll need them for all subsequent operations:
| Value | Where to find it |
|---|---|
| lockId | currentLock.id |
| lockEventId | currentLock.lockEvents[last].id (always use the last element in the array) |
| scenario | currentLock.lockEvents[last].scenario |
currentLock.lockEvents is an array that grows with each lock action. Always use the last element to get the most recent event ID and scenario.
Step 5: Push Pricing Information to LQB
After locking, push the pricing information back to LQB. This syncs the locked pricing data from Lender Price to the LQB loan record.
Endpoint: PUT /rest/v1/integration/ellie/loan/updateloan/{{priceQuoteId}}/parsetype/pricing
Headers:
| Header | Value |
|---|---|
| Authorization | Bearer {{accessToken}} |
Body:
{
"overrideSetting": {
"relock": {
"relockFee": null
},
"extension": {
"extensionFee": null
},
"concession": {
"concessionFee": null
}
}
}
Set fee values to null to use company defaults, or provide specific values to override.
Response:
{
"message": "Success"
}
Step 6: Get Next Lock Status
Retrieve the available actions the user can take based on the current lock state and the company's locking policy.
Endpoint: GET /rest/v1/lp-ppe-api/price-quote/getNextLockStatus/{{lockId}}/{{lockEventId}}
Headers:
| Header | Value |
|---|---|
| Authorization | Bearer {{accessToken}} |
Path Parameters:
| Parameter | Description |
|---|---|
| lockId | currentLock.id from the Lock With Scenario response |
| lockEventId | currentLock.lockEvents[last].id from the Lock With Scenario response |
Response:
Returns an array of status objects representing available actions:
[
{
"id": "65a1b2c3d4e5f6a7b8c9d030",
"code": "Priced",
"buttonName": "Price",
"lockStatusLogic": "Other",
"requireReprice": false,
"worseCase": false
},
{
"id": "65a1b2c3d4e5f6a7b8c9d031",
"code": "Lock Requested",
"buttonName": "Request Lock",
"lockStatusLogic": "Requested",
"requireReprice": true,
"autoStatusLockStatusId": "65a1b2c3d4e5f6a7b8c9d032"
}
]
How to Find the Right Status
Each post-lock operation requires a specific lockStatusId. Use the table below to identify which status to pick from the response:
| Action | How to identify the correct status |
|---|---|
| Request Lock | lockStatusLogic == "Requested" |
| Approve Lock | lockStatusLogic == "Locked" |
| Deny Lock | lockStatusLogic == "Rejected" |
| Extension Request | lockExtender.enable == true and lockExtender.type == "Request" |
| Approve Extension | lockExtender.enable == true and lockExtender.type == "Response" |
| Price Concession | lockException.enable == true and lockException.requestType == "Request" |
| Approve Concession | lockException.enable == true and lockException.requestType == "Grant" |
| Cancel Lock | lockStatusLogic == "CanceledOrWithdrawn" |
Use the id of the matching status as the lockStatusId when calling addLockEvent in the Post-Lock Operations page.