Search Listings
Search listings by location keywords and optional filters (price, bedrooms, bathrooms, sqft, property type, listing status, purchase type).
curl --request POST \
--url https://api.lofty.com/v2.0/listings/search \
--header 'Authorization: <authorization>' \
--header 'Content-Type: <content-type>' \
--data '
{
"searchScope": "all",
"soldFlag": true,
"filterConditions": {},
"sortFields": [
"<string>"
],
"returnFields": [
"<string>"
],
"pageNum": 1,
"pageSize": 25
}
'import requests
url = "https://api.lofty.com/v2.0/listings/search"
payload = {
"searchScope": "all",
"soldFlag": True,
"filterConditions": {},
"sortFields": ["<string>"],
"returnFields": ["<string>"],
"pageNum": 1,
"pageSize": 25
}
headers = {
"Authorization": "<authorization>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<authorization>', 'Content-Type': '<content-type>'},
body: JSON.stringify({
searchScope: 'all',
soldFlag: true,
filterConditions: {},
sortFields: ['<string>'],
returnFields: ['<string>'],
pageNum: 1,
pageSize: 25
})
};
fetch('https://api.lofty.com/v2.0/listings/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.lofty.com/v2.0/listings/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'searchScope' => 'all',
'soldFlag' => true,
'filterConditions' => [
],
'sortFields' => [
'<string>'
],
'returnFields' => [
'<string>'
],
'pageNum' => 1,
'pageSize' => 25
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: <content-type>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.lofty.com/v2.0/listings/search"
payload := strings.NewReader("{\n \"searchScope\": \"all\",\n \"soldFlag\": true,\n \"filterConditions\": {},\n \"sortFields\": [\n \"<string>\"\n ],\n \"returnFields\": [\n \"<string>\"\n ],\n \"pageNum\": 1,\n \"pageSize\": 25\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("Content-Type", "<content-type>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.lofty.com/v2.0/listings/search")
.header("Authorization", "<authorization>")
.header("Content-Type", "<content-type>")
.body("{\n \"searchScope\": \"all\",\n \"soldFlag\": true,\n \"filterConditions\": {},\n \"sortFields\": [\n \"<string>\"\n ],\n \"returnFields\": [\n \"<string>\"\n ],\n \"pageNum\": 1,\n \"pageSize\": 25\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.lofty.com/v2.0/listings/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["Content-Type"] = '<content-type>'
request.body = "{\n \"searchScope\": \"all\",\n \"soldFlag\": true,\n \"filterConditions\": {},\n \"sortFields\": [\n \"<string>\"\n ],\n \"returnFields\": [\n \"<string>\"\n ],\n \"pageNum\": 1,\n \"pageSize\": 25\n}"
response = http.request(request)
puts response.read_body{
"listing": [
{
"listingId": "1179625482",
"mlsListingId": "ML82040728",
"listingStreetName": "5164 Montreal DR",
"listingCity": "San Jose",
"listingState": "CA",
"listingZipcode": [
"<string>"
],
"county": "Santa Clara",
"area": "Campbell",
"chimeArea": "<string>",
"subDivisionName": "<string>",
"community": "<string>",
"chimeComplex": "<string>",
"price": "1950000",
"beds": 3,
"baths": 2,
"sqft": 1408,
"builtYear": 1959,
"totalAvailableAcres": "6000",
"detailsDescribe": "<string>",
"listingStatus": "Active",
"purchaseType": "For Sale",
"propertyTypes": [
"<string>"
],
"propertyTypePrimary": "Residential",
"propertyTypeSecondary": "Single Family Home",
"pictureList": [
"<string>"
],
"openHouseSchedules": "Sat Apr 04, 1:00pm - 4:00pm",
"openHouseSchedulesStart": "2026-04-04 13:00:00",
"openHouseSchedulesEnd": "2026-04-04 16:00:00",
"agentId": "5106715",
"agentName": "Dawn Thorburn",
"agentOrgId": "6043409",
"agentOrgName": "Rocky Properties Inc.",
"coAgentId": "<string>",
"coAgentName": "<string>",
"coAgentOrgId": "<string>",
"coAgentOrgName": "<string>",
"hoaFee": -1,
"hoaFeeFrequency": "<string>",
"condoFee": -1,
"condoFeeFrequency": "<string>",
"chimeMaintenanceFee": 0,
"garageParkingSpaces": 2,
"interiorFeatures": "<string>",
"exterior": "<string>",
"mlsListDateL": 0
}
],
"metadata": {
"collection": "<string>",
"pageSize": 123,
"pageNum": 123,
"totalCount": 123,
"totalPage": 123,
"hasMore": true
}
}Body
Search scope. 'my' = agent's own listings, 'office' = office-level listings, 'all' = all listings the agent has access to. Default 'all'.
my, office, all Whether to search sold listings. Default false (active listings).
Advanced search filter conditions. Keys must match condition names in the property.condition table. Examples:
- "location": {"city": ["Seattle"]} (suggestion type)
- "price": "100000,500000" (inputBox range: "min,max")
- "beds": "2," (inputBox range: min only)
- "baths": ",3" (inputBox range: max only)
- "sqFt": "1000,3000" (inputBox range)
- "daysOnSite": ",30" (inputBox days: within last N days)
- "propertyType": ["Condo", "Townhouse"] (multiSelect labels)
- "purchaseType": ["For Sale"] (singleSelect label)
Show child attributes
Show child attributes
Sort fields. Values from ListingSortEnum, e.g. MLS_LIST_DATE_L_DESC, PRICE_DESC, PRICE_ASC, BEDROOMS_DESC, BATHS_DESC, BUILT_YEAR_DESC, SQFT_DESC, RELEVANCE, QUALITY_DESC, OPEN_HOUSE_DESC.
Return fields. If empty, uses default fields for the listing type.
Page number, starting from 1. Default 1.
Page size, 1–100. Default 25.
curl --request POST \
--url https://api.lofty.com/v2.0/listings/search \
--header 'Authorization: <authorization>' \
--header 'Content-Type: <content-type>' \
--data '
{
"searchScope": "all",
"soldFlag": true,
"filterConditions": {},
"sortFields": [
"<string>"
],
"returnFields": [
"<string>"
],
"pageNum": 1,
"pageSize": 25
}
'import requests
url = "https://api.lofty.com/v2.0/listings/search"
payload = {
"searchScope": "all",
"soldFlag": True,
"filterConditions": {},
"sortFields": ["<string>"],
"returnFields": ["<string>"],
"pageNum": 1,
"pageSize": 25
}
headers = {
"Authorization": "<authorization>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<authorization>', 'Content-Type': '<content-type>'},
body: JSON.stringify({
searchScope: 'all',
soldFlag: true,
filterConditions: {},
sortFields: ['<string>'],
returnFields: ['<string>'],
pageNum: 1,
pageSize: 25
})
};
fetch('https://api.lofty.com/v2.0/listings/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.lofty.com/v2.0/listings/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'searchScope' => 'all',
'soldFlag' => true,
'filterConditions' => [
],
'sortFields' => [
'<string>'
],
'returnFields' => [
'<string>'
],
'pageNum' => 1,
'pageSize' => 25
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: <content-type>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.lofty.com/v2.0/listings/search"
payload := strings.NewReader("{\n \"searchScope\": \"all\",\n \"soldFlag\": true,\n \"filterConditions\": {},\n \"sortFields\": [\n \"<string>\"\n ],\n \"returnFields\": [\n \"<string>\"\n ],\n \"pageNum\": 1,\n \"pageSize\": 25\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("Content-Type", "<content-type>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.lofty.com/v2.0/listings/search")
.header("Authorization", "<authorization>")
.header("Content-Type", "<content-type>")
.body("{\n \"searchScope\": \"all\",\n \"soldFlag\": true,\n \"filterConditions\": {},\n \"sortFields\": [\n \"<string>\"\n ],\n \"returnFields\": [\n \"<string>\"\n ],\n \"pageNum\": 1,\n \"pageSize\": 25\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.lofty.com/v2.0/listings/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["Content-Type"] = '<content-type>'
request.body = "{\n \"searchScope\": \"all\",\n \"soldFlag\": true,\n \"filterConditions\": {},\n \"sortFields\": [\n \"<string>\"\n ],\n \"returnFields\": [\n \"<string>\"\n ],\n \"pageNum\": 1,\n \"pageSize\": 25\n}"
response = http.request(request)
puts response.read_body{
"listing": [
{
"listingId": "1179625482",
"mlsListingId": "ML82040728",
"listingStreetName": "5164 Montreal DR",
"listingCity": "San Jose",
"listingState": "CA",
"listingZipcode": [
"<string>"
],
"county": "Santa Clara",
"area": "Campbell",
"chimeArea": "<string>",
"subDivisionName": "<string>",
"community": "<string>",
"chimeComplex": "<string>",
"price": "1950000",
"beds": 3,
"baths": 2,
"sqft": 1408,
"builtYear": 1959,
"totalAvailableAcres": "6000",
"detailsDescribe": "<string>",
"listingStatus": "Active",
"purchaseType": "For Sale",
"propertyTypes": [
"<string>"
],
"propertyTypePrimary": "Residential",
"propertyTypeSecondary": "Single Family Home",
"pictureList": [
"<string>"
],
"openHouseSchedules": "Sat Apr 04, 1:00pm - 4:00pm",
"openHouseSchedulesStart": "2026-04-04 13:00:00",
"openHouseSchedulesEnd": "2026-04-04 16:00:00",
"agentId": "5106715",
"agentName": "Dawn Thorburn",
"agentOrgId": "6043409",
"agentOrgName": "Rocky Properties Inc.",
"coAgentId": "<string>",
"coAgentName": "<string>",
"coAgentOrgId": "<string>",
"coAgentOrgName": "<string>",
"hoaFee": -1,
"hoaFeeFrequency": "<string>",
"condoFee": -1,
"condoFeeFrequency": "<string>",
"chimeMaintenanceFee": 0,
"garageParkingSpaces": 2,
"interiorFeatures": "<string>",
"exterior": "<string>",
"mlsListDateL": 0
}
],
"metadata": {
"collection": "<string>",
"pageSize": 123,
"pageNum": 123,
"totalCount": 123,
"totalPage": 123,
"hasMore": true
}
}