# 🚗 Hatla2ee هتلاقي Scraper - Used & New Cars, 6 MENA Markets (`boring_internet_explorer/hatla2ee-scraper`) Actor

Scrape used cars, imported cars and new cars, trucks, buses and motorcycles from Hatla2ee in Egypt, Kuwait, Oman, Qatar, Saudi Arabia and the UAE. Get prices, mileage, specs, locations, photos and seller details with one unified output.

- **URL**: https://apify.com/boring_internet_explorer/hatla2ee-scraper.md
- **Developed by:** [Boring Internet Explorer](https://apify.com/boring_internet_explorer) (community)
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 🚗 Hatla2ee Scraper

### ❓ What is this scraper?

This scraper extracts structured data from **Hatla2ee** (`hatla2ee.com`) — a leading car marketplace in the Middle East with used car listings, imported cars and a catalog of new cars, trucks, buses and motorcycles. It covers six country sites: **Egypt, Kuwait, Oman, Qatar, Saudi Arabia and the UAE**.

Give it any supported Hatla2ee search or filtered URL and it returns clean, uniform records with prices, specs, locations, photos and seller details.

The extracted data is normalized into one structured format for both used and new vehicles, making it easy to use for analysis, integrations, or storage.

***

### ⚡ Why this scraper?

Hatla2ee lists tens of thousands of cars across the region. Collecting that by hand is not realistic, and this scraper lets you:

- 🚗 Monitor used car prices, mileage and availability by make, model, year or city.
- 🆕 Track new vehicle prices and trims across cars, trucks, buses and motorcycles.
- 🔌 Follow the electric vehicle market, including battery range and capacity filters.
- 🌍 Compare the same models across Egypt, the Gulf countries and Saudi Arabia.
- 📊 Power price intelligence dashboards and market research.
- 🤖 Feed AI and enrichment pipelines with structured automotive data.

Perfect for:

- Automotive dealers and importers
- Market analysts and researchers
- Price comparison and valuation platforms
- Data engineers building automotive datasets

***

### 🔗 Supported URL types

The URL decides the country, whether you get used cars or new vehicles, and which filters apply. Both `/en/` URLs and page numbers are supported.

| Type                       | Example                                                                                  |
| -------------------------- | ---------------------------------------------------------------------------------------- |
| Used cars – all            | `https://eg.hatla2ee.com/en/car/search`                                                  |
| Used cars – make           | `https://eg.hatla2ee.com/en/car/mercedes`                                                |
| Used cars – make and model | `https://eg.hatla2ee.com/en/car/mercedes/c-180`                                          |
| Used cars – electric       | `https://eg.hatla2ee.com/en/car/electric`                                                |
| Used cars – electric make  | `https://eg.hatla2ee.com/en/car/byd/electric`                                            |
| Used cars – imported       | `https://eg.hatla2ee.com/en/imported-car`                                                |
| Used cars – filtered       | `https://eg.hatla2ee.com/en/car/search?make=40&model=460&priceMax=900000&condition=used` |
| Used cars – paginated      | `https://eg.hatla2ee.com/en/car/electric/page/2`                                         |
| New cars – all             | `https://eg.hatla2ee.com/en/new-car/search`                                              |
| New cars – make            | `https://eg.hatla2ee.com/en/new-car/mercedes`                                            |
| New cars – filtered        | `https://eg.hatla2ee.com/en/new-car/search?make=porsche&model=718&priceMax=90000000`     |
| New cars – paginated       | `https://uae.hatla2ee.com/en/new-car/search?page=6`                                      |
| New trucks                 | `https://eg.hatla2ee.com/en/new-trucks/search`                                           |
| New buses                  | `https://eg.hatla2ee.com/en/new-bus/search?make=toyota&model=hiace`                      |
| New motorcycles            | `https://eg.hatla2ee.com/en/new-motorcycle/search`                                       |
| Other countries            | `https://ksa.hatla2ee.com/en/car/search` (also `kuwait`, `oman`, `qatar`, `uae`)         |

#### Supported filters

| Used cars (`/car/search?...`)                                                                  | New vehicles (`/new-*/search?...`)              |
| ---------------------------------------------------------------------------------------------- | ----------------------------------------------- |
| `make`, `model`, `variant`, `city`, `color`, `body`, `fuel`, `transmission`, `cc`, `condition` | `make`, `model`, `body`, `transmission`, `fuel` |
| `priceMin`, `priceMax`, `dateMin`, `dateMax`, `kmMin`, `kmMax`                                 | `priceMin`, `priceMax`                          |
| `kasr-zero`, `financed`, `imported`, `taxi`, `classic`, `disabled`, `good_deal`                | `kmRangeMin`, `kmRangeMax`, `batteryCapacity`   |
| `sortby`, `page`                                                                               | `sortby`, `page`                                |

Used car filters accept the numeric IDs or slugs shown in Hatla2ee URLs. Several values can be combined with `_and_`, for example `transmission=1_and_2`. URLs that are not supported are skipped with a warning in the log.

***

### 📥 Input fields

| Field                | Type    | Description                                                                |
| -------------------- | ------- | -------------------------------------------------------------------------- |
| `startUrls`          | array   | Hatla2ee search or listing URLs to scrape. Filters in the URL are applied. |
| `maxItems`           | integer | Maximum number of items to scrape **per start URL** (default `5`).         |
| `proxyConfiguration` | object  | Optional proxy settings. The scraper works without a proxy by default.     |

### 🧪 Example input

```json
{
  "startUrls": [
    { 
      "url": "https://eg.hatla2ee.com/en/new-car/search?make=porsche&model=718" 
    }
  ],
  "maxItems": 5,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

***

### 📤 Output

Each used car or new vehicle is stored as one record in the dataset. Used cars and new vehicles share exactly the same fields; fields that do not apply to a record are `null`.

- **Used cars** (`type: "used"`) are individual listings with mileage, location and seller details.
- **New vehicles** (`type: "new-vehicle"`) are catalog entries with prices, specs and launch details. Search URLs return one record per trim (variant); a make page such as `/new-car/mercedes` returns one record per model.

### 📋 Example output – used car

```json
{
  "scrapedAt": "2026-10-03T12:07:21.995Z",
  "url": "https://eg.hatla2ee.com/en/car/kia/cerato/7292735",
  "id": 7292735,
  "type": "used",
  "country": "EG",
  "category": "car",
  "title": "Kia Cerato 2017",
  "titleAr": null,
  "make": { "id": 3, "slug": "kia", "label": "Kia", "labelAr": "كيا" },
  "model": { "id": 29, "slug": "cerato", "label": "Cerato", "labelAr": "سيراتو" },
  "variant": {
    "id": 3694,
    "slug": "a-t-ex-dab-abs",
    "label": "A/T EX (DAB+ABS)",
    "labelAr": "ناقل اوتماتيك  EX (DAB+ABS)"
  },
  "year": 2017,
  "condition": { "id": 119, "slug": "used", "label": "Used", "labelAr": "مستخدم" },
  "price": 800000,
  "originalPrice": null,
  "minOfficialPrice": null,
  "maxOfficialPrice": null,
  "minMarketPrice": null,
  "maxMarketPrice": null,
  "discount": null,
  "cashback": null,
  "km": 100000,
  "bodyType": { "id": 121, "slug": "sedan", "label": "Sedan", "labelAr": "سيدان" },
  "transmission": { "id": 27, "slug": "automatic", "label": "Automatic", "labelAr": "أتوماتيك‎" },
  "fuelType": { "id": 32, "slug": "gas", "label": "Gas", "labelAr": "بنزين" },
  "exteriorColor": { "id": 2, "slug": "black", "label": "Black", "labelAr": "أسود" },
  "engineCc": 1600,
  "goodDeal": true,
  "lowKm": false,
  "financed": false,
  "imported": true,
  "taxi": false,
  "classic": null,
  "disabled": false,
  "status": null,
  "launchDate": null,
  "variantCount": null,
  "warrantyYears": null,
  "warrantyKm": null,
  "assembledIn": null,
  "origin": null,
  "brochureUrl": null,
  "location": {
    "id": 22,
    "title": "Tanta",
    "breadcrumbs": ["Egypt", "Gharbia", "Tanta"],
    "latitude": 30.78,
    "longitude": 31
  },
  "images": [
    "https://legion-images.hatla2ee.com/listing_image/fc9b1126-4dee-4d6b-8554-d483821a6b80/full.jpg"
  ],
  "seller": {
    "name": "Seller Name",
    "email": "seller@example.com",
    "mobile": "+2011XXXXXXX",
    "whatsapp": "+2011XXXXXXX",
    "verified": null,
    "memberSince": "2026-09-25T19:28:05.671+03:00"
  },
  "agency": null,
  "postedAt": "2026-10-02T22:00:25.616+03:00",
  "updatedAt": null
}
```

Seller details in the example are masked.

### 📋 Example output – new vehicle

```json
{
  "scrapedAt": "2026-10-03T12:10:07.883Z",
  "url": "https://eg.hatla2ee.com/en/new-bus/toyota/hiace/49040",
  "id": 49040,
  "type": "new-vehicle",
  "country": "EG",
  "category": "bus",
  "title": "Toyota Hiace 2026 A/T / Full Option",
  "titleAr": "تويوتا هاى اس 2026 اتوماتيك / Full Option",
  "make": { "id": 36, "slug": "toyota", "label": "Toyota", "labelAr": "تويوتا" },
  "model": { "id": 609, "slug": "hiace", "label": "Hiace", "labelAr": "هاى اس" },
  "variant": {
    "id": 49040,
    "slug": "a-t-full-option",
    "label": "A/T / Full option",
    "labelAr": "اتوماتيك / Full Option"
  },
  "year": 2026,
  "condition": { "id": null, "slug": "new", "label": "New", "labelAr": null },
  "price": 1900000,
  "km": null,
  "bodyType": { "id": 494, "slug": "microbus", "label": "Microbus", "labelAr": "ميكروباص" },
  "transmission": { "id": 459, "slug": "manual", "label": "Manual", "labelAr": "مانيوال" },
  "fuelType": { "id": 478, "slug": "diesel", "label": "Diesel", "labelAr": "ديزل" },
  "engineCc": 2750,
  "imported": false,
  "status": "launched",
  "launchDate": "2026-01-01",
  "origin": "Japan",
  "location": null,
  "images": [
    "https://legion-images.hatla2ee.com/original_image/4a5dd01c-309b-4441-9eb0-7db877652930/full.png"
  ],
  "seller": null,
  "updatedAt": "2026-01-26T12:10:16.458+02:00"
}
```

The new vehicle example is shortened; the real record contains every field from the table below, with `null` for the ones not shown.

***

### 🗂️ Field reference

| Field              | Type    | Description                                                                                  |
| ------------------ | ------- | -------------------------------------------------------------------------------------------- |
| `scrapedAt`        | string  | Timestamp of when the record was scraped (ISO 8601).                                         |
| `url`              | string  | Link to the listing or catalog page on Hatla2ee.                                             |
| `id`               | number  | Hatla2ee identifier of the listing or variant.                                               |
| `type`             | string  | `"used"` for used car URLs, `"new-vehicle"` for new vehicle URLs.                            |
| `country`          | string  | Country code of the site: `EG`, `KW`, `OM`, `QA`, `SA` or `AE`.                              |
| `category`         | string  | Vehicle category: `car`, `trucks`, `bus` or `motorcycle`.                                    |
| `title`            | string  | Listing or vehicle title.                                                                    |
| `titleAr`          | string  | Arabic title, when available.                                                                |
| `make`             | object  | Make with `id`, `slug`, `label` and `labelAr`.                                               |
| `model`            | object  | Model with `id`, `slug`, `label` and `labelAr`.                                              |
| `variant`          | object  | Trim / variant, when available.                                                              |
| `year`             | number  | Model year (used cars) or launch year (new vehicles).                                        |
| `condition`        | object  | `used` or `new`.                                                                             |
| `price`            | number  | Asking price (used) or variant price (new), in local currency.                               |
| `originalPrice`    | number  | Price before discount, when available.                                                       |
| `minOfficialPrice` | number  | Lowest official price across a model's trims (model-level new vehicle records).              |
| `maxOfficialPrice` | number  | Highest official price across a model's trims (model-level new vehicle records).             |
| `minMarketPrice`   | number  | Lowest market price, when available.                                                         |
| `maxMarketPrice`   | number  | Highest market price, when available.                                                        |
| `discount`         | any     | Discount information, when available.                                                        |
| `cashback`         | any     | Cashback information, when available.                                                        |
| `km`               | number  | Mileage in kilometres (used cars).                                                           |
| `bodyType`         | object  | Body type, e.g. Sedan, SUV, Pickup.                                                          |
| `transmission`     | object  | Manual or automatic.                                                                         |
| `fuelType`         | object  | Fuel type, e.g. Gas, Diesel, Electric.                                                       |
| `exteriorColor`    | object  | Exterior colour (used cars).                                                                 |
| `engineCc`         | number  | Engine size in cc, when available.                                                           |
| `goodDeal`         | boolean | Marked by Hatla2ee as a good deal.                                                           |
| `lowKm`            | boolean | Marked as a low mileage car.                                                                 |
| `financed`         | boolean | Listed as financed.                                                                          |
| `imported`         | boolean | Imported car.                                                                                |
| `taxi`             | boolean | Former taxi.                                                                                 |
| `classic`          | boolean | Classic car.                                                                                 |
| `disabled`         | boolean | Adapted for drivers with disabilities.                                                       |
| `status`           | string  | Launch status of a new vehicle, e.g. `launched`.                                             |
| `launchDate`       | string  | Launch date of a new vehicle.                                                                |
| `variantCount`     | number  | Number of trims of a model (model-level new vehicle records).                                |
| `warrantyYears`    | number  | Warranty duration in years, when available.                                                  |
| `warrantyKm`       | number  | Warranty distance in kilometres, when available.                                             |
| `assembledIn`      | string  | Country of assembly, when available.                                                         |
| `origin`           | string  | Country of origin, when available.                                                           |
| `brochureUrl`      | string  | Link to the manufacturer brochure, when available.                                           |
| `location`         | object  | `id`, `title`, `breadcrumbs` (country > region > city), `latitude`, `longitude` (used cars). |
| `images`           | array   | Photo URLs.                                                                                  |
| `seller`           | object  | `name`, `email`, `mobile`, `whatsapp`, `verified` and `memberSince` as shown on the listing. |
| `agency`           | object  | Dealer / showroom information when the seller is a dealer.                                   |
| `postedAt`         | string  | When the listing was posted or last refreshed (ISO 8601).                                    |
| `updatedAt`        | string  | When the catalog entry was last updated (ISO 8601).                                          |

***

### ❓ FAQ

**Which countries are supported?**

Egypt (`eg`), Kuwait (`kuwait`), Oman (`oman`), Qatar (`qatar`), Saudi Arabia (`ksa`) and the UAE (`uae`). Use the matching `https://<country>.hatla2ee.com/en/...` URL.

**What is the difference between used and new vehicle URLs?**

URLs starting with `/en/car/` (and `/en/imported-car`) return used car listings. URLs starting with `/en/new-car/`, `/en/new-trucks/`, `/en/new-bus/` and `/en/new-motorcycle/` return new vehicles from the Hatla2ee catalog. The `type` field of every record tells you which one it is.

**Why do new vehicle search URLs return several records for one model?**

Search URLs list individual trims, just like the website, so a model with four trims returns four records with their own prices. Make pages such as `/en/new-car/mercedes` list models instead and fill `minOfficialPrice`, `maxOfficialPrice` and `variantCount`.

**Can I start from a later page?**

Yes. Use a URL that already contains the page, such as `.../new-car/search?page=6` or `.../car/electric/page/2`. The scraper starts there and continues with the following pages until `maxItems` is reached or there are no more results.

**Is there a limit on how many results one URL can return?**

For used car searches, the website serves up to 10,000 results per search. Narrow the search with filters, for example by make, city or price, to reach the rest.

**Why was my URL skipped?**

URLs from other websites, unknown filters, or pages that are not search results (for example price tables or comparison pages) are skipped, and a warning is written to the log.

**Do I need a proxy?**

No. The scraper works without a proxy, which keeps run costs low. You can add one in the input if you prefer.

**What does the seller information contain?**

The name and contact details exactly as they appear on the public listing. Not every listing shows every contact method, so `email`, `mobile` and `whatsapp` can be `null`. Make sure your use of this data complies with the privacy rules that apply to you.

***

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

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

[Dubizzle Saudi Arabia Scraper](https://apify.com/boring_internet_explorer/dubizzle-scraper) - Scrape listing data from Dubizzle Saudi Arabia, the leading classifieds marketplace in KSA, across vehicles, properties, electronics and more.

[Haraj Scraper](https://apify.com/boring_internet_explorer/haraj-scraper) - Scrape listings from Haraj, Saudi Arabia's largest classifieds platform, including cars, real estate, electronics and 20+ categories.

[OpenSooq Scraper](https://apify.com/boring_internet_explorer/opensooq-scraper) - Scrape structured listing data from OpenSooq, the largest classifieds marketplace in MENA, across 20 markets and 17 categories.

[Soum Product Scraper](https://apify.com/boring_internet_explorer/soum-scraper) - Scrape product data from soum.sa, Saudi Arabia's marketplace for new and used products.

***

### 🛠️ Need a custom extension?

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

# Actor input Schema

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

Hatla2ee search or listing URLs (eg, kuwait, oman, qatar, ksa, uae). Filters in the URL are applied. A /page/N suffix or ?page=N starts from that page.

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

The maximum number of items to fetch for each start URL

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

Your proxy configuration from Apify

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://eg.hatla2ee.com/en/car/search"
    }
  ],
  "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://eg.hatla2ee.com/en/car/search"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boring_internet_explorer/hatla2ee-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://eg.hatla2ee.com/en/car/search" }] }

# Run the Actor and wait for it to finish
run = client.actor("boring_internet_explorer/hatla2ee-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://eg.hatla2ee.com/en/car/search"
    }
  ]
}' |
apify call boring_internet_explorer/hatla2ee-scraper --silent --output-dataset

```

## MCP server setup

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