Skip to main content

Approve or Reject a Lock

After a lock request has been submitted, it must be approved or denied. This page also covers lock requests that include a price concession.

All calls on this page use the same endpoint -- POST /rest/v1/lp-ppe-api/price-quote/addLockEvent with the Authorization: Bearer {{accessToken}} header. What changes between them is the lockStatusId: you always select it from the Get Next Lock Actions response by its logic fields, never by name.

important

There is no lockStatusLogic field in the request body. The status logic lives on the status objects returned by Get Next Lock Actions -- you pick the right status there and pass its id as lockStatusId.

Getting the current IDs: priceQuoteId and lockId never change for a loan. The current lockEventId (and scenario) must be re-read before each call: pull the price quote with Get Price Quote and take currentLock.lockEvents[currentLock.lockEvents.length - 1] -- always the last event.


Approve Lock

Approve a pending lock request, moving the lock to Locked.

lockStatusId is the status from Get Next Lock Actions with lockStatusLogic == "Locked".

Endpoint: POST /rest/v1/lp-ppe-api/price-quote/addLockEvent

Headers:

HeaderValue
AuthorizationBearer {{accessToken}}

Body:

{
"priceQuoteId": "{{priceQuoteId}}",
"lockId": "{{lockId}}",
"lockStatusId": "{{lockedStatusId}}",
"lockEventExceptionInfo": null,
"lockEventExtensionInfo": null,
"scenario": null,
"lockDateUpdate": null,
"hasSellSide": false,
"historicalPricing": false,
"exportAndLock": false,
"lockEventId": "{{lockEventId}}",
"lockEventComment": "whatever comments"
}

Example Request:

curl --location -g '{{protocol}}{{domain}}/rest/v1/lp-ppe-api/price-quote/addLockEvent' \
--header 'Authorization: Bearer {{accessToken}}' \
--data '{
"priceQuoteId": "{{priceQuoteId}}",
"lockId": "{{lockId}}",
"lockStatusId": "{{lockedStatusId}}",
"lockEventExceptionInfo": null,
"lockEventExtensionInfo": null,
"scenario": null,
"lockDateUpdate": null,
"hasSellSide": false,
"historicalPricing": false,
"exportAndLock": false,
"lockEventId": "{{lockEventId}}",
"lockEventComment": "whatever comments"
}'

Response:

{
"isAutoLock": true,
"queueItemId": "65a1b2c3d4e5f6a7b8c9d020"
}

Track the queued action with Check Queue Item.


Deny Lock Request

Denying a lock request uses the same URL and payload as Approve Lock. The only difference: lockStatusId is the status from Get Next Lock Actions with lockStatusLogic == "Rejected".

Behavior of a deny depends on where it happens in the flow:

  • Deny after a lock request (pre-lock): the only next status is the Price event -- the user can price again.
  • Deny after a post-lock request (reprice, extension, concession): the next status is always auto-status back to a Locked event.
  • Deny after a relock request (higher-of): the only next status is the Expired or Cancelled event (whichever came before the request).

Lock Request With Price Concession

A lock request can carry a price concession (exception). Use the status from Get Next Lock Actions whose lockException.enable == true and lockException.requestType == "Request", and populate lockEventExceptionInfo in the body.

Endpoint: POST /rest/v1/lp-ppe-api/price-quote/addLockEvent

Headers:

HeaderValue
AuthorizationBearer {{accessToken}}

Body:

{
"priceQuoteId": "{{priceQuoteId}}",
"lockId": "{{lockId}}",
"lockStatusId": "{{exceptionStatusId}}",
"lockEventExceptionInfo": {
"exceptionValueType": "Points",
"requestType": "Request",
"reason": "",
"holdback": false,
"excludeFromPriceCap": false,
"values": { "Price": 0 },
"valuesList": [
{
"type": "Price",
"value": "-0.03",
"amount": null,
"reason": "Points and Fees",
"costCenter": null,
"comment": null,
"exceptionPriceType": "CUSTOM",
"exceptionDataId": "{{priceQuoteId}}{{randomString}}",
"purpose": null
}
],
"exceptionOverrideDifferences": {}
},
"lockEventExtensionInfo": null,
"scenario": null,
"hasSellSide": false,
"sellSideLine": null,
"lockDateUpdate": null,
"lockEventId": "{{lockEventId}}",
"lockEventComment": "Whatever comment you would like."
}

Field notes:

  • exceptionValueType -- "Points" or "Rate".
  • values -- deprecated; use valuesList instead.
  • valuesList[].value -- can be negative or positive.
  • valuesList[].reason -- any reason configured in the lock policy.
  • valuesList[].exceptionPriceType -- "CUSTOM", "BRANCH", or "CORPORATE".
  • valuesList[].exceptionDataId -- build as priceQuoteId + a random string; you need it later to edit or remove the exception.
  • No scenario is sent with exception events.

Response: { "isAutoLock": ..., "queueItemId": ... }

Approving or denying the concession works the same way as any post-lock exception -- see Approve Exception and Deny Lock Request.

For post-lock concessions (after the loan is already locked), see Request Post-Lock Price Concession.