Add subject properties to a loan

Adds one or more subject properties to a loan that already exists.

Each route does exactly one job:

propertyIdwhat it does
PATCH /api/v4/loans/{id}requiredupdates the properties you name
POST /api/v4/loans/{id}/propertiesnot acceptedadds new properties

You get back the properties this call created, and nothing else — a
list, in the order you sent them, each carrying the propertyId the
platform assigned. Send two properties and you get two entries; send
one and you get a list of one, so there is no need to check the count
before reading the reply. The loan's other properties are not
included; read those with GET /api/v4/loans/{id}.

Properties already on the loan are left alone. Set isPrimary: true
on an entry to make that property the loan's primary one. Doing so
steps the current primary down, and the new primary property's
address is copied onto the loan file. Leave isPrimary out and the
existing primary stays as it is.

Only properties is accepted here. A loan-level field sent to this
route — borrower, loan, primaryStatusId and so on — is refused
with a 422 rather than quietly dropped. Send those to
PATCH /api/v4/loans/{id} instead.

You'll get a 404 if the loan is not on your processing company's
account.

Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…
Path Params
integer
required

Numeric loan-file id (LMRId).

Body Params

Body for POST /api/v4/loans/{id}/properties. Only properties is accepted — loan-level fields sent here are rejected with 422 rather than silently dropped.

properties
array of objects
required
length ≥ 1

One or more properties to add. Each entry has to be an object with at least one property field in it. A bare value such as [1,2,3] or ["x"], and an empty object {}, are refused with a 422.

properties*

A property being ADDED through POST /api/v4/loans/{id}/properties — the shared Property shape with propertyId NOT accepted (the platform assigns it). Sending one returns 422.

integer
≥ 1

The property's id. A read gives you one on every property.
Required when you update. It tells the platform which property you are changing. Send back the propertyId that GET /api/v4/loans/{id} gave you. Leave it out and the call is refused with 422 VALIDATION_FAILED keyed properties.{i}.propertyId. 0 is not a stand-in for "new" and is refused as well, and a propertyId belonging to another loan is refused with a 422.
Which route wants it: POST /api/v4/loans/{id}/properties does not accept it, because the platform assigns it there. On POST /api/v4/loans there are no existing properties to name, so entries carry no id.

boolean

Marks this as the primary subject property (exactly one per loan). Setting it on one property DEMOTES the previous primary — you never need to clear the old one. ⚠️ The properties array is returned PRIMARY-FIRST, so after promoting a property it moves to position 0; the order reflects primacy, not the reverse.

string | null
string | null
string | null
string | null

The property's state. ⚠️ This one is checked against your own company's settings, so the values it accepts differ from company to company, and from one loan program to the next. That is why it is not written out here as a fixed set of values: the permitted set is your configuration, not something the platform fixes.
When your company's Custom Loan Guidelines for this loan's program list the property states they allow, a state outside that list is refused with 422 VALIDATION_FAILED, and the message names the states that are allowed. The list that applies is the one for the loan program in this request (loanProgram), falling back to the program already on the loan.
Two cases are deliberately accepted, so that valid loans keep saving.
A company with no list configured is unrestricted. Every state in the platform's own state list is accepted, plus the two US territory codes GU (Guam) and V.I. (US Virgin Islands), which the property import stores even though they are not rows in that list. This is most companies, and it matches the back office, whose picker narrows only when a list exists. "Unrestricted" means no restriction from your own company — a value outside the platform's state list is still refused with 422 VALIDATION_FAILED, and the message then says the value is not a valid US state or territory code, rather than naming a company list.
Case matters here too, exactly as on the borrower state fields: FL is accepted and fl is refused. A differently-cased code is not quietly corrected, because the platform does no case conversion, and the back office's state control could not display the corrected value.
A state already saved on the property stays acceptable, even when the guidelines were narrowed afterwards. The back office does the same: it keeps offering the saved state and flags it for review rather than treating it as invalid. So a loan you fetched can always be sent back unchanged — include propertyId so the platform knows which property you mean.
Sending it blank, or null, clears the field and is never refused.

string | null
string | null
string | null
string | null
string | null
integer | null

Property type code (global master list).

number | null
number | null
integer | null
integer | null
integer | null

Whole numbers only — stored as an integer (QA F4).

integer | null

Whole numbers only — stored as an integer (QA F4).

number | null
integer | null

Owner-occupancy percentage (whole numbers only — stored as an integer).

number | null
number | null
number | null
number | null
number | null
number | null
date | null
number | null

How much of the loan is allocated to this property. Add this up across the properties on the file and you get summary.summaryTotalAllocatedLoanAmount, and that same total — plus financed rehab where the loan needs it — is summary.summaryTotalLoanAmount. It is also the top half of the file's loan-to-purchase, loan-to-value and qualifying loan-to-value percentages, and the basis of this property's interest-only payment. Send 0 to allocate nothing; 0 is returned as 0, so you can always tell an allocation of nothing from a property that has no figure on file.

number | null

The property's annual hazard insurance premium. Added to the flood premium to give propertyTotalHazardFloodInsurance, which the platform works out for you.

number | null

The property's annual flood insurance premium. Added to the hazard premium to give propertyTotalHazardFloodInsurance, which the platform works out for you.

number | null

The property's annual association dues. One twelfth of this, added up across the properties, is summary.summaryMonthlyHOAFees, and the annual figure is part of propertyTotalExpenses.

number | null

Total existing lien payoffs on this property. Add this up across the properties and you get summary.summaryTotalExistingLienPayoffs. ⚠️ This is not the same figure as propertyPayOffAmount above, which is the lien release / payoff amount.

number | null

The property's monthly gross operating income — what it takes in. Add this up across the properties and you get summary.summaryGrossOperatingIncome. The platform uses it to work out this property's net operating income and its debt-service ratio.

integer | null

Which value this property qualifies on. 1 means its purchase price, 2 means its as-is value, and 3 means 60% of its as-is value. Send 0 to select nothing; 0 reads back as null, and a property with nothing selected adds nothing to summary.summaryTotalQualifyingLoanAmount.

Responses

Language
Credentials
Bearer
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json