Skip to content
    ↑↓ to choose · Enter to open

    · 17 min read

    Haraj Scraper: Up to 1,000 Free Results a Month (2026)

    By CrawlerBros Engineering Team

    A thousand listings from Haraj (haraj.com.sa) costs $5.00 on the free plan. This Actor collects detailed listings including price in SAR, city, description, images, and the posted date. You can search by keyword, browse by category/city, look up listings by ID, pull a seller's listings, or fetch trending keywords. This Actor is suited for market researchers and analysts, but not for anyone who needs to scrape job listings directly from Haraj's dedicated jobs section, as that area is powered by a separate service not accessible through the public API used here.

    Try it before you read further. Apify's free plan includes $5.00 of usage every month with no credit card, enough for up to 1,000 results at $0.005 each before platform usage. Open Haraj Scraper on Apify and run the prefilled example.

    How reliable is Haraj Scraper in production?

    Across the last 30 days of public runs on the Apify platform, Haraj Scraper recorded 66 runs with the following outcomes.

    Outcome Runs Share
    Succeeded 66 100.0%
    Failed 0 0.0%
    Aborted by the user 0 0.0%
    Timed out 0 0.0%
    Total 66 100.0%

    No run failed or timed out in the last 30 days. Keep a retry and an alert on scheduled runs all the same: a clean month is a record, not a guarantee.

    What does it cost to run Haraj Scraper?

    Each result costs $0.005 on Apify's free plan, which is $5.00 per 1,000 results. Starting a run is charged separately at $0.005 per GB of Actor memory. Apify also bills the platform usage each run consumes, at the rates of your Apify plan, on top of these charges.

    Apify plan Per result Per 1,000 results
    FREE $0.005 $5.00
    BRONZE $0.00433 $4.33
    SILVER $0.00367 $3.67
    GOLD $0.003 $3.00
    PLATINUM $0.003 $3.00
    DIAMOND $0.003 $3.00

    Worked example: collecting 10,000 results costs $50.00 in result charges before run-start fees and platform usage. No run failed or timed out in the last 30 days, so the list price is a fair budget; keep a retry in place all the same.

    The number of results collected is the primary cost driver. Each result is charged, so the maxItems input control has the largest effect on your bill. To find out whether this Actor answers your question before committing to larger costs, try a run with maxItems set to a small value, like 30, and review the output.

    How do you run Haraj Scraper from the API?

    The schema marks 1 of its 20 controls as required: mode. Every value in the payload below comes from the published schema's own prefills, which means you can paste it, swap the token, and get a real result.

    Call the synchronous endpoint to start a run and receive dataset items in one request:

    curl -X POST "https://api.apify.com/v2/acts/crawlerbros~haraj-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"mode":"search","searchQuery":"ايفون","subTag":"","neighborhood":""}'
    

    The same run from Python, using the official client:

    from apify_client import ApifyClient
    
    client = ApifyClient("<YOUR_APIFY_TOKEN>")
    
    run_input = {
      "mode": "search",
      "searchQuery": "ايفون",
      "subTag": "",
      "neighborhood": ""
    }
    
    run = client.actor("crawlerbros~haraj-scraper").call(run_input=run_input)
    
    for item in client.dataset(run["defaultDatasetId"]).iterate_items():
        print(item)
    

    And from Node.js:

    import { ApifyClient } from 'apify-client'
    
    const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })
    
    const input = {
      "mode": "search",
      "searchQuery": "ايفون",
      "subTag": "",
      "neighborhood": ""
    }
    
    const run = await client.actor('crawlerbros~haraj-scraper').call(input)
    const { items } = await client.dataset(run.defaultDatasetId).listItems()
    console.log(items)
    

    That endpoint blocks until the run completes. Fine while you are testing a handful of records, risky once a run takes minutes: a dropped connection loses the response even though the run itself finished. Switch to an asynchronous start with polling or a webhook before you schedule anything.

    Which Haraj Scraper inputs matter, and which can you skip?

    The mode control is required and defines the type of data to retrieve. For broad searches, set mode to search or browse and use searchQuery for keywords or category and city for filtered browsing. For initial runs, you can leave advanced filtering controls such as subTag or carBodyType at their default values.

    • mode (string): What to fetch. Default: "search".
    • searchQuery (string): Free-text keyword search, in Arabic or English (mode=search). Required for this mode.
    • subTag (string): Narrower than category - a specific brand or model tag from Haraj's own hierarchical tag tree, e.g. تويوتا (Toyota), كامري (Camry), ايفون (iPhone) (mode=search, browse). Confirmed via live probing that Haraj's finer tags filter correctly server-side, but the full tag tree runs into the thousands (every brand/model/variant across every category) so it isn't a stable curated dropdown - enter the exact tag text, e.g. copied from a listing's own categories[] output field. When set, this takes priority over category for narrowing (only one tag value can be sent upstream at a time) - category/excludeCategory still apply as an extra check afterwards.
    • neighborhood (string): Restrict results to an exact match of Haraj's finer town/neighborhood-level location tag (the geoCity output field) - e.g. الدرعية (Diriyah) or الخبر (Al Khobar). More granular than city/cities (which match the broader region/city) and combines with them as an AND - a listing must match both when both are set. Free-text because Haraj's neighborhood/town list runs into the hundreds and isn't a stable curated set - enter the exact value from a listing's own geoCity output field to filter by it precisely (mode=search, browse, byAuthor).
    • category (string): Restrict results to a Haraj top-level category (mode=search, browse). Leave as "(any category)" for no category filter. Default: "".
    • city (string): Restrict results to a Saudi city/region (or Kuwait, UAE, Bahrain) (mode=search, browse). Leave as "(any city)" for no city filter. Default: "".
    • carBodyType (string): Restrict results to a specific car body style (mode=search, browse). Haraj's own frontend uses this exact 12-value vocabulary as a hidden filter axis, distinct from subTag's brand/model tags - confirmed via live probing that each value reliably narrows to the correct body style server-side. Since only one tag value can be sent upstream at a time, this takes priority over subTag/category for that slot when set (both still apply as extra client-side checks afterwards). Leave as "(any body type)" for no filter. Default: "".
    • cities (array): Restrict results to any of several Saudi cities/regions (or Kuwait, UAE, Bahrain) in one request - a listing matching ANY selected city passes (mode=search, browse). Combines with city above (both are OR'd together) if both are set. Leave empty for no multi-city filter. Default: [].
    • excludeCategory (string): Drop results from this category, even if they match other filters (mode=search, browse). Default: "".
    • postIds (array): Haraj numeric listing IDs or full listing URLs, e.g. 186610241 or https://haraj.com.sa/11186610241/.... Required for this mode. Default: [].
    • authorUsername (string): Exact Haraj seller username, e.g. معرض رائد علي القحطاني. Required for this mode.
    • includeSimilarListings (boolean): For each resolved listing, attach a similarListings[] array of related Haraj listings (id, title, url, priceSAR, thumbnailUrl, city) using Haraj's own "related items" lookup. Adds one extra request per listing ID, so only available for mode=byId. Default: false.

    The other 8 controls, with their defaults, are listed in the input schema on Haraj Scraper on Apify.

    Fixed-choice controls: mode accepts search (Search by keyword), browse (Browse by category / city / latest), byId (Lookup listings by ID or URL), byAuthor (All listings from a seller), trending (Trending search keywords (no listings)); category accepts 21 values (default ""), including "" ((any category)), حراج السيارات (Cars), حراج الأجهزة (Electronics & Devices), حراج العقار (Real Estate); city accepts 22 values (default ""), including "" ((any city)), الرياض (Riyadh), الشرقيه (Eastern Province), جده (Jeddah); carBodyType accepts 13 values (default ""), including "" ((any body type)), سيدان صغيرة (Small sedan), سيدان (Sedan), سيدان فاخرة (Luxury sedan); excludeCategory accepts 21 values (default ""), including "" ((none)), حراج السيارات (Cars), حراج الأجهزة (Electronics & Devices), حراج العقار (Real Estate).

    What does Haraj Scraper return?

    The returned listing records include priceSAR, images[], description, authorUsername, and postedDate. The priceSAR field is omitted when the seller has not specified a price. Job listings found through keyword searches or from a seller's other listings will include a job object, but Haraj's dedicated jobs section is not directly covered.

    Output per listing

    • id - Haraj numeric listing ID
    • title, description
    • priceSAR - price in Saudi Riyal (omitted when the seller didn't state a price)
    • category - the listing's most specific category tag
    • categories[] - full list of category/brand/model tags Haraj assigned to the listing
    • city, geoCity, geoNeighborhood, geoHash - region, city/town, neighborhood, and a geohash for the listing's approximate coordinates
    • images[], thumbnailUrl
    • url - canonical listing URL
    • authorUsername, authorId - seller / store name and Haraj's numeric account ID (useful for disambiguating sellers who share a display name)
    • postedDate, updatedDate - ISO 8601 UTC (updatedDate only present when different from postedDate - e.g. the seller renewed/bumped the ad)
    • hasImage, hasVideo, isPromoted, commentCount
    • upvotes, downvotes - Haraj's community "helpful / not helpful" feedback counts on the listing (0 is a real "no votes yet" value, not a missing one)
    • car - for vehicle listings: listingType, is4WheelDrive, modelYear, mileageKm, fuelType, transmission, condition, vehicleType, bank
    • realEstate - for property listings: regaAdvertiserRegistrationNumber, regaAuthorizationNumber
    • job - for job listings (when reachable via search/byId/byAuthor): offerType, experienceLevel, contractType, qualification, commercialRegisterNumber
    • specs - key/value attributes Haraj extracted for the item (e.g. laptop brand, RAM size, screen size)
    • similarListings[] - only when mode=byId and includeSimilarListings=true: related listings (id, title, url, priceSAR, thumbnailUrl, city)
    • recordType - listing / carListing / realEstateListing / jobListing, scrapedAt

    Output for mode=trending

    • keyword - the trending search term
    • score - Haraj's relevance/popularity score for the keyword over the requested window (0-1 range observed)
    • rangeInDays - the window that was requested
    • recordType - trendingKeyword, scrapedAt

    These are the documented fields. Optional ones can be empty on a given record, so measure how often each field your deliverable depends on is populated across a real sample before automating the handoff.

    How do you build the workflow end to end?

    Open Haraj Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.

    1. Set the "mode" input to "search" or "browse" depending on whether you are using keywords or categories. Specify your "city" and "category" filters and a relevant "maxItems" cap (start with 30) before running.
    2. Inspect the first few records to ensure that the priceSAR field is present and correctly formatted for your needs.
    3. If priceSAR is often missing, consider adjusting your criteria or accepting listings without a stated price, as Haraj permits sellers to post without one.
    4. When collecting a large volume of data, split your requests by category or city to prevent hitting Haraj's pagination limits on broad queries.
    5. For mode="byId" or mode="byAuthor", verify that the similarListings[] array is populated if you enabled includeSimilarListings.
    6. After widening your queries, check that the recordType field correctly distinguishes between listing, carListing, realEstateListing, and jobListing as expected.
    7. If fetching trending keywords, ensure the score and rangeInDays fields are present for each trendingKeyword record.
    8. Review postedDate and updatedDate to understand listing recency, especially when monitoring new or frequently bumped listings.

    How do you apply it? Three worked playbooks

    These are Haraj Scraper's own documented use cases, each worked through as an operating pattern rather than a description.

    Use case 1: Price intelligence

    Outcome: Track asking prices for cars, phones, or real estate across Saudi cities

    Configure: Set "mode" to "search" or "browse". Define a "category" (e.g., "حراج السيارات") and specific "cities" or a single "city" (e.g., "جده"). Use priceMin and priceMax for targeted analysis, and set sortBy to "newestPosted".

    Working method: Start by running the Actor for a single city and category, filtering for a specific price range. Review the priceSAR field for consistency. Expand to multiple cities or broader price ranges, then compare price distributions across different geographic areas or categories over time.

    Deliverable: A dataset of classifieds listings with priceSAR, category, and city fields for comparative analysis.

    Stop condition: Records appear with priceSAR missing unexpectedly for items that typically have prices, or city values are inconsistent with input filters.

    Use case 2: Real estate analytics

    Outcome: Pull REGA-licensed property listings with registration details

    Configure: Set "mode" to "search" or "browse". Set "category" to "حراج العقار" (Real Estate). Optionally filter by city or neighborhood for specific regions, and enable onlyWithImage.

    Working method: Begin by browsing real estate listings in a single large city. Check that the realEstate.regaAdvertiserRegistrationNumber and realEstate.regaAuthorizationNumber fields are populated as expected. Expand your collection to include multiple cities and neighborhoods, monitoring the presence and validity of these registration details for compliance analysis.

    Deliverable: A dataset of real estate listings including REGA registration numbers, property type, and location details.

    Stop condition: Real estate listings are returned without the realEstate.regaAdvertiserRegistrationNumber field when expected, or location fields like geoCity are null for populated records.

    Use case 3: Lead generation

    Outcome: Monitor new listings in a specific category or city as they're posted

    Configure: Set "mode" to "browse", and specify a category (e.g., "اثاث" for Furniture) or city. Set sortBy to "newestPosted" and maxItems to a low number like 30.

    Working method: Schedule a run for your target category and city to execute frequently, using the "newestPosted" sort order. Compare the id field of newly returned records against previously collected IDs to identify truly new listings. Implement a system to alert you to new id values that appear in successive runs.

    Deliverable: A continuously updated feed of new classifieds listings, highlighting recently posted items in target categories or cities.

    Stop condition: Runs consistently return the same set of id values, indicating no new listings are being detected, or the postedDate does not reflect the "newest posted" sort order.

    What breaks, and how do you design around it?

    • Over the last 30 days, 0.0% of public runs failed and 0.0% timed out. Build retries and alerting around those rates rather than assuming every run completes.

    Haraj's pagination for search and browse requests exposes a finite window of unique listings before repeating. When this plateau is reached, the run stops, even if below the maxItems cap. For trending keywords, the trendingRangeDays input is limited to 1 to 14 days, as Haraj's public endpoint only provides data within this range.

    When should you not use Haraj Scraper?

    Do not use Haraj Scraper if your primary need is to collect comprehensive details for job listings directly from Haraj's dedicated jobs section. Haraj's Jobs section is powered by a separate service that isn't reachable through the same public search/browse API used for the rest of the site, so it isn't included in the category dropdown. A better alternative for job market data across the region would be to look for specialized job board scrapers or official APIs from dedicated recruitment platforms. This Actor is also not ideal if you are focused on classifieds markets outside Saudi Arabia, Kuwait, UAE, or Bahrain. For example, to scrape classifieds in Cyprus, consider using the Bazaraki Cyprus Classifieds Scraper.

    What should you check before trusting the output?

    • Check that priceSAR is never present with a value of 0, as Haraj omits the field when no price is stated; if 0 appears, it indicates a malformed record.
    • Validate that category and categories[] consistently reflect the listing's classification; inconsistencies might point to unexpected tagging by sellers.
    • For car listings, ensure that car.modelYear and car.mileageKm are numeric and within expected ranges for the vehicle type.
    • Confirm that geoCity and geoNeighborhood accurately map to the intended geographical areas, especially when using these as filters.
    • If collecting images, verify that images[] contains valid URLs and thumbnailUrl is present for each listing.
    • When tracking sellers, cross-reference authorUsername and authorId to confirm unique sellers and prevent data merging issues from display name collisions.

    None of this proves a record is correct. It gives a scheduled Haraj Scraper run defined points where it should stop instead of quietly passing bad data downstream.

    Frequently asked questions

    What is the cost of using Haraj Scraper?

    On Apify's free plan, the Haraj Scraper costs $0.005 per result, which amounts to $5.00 for every 1,000 results. Apify's free plan includes $5.00 of monthly prepaid platform usage and requires no credit card, which covers up to 1,000 results of this Actor before run-start charges.

    Why is priceSAR sometimes missing from the output?

    Haraj lets sellers post listings without stating a price. When a price is not stated by the seller, the priceSAR field is omitted from the Actor's output, rather than returning a placeholder value like zero. This ensures that only explicitly provided prices are included.

    What's the difference between the search and browse modes?

    The search mode allows you to query listings using a free-text keyword, optionally narrowing results by category, city, or price. The browse mode returns listings for a category and/or city, or the site-wide latest feed if neither is set, without requiring a keyword.

    How can I get trending keywords instead of listings?

    To get trending keywords, set the mode input to "trending". This returns Haraj's own site-wide trending-search-keywords feed, indicating what people are searching for over the last trendingRangeDays days. You can specify the trendingRangeDays to define the trailing window, from 1 to 14 days. This mode returns keyword and score fields, not actual listings.

    Will maxItems always return the exact number of results I specify?

    Not always. Haraj's own pagination only exposes a finite window of unique listings for a given search or browse request before it starts repeating already-seen listings. When a run hits this plateau it stops rather than looping forever, and reports the actual delivered count versus the requested maxItems in the run's status message.

    Where to go next

    When you are ready to run it, open Haraj Scraper on Apify; the free plan covers up to 1,000 results a month.

    Start with the Haraj Scraper Actor page for the current input schema, pricing tier, and run history.

    Other Actors we maintain for related data:

    • Bazaraki Cyprus Classifieds Scraper: Scrape Bazaraki.com - Cyprus's largest classifieds marketplace with real estate, cars, jobs, electronics and general items.
    • Bazos.cz / Bazos.sk / Bazos.at / Bazos.pl Scraper: Search the Bazos classifieds marketplace across CZ (bazos.cz), SK (bazos.sk), AT (bazos.at), and PL (bazos.pl) by keyword.
    • Cartlow Scraper: Scrape Cartlow - Middle East's digital marketplace for gift cards, gaming credits, and entertainment vouchers.
    • Barnstormers Aircraft Classifieds Scraper: Scrape aircraft and aircraft-parts classified listings from barnstormers.com - search by keyword/make/model, browse by real site category, view recent listings, or pull all ads from one seller.
    • ClassicCars.com Scraper: Scrape ClassicCars.com listings - collector, classic, and muscle car classifieds.
    • Patch Scraper: Scrape Patch.com hyperlocal US news, local events, and classifieds.
    • OLX Global Scraper: Scrape OLX classified-ad listings across 24 countries (Poland, Ukraine, Brazil, India, Pakistan, Indonesia, Argentina, Türkiye, Portugal, ...).
    • Tradera Scraper: Scrape Tradera.com - Sweden's largest second-hand marketplace with millions of auction and buy-now listings.

    Related guides:

    Resources

    • Actor documentation, input schema, and pricing: verified against the published Actor on 2026-09-29.

    • Actor last updated by its maintainers on 2026-08-18.

    • Run outcome figures cover the 30 day public window ending 2026-09-29.

    • Haraj Scraper on Apify

    Featured actors

    Haraj Scraper

    Scrape Haraj (haraj.com.sa) - Saudi Arabia's largest classifieds marketplace. Search by keyword, browse by category/city, look up listings by ID, pull a seller's listings, or fetch trending keywords. Get price (SAR), city, description, images, posted date.

    Run on Apify ↗