# OpenSooq Scraper - MENA Classifieds Data API (`parsebird/opensooq-scraper`) Actor

Scrape OpenSooq (السوق المفتوح) classified listings across Jordan, Saudi Arabia, UAE, Kuwait, Egypt, and more. Extract price, location, category, images, seller, and phone reveal key. Filter by keyword, city, price, car year, and property size. Export JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/opensooq-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 listings

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

Extract classified listings from **[OpenSooq](https://www.opensooq.com)** (السوق المفتوح), the largest online marketplace in the Middle East and North Africa. The **OpenSooq Scraper** turns any OpenSooq search — cars, apartments, phones, jobs, or anything else — into a clean, structured dataset across Jordan, Saudi Arabia, the UAE, Kuwait, Egypt, and 10 more country sites.

<table><tr>
<td style="border-left:4px solid #0098A6;padding:12px 16px;font-weight:600">
Scrape OpenSooq by keyword, city, price, car year, or property size across 15 MENA country sites — get price, location, category, images, seller, and the phone-reveal key for every listing, ready for analysis or lead generation.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Actor: parsebird/opensooq-scraper (Apify). Scrapes classified listings from opensooq.com (السوق المفتوح), the MENA marketplace.
Call with ApifyClient:
  client.actor("parsebird/opensooq-scraper").call(run_input={
    "site": "jo",                       # jo, sa, ae, kw, eg, om, qa, bh, iq, ly, ye, ps, sd, sy, lb
    "query": "toyota",                   # free-text keyword (optional)
    "startUrls": [{"url": "https://jo.opensooq.com/en/cars/cars-for-sale/toyota?price_from=5000"}],  # optional, full filter fidelity
    "vertical": "cars_for_sale",          # general | cars_for_sale | apartments_for_sale | apartments_for_rent
    "category": "",                       # OpenSooq category id (or "catId:subId") for general search
    "city": "59",                         # numeric OpenSooq city id (Amman 59, Riyadh 24)
    "neighborhood": "",                   # numeric neighborhood id (needs city)
    "priceFrom": 5000, "priceTo": 0,
    "vehicleYearFrom": 0, "vehicleYearTo": 0, "vehicleMileageBand": "",
    "propertyBedrooms": "", "propertyBathrooms": "", "surfaceFrom": 0, "surfaceTo": 0,
    "sortBy": "price-asc",                # "" | recent | price-asc | price-desc
    "hasImages": false, "hasPrice": false, "isShop": false,
    "maxItems": 50,
    "proxyConfiguration": {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}
  })
Output per listing: id, url, title, descriptionPreview, subtitle, price, currency, city, neighborhood, category,
  categoryPath, imageUrl, imageCount, hasVideo, specs[], mileageKm, postedAt, insertedDate, listingStatus,
  memberId, memberDisplayName, memberRatingAvg, isShop, shopName, phoneNumber (masked), phoneRevealKey, scrapedAt.
API docs: https://apify.com/parsebird/opensooq-scraper/api  |  Token: https://console.apify.com/account/integrations
```

### What is the OpenSooq Scraper?

The **OpenSooq Scraper** is a data-extraction tool for **OpenSooq.com**, the classifieds platform used across the Arab world for cars, real estate, electronics, jobs, and services. OpenSooq has no public data API, so this actor acts as an **OpenSooq API alternative**: pass a country, a keyword, and a few filters — or paste a search URL straight from the site — and it returns every matching listing as JSON, CSV, or Excel.

It reads the same structured data the OpenSooq website itself renders, so results are complete and consistent: price, currency, city, neighborhood, category, image, listing specs, seller identity, and the `phoneRevealKey` used to request a seller's full phone number.

### What can the OpenSooq Scraper do?

- 🌍 Scrape **15 OpenSooq country sites** — Jordan, Saudi Arabia, UAE, Kuwait, Egypt, Oman, Qatar, Bahrain, Iraq, Libya, Yemen, Palestine, Sudan, Syria, Lebanon.
- 🔎 Search by **free-text keyword**, guided **vertical** (cars for sale, apartments for sale, apartments for rent), or **category ID** for general search.
- 📍 Filter by **city** and **neighborhood** ID, **price** range, car **model year** and **mileage**, apartment **bedrooms** and **surface area**.
- 🔗 Paste **exact OpenSooq search URLs** as start URLs to preserve every filter the site supports.
- 🏪 Restrict to **business shop** listings, listings **with images**, or listings **with a disclosed price**.
- 📞 Get **seller info** and the **phone reveal key** for every listing.
- ⏱️ Run on a **schedule**, call it by **API**, and connect it to Make, Zapier, Google Sheets, or Slack.
- 📤 Export to **JSON, CSV, Excel, HTML, or XML**.

### What data can you extract from OpenSooq?

| Field | Description |
|-------|-------------|
| `id` | OpenSooq listing ID |
| `url` | Canonical listing URL |
| `title` | Listing title (Arabic or English, as posted) |
| `descriptionPreview` | Short preview of the listing description |
| `subtitle` | Auto-generated summary line (e.g. `2019 Toyota Corolla Hybrid`) |
| `price` / `currency` | Price value as a string and ISO currency (`JOD`, `SAR`, `AED`, `KWD`, `EGP`, …) |
| `city` / `neighborhood` | Location names |
| `category` / `categoryPath` | Category label and URL path |
| `imageUrl` / `imageCount` | Cover photo URL and number of photos |
| `specs` | List of listing attributes (make, model, year, km, bedrooms, area, …) |
| `mileageKm` | Odometer reading for vehicles |
| `postedAt` / `insertedDate` | Relative and absolute posting date |
| `listingStatus` | `featured_turbo`, `reposted`, `default`, … |
| `memberId` / `memberDisplayName` | Seller identity |
| `memberRatingAvg` / `memberRatingCount` | Seller rating |
| `isShop` / `shopName` | Whether the seller is a registered business shop |
| `phoneNumber` | Masked phone number (last 2 digits hidden by OpenSooq) |
| `phoneRevealKey` | Key used to request the full number on the platform |
| `scrapedAt` | ISO timestamp of extraction |

### How to scrape OpenSooq

1. Open the **OpenSooq Scraper** and go to the **Input** tab.
2. Choose a **Country site** (for example `jo` for Jordan or `sa` for Saudi Arabia).
3. Either:
   - enter a **Search query** and pick a **Vertical**, or
   - paste one or more OpenSooq search URLs into **Start URLs** (recommended when you need advanced filters — build the search on the site, copy the URL).
4. Add optional filters — **city ID**, **price range**, **car year**, **bedrooms**, **surface area**, **sort order**.
5. Set **Maximum number of items** (this is the number of billed rows).
6. Keep proxy on **Residential** for clean regional access.
7. Click **Start**, then download the results as JSON, CSV, or Excel from the **Output** tab.

#### Finding city and neighborhood IDs

Run a search on the OpenSooq website and filter by a city. The city ID appears in the resulting URL (`...?search=true&city_ids=59`). Neighborhood IDs appear the same way as `nhood_ids`.

### How much does it cost to scrape OpenSooq?

This actor uses **pay-per-event** pricing. You are charged once per listing saved to the dataset:

| Plan | Price per 1,000 listings |
|------|--------------------------|
| Free | **$0.79** |
| Bronze | **$0.69** |
| Silver | **$0.59** |
| Gold | **$0.49** |

Scraping 1,000 listings on the Free plan costs about **$0.79** plus a small amount of platform compute. Apify's free monthly usage credits cover tens of thousands of listings per month.

### Input

```json
{
  "site": "jo",
  "query": "toyota",
  "vertical": "cars_for_sale",
  "city": "59",
  "priceFrom": 5000,
  "sortBy": "price-asc",
  "maxItems": 50,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### Output example

Download results in **JSON, CSV, Excel, HTML, or XML**.

```json
{
  "id": "276150375",
  "url": "https://jo.opensooq.com/en/search/276150375",
  "title": "190 m2 3 Bedrooms Apartments for Sale in Zarqa Dahiet Al Madena Al Monawwara",
  "descriptionPreview": "شقة طابقية مميزة تشطيبات فندقية عالية الجودة مكونة من 3 غرف نوم...",
  "subtitle": "190 m2 3 Bedrooms",
  "price": "66,000",
  "currency": "JOD",
  "city": "Zarqa",
  "neighborhood": "Dahiet Al Madena Al Monawwara",
  "category": "Apartments for Sale",
  "categoryPath": "property/apartments-for-sale",
  "imageUrl": "https://opensooq-images.os-cdn.com/previews/700x0/a9/ab/a9abf520684bb5399eb5f27fc4620d01dc354b6e19860aa901257c8343f65565.jpg",
  "imageCount": 12,
  "specs": ["3 Bedrooms", "2 Bathrooms", "Area: 190 m2", "Second Floor"],
  "postedAt": "2 hours ago",
  "insertedDate": "2026-06-15",
  "listingStatus": "featured_turbo",
  "memberId": "1234567",
  "memberDisplayName": "mohamad abo khadra",
  "isShop": false,
  "shopName": null,
  "phoneNumber": "07996786XX",
  "phoneRevealKey": "0cd4416532a0ce20860ce546ba8dc236",
  "scrapedAt": "2026-06-15T12:38:09.000Z"
}
```

### Use cases

- 🚗 **Car price research** — track asking prices for a make, model, and year across a country.
- 🏠 **Real-estate analysis** — build datasets of rents and sale prices by city and neighborhood.
- 📇 **Lead generation** — collect seller and shop listings, then request phone numbers on the platform.
- 📊 **Market intelligence** — monitor listing volume, category mix, and price trends across MENA markets.
- 🔁 **Inventory monitoring** — schedule daily runs on a saved search and watch what changes.

### How it works

1. The actor builds an OpenSooq search URL for the chosen country site from your keyword, vertical, category, and filters — or uses your start URLs directly.
2. It requests each search-results page and reads the structured listing data OpenSooq embeds in the page.
3. It paginates until it reaches `maxItems` or the last page of results.
4. It applies the `hasPrice`, `hasImages`, and `isShop` filters, de-duplicates by listing ID, and pushes rows to the dataset.
5. You are charged one event per listing saved.

### Pricing

| Event | Price per event | Price per 1,000 |
|-------|----------------|-----------------|
| `listing-scraped` | $0.00079 | **$0.79** (Free tier) |

One event is charged for every listing written to the dataset. Bronze/Silver/Gold plans pay $0.69 / $0.59 / $0.49 per 1,000.

### FAQ

**Which OpenSooq countries are supported?**
All 15 OpenSooq country sites: Jordan, Saudi Arabia, UAE, Kuwait, Egypt, Oman, Qatar, Bahrain, Iraq, Libya, Yemen, Palestine, Sudan, Syria, and Lebanon. Pick one per run with the `site` input.

**Can I get the seller's full phone number?**
The actor returns the masked number (`phoneNumber`) and the `phoneRevealKey`. OpenSooq requires an on-platform request to reveal the last digits, so the full number is not extracted automatically.

**How do I filter by an exact search I built on the site?**
Copy the URL from your browser after applying filters on OpenSooq and paste it into **Start URLs**. Start URLs preserve every filter, including ones not exposed as inputs (make, model, condition, fuel type, furnished, floor, and more).

**Why is `price` sometimes null?**
Some sellers post without a price. Enable **Only listings with a price** (`hasPrice`) to skip them.

**Titles are in Arabic — can I get English?**
Listings are returned exactly as the seller posted them, which on OpenSooq is usually Arabic. City, neighborhood, and category names are returned in English.

**Can I schedule recurring runs?**
Yes. Use Apify [scheduling](https://docs.apify.com/platform/schedules) to run the scraper on any interval, and connect the output to [integrations](https://docs.apify.com/platform/integrations) like Google Sheets, Make, or Slack.

**Something looks wrong or missing.**
Open the **Issues** tab on the actor page with an example input and we will take a look.

### API usage examples

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("parsebird/opensooq-scraper").call(run_input={
    "site": "sa",
    "query": "toyota",
    "vertical": "cars_for_sale",
    "city": "24",
    "maxItems": 100,
    "proxyConfiguration": {"useApifyProxy": True, "apifyProxyGroups": ["RESIDENTIAL"]},
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["price"], item["currency"], item["url"])
```

**JavaScript**

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('parsebird/opensooq-scraper').call({
    site: 'ae',
    query: 'iphone 15',
    vertical: 'general',
    maxItems: 100,
    proxyConfiguration: { useApifyProxy: true, apifyProxyGroups: ['RESIDENTIAL'] },
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((it) => console.log(it.title, it.price, it.currency, it.url));
```

### Related actors

- [Dubizzle Scraper](https://apify.com/parsebird/dubizzle-scraper) — UAE classifieds and property.
- [Ebay Kleinanzeigen Scraper](https://apify.com/parsebird/ebay-kleinanzeigen-scraper) — Germany's largest classifieds site.
- [Milanuncios Scraper](https://apify.com/parsebird/milanuncios-scraper) — Spain's largest classifieds site.
- [Subito.it Scraper](https://apify.com/parsebird/subito-it-scraper) — Italy's largest classifieds site.

### Legal and compliance

This actor extracts only publicly accessible listing data from opensooq.com and does not bypass any login or access control. Results may include personal data of sellers; if you store or process it, you must comply with applicable data-protection law (including the GDPR where relevant) and OpenSooq's Terms of Service. You use this actor at your own responsibility. It is not affiliated with, endorsed by, or connected to OpenSooq.

# Actor input Schema

## `site` (type: `string`):

Which OpenSooq country site to scrape.

## `query` (type: `string`):

Text keyword to search for (e.g. iphone, apartment, bmw). Leave empty to browse the whole vertical.

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

Exact OpenSooq search-result URLs (for example https://jo.opensooq.com/en/cars/cars-for-sale/toyota?price\_from=5000). These take precedence over the guided filters and preserve every filter in the URL.

## `vertical` (type: `string`):

General site-wide search, or a guided vertical with its own filters.

## `category` (type: `string`):

OpenSooq category ID for General search, optionally `categoryId:subCategoryId` (e.g. `1775:1777`). Ignored when a guided vertical is selected.

## `city` (type: `string`):

Numeric OpenSooq city ID (for example Amman is 59, Riyadh is 24). Find it in a city-filtered URL on the site.

## `neighborhood` (type: `string`):

Numeric OpenSooq neighborhood ID. Requires a city ID.

## `priceFrom` (type: `integer`):

Only include listings priced at or above this value.

## `priceTo` (type: `integer`):

Only include listings priced at or below this value.

## `vehicleYearFrom` (type: `integer`):

Model-year lower bound for the Cars for Sale vertical.

## `vehicleYearTo` (type: `integer`):

Model-year upper bound for the Cars for Sale vertical.

## `vehicleMileageBand` (type: `string`):

Mileage range (km) for the Cars for Sale vertical.

## `propertyBedrooms` (type: `string`):

Bedroom count for an apartment vertical. Applied as an OpenSooq filter path; cannot be combined with a bathrooms filter (use Start URLs for both).

## `propertyBathrooms` (type: `string`):

Bathroom count for an apartment vertical. Used only when no bedrooms filter is set.

## `surfaceFrom` (type: `integer`):

Minimum apartment surface area in square metres.

## `surfaceTo` (type: `integer`):

Maximum apartment surface area in square metres.

## `sortBy` (type: `string`):

Result order.

## `hasImages` (type: `boolean`):

Only return listings that contain an image gallery.

## `hasPrice` (type: `boolean`):

Only return listings that disclose an explicit price.

## `isShop` (type: `boolean`):

Only return listings posted by registered OpenSooq business shops.

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

Maximum number of listing records to extract. This is the number of billed rows.

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

Proxy settings. Residential proxies are recommended for clean, unblocked regional access to OpenSooq.

## Actor input object example

```json
{
  "site": "jo",
  "query": "toyota",
  "startUrls": [],
  "vertical": "cars_for_sale",
  "vehicleMileageBand": "",
  "propertyBedrooms": "",
  "propertyBathrooms": "",
  "sortBy": "",
  "hasImages": false,
  "hasPrice": false,
  "isShop": false,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "site": "jo",
    "query": "toyota",
    "startUrls": [],
    "vertical": "cars_for_sale",
    "category": "",
    "city": "",
    "neighborhood": "",
    "priceFrom": 0,
    "priceTo": 0,
    "vehicleYearFrom": 0,
    "vehicleYearTo": 0,
    "surfaceFrom": 0,
    "surfaceTo": 0,
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/opensooq-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 = {
    "site": "jo",
    "query": "toyota",
    "startUrls": [],
    "vertical": "cars_for_sale",
    "category": "",
    "city": "",
    "neighborhood": "",
    "priceFrom": 0,
    "priceTo": 0,
    "vehicleYearFrom": 0,
    "vehicleYearTo": 0,
    "surfaceFrom": 0,
    "surfaceTo": 0,
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/opensooq-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 '{
  "site": "jo",
  "query": "toyota",
  "startUrls": [],
  "vertical": "cars_for_sale",
  "category": "",
  "city": "",
  "neighborhood": "",
  "priceFrom": 0,
  "priceTo": 0,
  "vehicleYearFrom": 0,
  "vehicleYearTo": 0,
  "surfaceFrom": 0,
  "surfaceTo": 0,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call parsebird/opensooq-scraper --silent --output-dataset

```

## MCP server setup

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