Get Saudi property listings, SAR prices and district price history from Aqar with one API
The Aqar API returns sa.aqar.fm, Saudi Arabia's largest real-estate marketplace, as clean JSON in nine actions.
9 active endpoints, on 1 and 2 credit tiers.
- POST/aqar/v1/search
- POST/aqar/v1/detail
- POST/aqar/v1/count
- POST/aqar/v1/categories
- POST/aqar/v1/cities
- POST/aqar/v1/districts
- POST/aqar/v1/price_history
- +2 more
What Aqar endpoints does ReefAPI ship?
9 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Aqar API
9 of 9 endpoints, ready to run
Filter Saudi Arabia's largest property marketplace by category, city, district, price, area, bedrooms, amenities, advertiser and free Arabic or English text. Up to 70 rows a request, no paging ceiling, and every row states whether its price is daily, monthly or yearly instead of leaving you to guess.
// Press "Try it" and this pane shows exactly what the // live site returned this second — including an empty // result, if that is the truth. No key, no account.
How the Aqar API works
Aqar is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 438 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Build a Saudi district rent-yield table, with the rent period read rather than assumed
Two things break yield models on Saudi listings: treating an annual rent as monthly, and a newest order that is really a bump order. Both are handled explicitly here, so a district-level yield table takes four calls.
Get the district ids and their live counts once. Riyadh apartments return 152 districts; An Narjis (600) alone holds 1,975 rentals.
One request returns every district's half-yearly deal count and average price per square metre back to 2015 - the sale side of the ratio, 124 districts for Riyadh.
The rent side. Read price_period off every row and price_period_source to see whether the advertiser stated the period or the category default supplied it.
Sizes each district before you page it, in a 56-byte request, and tells you whether Aqar's two totals agree for that slice.
The new-listing feed. This filters on the real publication date, which is the one thing the recency sort cannot give you here.
A district-by-district table of average sale price per square metre against live asking rents in a known period, refreshed daily from genuinely new listings rather than re-promoted ones.
curl -X POST https://api.reefapi.com/aqar/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"category":"apartment-for-rent","city":"riyadh","price_max":80000,"beds_min":2,"sort":"recently_bumped","max_results":20}'{
"ok": true,
"data": { … },
"meta": {
"api": "aqar",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}What is on Aqar right now - and how much of each slice an API call can reach
Measured on 2026-10-06 with the count action. Aqar publishes two totals for every query and they do not match, so both are shown: the middle column is the index's own tally and the right-hand column is what paging can actually reach. The right-hand number is the one to build against - and unlike most marketplaces, there is no paging ceiling cutting it short.
| Slice | Index count | Reachable by paging |
|---|---|---|
| Everything, all categories, all cities | 174,523 | 168,956 |
| Apartments for sale | 42,413 | 41,582 |
| Apartments for rent | 34,519 | 34,355 |
| Land for sale | 26,468 | 26,338 |
| Villas for sale | 25,691 | 25,467 |
| Villas for rent | 5,322 | 5,298 |
| Buildings for sale | 4,709 | 4,695 |
| Shops for rent | 2,398 | 2,393 |
| Apartments for daily booking | 2,441 | 2,438 |
| Offices for rent | 1,671 | 1,663 |
| Rooms for rent | 1,377 | 1,371 |
| Farms for sale | 849 | 844 |
| Riyadh, every category | 83,837 | see per-query total |
| Jeddah, every category | 41,570 | see per-query total |
| Dammam / Al Khobar / Medina / Mecca | 8,523 / 8,456 / 5,124 / 4,115 | see per-query total |
The two columns diverge most where a separate booking funnel sits behind the category: a daily-rate filter reported 3,952 in the index and exactly 1 reachable row. That is why both numbers are returned on every search and count response instead of one averaged figure.
What was measured on 2026-10-06
Eighteen live searches across ten cities and eleven categories, nine lookup and detail calls, and twenty filter counts, all recomputed from the raw responses. The lines that go against us are in here too, because those are the ones that would otherwise surprise you in production.
Saudi Arabia - 96 cities with live stock, from Riyadh (83,837) and Jeddah (41,570) down to Al Wadiah (1)
174,523 by the index's own count, 168,956 reachable by paging - both numbers are returned on every call
SAR on every row
Arabic and English, for the query and for the description. Most listings are Arabic-only: description_ar filled on 98.6 percent of rows, description_en on 97.6
66, each pairing a property type with sale, rent or booking - returned in both languages with live counts
Up to 70. Asking for more returns 70 without saying so, so the API pages for you and reports page_size 70
All of it. Offsets of 10,000 and 20,000 returned fresh rows, an offset past the total returned an empty list, and a full walk of a 186-row query returned 186 unique ids
Yearly is the norm: 27,149 listings priced per year, 3,952 per day, 5 per month. Every row states its period as a word, and price_period_source says whether the advertiser stated it (85 of 153 rent rows) or the category default supplied it (68 of 153)
417 of 417 rows across 18 searches carried id, URL, category, deal type, price, currency, area, district, region, coordinates, deed number, publication date and bump date
bedrooms 92.8 percent, building age 93.8, REGA licence number 90.2, rooms 86.1, bathrooms 77.5, street width 71.0, floor 30.9, price per square metre only 6.5
Checked against the listing pages' own rendered price and structured data on eight listings, 8 of 8 identical - including one where the advertiser's own description contradicts the price field by ten times and the field is the correct one
Every exposed filter bit against an unfiltered control of 22,758 taken in the same run. An unrecognised filter is rejected with a 400 rather than silently ignored
verified matched 22,253 of 22,758 rows, so it is returned as a field and labelled as non-discriminating rather than sold as a filter
94 apart on Riyadh apartments, 349 on Jeddah apartments for sale, 3,951 on daily-rate stock. total_results is the reachable one
Aqar accepts one and then ignores it - ascending and descending return the same rows. Use created_after_days; the publication date is on every row
Per-listing advertiser phone numbers, deed owner names and deed ids are not served to anonymous callers, so they are not returned. No listing sitemap exists either, so ids come from search
8 of 8 ids taken from a search resolved in detail to the same record - identical id, price, area, price period and district
Half-yearly deal count and average price per square metre from the first half of 2015, 124 Riyadh apartment districts in one request
What people build with Aqar
The jobs this data is most often used for.
endpoints
credits per call
Saudi property analysts call price_history per city to chart average price per square metre by district from 2015 to today, then count to size the live stock behind each district.
Rental-yield models call search with rent_period and read price_period off every row, so an annual rent is never mistaken for a monthly one, then price_history for the district's sale price per square metre.
Portal and aggregator builders call categories, cities and districts once for the numeric ids, then page search with no depth limit - a 22,000-row Riyadh query really is 22,000 rows.
New-listing feeds call search with created_after_days instead of a newest sort, because on this marketplace the recency sort is a bump order and created_after_days is the real publication filter.
What Aqar data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 438 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/aqar/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"category":"apartment-for-rent","city":"riyadh","price_max":80000,"beds_min":2,"sort":"recently_bumped","max_results":20}'import requests
r = requests.post(
"https://api.reefapi.com/aqar/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"category": "apartment-for-rent",
"city": "riyadh",
"price_max": 80000,
"beds_min": 2,
"sort": "recently_bumped",
"max_results": 20
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Aqar.
Get a free key →Is a rent price on Aqar monthly or yearly?▾
Usually yearly. Site-wide at capture, 27,149 rent listings were priced per year, 3,952 per day and only 5 per month, so a caller who assumes monthly is out by twelve times. Every row returns price_period as a word - daily, monthly or yearly - and price_per_year is derived only where the period is known. Sale rows carry no period at all.
What happens when the advertiser did not state a rent period?▾
It happens often: 68 of 153 rent rows in a 417-row sample had no stated period. Aqar's own listing page still prints a period for those - it renders a yearly label and its structured data says annually - so the API returns yearly and sets price_period_source to category_default. When the advertiser did state it, price_period_source says stated_by_advertiser. The distinction is on every row, so nothing is assumed silently.
Why does the response return two different totals?▾
Because Aqar computes two. total_results is the number of rows that can actually be paged through and index_count is the index's own tally. They differ by 94 on a Riyadh apartment query, by 349 on Jeddah apartments for sale, and by 3,951 on daily-rate stock. Both are returned along with counts_disagree and count_gap. Build against total_results.
Can I sort by newest listing?▾
Not reliably, and the API says so instead of pretending. Aqar accepts a creation-date sort and then ignores it - ascending and descending return the same rows, measured. The only working recency order is recently_bumped, which is when the advertiser last re-promoted the ad. For genuinely new stock use created_after_days: seven days returned 1,775 of 22,758 Riyadh rentals and thirty days returned 7,052. Passing sort=newest is accepted, mapped to recently_bumped, and the response explains the swap.
How deep can I page?▾
To the end. Offsets of 1,000, 5,000, 9,000, 10,000, 12,000 and 20,000 all returned fresh rows on a 22,666-row query, an offset of 22,666 returned an empty list, and a full walk of a 186-row query returned 186 unique ids. There is no silent repeat of the last page. Each request serves up to 70 rows; bigger asks are walked for you.
Does the API give me the advertiser's phone number?▾
No. Aqar does not publish per-listing contact numbers to anonymous callers, so there is nothing to return. What is published is the advertiser's display name, the office's company name, its rating, its REGA and brokerage licence numbers, its live and archived listing counts and its numeric id, which the agent action resolves into a full public profile.
What is in price_history and how far back does it go?▾
Aqar's own half-yearly market series per district: for each period, how many deals were recorded and the average price per square metre. Riyadh apartments returned 124 districts and a series starting in the first half of 2015, all in one request. It is the dataset behind the site's district pages, and it is the main reason to use this API for analysis rather than just for listings.
Do the filters actually narrow the results?▾
Every exposed filter was bite-tested against an unfiltered control of 22,758 taken in the same run: price under 30,000 gave 6,453, three or more bedrooms 12,425, area 200 m² and up 8,176, furnished 3,235, has video 9,304, Arabic keyword فيلا 1,420, offices 4,206 against 18,552 private advertisers. One filter is deliberately labelled as weak rather than dropped: verified matched 22,253 of 22,758, so it narrows almost nothing. An unrecognised filter is rejected with a 400 rather than silently ignored.
What is the Aqar API?▾
Aqar API is a ReefAPI endpoint group for saudi arabia's largest property marketplace: 169,000 reachable apartment, villa, land, office and shop listings in sar, with rent quoted in the period the advertiser actually used. It returns live JSON through POST requests under /aqar/v1.
Is the Aqar API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Aqar calls use the same shared credit balance as every other ReefAPI engine.
Do I need an Aqar login or account?▾
No login to Aqar is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Aqar data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Aqar API use?▾
Aqar actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Aqar from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call aqar actions with the same key, credit pool and JSON envelope used by normal REST requests.
21 Real Estate APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Aqar, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 437 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-10-06.