# Haraj حراج Scraper — Saudi Classifieds Listings Data (`boring_internet_explorer/haraj-scraper`) Actor

Scrape listings from Haraj (haraj.com.sa), Saudi Arabia's largest classifieds platform. Collect structured data from cars, real estate, electronics, jobs, furniture, and 20+ categories including prices, images, location, seller info, and category-specific details.

- **URL**: https://apify.com/boring\_internet\_explorer/haraj-scraper.md
- **Developed by:** [Boring Internet Explorer](https://apify.com/boring_internet_explorer) (community)
- **Categories:** E-commerce, Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Haraj حراج Scraper — Saudi Classifieds Data

Scrapes structured listing data from **Haraj** (`haraj.com.sa`), Saudi Arabia's most popular online classifieds platform founded in 2007. Haraj connects buyers and sellers across the Kingdom and covers a wide range of categories including vehicles, real estate, electronics, livestock, furniture, jobs, and more.

Given a Haraj **tag, search, or detail URL**, the scraper collects listing information and returns structured data including listing identifiers, titles, descriptions, pricing, images, author information, location, and category-specific details such as car specs, real estate registration numbers, and job details.

### Why use this scraper?

Haraj is one of the most active classifieds marketplaces in Saudi Arabia, with hundreds of thousands of listings across all major categories.

Collecting this information manually across thousands of listings is time-consuming. This scraper provides structured listing records that can be used for:

- 🚗 Monitoring vehicle listings, prices, and specs across makes and models.
- 🏠 Tracking real estate listings and REGA-registered advertiser data.
- 💰 Comparing prices across categories, cities, and listing types.
- 📊 Building market intelligence dashboards for Saudi classifieds.
- 🔍 Collecting detailed listing descriptions and seller information.
- 🖼️ Building search and comparison tools with listing images.
- 📈 Tracking listing activity, upvotes, and engagement over time.
- 💼 Collecting job listings and employment market data.
- 🤖 Powering analytics, enrichment pipelines, and AI applications.
- 📦 Conducting Saudi e-commerce and marketplace research.

### Supported URL types

The scraper supports three types of Haraj URLs:

| Type                    | Example                                                                         |
| ----------------------- | ------------------------------------------------------------------------------- |
| Tag listing             | `https://haraj.com.sa/tags/تويوتا`                                              |
| Tag listing with filter | `https://haraj.com.sa/tags/حراج السيارات/filters/carBodyType-سيدان`             |
| Search                  | `https://haraj.com.sa/search/ipad`                                              |
| Search with filters     | `https://haraj.com.sa/search/ss/city/الرياض?tag=حراج+السيارات&duringdate=1days` |
| Detail                  | `https://haraj.com.sa/11186154368/ايفون_17_برو/`                                |

### Input fields

| Field                | Type   | Description                                  |
| -------------------- | ------ | -------------------------------------------- |
| `startUrls`          | array  | Haraj tag, search, or detail URLs to scrape. |
| `maxItems`           | number | Maximum number of listings to scrape.        |
| `proxyConfiguration` | object | Optional proxy settings.                     |

### Example input

```json
{
  "startUrls": [
    {
      "url": "https://haraj.com.sa/tags/%D8%AD%D8%B1%D8%A7%D8%AC%20%D8%A7%D9%84%D8%B3%D9%8A%D8%A7%D8%B1%D8%A7%D8%AA/filters/carBodyType-%D8%A7%D8%B3%20%D9%8A%D9%88%20%D9%81%D9%8A"
    }
  ],
  "maxItems": 5
}
```

### Output

Each scraped listing is stored as one record in the dataset.

### Example output

```json
{
  "scrapedAt": "2026-08-10T19:02:38.099Z",
  "id": 186170782,
  "url": "https://haraj.com.sa/11186170782/VXR_لاندكروزر_V8/",
  "title": "VXR لاندكروزر V8",
  "postedAt": "2026-08-10T19:01:25.000Z",
  "postedAgo": "1 minute ago",
  "updatedAt": "2026-08-10T19:01:25.000Z",
  "updatedAgo": "1 minute ago",
  "status": true,
  "postType": "AD",
  "author": {
    "id": 14942662,
    "url": "https://haraj.com.sa/users/عبدالله سعد العسيم الدوسري",
    "name": "عبدالله سعد العسيم الدوسري"
  },
  "description": {
    "text": "الموتر 8 سلندر فيه هدروليك من الوكاله...",
    "html": null
  },
  "images": ["https://mimg6cdn.haraj.com.sa/userfiles30/2026-08-10/1800x1350_08698C42.jpg"],
  "location": {
    "city": "الرياض",
    "geoCity": "الرياض",
    "neighborhood": "عكاظ",
    "geoHash": "th35qq"
  },
  "tags": ["حراج السيارات", "تويوتا", "لاندكروزر", "لاندكروزر 1999"],
  "filters": [],
  "isPromoted": false,
  "commentCount": 0,
  "upvotes": 0,
  "downvotes": 0,
  "price": {
    "display": "28,000",
    "value": "28000"
  },
  "attributes": null,
  "car": {
    "saleType": "SELL",
    "is4WD": true,
    "year": 1999,
    "mileageKm": 280,
    "fuelType": "GASOLINE",
    "transmission": "AUTO",
    "condition": "USED",
    "vehicleType": "CAR",
    "bank": null
  },
  "realEstate": null,
  "job": null,
  "notes": [],
  "buyButton": null
}
```

### Field reference

| Field                                | Description                                                      |
| ------------------------------------ | ---------------------------------------------------------------- |
| `scrapedAt`                          | Timestamp of when the listing was scraped.                       |
| `id`                                 | Unique Haraj listing identifier.                                 |
| `url`                                | Full listing page URL.                                           |
| `title`                              | Listing title.                                                   |
| `postedAt`                           | ISO 8601 timestamp of when the listing was posted.               |
| `postedAgo`                          | Human-readable relative post time, such as `"52 minutes ago"`.   |
| `updatedAt`                          | ISO 8601 timestamp of the last listing update.                   |
| `updatedAgo`                         | Human-readable relative update time.                             |
| `status`                             | Whether the listing is active.                                   |
| `postType`                           | Listing type, such as `AD`.                                      |
| `author.id`                          | Seller's Haraj user ID.                                          |
| `author.url`                         | Seller's profile URL.                                            |
| `author.name`                        | Seller's username.                                               |
| `description.text`                   | Plain text listing description.                                  |
| `description.html`                   | HTML listing description, when available.                        |
| `images`                             | All listing image URLs.                                          |
| `location.city`                      | Listing city.                                                    |
| `location.geoCity`                   | Resolved city name from geolocation.                             |
| `location.neighborhood`              | Neighborhood name, when available.                               |
| `location.geoHash`                   | Geohash of the listing location.                                 |
| `tags`                               | Haraj category tags applied to the listing.                      |
| `filters`                            | Active filter values applied to the listing.                     |
| `isPromoted`                         | Whether the listing is promoted.                                 |
| `commentCount`                       | Number of comments on the listing.                               |
| `upvotes`                            | Number of upvotes.                                               |
| `downvotes`                          | Number of downvotes.                                             |
| `price.display`                      | Formatted price string, such as `"28,000"`.                      |
| `price.value`                        | Raw price value as a string.                                     |
| `attributes`                         | Key-value listing attributes, when available.                    |
| `car.saleType`                       | Whether the vehicle is for sale or transfer (`SELL` / `WAIVER`). |
| `car.is4WD`                          | Whether the vehicle has four-wheel drive.                        |
| `car.year`                           | Vehicle model year.                                              |
| `car.mileageKm`                      | Vehicle mileage in thousands of kilometres.                      |
| `car.fuelType`                       | Fuel type, such as `GASOLINE` or `DIESEL`.                       |
| `car.transmission`                   | Transmission type, such as `AUTO` or `MANUAL`.                   |
| `car.condition`                      | Vehicle condition, such as `USED` or `NEW`.                      |
| `car.vehicleType`                    | Vehicle type, such as `CAR` or `TRUCK`.                          |
| `car.bank`                           | Bank financing option, when available.                           |
| `realEstate.regaAdvertiserNumber`    | REGA advertiser registration number.                             |
| `realEstate.regaAuthorizationNumber` | REGA authorization number.                                       |
| `job.offerType`                      | Job offer type.                                                  |
| `job.experienceLevel`                | Required experience level.                                       |
| `job.contractType`                   | Contract type, such as full-time or part-time.                   |
| `job.qualification`                  | Required qualification.                                          |
| `job.commercialRegisterNumber`       | Employer's commercial register number.                           |
| `notes`                              | Platform safety and payment notes attached to the listing.       |
| `buyButton.link`                     | Buy button URL, when available.                                  |
| `buyButton.storeName`                | Store name associated with the buy button.                       |
| `buyButton.wasataEnabled`            | Whether Wasata service is available.                             |
| `buyButton.makeOfferEnabled`         | Whether make-offer is enabled.                                   |

### ❓ FAQ

**What types of URLs can I provide?**

The scraper supports tag listing, search, and detail URLs.

- Tag: `https://haraj.com.sa/tags/تويوتا`
- Tag with filter: `https://haraj.com.sa/tags/حراج السيارات/filters/carBodyType-سيدان`
- Search: `https://haraj.com.sa/search/ipad`
- Search with filters: `https://haraj.com.sa/search/ss/city/الرياض?tag=حراج+السيارات&duringdate=1days`
- Detail: `https://haraj.com.sa/11186154368/ايفون_17_برو/`

**Can I filter by city or date range?**

Yes. Use a search URL with city and date filter parameters. For example, appending `?duringdate=1days` limits results to the past 24 hours, and `/city/الرياض` limits results to Riyadh.

**Can I scrape a specific listing?**

Yes. Provide a detail URL to scrape a single listing by ID.

**How many listings can I scrape?**

Use `maxItems` to limit the number of listings returned. For example, `maxItems: 10` limits the run to ten listings.

**What category-specific data is available?**

The scraper returns structured data for vehicles (`car`), real estate (`realEstate`), and jobs (`job`) when the listing belongs to those categories. All other listings return these fields as `null`.

***

### 🔗 Want More Data in the Gulf Market?

#### If you found this scraper useful, check out our other scrapers:

[Soum سوم Product Scraper - Extract soum.sa Product Data](https://apify.com/boring_internet_explorer/soum-scraper) - Scrape detailed product data from soum.sa, Saudi Arabia’s marketplace for new and used products. Extract product IDs, brands, models, specifications, condition, pricing, and images.

[eXtra - اكسترا Product Scraper](https://apify.com/boring_internet_explorer/extra-scraper) — Extract product data from extra.com — prices, discounts, stock availability, brands, images, model numbers, ratings, and category breadcrumbs — across Saudi Arabia, Oman, and Bahrain in both English and Arabic.

[🥷🏽 Ninja نينجا Product Scraper](https://apify.com/boring_internet_explorer/ninja-product-scraper) — Extract product data from ananinja.com — prices, stock availability, brands, images, product IDs, and category for groceries, pharmacy, beauty, and household products across Saudi Arabia, Bahrain, Qatar, and Kuwait.

[Jarir جرير Product Scraper](https://apify.com/boring_internet_explorer/jarir-scraper) — Scrape product data from jarir.com, the GCC's leading retailer for electronics, books, and office supplies — pricing, stock, brand, images, and categories across all 5 storefronts (KSA, UAE, Qatar, Bahrain, Kuwait).

[Soum Product Scraper](https://apify.com/boring_internet_explorer/soum-scraper) — Scrapes structured product data from soum.sa, a Saudi marketplace for buying and selling new and used electronics, phones, laptops, tablets, gaming products, and cars.

[Saudi Companies Directory Scraper](https://apify.com/boring_internet_explorer/saudi-companies-ecosystem-scraper) — Scrapes structured directory data from ecosystemsa.com — Saudi Arabia's business ecosystem directory covering VCs, angel groups, accelerators, incubators, and startups.

[Saudi Companies Scraper — 19K+ Companies](https://apify.com/boring_internet_explorer/companies-scraper) — Extract 19,000+ Saudi and Arab company profiles with contacts, industries, funding stage, and Arabic and English fields.

***

### 🛠️ Need a custom extension?

Need this scraper adapted to your use case — extra fields, additional filters, a different output format, or a new category? Just reach out to us by email and we'll be happy to help.

# Actor input Schema

## `startUrls` (type: `array`):

URLs to scrape

## `maxItems` (type: `integer`):

The maximum number of items to fetch

## `proxyConfiguration` (type: `object`):

Your proxy configuration from Apify

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://haraj.com.sa/tags/%D8%AD%D8%B1%D8%A7%D8%AC%20%D8%A7%D9%84%D8%B3%D9%8A%D8%A7%D8%B1%D8%A7%D8%AA/filters/carBodyType-%D8%A7%D8%B3%20%D9%8A%D9%88%20%D9%81%D9%8A"
    }
  ],
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://haraj.com.sa/tags/%D8%AD%D8%B1%D8%A7%D8%AC%20%D8%A7%D9%84%D8%B3%D9%8A%D8%A7%D8%B1%D8%A7%D8%AA/filters/carBodyType-%D8%A7%D8%B3%20%D9%8A%D9%88%20%D9%81%D9%8A"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boring_internet_explorer/haraj-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": [{ "url": "https://haraj.com.sa/tags/%D8%AD%D8%B1%D8%A7%D8%AC%20%D8%A7%D9%84%D8%B3%D9%8A%D8%A7%D8%B1%D8%A7%D8%AA/filters/carBodyType-%D8%A7%D8%B3%20%D9%8A%D9%88%20%D9%81%D9%8A" }] }

# Run the Actor and wait for it to finish
run = client.actor("boring_internet_explorer/haraj-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://haraj.com.sa/tags/%D8%AD%D8%B1%D8%A7%D8%AC%20%D8%A7%D9%84%D8%B3%D9%8A%D8%A7%D8%B1%D8%A7%D8%AA/filters/carBodyType-%D8%A7%D8%B3%20%D9%8A%D9%88%20%D9%81%D9%8A"
    }
  ]
}' |
apify call boring_internet_explorer/haraj-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,boring_internet_explorer/haraj-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/iZgNGIo1CiPFld1Im/builds/q5isSIAeZiXZp6AHv/openapi.json
