Syarah API & Scraper
The Syarah API returns syarah.com, Saudi Arabia's online car marketplace, as clean JSON in eight actions.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
search filters the live stock by free text in Arabic or English, numeric make, model and trim ids, new or used, who owns the car, body style, fuel, gearbox, drivetrain, Saudi or GCC spec, exterior and interior colour, seats, cylinders, engine size, equipment, payment scheme, model-year range, price range in SAR, odometer range and monthly-instalment range, with seven sort orders. Each row carries the listing id and URL, title, the asking price with its currency read back from the source, the price before any discount and the discount itself, the monthly instalment, model year, make, model, trim, condition, kilometres, fuel, gearbox, drivetrain, engine size, both colours, Saudi or GCC spec, the city the car sits in, whether the seller is Syarah itself, a dealer or a private owner, whether it is already reserved, the warranty badge and a five-image preview. detail opens one listing in full: the complete spec card, the equipment list grouped into safety, comfort, technology and exterior, every gallery photo, the financing breakdown, and the date the listing first went live together with how many days it has been on the lot. count answers how many cars match a filter combination in one tiny request. makes, models and filters hand you the site's own vocabulary - 65 makes, 337 models, 23 enum groups and the real bounds of the four numeric ranges - with live stock counts, so you never guess an id. suggest turns a half-typed Arabic or English phrase into terms the text filter actually matches. batch re-checks up to 100 listings in a single request, which is how you watch a price list without calling detail a hundred times. Three things we publish rather than hide: the whole result set is reachable here - a query that reports 109 cars really does hand back 109 unique rows, and page 38 of a 37-page result returns an empty list instead of silently repeating page 37; sorting by newest really is the date the car was first listed, not the day someone bumped the ad, and detail gives you that date; and Syarah accepts no location filter at all, so the city comes back on every row but cannot be pushed into the query. On 2026-10-06, twelve different live searches returned 278 rows with price, currency, year, make, model, condition, fuel, gearbox, drivetrain, colours, spec, city and seller kind filled on 278 of 278, and twelve listings pulled from those rows returned complete detail 12 of 12 with the id, price and odometer identical to the search row that produced them. No Syarah account, no browser - one ReefAPI key and the standard { ok, data, meta, error } envelope.
What is on Syarah right now - and how much of each slice an API call can reach
Measured on 2026-10-06 with the count action, each row against an unfiltered control of 3,674 cars taken in the same run. The right-hand column is the one worth reading: unlike most classifieds sites, Syarah serves its whole result set, so a slice of 1,905 cars really is 1,905 rows of paging.
| Slice | Cars listed | Reachable in one query |
|---|---|---|
| Everything, unfiltered | 3,674 | all 3,674 |
| Dealer stock | 1,905 | all 1,905 |
| Syarah's own inspected stock | 1,769 | all 1,769 |
| Year 2025-2026 | 1,304 | all 1,304 |
| Under 20,000 km | 1,128 | all 1,128 |
| Cash-only listings | 1,218 | all 1,218 |
| Brand new | 796 | all 796 |
| Toyota | 672 | all 672 |
| Under 40,000 SAR | 638 | all 638 |
| Seven-seaters | 496 | all 496 |
| Already reserved | 506 | all 506 |
| GCC spec | 213 | all 213 |
| Manual gearbox | 136 | all 136 |
| Pickups | 109 | all 109 |
| Hybrid | 132 | all 132 |
| Electric | 11 | all 11 |
Checked rather than assumed: a 3,674-car query reports 37 pages of 100, page 37 returns exactly 74 rows, and pages 38 and 999 return an empty list instead of repeating the last page. A full walk of a 109-car query collected 109 unique ids. Every search response still returns total_results and reachable_results so code written against a capped marketplace keeps working unchanged.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/syarah/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"make_id": 4,
"condition": "used",
"sort": "newest",
"max_results": 24
}
}{
"ok": true,
"meta": {
"api": "syarah",
"endpoint": "search",
"mode": "live",
"latency_ms": 396,
"record_count": 24,
"bytes": 118961,
"cache_hit": false,
"completeness_pct": 100,
"stop_reason": "complete",
"charged_credits": 1,
"version": "1.0.0",
"request_id": "621ae7c66f3b46b7",
"queue_ms": 2.3,
"fetched_at": "2026-10-06T14:47:19.309Z"
},
"data": {
"rows": [
{
"id": 319280,
"url": "https://syarah.com/en/cardetail/toyota-corolla-used-319280",
"title": "Toyota Corolla XLI 2024",
"price": 53000,
"price_currency": "SAR",
"price_disagrees": false,
"monthly_installment": 1143,
"discount": null,
"price_before_discount": null,
"year": 2024,
"make": "Toyota",
"model": "Corolla",
"trim": "XLI",
"condition": "used",
"kilometers": 68408,
"kilometers_unit": "Km",
"kilometers_reported": true,
"fuel_type": "Gasoline",
"transmission": "CVT",
"drivetrain": "FWD",
"engine_size": "1.5",
"exterior_color": "White",
"interior_color": "Beige",
"car_origin": "Saudi",
"city": "Riyadh",
"seller_type": "syarah",
"seller_label": "Owned",
"financing_available": true,
"is_booked": false,
"has_tamara": true,
"warranty": "inspected",
"warranty_label": "**Inspected & Guaranteed**",
"tags": [
"Used",
"68,408 KM"
],
"image": "https://cdn.syarah.com/photos-thumbs/online-v1/0x300/online/posts/319280/orignal-319280-1-1791214485.jpg?v=1",
"preview_photos": [
"https://cdn.syarah.com/photos-thumbs/online-v1/0x300/online/posts/319280/orignal-319280-1-1791214485.jpg?v=1",
"https://cdn.syarah.com/photos-thumbs/online-v1/0x300/online/posts/319280/orignal-319280-2-1791214485.jpg?v=1",
"https://cdn.syarah.com/photos-thumbs/online-v1/0x300/online/posts/319280/orignal-319280-4-1791214485.jpg?v=1"
],
"preview_photos_count": 5,
"position": 1
},
{
"id": 319189,
"url": "https://syarah.com/en/cardetail/toyota-fortuner-used-319189",
"title": "Toyota Fortuner VX 2024 دبل",
"price": 116700,
"price_currency": "SAR",
"price_disagrees": false,
"monthly_installment": 2489,
"discount": null,
"price_before_discount": null,
"year": 2024,
"make": "Toyota",
"model": "Fortuner",
"trim": "VX",
"condition": "used",
"kilometers": 38480,
"kilometers_unit": "Km",
"kilometers_reported": true,
"fuel_type": "Gasoline",
"transmission": "Automatic",
"drivetrain": "Double (4x4)",
"engine_size": "4.0",
"exterior_color": "White",
"interior_color": "Camel",
"car_origin": "Saudi",
"city": "Riyadh",
"seller_type": "syarah",
"seller_label": "Owned",
"financing_available": true,
"is_booked": false,
"has_tamara": false,
"warranty": "inspected",
"warranty_label": "**Inspected & Guaranteed**",
"tags": [
"Used",
"38,480 KM",
"Low mileage"
],
"image": "https://cdn.syarah.com/photos-thumbs/online-v1/0x300/online/posts/319189/orignal-1791286603-493_cut.jpg?v=1",
"preview_photos": [
"https://cdn.syarah.com/photos-thumbs/online-v1/0x300/online/posts/319189/orignal-1791286603-493_cut.jpg?v=1",
"https://cdn.syarah.com/photos-thumbs/online-v1/0x300/online/posts/319189/orignal-1791286605-241_cut.jpg?v=1",
"https://cdn.syarah.com/photos-thumbs/online-v1/0x300/online/posts/319189/orignal-1791286607-854_cut.jpg?v=1"
],
"preview_photos_count": 5,
"position": 2
},
{
"id": 319177,
"url": "https://syarah.com/en/cardetail/toyota-camry-used-319177",
"title": "Toyota Camry LE 2023",
"price": 83000,
"price_currency": "SAR",
"price_disagrees": false,
"monthly_installment": 1777,
"discount": null,
"price_before_discount": null,
"year": 2023,
"make": "Toyota",
"model": "Camry",
"trim": "LE",
"condition": "used",
"kilometers": 120259,
"kilometers_unit": "Km",
"kilometers_reported": true,
"fuel_type": "Gasoline",
"transmission": "Automatic",
"drivetrain": "FWD",
"engine_size": "2.5",
"exterior_color": "Silver",
"interior_color": "Beige",
"car_origin": "Saudi",
"city": "Riyadh",
"seller_type": "syarah",
"seller_label": "Owned",
"financing_available": true,
"is_booked": false,
"has_tamara": false,
"warranty": "inspected",
"warranty_label": "**Inspected & Guaranteed**",
"tags": [
"Used",
"120,259 KM"
],
"image": "https://cdn.syarah.com/photos-thumbs/online-v1/0x300/online/posts/319177/orignal-319177-1-1791186612.jpg?v=1",
"preview_photos": [
"https://cdn.syarah.com/photos-thumbs/online-v1/0x300/online/posts/319177/orignal-319177-1-1791186612.jpg?v=1",
"https://cdn.syarah.com/photos-thumbs/online-v1/0x300/online/posts/319177/orignal-319177-2-1791186612.jpg?v=1",
"https://cdn.syarah.com/photos-thumbs/online-v1/0x300/online/posts/319177/orignal-319177-4-1791186612.jpg?v=1"
],
"preview_photos_count": 5,
"position": 3
}
],
"summary": {
"total_results": 567,
"reachable_results": 567,
"last_page": 24,
"page": 1,
"page_size": 24,
"returned": 24,
"has_more": true,
"sort": "newest",
"currency": "SAR",
"filters_applied": {
"condition": "used",
"make_id": 4
},
"deal": {
"id": 124,
"name": "Last Chance 🔥",
"name_en": "Last Chance 🔥",
"name_ar": "Last Chance 🔥"
},
"stop_reason": "complete"
}
}
}What the Syarah API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search Syarah's Saudi car stock by free text (English or Arabic), make, model, trim, condition, seller type, body style, fuel, transmission, drivetrain, origin, colours, seats, cylinders, engine size, payment scheme, model year, price, mileage and monthly instalment, with seven verified sort orders. Every row carries price in SAR, mileage, year, trim, city, seller kind and the photo set. 🔴 Unlike the UAE marketplaces, the FULL result set is reachable here: a measured full walk returned 109 unique rows for a stated 109, and `summary.total_results` / `summary.reachable_results` always say both numbers. | Price-intelligence teams call search to search Syarah's Saudi car stock by free text (English or Arabic), make, model, trim, conditio…. | text, make_id, model_id, trim_id, condition, ... |
| detail | The full record for one listing: the complete spec card (body style, fuel, transmission and gear count, drivetrain, cylinders, engine size and type, seats, doors, key count, both colours with hex codes, origin), the option list grouped by Safety / Comfort / Technology / Exterior, every gallery photo, the financing breakdown, the inspection-report link — and the listing's REAL first-activation date plus how many days it has been on the lot. Takes the numeric id from a `search` row or the listing URL. | Classifieds aggregators call detail to get the full record for one listing. | id, lang |
| count | How many cars match a filter combination, from Syarah's own count — one tiny request, no row parsing. Built for market sizing: combine make, body style, fuel, price band and seller type and read the number back. Also reports whether the whole set is walkable and in how many pages. | Resale and arbitrage tools call count to get how many cars match a filter combination, from Syarah's own count. | text, make_id, model_id, trim_id, condition, ... |
| makes | Every car make Syarah currently lists, with the numeric `make_id` that `search`, `count` and `models` take, the live stock count and the brand logo. 65 makes / 3,674 cars at capture. Accepts the same filters as `search`, so you can ask "which brands have hybrids under 80,000 SAR" in one call. | Lead-generation teams call makes to get every car make Syarah currently lists, with the numeric `make_id` that `search`, `count` and…. | text, make_id, model_id, trim_id, condition, ... |
| models | Every model Syarah lists, with the numeric `model_id` that `search` takes and the parent `make_id` it must be paired with. Omit `make_id` for all 337 models across every brand; pass one to scope it (MG 78 → 8 models). | Price-intelligence teams call models to get every model Syarah lists, with the numeric `model_id` that `search` takes and the parent `mak…. | text, make_id, model_id, trim_id, condition, ... |
| filters | The complete, live filter vocabulary Syarah publishes: every enum (condition, seller type, fuel, transmission, drivetrain, body shape, origin, category, make country, payment scheme, 32 exterior and 24 interior colours with hex codes, cylinders, seats, cabins, 34 engine sizes, makes, models, trims) with its live stock count, and the real bounds of the four numeric ranges (year, price, odometer, monthly instalment) with their source-published units. Read this before building a faceted query instead of guessing ids. | Classifieds aggregators call filters to get the complete, live filter vocabulary Syarah publishes. | text, make_id, model_id, trim_id, condition, ... |
| suggest | Syarah's own type-ahead for a partial query, in English or Arabic. Use it to turn a shopper's half-typed phrase into terms the `text` filter actually matches. 182 bytes a call. | Resale and arbitrage tools call suggest to get syarah's own type-ahead for a partial query, in English or Arabic. | q |
| batch | Up to 100 listings' search-shaped rows in ONE request — the cheap way to re-check prices and availability on a watchlist instead of calling `detail` per car. Returns the same row shape as `search`, plus the ids that no longer exist so a disappeared listing is visible rather than silently missing. | Lead-generation teams call batch to get up to 100 listings' search-shaped rows in ONE request. | ids |
Call search from your stack
curl -X POST https://api.reefapi.com/syarah/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"make_id":4,"condition":"used","sort":"newest","max_results":24}'import requests
r = requests.post(
"https://api.reefapi.com/syarah/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"make_id": 4,
"condition": "used",
"sort": "newest",
"max_results": 24
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/syarah/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"make_id": 4,
"condition": "used",
"sort": "newest",
"max_results": 24
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.syarah.search with {"make_id":4,"condition":"used","sort":"newest","max_results":24}.Who uses this API and why
- Saudi dealer-pricing and residual-value teams call search per make and model to track asking prices in SAR against mileage and model year, then detail for the full spec card.
- Car-buying apps and lead-gen sites call detail on a search row to show the equipment list, the financing breakdown and every photo in their own UI.
- Market-sizing dashboards call count with different filter combinations to measure how much stock exists per brand, body style, fuel and price band in one request each.
- Price-watch and change-tracking jobs call batch with up to 100 listing ids per request to spot price cuts and sold cars, and sort by newest to pick up genuinely new listings.
- Anyone building a Saudi vehicle dataset calls makes, models and filters first to get the numeric ids and the live range bounds the search filters take, instead of guessing names.
Questions developers ask before integrating
Can I search Syarah in Arabic?
Yes, and it works on both language surfaces. A search for تويوتا returned the same 672 Toyotas as the English word toyota, and كامري, لاندكروزر and برادو all resolve through the suggest action. You can also set the response language, which switches the make, model, colour, fuel and gearbox labels to Arabic. One honest note: a few trim names come back in Arabic even on the English surface, because that is how Syarah stores them - we return the stored value rather than inventing a translation.
How many results can one search return?
All of them. This is the unusual part of Syarah compared with other car marketplaces: there is no paging ceiling. A 3,674-car query reports 37 pages of 100, the last page returns exactly 74 rows so the arithmetic closes, and asking for page 38 or page 999 returns an empty list rather than quietly serving page 37 again. A full walk of a 109-car query handed back 109 unique listing ids. Pages are up to 100 rows; Syarah itself refuses more than that and says so.
Is "newest" the date the car was actually listed?
Yes, and it is worth saying because on most classifieds sites it is not. Sorting by newest uses Syarah's own first-activation order: on one measured page, all twelve rows had been listed the previous day, with a lot age of nought or one day, while the site's default order mixed cars that were three to eighty-three days old. The detail call returns that date as listed_at along with days_on_lot. The one limitation: search rows carry no date field - Syarah does not publish one there - so you get the order from search and the date from detail or batch.
What currency are the prices in?
SAR, and the API reads it back out of Syarah's own response on every call instead of writing it in. Price integrity was checked against four independent numbers in the same payload - the search row, the listing's own price block, its analytics record and the schema.org data on the page itself - and all four agreed on ten of ten listings sampled across new, used, GCC-spec, hybrid and 200,000-SAR-plus stock. Two separate fields are returned where a car is discounted: discount is the cut, and price_before_discount is the pre-cut price, so you never have to guess which is which.
Can I filter by city?
No, and we would rather say so than ship a box that does nothing. Syarah accepts no location parameter: every spelling we tried returned the complete unfiltered catalogue. The city is returned on every row, so you can filter it yourself - across 278 measured rows it was Riyadh 141 times, Al Qurayyat 90, Jeddah 40 and Dammam 7. If you mainly want Riyadh, filtering to Syarah's own inspected stock gets you close, since that inventory sits there. Send a city parameter anyway and the response explains why it cannot work.
Does it tell me who is selling the car?
It tells you what kind of seller it is: Syarah itself, a dealer on the platform, or a private owner. Syarah's own inspected inventory was 1,769 of the 3,674 cars and dealer or private stock the other 1,905 - the two add up exactly. Syarah sells centrally rather than putting sellers in touch with buyers, so there is no per-listing phone number or seller profile on the public page, and none is returned.
What does the full detail call give me that search does not?
The spec card, the equipment list, the whole gallery and the listing date. Across twelve listings, detail returned twenty-one to sixty-two individual features grouped into safety, comfort, technology and exterior, and fourteen to thirty-seven photos - against a five-image preview on a search row. It also adds cylinders, engine type, gear count, doors, key count, both colour hex codes, the financing breakdown and the warranty, plus listed_at and days_on_lot. Horsepower, fuel-tank size, gear count and door count only appear on part of the stock, so they are returned where Syarah publishes them and left empty where it does not.
Do the price, mileage and year filters actually work?
Every filter was measured against an unfiltered control of 3,674 cars in the same run, and all twenty bit: under 40,000 SAR cut it to 638, under 20,000 km to 1,128, model year 2025-2026 to 1,304, electric to 11, pickups to 109. One quirk we handle for you: Syarah silently ignores a range that only has one end, so if you send just a maximum price the API supplies the other end itself and tells you it did. One quirk to know about: an instalment range also drops the 1,218 cars that carry no instalment at all.
How do I watch a list of cars for price changes?
Use batch. It takes up to 100 listing ids and returns their current rows in a single request, which was measured working at exactly 100 ids. Ids that Syarah no longer publishes come back in a missing_ids list, so a sold or withdrawn car is visible instead of silently absent from the answer. Compared with calling detail a hundred times it is one request instead of a hundred, and priced accordingly.
What does Syarah not publish?
VIN, service history, previous-owner count, view counts and seller contact details are not on the public listing, so they are not in the response - absent rather than guessed. The listing page does print a VIN field, but it is seventeen zeros on every car, so we do not return it at all. Brand-new cars carry no odometer reading, which the API returns as empty rather than as zero - that was true on ninety-three of ninety-three new rows measured. And cylinders and cabin count, which search rows leave empty on every row, are returned by detail instead.
What is the Syarah API?
Syarah API is a ReefAPI endpoint group for saudi arabia's online car marketplace: used and new stock from syarah's own inspected inventory, dealers and private sellers, priced in sar, searchable in arabic or english. It returns live JSON through POST requests under /syarah/v1.
Is the Syarah API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Syarah calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Syarah login or account?
No login to Syarah 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 Syarah data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.