Originators
Borrower retention report for this LO
Classifies every loan this LO originated since 2017 against every later loan and sale on the same parcel, for the period start–end: borrowers kept (the LO refinanced them again), lost (refinanced elsewhere — churnedLoans, with who captured them), sold, or a second lien taken elsewhere. Returns the summary, capture lanes (same funding lender vs other companies), capturing companies / LOs (top 25 + full-population totals), timing, monthly trend, the newest 500 loss rows, and exit signals on the retained book (atRisk). compare adds a second period's summary and monthly trend (previous) from the same scan. A very large book that cannot be read in time answers status: "timeout".
Authorization
Path parameters
nmlsIdstringrequiredOriginator NMLS ID
Body application/json
compareobjectOptional comparison period (e.g. the prior 14 months). Its summary and monthly trend come back as previous; it reuses this request's loan scan, so it costs no extra search.
Show child attributesHide child attributes
endstringrequiredLast day of the period (UTC, inclusive).
startstringrequiredFirst day of the period (UTC).
endstringrequiredLast day of the period (UTC, inclusive).
includeAtRiskbooleanScan the retained book for exit signals (listed / likely to sell / rate incentive). Default true.
startstringrequiredFirst day of the period (UTC).
Responses
200objectRetention reportShow attributesHide attributes
atRiskobject | nullrequiredExit signals on the retained book; null when not requested or the scan could not complete.
Show child attributesHide child attributes
equityBandsobject[]requiredShow child attributesHide child attributes
bandstringrequiredcountnumberrequiredhighEquityLowRatenumberrequiredjoinednumberrequiredlikelyToSellnumberrequiredlistedNownumberrequiredmedianEquityPctnumber | nullrequiredmedianRatenumber | nullrequiredrateIncentivenumberrequiredretainedScannednumberrequiredrowsobject[]requiredShow child attributesHide child attributes
addressstringrequiredborrowerstringrequiredcurrentBalancenumber | nullrequiredcurrentLenderstring | nullrequiredcurrentRatenumber | nullrequiredequityPctnumber | nullrequiredflagsenum[]requiredlistedlikely_sellratehomeValuenumber | nullrequiredlistPricenumber | nullrequiredlistedDatenumber | nullrequiredlistingStatusstring | nullrequiredoriginalAmountnumberrequiredoriginalLoanDatenumberrequiredoriginalLoanTypestringrequiredpropensityCategorystring | nullrequiredpropertyIdstringrequiredsalePropensitynumber | nullrequiredsignallingnumberrequiredcapturingCompaniesobject[]requiredShow child attributesHide child attributes
countnumberrequiredlaneenumrequiredown_companyservicercompetitornamestringrequirednmlsIdstringrequiredvolumenumberrequiredcapturingOriginatorsobject[]requiredShow child attributesHide child attributes
companyNamestringrequiredcountnumberrequirednamestringrequirednmlsIdstringrequiredvolumenumberrequiredcapturingTotalsobjectrequiredShow child attributesHide child attributes
companiesobjectrequiredShow child attributesHide child attributes
distinctnumberrequiredloansnumberrequiredvolumenumberrequiredoriginatorsobjectrequiredShow child attributesHide child attributes
distinctnumberrequiredloansnumberrequiredunattributedLoansnumberrequiredvolumenumberrequiredsecondCompaniesobjectrequiredShow child attributesHide child attributes
distinctnumberrequiredloansnumberrequiredvolumenumberrequiredchurnByLoanTypeobject[]requiredShow child attributesHide child attributes
countnumberrequiredtypestringrequiredvolumenumberrequiredchurnTrendobject[]requiredShow child attributesHide child attributes
churnednumberrequiredkeptnumberrequiredmonthstringrequiredretainednumberrequiredsecondPositionsnumberrequiredchurnedLoansobject[]requiredShow child attributesHide child attributes
addressstringrequiredborrowerstringrequiredcapturingAmountnumberrequiredcapturingCompanystringrequiredcapturingCompanyNmlsIdstringrequiredcapturingLenderstringrequiredcapturingLoNamestringrequiredcapturingLoNmlsIdstringrequiredcapturingLoanTypestringrequiredcapturingRatenumber | nullrequiredcashOutbooleanrequiredcurrentobject | nullrequiredWhat the parcel looks like today, when a scored snapshot newer than the event joined; null otherwise (unknown, never 'retained').
Show child attributesHide child attributes
currentBalancenumber | nullrequiredcurrentLenderstring | nullrequiredcurrentRatenumber | nullrequiredlastSaleDatenumber | nullrequiredloStillActivebooleanrequiredownerChangedboolean | nullrequireddaysToEventnumberrequiredeventDatenumberrequiredkindenumrequiredrefisecondlaneenumrequiredown_companyservicercompetitororiginalAmountnumberrequiredoriginalLenderstringrequiredoriginalLoanDatenumberrequiredoriginalLoanTypestringrequiredoriginalRatenumber | nullrequiredoriginalTransactionTypestringrequiredpropertyIdstringrequiredsameBorrowerboolean | nullrequiredlanesobjectrequiredShow child attributesHide child attributes
competitorobjectrequiredShow child attributesHide child attributes
countnumberrequiredvolumenumberrequiredown_companyobjectrequiredShow child attributesHide child attributes
countnumberrequiredvolumenumberrequiredservicerobjectrequiredShow child attributesHide child attributes
countnumberrequiredvolumenumberrequiredpreviousobject | nullrequiredThe compare period's summary and monthly trend, when asked.
Show child attributesHide child attributes
churnTrendobject[]requiredShow child attributesHide child attributes
churnednumberrequiredkeptnumberrequiredmonthstringrequiredretainednumberrequiredsecondPositionsnumberrequiredsummaryobjectrequiredShow child attributesHide child attributes
churnRatenumberrequiredchurnedCountnumberrequireddaysToRefiPairsUsednumberrequiredkeptRefiCountnumberrequiredSame-LO refinances of the LO's own borrowers in the period
keptRefiVolumenumberrequiredkeptSecondCountnumberrequiredmedianDaysToRefinumber | nullrequiredpropertySoldCountnumberrequiredrefiRetentionRatenumber | nullrequiredkept ÷ (kept + churned) refi events; null with none
retainedCountnumberrequiredsecondPositionCountnumberrequiredsecondPositionVolumenumberrequiredtotalBorrowersnumberrequiredunattributedCountnumberrequiredvolumeLostnumberrequiredvolumeRetainednumberrequiredsecondPositionCompaniesobject[]requiredShow child attributesHide child attributes
countnumberrequiredlaneenumrequiredown_companyservicercompetitornamestringrequirednmlsIdstringrequiredvolumenumberrequiredsecondPositionLanesobjectrequiredShow child attributesHide child attributes
competitorobjectrequiredShow child attributesHide child attributes
countnumberrequiredvolumenumberrequiredown_companyobjectrequiredShow child attributesHide child attributes
countnumberrequiredvolumenumberrequiredservicerobjectrequiredShow child attributesHide child attributes
countnumberrequiredvolumenumberrequiredstatusenumrequiredtimeout when the LO's loan history could not be read within the time budget (very large book): every count is then 0 and means 'not available', not 'none'.
oktimeoutsummaryobjectrequiredShow child attributesHide child attributes
churnRatenumberrequiredchurnedCountnumberrequireddaysToRefiPairsUsednumberrequiredkeptRefiCountnumberrequiredSame-LO refinances of the LO's own borrowers in the period
keptRefiVolumenumberrequiredkeptSecondCountnumberrequiredmedianDaysToRefinumber | nullrequiredpropertySoldCountnumberrequiredrefiRetentionRatenumber | nullrequiredkept ÷ (kept + churned) refi events; null with none
retainedCountnumberrequiredsecondPositionCountnumberrequiredsecondPositionVolumenumberrequiredtotalBorrowersnumberrequiredunattributedCountnumberrequiredvolumeLostnumberrequiredvolumeRetainednumberrequiredtimingobjectrequiredShow child attributesHide child attributes
cashOutCountnumberrequiredcashOutSharenumber | nullrequiredloanTypeChangeCountnumberrequiredmedianMonthsnumber | nullrequiredmonthsToExitobject[]requiredShow child attributesHide child attributes
bucketstringrequiredcountnumberrequiredrateDeltaMediannumber | nullrequiredrateDeltaPairsnumberrequiredtruncatedbooleanrequiredA loan / sale scan hit its row cap; counts cover the rows read.
400objectValidation error401objectUnauthorized403objectForbidden (authenticated, but missing required context — e.g. no active organization)404objectNot found413objectResponse payload too large — detail endpoint capped to fit Lambda response limits503objectSearch timed out or the cluster is overloaded — retry after `Retry-After` seconds.