Properties
Free-text property search
Find properties by a single free-text query — a full or partial address, an owner name, or a place. Results are ranked by relevance and tolerate typos, missing components, and reordered street directionals (e.g. "112 5th ave nw" and "112 nw 5th ave" both match). Returns the same property summary rows as the list endpoint. Use this for a search box; use the list endpoint for structured filtering.
Authorization
Body application/json
limitintegerMax results to return (default 12).
querystringrequiredFree-text search — an address (full or partial), an owner name, or a place. Ranked by relevance; tolerates typos, missing parts, and reordered directionals.
Responses
200objectRelevance-ranked property matchesShow attributesHide attributes
cursorstringdataobject[]requiredShow child attributesHide child attributes
absenteeOwnerboolean | nulltrue when the owner's mailing address (street + 5-digit zip, case/punctuation-insensitive) differs from the property's site address — a non-owner-occupied/investor signal; false when the owner mails to the property; null when either address is missing. Filterable.
activeLoanCountnumber | nullMortgages believed to still be outstanding. IMPORTANT: 0 does not always mean the parcel is paid off — on a recently-sold parcel it usually means the buyer's new mortgage has not reached the public record yet, so the honest reading is UNKNOWN. Check activeLoanCountKnown before treating a 0 as fact, and do not infer 100% equity from it.
activeLoanCountKnownbooleanfalse when activeLoanCount reflects a gap in the record rather than a measurement — the parcel sold, its prior mortgage was excluded, and no replacement has been recorded yet. On those parcels activeLoanCount: 0, mortgageBalance: 0 and an equity of 100% are all consequences of the same missing document, not independent findings. To exclude them, filter preSaleLoanCount: {lte: 0} alongside activeLoanCount: {lte: 0}.
addressstring | nullapnstring | nullAssessor parcel number (cleaned)
avmobject | nullShow child attributesHide child attributes
confidencenumber | nullrequired0–100
highnumber | nullrequiredlownumber | nullrequiredmidnumber | nullrequiredbathsnumber | nullbedsnumber | nullborrowerStatusstring | nullborrowersobject[]Borrowers on the current mortgage (up to two); not the owner of record.
Show child attributesHide child attributes
firstNamestring | nullrequiredlastNamestring | nullrequiredcitystring | nullcoordinatesobject | nullShow child attributesHide child attributes
latnumberrequiredlonnumberrequiredcountyNamestring | nullCounty name, lowercase ("catawba county").
currentOwnerNamestring | nullThe assessor's owner-of-record line as recorded — every owner on title.
equityobject | nullShow child attributesHide child attributes
pctnumber | nullrequiredEquity as a FRACTION of the value estimate — 1 is the whole value, 0.5 is half. A 1 alongside activeLoanCountKnown: false is arithmetic on a missing mortgage, not a free-and-clear parcel.
valuenumber | nullrequiredEstimated equity in whole dollars — the value estimate minus the outstanding balance of the mortgages we know about. It inherits their completeness: when activeLoanCountKnown is false there is no known balance to subtract, so this equals the full value estimate and should NOT be read as equity.
equityPlausiblebooleanfalse when equity is outside the range our equity metrics treat as possible, so aggregate equity figures exclude this parcel while this row still shows it — both are correct, they are answering different questions. Applies to pct as well, since that is value divided by the value estimate. Read alongside activeLoanCountKnown, which is the opposite failure: that one flags equity computed against a MISSING mortgage (so equity looks too GOOD), where this one flags equity distorted by an oversized one (equity looks too BAD).
fipsstring | nullFIPS county code
foreclosureobjectShow child attributesHide child attributes
datestring | nullrequiredRecording date of the most recent foreclosure notice (ISO 8601) — the value the foreclosureDate filter matches. Null when the parcel has no notice.
matchedbooleanrequiredscheduledAuctionDatestring | nullrequiredstagestring | nullrequiredStage code of the most recent recorded foreclosure notice (e.g. "ND", "NS") — the value the foreclosureStage filter matches. Null when the parcel has no notice.
statusstring | nullrequirede.g. "in_foreclosure" or "unknown"
idstringrequiredDocument ID
loanCountnumber | nullEvery mortgage on record for this parcel, current or not. Splits into activeLoanCount + preSaleLoanCount + the paid-off and released counts on the detail position block.
loanTypestring | nullloansobject[]The parcel's cached top-5 loans (may be fewer than loanCount; full history is on the loans index).
Show child attributesHide child attributes
amountnumber | nullrequiredamountPlausiblebooleanfalse when amount is outside the range our mortgage metrics treat as possible, so aggregate totals exclude this loan while this row still shows it. Usually an institutional blanket loan — one note recorded against every parcel in a pool — which is a real record but not this property's debt. This judges SIZE only, so true means the amount is a believable one, not that it is the right one.
borrowerStatusstring | nullrequiredbrokerNmlsstring | nullrequiredcompanyNamestring | nullFunding-company name as recorded on the loan.
companyNmlsstring | nullrequiredcurrentBalancenumber | nullrequiredinterestRatenumber | nullrequiredlenderIdstring | nullrequiredLender id for this loan — pass it back as loanLender to select every parcel financed by the same lender, exactly as a chart bucket's id round-trips. null when this loan carries no lender id; use lenderName with loanLenderName in that case.
lenderNamestring | nullrequiredLender name as recorded on the loan document — the same value /v1/loans returns as lenderName for this loan. To filter parcels by it, pass it as loanLenderName; lenderId is the exact-id route.
lenderNmlsstring | nullrequiredloanTypestring | nullrequiredltvnumber | nullrequiredDEPRECATED — do not use; will be removed in a future major. This is not a reliable loan-to-value ratio. It is NOT per-loan: two thirds of parcels carrying several mortgages report an identical figure across loans of very different amounts, so per-loan equity computed from it is wrong. Nor does it consistently track the parcel's combined position, so it cannot be read as a whole-parcel ratio either. null when unknown — the stored value is clipped to a fixed range and both ends mean "clipped" rather than a real ratio, so they are returned as null rather than as a plausible-looking number. For a dependable measure of borrower position use equity on the parcel.
originatorNamestring | nullrequiredoriginatorNmlsstring | nullrequiredrecordedInterestRatenumber | nullrequiredrecordingDatestring | nullrequiredtransactionTypestring | nullrequiredlotSquareFeetnumber | nullmmPropertyIdstring | nullmortgageBalancenumber | nullmortgageBalancePlausiblebooleanfalse when mortgageBalance is outside the range our mortgage metrics treat as possible — typically a parcel carrying an institutional blanket loan, where one securitization note is recorded against every property in the pool. Sorting by mortgageBalance puts these first, so check this flag before reading the top of that list as the most heavily mortgaged homes.
ownerFirstNamestring | nullownerLastNamestring | nullownerMailingAddressobject | nullPrimary owner's mailing address, null when none is recorded.
Show child attributesHide child attributes
citystring | nullrequiredstatestring | nullrequiredstreetstring | nullrequiredzipstring | nullrequiredownerMiddleNamestring | nullownerNamestring | nullownerOccupancyenumAssessor owner-occupancy flag, bucketed: owner_occupied (owner-occupied, incl. the vendor's phased-out non-residential code), probable_owner_occupied, or not_flagged (the assessor did not flag the parcel — not proof of an investor, but where non-owner-occupied/investor parcels land; pair with absenteeOwner). Filterable.
owner_occupiedprobable_owner_occupiednot_flaggedownerOccupiedboolean | nulltrue only on the assessor's confident owner-occupied code ("Y"); null = not flagged / unknown, never false. Kept for compatibility — prefer ownerOccupancy.
partialBathsnumber | nullpreSaleLoanCountnumber | nullMortgages excluded from activeLoanCount because the parcel sold after they were recorded — the seller's loan, assumed paid off at closing. Read this NEXT TO activeLoanCount, never alone: a non-zero value on a parcel that still has an active loan is the normal post-sale state and means the replacement mortgage was recorded. It is only a warning when activeLoanCount is 0, which is what activeLoanCountKnown reports.
recordedInterestRatenumber | nullGenuine recorded note rate from the most-recent loan (sparse, ~7%). See loans[] for per-loan detail.
saleCountnumber | nullsalePropensityobject | nullShow child attributesHide child attributes
categorystring | nullrequiredLow/Medium/High
scorenumber | nullrequired0–100
salesobjectShow child attributesHide child attributes
countnumber | nullrequiredfirstDatestring | nullrequiredlastDatestring | nullrequiredlastPricenumber | nullrequiredscoredAtstring | nullsquareFeetnumber | nullstatestring | nullTwo-letter state abbreviation, uppercased (stored lowercase in OS)
storiesnumber | nullyearBuiltnumber | nullzipstring | nulllenderNormalizationsobject[]How each loanLenderName value resolved against the lender dictionary. Present when a loanLenderName filter was supplied. A matchedVia of unresolved means only the recorded lender string was matched, not the lender's whole name family.
Show child attributesHide child attributes
aliasCountintegerrequiredStored lender-name variants this id expands to
displayNamestring | nullrequiredidstring | nullrequiredCanonical lender-dictionary id, or null
matchedViaenumrequiredid = the value already WAS a canonical key; alias = a stored lender name; name = matched the display/canonical name; unresolved = fell back to raw text match; degraded = the dictionary could not be consulted.
idaliasnameunresolveddegradedoriginalstringrequiredThe value the caller sent
totalDocumentsintegerrequiredLoans the dictionary attributes to this id. A small number next to a well-known lender name means the name matched a minor entry.
totalnumberrequired400objectValidation 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.