# Ounass Scraper (`crawlerbros/ounass-scraper`) Actor

Scrape Ounass (ounass.ae) - luxury fashion e-commerce for the UAE and GCC. Search or browse by category across Women/Men/Kids, filter by designer, price, colour, and sale status, or fetch full product details (description, sizes, stock, images) by URL.

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

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Ounass Scraper

Scrape [Ounass](https://www.ounass.ae) — the leading luxury fashion, beauty, and lifestyle e-commerce platform for the UAE and GCC (Saudi Arabia, Oman, Kuwait, Bahrain, Qatar). Search products by keyword, browse categories across Women / Men / Kids, filter by designer, price, colour, and sale status, or pull full product detail pages (description, sizes, live stock, images) from product URLs.

### What this actor does

- **Three modes:** `search`, `byCategory`, `byProductUrls`
- **Six markets:** UAE, Saudi Arabia, Oman, Kuwait, Bahrain, Qatar — prices and currency follow the selected market
- **Two languages:** English and Arabic — Arabic uses each market's own Arabic-language domain (e.g. `ar.ounass.ae`); product/designer/colour names come back in Arabic with the English equivalents still populated where the site provides them
- **Three departments:** Women, Men, Kids
- **Nine categories, plus optional sub-category:** Clothing, Bags, Shoes, Jewellery, Accessories, Beauty, Sale/Clearance, New In, Pre-Loved — with an optional free-text `subCategory` (e.g. `dresses`, `handbags`, `sneakers`) for deeper browsing
- **Filters:** designer/brand, colour, size, min/max price, minimum discount percent, on-sale-only, in-stock-only, sort order
- **Full product detail mode:** description, breadcrumb category path, all product images, per-size stock, loyalty points, return eligibility
- **Empty fields are omitted** — every record only contains data that was actually found

### Output per product

#### Listing records (`search` / `byCategory`, `recordType: "product"`)

- `productId`, `sku`
- `productName`, `productNameEnglish` (when different from `productName`)
- `designer`, `designerEnglish` (when different)
- `color`, `division`, `department`, `productClass`, `productSubClass`, `gender`, `season`
- `price`, `originalPrice`, `discountPercent`, `currency`
- `inStock`, `isClearance`, `isPromotion`, `wishlistCount`, `badge`
- `thumbnailUrl`, `hoverImageUrl`
- `categoryPath`, `productUrl`, `sourceUrl`
- `sizes[]` — `sizeCode`, `sku`, `price`, `originalPrice`, `discountPercent`, `stock`, `inStock`
- `recordType: "product"`, `scrapedAt`

#### Product detail records (`byProductUrls`, `recordType: "productDetail"`)

Everything above, plus:

- `description` — full product description text
- `countryOfOrigin`
- `loyaltyPoints`, `isReturnable`
- `breadcrumbs[]` — category path names from department down to product
- `imageUrls[]` — every product image, full resolution

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | `search` / `byCategory` / `byProductUrls` |
| `searchQuery` | string | `dress` | Free-text query (mode=search) |
| `country` | select | `ae` | Market: `ae` / `sa` / `om` / `kw` / `bh` / `qa` |
| `language` | select | `en` | `en` / `ar` — Arabic uses each market's Arabic-language domain |
| `department` | select | `women` | `women` / `men` / `kids` (mode=search, byCategory) |
| `category` | select | – | Category to browse (mode=byCategory), required for that mode |
| `subCategory` | string | – | Optional deeper listing under `category`, e.g. `dresses`, `handbags`, `sneakers` (mode=byCategory) |
| `productUrls` | array | – | Full Ounass product URLs (mode=byProductUrls) |
| `designer` | string | – | Only keep products whose designer contains this text |
| `color` | string | – | Only keep products whose colour contains this text |
| `size` | string | – | Only keep products offering a matching size, e.g. `M`, `42`, `One Size` |
| `minPrice` | int | – | Minimum price in the selected market's currency |
| `maxPrice` | int | – | Maximum price in the selected market's currency |
| `minDiscountPercent` | select | – | Only keep products discounted by at least this percent: `10`–`80` |
| `sortBy` | select | `popularity` | `popularity` / `newness` / `mostWishlisted` / `lowestPrice` / `highestPrice` |
| `onSaleOnly` | bool | `false` | Only keep clearance/promotion/discounted products |
| `inStockOnly` | bool | `false` | Only keep in-stock products |
| `maxItems` | int | `50` | Hard cap (1–2000) |

#### Example: search for dresses under AED 3,000

```json
{
  "mode": "search",
  "searchQuery": "dress",
  "department": "women",
  "maxPrice": 3000,
  "maxItems": 50
}
```

#### Example: browse men's shoes on sale, sorted by newest

```json
{
  "mode": "byCategory",
  "department": "men",
  "category": "shoes",
  "onSaleOnly": true,
  "sortBy": "newness",
  "maxItems": 50
}
```

#### Example: full product details from a saved list of URLs

```json
{
  "mode": "byProductUrls",
  "productUrls": [
    "https://www.ounass.ae/shop-mach-mach-peony-mini-dress-in-crochet-for-women-219308301_2709.html"
  ]
}
```

#### Example: browse a sub-category with size and discount filters

```json
{
  "mode": "byCategory",
  "department": "women",
  "category": "clothing",
  "subCategory": "dresses",
  "size": "M",
  "minDiscountPercent": "30",
  "maxItems": 50
}
```

#### Example: Saudi Arabia market, designer filter

```json
{
  "mode": "search",
  "searchQuery": "bag",
  "country": "sa",
  "designer": "Gucci",
  "maxItems": 30
}
```

### Use cases

- **Price monitoring** — track designer/product prices and discounts across GCC markets
- **Market research** — compare product assortment and pricing between UAE, Saudi Arabia, and other GCC storefronts
- **Trend tracking** — sort by newness or wishlist count to spot trending designers/products
- **Catalogue enrichment** — pull full product descriptions, images, and size availability for a known list of product URLs

### FAQ

**Does this need a login or API key?**
No. All data is publicly available on Ounass's storefront pages.

**Which markets are supported?**
United Arab Emirates, Saudi Arabia, Oman, Kuwait, Bahrain, and Qatar. Prices and currency automatically follow the selected market.

**Can I get Arabic-language product data?**
Yes — set `language: "ar"`. The run scrapes each market's Arabic-language storefront domain (e.g. `ar.ounass.ae` for UAE), so `productName`, `designer`, and `color` come back in Arabic. The English equivalents remain available in `productNameEnglish` / `designerEnglish` when the site provides them.

**What sub-categories are available?**
`subCategory` is free text so it works with any of Ounass's own deeper listing slugs — for example, under `clothing`: `dresses`, `tops`, `pants`, `jeans`, `knitwear`, `jumpsuits`, `abayas`; under `bags`: `handbags`, `backpacks`, `clutches`; under `shoes`: `sneakers`, `heels`, `sandals`, `boots`. Spaces are converted to hyphens automatically. If a combination doesn't exist upstream, the run finishes cleanly with a status message instead of erroring.

**Why do some department + category combinations return 0 results?**
Not every category exists under every department upstream (e.g. Jewellery and Beauty are primarily under Women). The run finishes cleanly with a status message rather than erroring.

**Can I get full product descriptions and all images?**
Yes — use `mode: "byProductUrls"` with a list of product page URLs (from a prior `search`/`byCategory` run's `productUrl` field, or your own list).

**How current is the data?**
Every run fetches live pages directly from Ounass — prices, stock, and discounts reflect what's on the site at run time.

**Why does `search` combined with `designer`/`minPrice`/`maxPrice` sometimes return fewer results than `byCategory` with the same filters?**
Ounass's search backend only returns its first page of results when a text query is combined with a designer or price-range filter (pagination/sort parameters are ignored upstream in that combination) — our filters are still applied correctly client-side against that page. For deep, fully-paginated filtered browsing, use `mode: "byCategory"` with the same filters instead of `mode: "search"`.

**Does search work in Arabic?**
Ounass's own search index matches against its (English) product catalogue text, so Arabic-script queries currently return 0 results upstream — this is a source-side limitation, not an actor bug. Use English keywords, designer names, or product terms for best results.

**Will `productUrl` open for me?**
Yes — every `productUrl` is a real, live Ounass page (verified `200 OK`). Ounass runs Cloudflare bot-management on its storefront, so a bare `curl`/script request without a real browser TLS fingerprint may see a challenge page; opening the same URL in any normal web browser always works.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `searchQuery` (type: `string`):

Free-text search, e.g. designer name or product keyword (`dress`, `gucci bag`).

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

Which Ounass market domain to scrape. Prices and currency follow the selected market.

## `language` (type: `string`):

Storefront language. Arabic uses each market's Arabic-language domain (e.g. `ar.ounass.ae`) — product names, designer names, and colours come back in Arabic, with the English equivalents still populated in the `*English` fields where available. Applies to all modes (byProductUrls resolves language from each URL's own domain when recognizable).

## `department` (type: `string`):

Product department to search/browse within.

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

Category to browse within the selected department. Not every category exists under every department (e.g. Jewellery/Beauty are women-focused) — the run reports 0 results with a clear status message if the combination doesn't exist.

## `subCategory` (type: `string`):

Optional deeper listing under the selected category, e.g. `dresses` under Clothing, `handbags` under Bags, `sneakers` under Shoes. Free text — spaces are converted to hyphens automatically. Not every sub-category exists under every department/category; the run reports 0 results with a clear status message if the combination doesn't exist.

## `productUrls` (type: `array`):

Full Ounass product page URLs (any market domain), e.g. `https://www.ounass.ae/shop-...-219308301_2709.html`.

## `designer` (type: `string`):

Only keep products whose designer/brand name contains this text (case-insensitive). Applies to all modes.

## `color` (type: `string`):

Only keep products whose colour contains this text (case-insensitive), e.g. `black`, `red`.

## `size` (type: `string`):

Only keep products that offer a matching size (case-insensitive, e.g. `M`, `42`, `One Size`). Applies to all modes.

## `minPrice` (type: `integer`):

Only keep products priced at or above this amount, in the selected market's currency.

## `maxPrice` (type: `integer`):

Only keep products priced at or below this amount, in the selected market's currency.

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

Sort order for search/category listings.

## `minDiscountPercent` (type: `string`):

Only keep products discounted by at least this percentage off. Matches Ounass's own "Discount" listing filter buckets. Applies to all modes.

## `onSaleOnly` (type: `boolean`):

Only keep products that are on clearance, promotion, or have a discount.

## `inStockOnly` (type: `boolean`):

Only keep products that are currently in stock.

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

Maximum number of products to return.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "dress",
  "country": "ae",
  "language": "en",
  "department": "women",
  "category": "clothing",
  "productUrls": [],
  "sortBy": "popularity",
  "minDiscountPercent": "",
  "onSaleOnly": false,
  "inStockOnly": false,
  "maxItems": 24
}
```

# Actor output Schema

## `products` (type: `string`):

Dataset containing all scraped Ounass products.

# 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 = {
    "mode": "search",
    "searchQuery": "dress",
    "country": "ae",
    "language": "en",
    "department": "women",
    "category": "clothing",
    "productUrls": [],
    "sortBy": "popularity",
    "minDiscountPercent": "",
    "onSaleOnly": false,
    "inStockOnly": false,
    "maxItems": 24
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/ounass-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 = {
    "mode": "search",
    "searchQuery": "dress",
    "country": "ae",
    "language": "en",
    "department": "women",
    "category": "clothing",
    "productUrls": [],
    "sortBy": "popularity",
    "minDiscountPercent": "",
    "onSaleOnly": False,
    "inStockOnly": False,
    "maxItems": 24,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/ounass-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 '{
  "mode": "search",
  "searchQuery": "dress",
  "country": "ae",
  "language": "en",
  "department": "women",
  "category": "clothing",
  "productUrls": [],
  "sortBy": "popularity",
  "minDiscountPercent": "",
  "onSaleOnly": false,
  "inStockOnly": false,
  "maxItems": 24
}' |
apify call crawlerbros/ounass-scraper --silent --output-dataset

```

## MCP server setup

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