# OpenSooq Scraper — Middle East Classified Ads & Prices (`logiover/opensooq-mena-marketplace-scraper`) Actor

Scrape OpenSooq, the largest classified ads marketplace in the Middle East. Extract title and attribute summary, price and currency, city and neighbourhood, category, seller name and rating, verification level and photo count across Jordan, Saudi Arabia, the UAE, Egypt and more.

- **URL**: https://apify.com/logiover/opensooq-mena-marketplace-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## OpenSooq Scraper — Middle East Classified Ads & Prices

The Middle East's largest classified ads marketplace in rows: title and attribute summary, price and currency, city and neighbourhood, category, seller name, rating and verification level — across eighteen Arab country sites.

### What does the OpenSooq Scraper do?

This Actor collects classified ads from **OpenSooq**, by far the largest consumer marketplace in the Arab world. One deployment serves eighteen country sites — Jordan, Saudi Arabia, the UAE, Egypt, Kuwait, Iraq, Morocco and the rest — so you pick a country and a category and get the same clean record shape everywhere.

Two things make the export unusually workable for a classifieds site. The listing carries an **attribute summary** already parsed by the platform — `Kia | Rio | 2,013 | Used` — so make, model, year and condition arrive as structured text rather than something you have to mine out of an Arabic free-text title. And every ad carries the **seller's rating, rating count and verification level**, which is the fastest way to separate dealers with a track record from anonymous one-off posts.

### Who is it for?

- **Car dealers and importers** benchmarking asking prices across Gulf and Levant markets.
- **Real-estate analysts** tracking rents and sale prices by city and neighbourhood.
- **Market researchers** measuring consumer supply in a region with little open data.
- **Price-guide and valuation services** building Middle East resale curves.
- **Lead-generation teams** identifying high-rated, verified sellers.
- **Cross-border traders** comparing the same category between Jordan, Saudi Arabia and the UAE.

### Use cases

- Track used-car asking prices by make, model and year across a country.
- Compare apartment rents between neighbourhoods of the same city.
- Filter to verified sellers with a rating above four to build a dealer list.
- Watch listing volume in a category as an economic indicator.
- Compare one category across several country sites in the same week.
- Measure how photo count and video correlate with seller rating.
- Feed an AI agent live MENA marketplace data for pricing questions.

### Why use this OpenSooq Scraper?

- **Eighteen country sites** from one Actor, with an identical record shape.
- **Attribute summary parsed by the platform** — make, model, year and condition without touching the title.
- **Seller rating, rating count and verification** on every row.
- **Price and currency kept apart**, so a Jordanian dinar figure is never mixed with a Saudi riyal one.
- **Thirty ads per page**, fetched several pages at a time.
- **Keyless and login-free.**

### What data can you extract?

One row per ad. Anything the source left blank comes back as `null`.

| Field | Description |
| --- | --- |
| `postId` | OpenSooq post ID |
| `url` | Link to the ad |
| `title` | Ad title, as the seller wrote it |
| `attributes` | Platform attribute summary, e.g. Kia | Rio | 2,013 | Used |
| `price` | Asking price as a number |
| `currency` | ISO currency, e.g. JOD, SAR, AED |
| `priceText` | Price exactly as shown |
| `category` | Top-level category |
| `subCategory` | Sub-category |
| `city` | City |
| `neighbourhood` | Neighbourhood |
| `sellerName` | Seller display name |
| `sellerRating` | Seller rating out of 5 |
| `sellerRatingCount` | Number of ratings |
| `isVerified` | Whether the seller is verified |
| `photoCount` | Number of photos on the ad |
| `hasVideo` | Whether the ad carries video |
| `postedText` | Listing age as the site shows it |
| `scrapedAt` | ISO timestamp of collection |

#### Sample output

```json
{
  "postId": "285993190",
  "url": "https://jo.opensooq.com/en/search/285993190",
  "title": "كيا ريو موديل 2013 فحص كامل وارد الوكالة بحالة الزيرو مالك واحد",
  "attributes": "Kia | Rio | 2,013 | Used",
  "price": 6950,
  "currency": "JOD",
  "priceText": "6,950 JOD",
  "category": "Autos",
  "subCategory": "Cars For Sale",
  "city": "Amman",
  "neighbourhood": "Dabouq",
  "sellerName": "marbr16377546856465",
  "sellerRating": 4.32,
  "sellerRatingCount": 19,
  "isVerified": "Yes",
  "photoCount": 30,
  "hasVideo": "No",
  "postedText": "19 hours ago",
  "scrapedAt": "2026-08-23T11:34:01.026Z"
}
```

### How to use the OpenSooq Scraper

#### Option A — one country and category

Pick a **Country**, put a category path in **Category path** — `cars/cars-for-sale`, `real-estate/apartments-for-rent`, `electronics/mobile-phones` — set **Maximum results** and run.

#### Option B — a regional comparison

Run the same category path against several countries and combine the datasets. The record shape is identical, so they stack directly.

#### Option C — a price watch

Schedule a daily run and diff by `postId` to track what sold and what changed price.

### Input parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `country` | select | `jo` | Which OpenSooq country site to crawl |
| `categoryPath` | string | `cars/cars-for-sale` | Category path as it appears in an OpenSooq URL after `/en/` |
| `maxResults` | integer | 1000 | Stop after this many ads (max 50,000) |
| `proxyConfiguration` | object | residential | A proxy in the selected country is used automatically |

### Tips for best results

- **Split by `currency` before averaging.** Each country quotes in its own currency and a regional run mixes several in one column; the ISO code is there so you can group correctly.
- **`attributes` is the structured field to parse**, not the title. Titles are in Arabic free text; the attribute summary is generated by the platform and follows a stable order.
- **`isVerified` plus `sellerRatingCount` is the quality filter.** A verified seller with twenty ratings behaves very differently from an unverified account with none.
- **Take the category path from the URL**: `jo.opensooq.com/en/**real-estate/apartments-for-rent**`.
- **`postedText` is relative** — "19 hours ago" — because that is what the platform publishes; use `scrapedAt` as the fixed reference point.

### Integrations

Connect the dataset to Make, Zapier, Airbyte, Google Sheets, Slack, GitHub or any HTTP endpoint through Apify integrations, or schedule a run and push results into a warehouse with a webhook.

### API usage

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("logiover/opensooq-mena-marketplace-scraper").call(run_input={
    "country": "ae",
    "categoryPath": "cars/cars-for-sale",
    "maxResults": 3000,
})
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
trusted = [r for r in rows if r["isVerified"] == "Yes" and (r["sellerRatingCount"] or 0) >= 10]
print(len(trusted), "ads from established sellers")
```

### Use with AI agents (MCP)

The Actor is callable from the Apify MCP server, so an assistant can pull Middle East marketplace ads directly and answer pricing and availability questions.

### FAQ

#### Do I need an OpenSooq account or API key?

No. This Actor reads the public listing pages; there is nothing to register.

#### Which countries are covered?

Eighteen: Jordan, Saudi Arabia, the UAE, Egypt, Kuwait, Oman, Bahrain, Qatar, Iraq, Libya, Palestine, Sudan, Yemen, Algeria, Tunisia, Morocco, Lebanon and Syria.

#### How many ads can one run return?

Up to 50,000 per run, thirty per page. Pages are fetched several at a time, so a few thousand ads take about a minute.

#### Are titles in Arabic?

Usually, yes — sellers write in Arabic and the titles come back exactly as published. That is why the platform's own `attributes` summary is the more useful field for filtering: it is generated in English and follows a fixed order.

#### Why is there no photo column?

Because OpenSooq stores only a bare object hash for each image and serves it from a CDN that refuses every public path. Any URL built from it would be a link that does not open, so it is left out. The photo *count* is kept, which is the part you can actually act on.

#### Why is price sometimes empty?

Because the seller listed the ad without one — common for real estate and services, where the asking figure is negotiated. Those rows keep every other field.

#### What does the verification level mean?

OpenSooq verifies sellers through its own process and marks the result on each ad. Combined with the rating count it is the quickest way to separate established dealers from one-off accounts.

#### Can I export to CSV or Excel?

Yes — every run's dataset exports to JSON, CSV, Excel, XML or JSONL.

#### How fresh is the data?

Each run reads the marketplace live, so results are as current as OpenSooq itself.

#### Why did my run return zero ads?

Usually a category path that does not exist on the selected country site — coverage differs slightly between countries. Copy the path from a URL on that country's site.

### Is it legal to scrape OpenSooq?

OpenSooq is a public marketplace and this Actor reads only its public listing pages — no accounts, no logins, no phone numbers. Ad titles, prices, categories and locations are commercial listings published for public view. Seller display names may be personal, so you remain responsible for how you use the data and for respecting the marketplace's terms in your own jurisdiction.

### Related scrapers

- **Property Finder Gulf Scraper** — Gulf real estate listings.
- **Bayut Scraper** — UAE property.
- **ikman Scraper** — Sri Lanka's largest marketplace.
- **Jofogas Scraper** — Hungary's largest classifieds.

# Actor input Schema

## `country` (type: `string`):

OpenSooq country site to crawl.

## `categoryPath` (type: `string`):

Category path exactly as it appears in an OpenSooq URL after /en/, e.g. cars/cars-for-sale, real-estate/apartments-for-rent, electronics/mobile-phones.

## `maxResults` (type: `integer`):

Stop after this many ads. Each page returns 30.

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

OpenSooq serves local exits. A residential proxy in the selected country is used automatically.

## Actor input object example

```json
{
  "country": "jo",
  "categoryPath": "cars/cars-for-sale",
  "maxResults": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every record collected in this run. Open the Dataset tab to browse, filter or export as JSON, CSV or Excel.

# 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 = {
    "country": "jo",
    "categoryPath": "cars/cars-for-sale",
    "maxResults": 1000,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/opensooq-mena-marketplace-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 = {
    "country": "jo",
    "categoryPath": "cars/cars-for-sale",
    "maxResults": 1000,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/opensooq-mena-marketplace-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 '{
  "country": "jo",
  "categoryPath": "cars/cars-for-sale",
  "maxResults": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call logiover/opensooq-mena-marketplace-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/opensooq-mena-marketplace-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/vl0k7DZNXInPtdpL6/builds/BCFayqjLdsYfAEfwV/openapi.json
