Haraj Classifieds Scraper avatar

Haraj Classifieds Scraper

Pricing

from $0.56 / 1,000 results

Go to Apify Store
Haraj Classifieds Scraper

Haraj Classifieds Scraper

Saudi classifieds from Haraj: cars, real estate, jobs and general goods by category tag, city or seller. Every row is fully detailed — description, all images, precise location, and category-specific fields (price, car/property/job info).

Pricing

from $0.56 / 1,000 results

Rating

0.0

(0)

Developer

Ibnu Adzim

Ibnu Adzim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Scrapes classified ads from Haraj, Saudi Arabia's largest general classifieds marketplace: cars, real estate, jobs and general goods. Search by category tag, region or seller — or fetch specific ads directly by id.


What you get

One POST row per ad, plus a SEARCH_SUMMARY row per query.

Every row is already complete — unlike almost every other actor in this portfolio, there is no separate "detail pass": the same fields (full description, every image, exact location, category-specific data) come back whether the ad was found via a tag/city search or fetched directly by id.

id · title · bodyTEXT (full ad text) · imagesList (every photo, full-resolution CDN URLs) · city / geoCity / geoNeighborhood · tags (the ad's full category/brand/model breadcrumb) · authorUsername · postDateISO / updateDateISO · URL · carInfo (model year, mileage, fuel, gear, condition — for vehicle ads) · realEstateInfo · jobsInfo · price (often null — see below) · commentCount · isPromoted · and more, passed through verbatim from the site's own API.


Input

{
"queries": [
{ "tag": "تويوتا", "city": "الرياض" }
],
"postIds": [186515219],
"maxItemsPerQuery": 40
}

Each queries entry needs at least one of tag, city, cities, or authorUsername. postIds fetches specific ads directly, no search needed.

tag is Haraj's own taxonomy, free text, no enum

Examples: حراج السيارات (cars), تويوتا (Toyota), كامري (Camry), شقق للايجار (apartments for rent). There are many thousands of tags (every brand/model/year combination, every product category) and no lookup endpoint to enumerate them from — but an unrecognised tag is honest: it returns a genuinely empty result, never a silent fallback to the whole site.

city filters by REGION, not the city you'd expect — read this first

This is the one thing on this target that will surprise you. Despite the name, city/cities filter by Saudi Arabia's 13 administrative regions, not individual municipalities:

city: "جدة" (Jeddah, a city) -> 0 results
city: "مكة المكرمة" (Makkah, the region Jeddah belongs to) -> real results

All 13 verified working region names: الرياض (Riyadh), مكة المكرمة (Makkah), المدينة المنورة (Madinah), الشرقية (Eastern Province), القصيم (Qassim), عسير (Asir), تبوك (Tabuk), حائل (Hail), جازان (Jazan), نجران (Najran), الباحة (Al-Bahah), الجوف (Al-Jouf), الحدود الشمالية (Northern Borders). The output row's own city field carries the same region-level granularity; geoCity and geoNeighborhood on each row are the actual municipality/district — real per-ad location detail, just not something you can filter a query by.


Known limits

1. price is often null even on formally-licensed listings. One REGA-registered real-estate agency's listing had price: null and realEstateInfo: null while spelling out the exact rent price and every property attribute as plain text inside bodyTEXT (a standard Saudi real-estate disclosure block). Normal seller behaviour on this marketplace, not missing data — the actual figures are usually in bodyTEXT when the structured fields are empty.

2. No total-count field exists anywhere in this API. SEARCH_SUMMARY reports postsReturned and hasMoreAvailable (a genuine boolean the API provides), never a totalMatches — there is nothing upstream to report one from.

3. limit silently clamps above 60. Values 1-60 behave linearly; 61 and above drop to a fixed ~20 items with no error. This actor never sends more than 60, so it isn't something you'll hit through normal use.


Anti-bot posture

None observed. 8/8 TLS profiles clean on the GraphQL endpoint; ten rapid sequential requests all answered 200 with no rate-limit response. The actor still ships a rotating profile pool, a retry ladder and challenge-marker detection, and paces requests by default.

Policy

haraj.com.sa/robots.txt (User-agent: *) names no ClaudeBot/anthropic-ai/GPTBot group and does not disallow anything this actor touches. graphql.haraj.com.sa (the API host) serves no robots.txt at all.