Find below-market listings
GET/market/below-market
Residential listings asking noticeably less than similar listings nearby, biggest gap first. These are listings, not deals: "deal" in this API means a registered transaction (GET /transactions).
Each listing is compared with Kite's published nearby asking-price comparison: the same property type and bedroom count, a similar area, within a calibrated radius and look-back (disclosed per listing in comparison), one observation per distinct unit, and the subject's own duplicates excluded. A listing appears only when the comparison is published for its cohort and its direction is stable under a 95% cluster bootstrap, so thin or noisy evidence never puts a listing here. This is an asking-price comparison, not a valuation.
Listings are drawn from the market sample: active, deduplicated listings updated in the last 30 days (updated_at), after the same outlier filter kite.sa uses (per-tier price fences from the median and MAD of log price, bedroom and area sanity checks, and a floor at 30% of the neighborhood median). Prices are asking prices in SAR: yearly rent for rentals (monthly, weekly and daily postings are converted to a yearly amount), total price for sales. Paginate with cursor.
- Authentication
- Send a data key (dk_live_… or dk_test_…) as a Bearer token.
- Scope
analytics- Cost
- NaN units per call
Parameters
| Name | Type | Description |
|---|---|---|
cityrequiredquery | string | City slug from GET /cities. A town inside a covered region is accepted and resolved to its city ( |
listing_typerequiredquery | string |
One of: |
property_typequery | string | One residential property type. One of: |
bedsquery | integer | Exact number of bedrooms (0 = studio). |
neighborhood_idquery | integer[] | Limit to one or more neighborhoods (comma-separated ids from GET /cities/{city}/neighborhoods). Unknown ids are a 404. |
min_discount_pctquery | number | Minimum percent below the nearby median. |
max_discount_pctquery | number | Maximum percent below the nearby median. Listings priced far below their neighbors are usually mispriced or mislabeled, so they're left out by default. |
limitquery | integer | |
cursorquery | string |
Response
The data field is a list; each item has these fields.
| Name | Type | Description |
|---|---|---|
listingrequired | object | |
comparisonrequired | object |
Example request
curl "https://api.kite.sa/v1/market/below-market?city=riyadh&listing_type=rent" \
-H "Authorization: Bearer $KITE_API_KEY"import { Kite } from "@kite-sa/sdk";
const kite = new Kite(); // reads KITE_API_KEY
const result = await kite.analytics.belowMarket({ city: "riyadh", listing_type: "rent" });from kite_sa import Kite
kite = Kite() # reads KITE_API_KEY
result = kite.analytics.below_market(city="riyadh", listing_type="rent")Open in the interactive reference
Related endpoints
- Get comparable listings
GET /listings/{id}/comparables - Get a listing's market position
GET /listings/{id}/market-position - Get a listing's nearby asking-price band
GET /listings/{id}/price-band - Find below-market listings (old path)
GET /market/deals - Get gross rental yield
GET /market/rental-yield - Get price trends
GET /market/trends - Compare neighborhoods
GET /market/neighborhoods/compare