Aqar API

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.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a Aqar endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
A
/aqar/v1

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.

9 endpoints

search

2 cr

Search Saudi Arabia's largest property marketplace by category (66 of them, each pairing a pr…

required
—
optional
category, city, district_id, direction_id, keyword, price_min, price_max, rent_period, area_min, area_max, meter_price_min, meter_price_max, beds_min, rooms_min, livings_min, bathrooms_min, age_max, street_width_min, furnished, has_image, has_video, verified, elevator, pool, basement, duplex, near_metro, seller_type, user_id, created_after_days, bumped_after_days, sort, max_results, offset, lang, include_pii

detail

1 cr

The full record for one listing.

required
id
optional
lang, include_pii

count

1 cr

How many properties match a filter combination, without parsing a single row.

required
—
optional
category, city, district_id, direction_id, keyword, price_min, price_max, rent_period, area_min, area_max, meter_price_min, meter_price_max, beds_min, rooms_min, livings_min, bathrooms_min, age_max, street_width_min, furnished, has_image, has_video, verified, elevator, pool, basement, duplex, near_metro, seller_type, user_id, created_after_days, bumped_after_days

categories

1 cr

The complete category vocabulary.

required
—
optional
—

cities

1 cr

Every Saudi city that carries stock, with its numeric city_id and a LIVE listing count, optio…

required
—
optional
category

districts

1 cr

Every district (neighbourhood) of one city with a live listing count, plus the city's quadran…

required
city
optional
category

price_history

2 cr

Aqar's own half-yearly price series per district of a city, going back to 2015.

required
city
optional
category

agent

1 cr

The public profile of one advertising office or private advertiser.

required
user_id
optional
max_results, include_pii

suggest

1 cr

Place autocomplete straight from the site's own search box.

required
query
optional
—

Every parameter, every allowed value →

Aqar API

9 of 9 endpoints, ready to run

View docs ↗

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.

2 credits0 required · 22 optional
POST/aqar/v1/search
idle
// 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.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 438 engines.

02
Call
POST /aqar/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

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.

01districts with your city and category
POSTdistricts with your city and category

Get the district ids and their live counts once. Riyadh apartments return 152 districts; An Narjis (600) alone holds 1,975 rentals.

02price_history with the same city
POSTprice_history with the same city

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.

03search per district_id with rent_period yearly
POSTsearch per district_id with rent_period yearly

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.

04count with the same filters
POSTcount with the same filters

Sizes each district before you page it, in a 56-byte request, and tells you whether Aqar's two totals agree for that slice.

05search with created_after_days 7 on a schedule
POSTsearch with created_after_days 7 on a schedule

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.

request
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}'
response envelope
{
  "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.

SliceIndex countReachable by paging
Everything, all categories, all cities174,523168,956
Apartments for sale42,41341,582
Apartments for rent34,51934,355
Land for sale26,46826,338
Villas for sale25,69125,467
Villas for rent5,3225,298
Buildings for sale4,7094,695
Shops for rent2,3982,393
Apartments for daily booking2,4412,438
Offices for rent1,6711,663
Rooms for rent1,3771,371
Farms for sale849844
Riyadh, every category83,837see per-query total
Jeddah, every category41,570see per-query total
Dammam / Al Khobar / Medina / Mecca8,523 / 8,456 / 5,124 / 4,115see 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.

Market

Saudi Arabia - 96 cities with live stock, from Riyadh (83,837) and Jeddah (41,570) down to Al Wadiah (1)

Listings site-wide

174,523 by the index's own count, 168,956 reachable by paging - both numbers are returned on every call

Currency

SAR on every row

Languages

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

Categories

66, each pairing a property type with sale, rent or booking - returned in both languages with live counts

Rows per request

Up to 70. Asking for more returns 70 without saying so, so the API pages for you and reports page_size 70

Reachable per query

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

Rent period

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)

Core fields filled

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

Partly filled, by the source

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

Price integrity

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

Filters

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

A filter that barely narrows

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

Two totals that disagree

94 apart on Riyadh apartments, 349 on Jeddah apartments for sale, 3,951 on daily-rate stock. total_results is the reachable one

No creation-date sort

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

Not published by the source

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

Round-trip

8 of 8 ids taken from a search resolved in detail to the same record - identical id, price, area, price period and district

District price history

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.

9

endpoints

1/2

credits per call

01

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.

02

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.

03

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.

04

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 →
$0.67–$1.50 / 1,000 credits
  • 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
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}'
python
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"])
FAQ

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.

Already paying for something else?Aqar vs Bright Data

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.

0/4000

No account needed · we reply from [email protected]

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.