Batch Lookup
Resolve many listing IDs in a single request (up to your tier’s perPage
cap, and at most 500 IDs; large batches are looked up in chunks server-side).
Serves cached data only (it never triggers a live fetch) and is
billed at one request unit per requested (deduped) ID, including IDs that
are not found. amenities and internetProviders are not fetched in
batch and come back as null (not “none”); use GET /property/{id} when
you need those. Results are not returned in request order: match them by
id, and read meta.notFound for the misses. If the batch would exceed
your remaining monthly quota (including overage), the whole request is
rejected with 429 QUOTA_EXCEEDED; there is no partial result.
After de-duplication the list may hold at most 500 ids, and never more
than your tier’s maximum page size (Free 10, Starter 50, Pro/Business
500); a longer list returns 400.
Tier: Starter+
curl --request POST \
--url https://borough.qwady.app/v1/property/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ids": [
"4961849",
"1763374"
]
}
'import requests
url = "https://borough.qwady.app/v1/property/batch"
payload = { "ids": ["4961849", "1763374"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({ids: ['4961849', '1763374']})
};
fetch('https://borough.qwady.app/v1/property/batch', 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://borough.qwady.app/v1/property/batch",
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([
'ids' => [
'4961849',
'1763374'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://borough.qwady.app/v1/property/batch"
payload := strings.NewReader("{\n \"ids\": [\n \"4961849\",\n \"1763374\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://borough.qwady.app/v1/property/batch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"4961849\",\n \"1763374\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://borough.qwady.app/v1/property/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ids\": [\n \"4961849\",\n \"1763374\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"address": {
"street": "157 West 57th Street",
"unit": "#48B"
},
"price": 123,
"netEffective": 123,
"monthsFree": 123,
"leaseTermMonths": 123,
"bedroomCount": 123,
"fullBathroomCount": 123,
"halfBathroomCount": 123,
"sqft": 123,
"pricePerSqft": 123,
"buildingType": "CONDO",
"areaName": "<string>",
"areaId": 123,
"status": "ACTIVE",
"geoPoint": {
"latitude": 40.7654,
"longitude": -73.9791
},
"leadPhotoKey": "<string>",
"sourceGroupLabel": "<string>",
"urlPath": "<string>",
"listingType": "rental",
"listedAt": "2023-12-25",
"listedAtIsApproximate": true,
"availableAt": "2023-12-25",
"daysOnMarket": 123,
"buildingId": "<string>",
"buildingScores": {
"healthScore": 123,
"noiseScore": 123,
"safetyScore": 123,
"transitScore": 123,
"violationsOpen": 123,
"updatedAt": "<string>"
},
"noFee": true,
"detailScraped": true,
"priceDelta": 123,
"saleType": "RESALE",
"petsAllowed": true,
"amenities": [
"<string>"
],
"furnished": true,
"floorPlanKey": "<string>",
"has3dTour": true,
"hasVideo": true,
"priceChangedAt": "2023-11-07T05:31:56Z",
"maintenance": 123,
"commonCharges": 123,
"propertyTax": 123,
"virtualTourUrl": "<string>",
"internetProviders": {
"status": "matched",
"source": "fcc_bdc",
"coverageLevel": "building",
"fccLocationId": 123,
"blockGeoid": "<string>",
"matchedAddress": "<string>",
"unitCount": 123,
"updatedAt": "2023-11-07T05:31:56Z",
"providers": [
{
"providerId": 123,
"providerName": "<string>",
"holdingCompanyName": "<string>",
"technologyCode": 123,
"technologyLabel": "<string>",
"maxDownloadMbps": 123,
"maxUploadMbps": 123,
"lowLatency": true
}
],
"disclaimer": "<string>"
},
"photos": [
"<string>"
]
}
],
"meta": {
"total": 123,
"requested": 123,
"found": 123,
"notFound": [
"<string>"
],
"dataAge": "2023-11-07T05:31:56Z",
"source": "cached"
}
}Authorizations
Polar.sh license key. Format: BOROUGH-<uuid>
Body
1 - 500 elements["4961849", "1763374"]
curl --request POST \
--url https://borough.qwady.app/v1/property/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ids": [
"4961849",
"1763374"
]
}
'import requests
url = "https://borough.qwady.app/v1/property/batch"
payload = { "ids": ["4961849", "1763374"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({ids: ['4961849', '1763374']})
};
fetch('https://borough.qwady.app/v1/property/batch', 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://borough.qwady.app/v1/property/batch",
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([
'ids' => [
'4961849',
'1763374'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://borough.qwady.app/v1/property/batch"
payload := strings.NewReader("{\n \"ids\": [\n \"4961849\",\n \"1763374\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://borough.qwady.app/v1/property/batch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"4961849\",\n \"1763374\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://borough.qwady.app/v1/property/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ids\": [\n \"4961849\",\n \"1763374\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"address": {
"street": "157 West 57th Street",
"unit": "#48B"
},
"price": 123,
"netEffective": 123,
"monthsFree": 123,
"leaseTermMonths": 123,
"bedroomCount": 123,
"fullBathroomCount": 123,
"halfBathroomCount": 123,
"sqft": 123,
"pricePerSqft": 123,
"buildingType": "CONDO",
"areaName": "<string>",
"areaId": 123,
"status": "ACTIVE",
"geoPoint": {
"latitude": 40.7654,
"longitude": -73.9791
},
"leadPhotoKey": "<string>",
"sourceGroupLabel": "<string>",
"urlPath": "<string>",
"listingType": "rental",
"listedAt": "2023-12-25",
"listedAtIsApproximate": true,
"availableAt": "2023-12-25",
"daysOnMarket": 123,
"buildingId": "<string>",
"buildingScores": {
"healthScore": 123,
"noiseScore": 123,
"safetyScore": 123,
"transitScore": 123,
"violationsOpen": 123,
"updatedAt": "<string>"
},
"noFee": true,
"detailScraped": true,
"priceDelta": 123,
"saleType": "RESALE",
"petsAllowed": true,
"amenities": [
"<string>"
],
"furnished": true,
"floorPlanKey": "<string>",
"has3dTour": true,
"hasVideo": true,
"priceChangedAt": "2023-11-07T05:31:56Z",
"maintenance": 123,
"commonCharges": 123,
"propertyTax": 123,
"virtualTourUrl": "<string>",
"internetProviders": {
"status": "matched",
"source": "fcc_bdc",
"coverageLevel": "building",
"fccLocationId": 123,
"blockGeoid": "<string>",
"matchedAddress": "<string>",
"unitCount": 123,
"updatedAt": "2023-11-07T05:31:56Z",
"providers": [
{
"providerId": 123,
"providerName": "<string>",
"holdingCompanyName": "<string>",
"technologyCode": 123,
"technologyLabel": "<string>",
"maxDownloadMbps": 123,
"maxUploadMbps": 123,
"lowLatency": true
}
],
"disclaimer": "<string>"
},
"photos": [
"<string>"
]
}
],
"meta": {
"total": 123,
"requested": 123,
"found": 123,
"notFound": [
"<string>"
],
"dataAge": "2023-11-07T05:31:56Z",
"source": "cached"
}
}