Searching and filtering
GET /listings takes 34 filters. city and listing_type are the only required ones; everything else narrows. GET /listings/count accepts the same 34 and returns just a total, which is how you get one — search itself doesn't return a count.
Values that are lists, ids or slugs come from the reference endpoints rather than from this page, so they can't go stale: GET /cities, GET /cities/{city}/neighborhoods, and GET /enums for property types, amenities, sources and the rest.
| Group | Filters |
|---|---|
| Location | city, neighborhood_id, neighborhood_id_exclude, bbox, compound, in_compound |
| Type | listing_type, listing_category, property_type |
| Price | price_min, price_max, rent_frequency |
| Size | area_min, area_max |
| Rooms | beds, beds_min, beds_max, bathrooms, bathrooms_min, bathrooms_max, livings_min |
| Attributes | amenities, amenities_exclude, furnished, floor, max_age, verified |
| Freshness | updated_since, days_on_market_min, days_on_market_max |
| Source | source, source_exclude, advertiser_type |
| Text | q |
Things worth knowing before you rely on them
A few filters don't behave the way their name suggests. None of this is accidental, but none of it is guessable either.
bedsis exact — at every value. darak.app's own filter treatsbeds=5as five-or-more, so the same number returns a different set there. Usebeds_minwhen you want a range. The same applies tobathrooms.qsearches what the advertiser wrote, meaningtitleanddescription— notheadline, which Darak composes for the response. Several words must all appear;"quote a phrase"to match it whole;|between terms for either. Sources that post no title at all (Aqar among them) are matched on description alone.floor=groundandfloor=upperdon't partition. A listing whose floor the source never stated is in neither.verified=falsemeans "not marked verified", which includes every listing the source said nothing about — not only ones it marked unverified.neighborhood_id_excludekeeps listings Darak couldn't place;neighborhood_iddrops them. Excluding three neighborhoods is therefore not the same as including all the others.- A misspelled
sourcenarrows to nothing. Parameter names are validated, so a typo there is anunknown_parametererror — but source values aren't checked against the list, sosource=bayuttquietly returns an empty page.GET /enumshas the real ones. - Listings with no price never appear in search, even though
price.yearly_saris nullable and a detail lookup can return one. property_typewith several values shifts the quality bounds. The outlier filter calibrates per property type only when you ask for exactly one, so a villa excluded byproperty_type=villacan appear underproperty_type=villa,apartment.sort=price_dropalso filters, to listings whose price actually fell. Andsort=recommendedis a ranking that gets retuned between releases, so the same query can reorder — page through it freely, but don't sync with it.compound=trueis a special case meaning "in any compound", not a compound named "true". Usein_compoundif that's what you meant.
Counts won't match darak.app exactly
Both now serve all live inventory, so the two should agree closely. Where they differ it's the ranking and the outlier filter, not a freshness window — darak.app used to hide listings whose source hadn't restated an update date in 30 days, which turned out to exclude a fifth of live listings and to depend almost entirely on which source published them. That filter is gone.