# Chotot.com Scraper | Vietnam Classifieds & Property (`haketa/chotot-scraper`) Actor

Cho Tot scraper & API (Vietnam classifieds): search listings by keyword and category and export title, price, description, location, seller, attributes, photos, date and URL. Vietnam marketplace and resale market data plus seller lead gen — fast, no login.

- **URL**: https://apify.com/haketa/chotot-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Developer tools, Automation, Real estate
- **Features:** Limited permissions
- **Stats:** 23 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 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?

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

## Chotot.com Scraper — Vietnam Classifieds, Real Estate, Cars, Motorbikes & Electronics Data Extractor

> **Extract structured listings from [Chotot.com](https://www.chotot.com) (Chợ Tốt) — Vietnam's largest online classifieds and property marketplace.** Scrape **real estate (`Bất động sản` — apartments, houses, land, rooms for rent), used cars (`Ô tô`), motorbikes (`Xe máy`), trucks, smartphones, laptops, home appliances, and fashion** across **Ho Chi Minh City (HCMC), Hanoi, Da Nang, Hai Phong, Can Tho, Binh Duong, Dong Nai, and nationwide**. Returns normalized VND prices, human-readable Vietnamese price labels (`triệu` / `tỷ VND`), GPS coordinates, property specs (`m²`, bedrooms, legal documents `Sổ đỏ`/`Sổ hồng`), vehicle specs (make, model, year, mileage, fuel, transmission), verified seller badges, and optional seller phone numbers.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-00C853?style=flat-square\&logo=apify)](https://apify.com/haketa/chotot-scraper)
[![Market](https://img.shields.io/badge/Market-Vietnam%20%F0%9F%87%BB%F0%9F%87%B3-red?style=flat-square)]()
[![Deep Pagination](https://img.shields.io/badge/Scale-1%2C000%2B%20Listings%20Pagination-orange?style=flat-square)]()
[![Multi Category](https://img.shields.io/badge/Coverage-Property%20%7C%20Vehicles%20%7C%20Electronics-blue?style=flat-square)]()
[![Data Formats](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel%20%7C%20API-purple?style=flat-square)]()

***

### ⚡ At a glance

| Capability | Details |
| --- | --- |
| **Target Platform** | [Chotot.com](https://www.chotot.com) (`Chợ Tốt` — Vietnam's #1 peer-to-peer & dealer marketplace) |
| **Supported Categories** | **Real Estate (`1000`):** Apartments (`1010`), Houses (`1020`), Land (`1040`), Rooms (`1050`) · **Vehicles:** Cars (`2010`), Motorbikes (`2020`), Trucks (`2050`) · **Electronics & Goods:** Phones (`5010`), Laptops (`5030`), TV/Audio (`5020`), Appliances (`9000`), Fashion (`3000`) · **All Categories (`all`)** |
| **Geographic Scope** | All Vietnam (`0`), Hồ Chí Minh (`12000`), Hà Nội (`13000`), Đà Nẵng (`15000`), Hải Phòng (`17000`), Cần Thơ (`19000`), Bình Dương (`24000`), Đồng Nai (`25000`), Khánh Hòa (`48000`) |
| **Key Extracted Fields** | `listingId`, `subject`, `price` (VND), `priceDisplay`, `category`, `type` (`Bán`/`Cho thuê`), `region`, `district`, `ward`, `latitude`, `longitude`, `sellerName`, `isVerified`, `images`, `date` |
| **Detail Enrichment (`scrapeDetails`)** | Adds `sellerPhone`, full `description`, complete photo gallery, and additional property/vehicle attributes |
| **Pagination & Scale** | Automatic offset pagination (`maxPages: 0` = unlimited, governed by `maxRecords` up to **1,000–50,000+ listings**) |
| **Deduplication** | Built-in deduplication by `listingId` across pages and categories (0% duplicates) |
| **Export Formats** | JSON, JSONL, CSV, Excel (XLSX), XML, HTML Table, REST API, Webhooks |

***

### 🔎 Why scrape Chotot.com (Chợ Tốt)?

**Chotot.com (Chợ Tốt)** is Vietnam's largest consumer and commercial classifieds ecosystem, hosting millions of active listings posted daily by property brokers, landlords, auto dealerships, motorbike traders, electronics resellers, and private individuals.

Collecting clean Chotot market data at scale requires overcoming several platform-specific hurdles:

- **Raw đồng integers & Vietnamese shorthand:** Prices range from tens of thousands of đồng (`50.000 VND`) to tens of billions (`15.500.000.000 VND` = `15.5 tỷ VND`). Having both the raw numeric integer (`price`) for math and the formatted Vietnamese label (`priceDisplay`) for reporting saves hours of post-processing.
- **Coded vehicle & property attributes:** Chotot encodes transmission (`1` = `Tự động`, `2` = `Số sàn`), fuel (`1` = `Xăng`, `2` = `Dầu diesel`, `3` = `Điện`, `4` = `Hybrid`), deal type (`s` = `Bán`, `u`/`k` = `Cho thuê`), and colors as internal numeric codes.
- **Location vs. living area collision:** In Chotot's raw data, `area` is an internal district code while `size` is the actual property square meterage (`m²`) — naive scrapers mix them up and corrupt vehicle rows with location codes.

This **Chotot scraper** handles all of those translations automatically, delivering a universal flat schema with accurate `m²` property areas, translated Vietnamese vehicle specs, WGS-84 GPS coordinates, ISO posting dates, and high-resolution CDN image URLs.

***

### ✨ What this Chotot data extractor does

- 🏘️ **Full Real Estate Coverage (`Bất động sản`):** Scrape all property (`1000`) or target Apartments/Condos (`1010`), Houses (`1020`), Land (`1040`), and Rooms for Rent (`1050`) with `area` (`m²`), `bedroomCount`, `bathroomCount`, `houseDirection`, `legalDocument` (`Sổ hồng`/`Sổ đỏ`), `furniture`, and `floorCount`.
- 🛵 **Vietnam Automotive & Motorbike Intelligence (`Xe cộ`):** Extract Cars (`2010`), Motorbikes (`2020`), and Trucks (`2050`) with `make`, `model`, `year`, `mileage` (`km`), `transmission`, `fuelType`, `color`, `seats`, and `origin`.
- 📱 **Electronics, Appliances & Consumer Goods:** Monitor second-hand Phones (`5010`), Laptops (`5030`), TVs & Audio (`5020`), Home Appliances (`9000`), and Fashion (`3000`).
- 🔓 **Unlocked 1,000+ Deep Pagination:** With `maxPages: 0` by default, the actor paginates across 20-listing offsets until `maxRecords` is reached — scaling cleanly to **1,000+ listings** per category or balanced across all categories (`category: "all"`).
- 📍 **Ward, District & GPS Precision:** Captures the full 3-tier Vietnamese administrative hierarchy (`region` → `district` → `ward`) plus `latitude` and `longitude` on nearly 100% of listings.
- 📞 **Optional Detail & Phone Enrichment (`scrapeDetails: true`):** Fetches each listing's detail record to populate `sellerPhone`, full un-truncated `description`, complete `images` gallery, and backfilled property/vehicle specs.

***

### 🎯 High-value use cases & Vietnam market intelligence

#### 1. Vietnam PropTech, AVM & Real Estate Analytics

Track asking prices and **VND/m²** across Ho Chi Minh City (`Quận 1`, `Quận 2 / Thủ Đức`, `Quận 7`, `Bình Thạnh`), Hanoi (`Cầu Giấy`, `Đống Đa`, `Hà Đông`, `Nam Từ Liêm`), and Da Nang. Compare sale (`Bán`) vs. rental (`Cho thuê`) yields.

#### 2. Used Car & Motorbike Residual Value Benchmarking

Vietnam is one of the world's largest two-wheeler markets and a rapidly growing automotive market. Track depreciation curves for Honda (`Vision`, `SH`, `Wave`, `Air Blade`), Yamaha, VinFast EVs, Toyota, Hyundai, Kia, and Mazda by registration `year` and `mileage`.

#### 3. B2B Seller, Broker & Dealer Lead Generation

Combine `sellerName`, `isVerified`, `region`, `district`, and `sellerPhone` (with `scrapeDetails: true`) to build targeted outreach lists of active property brokers, car dealers, and high-volume electronics merchants.

#### 4. Recommerce & Second-Hand Electronics Arbitrage

Monitor live asking prices for used iPhones, Samsung Galaxy devices, MacBooks, and gaming laptops across HCMC and Hanoi to spot underpriced inventory and benchmark trade-in values.

#### 5. Urban Economics, Relocation & GIS Mapping

Use `latitude`, `longitude`, `ward`, `district`, and `price` to generate heatmaps of housing affordability, commercial density, and EV adoption across Vietnamese provinces.

***

### 📥 Input parameters

All fields are optional. Running with empty input automatically extracts a balanced 100-listing sample across all major categories.

| Parameter | Type | Default / Prefill | Description |
| --- | --- | --- | --- |
| `category` | `string` | Default `"all"` (Prefill `"1000"`) | Category code from the dropdown:<br>• `"all"` — Mixed sample across Real Estate, Cars, Motorbikes, Phones, Laptops & Appliances<br>• `"1000"` — Real Estate (All) · `"1010"` Apartments · `"1020"` Houses · `"1040"` Land · `"1050"` Rooms for Rent<br>• `"2010"` — Cars (`Ô tô`) · `"2020"` — Motorbikes (`Xe máy`) · `"2050"` — Trucks (`Xe tải`)<br>• `"5010"` — Phones · `"5030"` — Laptops · `"5020"` — TVs & Audio · `"9000"` — Home Appliances · `"3000"` — Fashion |
| `region` | `string` | `"12000"` (HCMC) | City or province filter:<br>• `"0"` — All Vietnam (Nationwide)<br>• `"12000"` — Hồ Chí Minh (HCMC) · `"13000"` — Hà Nội · `"15000"` — Đà Nẵng · `"17000"` — Hải Phòng<br>• `"19000"` — Cần Thơ · `"24000"` — Bình Dương · `"25000"` — Đồng Nai · `"48000"` — Khánh Hòa |
| `scrapeDetails` | `boolean` | `false` | Open each listing's detail endpoint to extract `sellerPhone`, full `description`, complete photo gallery, and extra property/vehicle specs. |
| `maxRecords` | `integer` | `100` | Maximum number of listings to collect (`0` = unlimited). Set to `1000+` for deep pulls. (Also accepts `maxItems` / `maxListings`). |
| `maxPages` | `integer` | `0` | Optional cap on result pages per category (`20` listings/page). `0` = unlimited (governed by `maxRecords`). |
| `requestDelay` | `integer` | `500` | Pause between API requests in milliseconds (`200` to `5000`). |
| `proxyConfiguration` | `object` | `{ "useApifyProxy": true }` | Apify Proxy configuration. Enabled by default for smooth, uninterrupted pagination at scale. |

***

### 🛠️ Input recipes & examples

#### Recipe 1: Deep 1,000+ Ho Chi Minh City real estate sweep

Collect 1,500 apartments, houses, and land listings in Ho Chi Minh City:

```json
{
  "category": "1000",
  "region": "12000",
  "scrapeDetails": false,
  "maxRecords": 1500,
  "maxPages": 0,
  "requestDelay": 500,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

#### Recipe 2: Used cars (`Ô tô`) nationwide with seller phone numbers

Extract 500 used car listings across all of Vietnam (`region: "0"`) with detail enrichment enabled:

```json
{
  "category": "2010",
  "region": "0",
  "scrapeDetails": true,
  "maxRecords": 500,
  "maxPages": 0,
  "requestDelay": 500
}
```

#### Recipe 3: Multi-category nationwide marketplace snapshot (1,200 listings)

Pull 1,200 listings balanced evenly across Real Estate, Cars, Motorbikes, Phones, Laptops, and Home Appliances in Hanoi:

```json
{
  "category": "all",
  "region": "13000",
  "scrapeDetails": false,
  "maxRecords": 1200,
  "maxPages": 0
}
```

***

### 📤 Output schema & field reference

Every listing shares a unified flat JSON schema so property, automotive, and electronics records can be analyzed together.

#### 🏷️ Core Listing, Price & Location Fields

| Field | Type | Coverage | Description |
| --- | --- | --- | --- |
| `listingId` | `string` | 🟢 High (100%) | Unique Chotot ad ID (`list_id`). Primary deduplication key. |
| `subject` | `string` | 🟢 High (100%) | Listing headline in Vietnamese. |
| `category` | `string` | 🟢 High (100%) | Vietnamese category name (`"Căn hộ/Chung cư"`, `"Nhà ở"`, `"Ô tô"`, `"Xe máy"`, `"Điện thoại"`, etc.). |
| `type` | `string` | 🟢 High (100%) | Transaction type: `"Bán"` (For Sale) or `"Cho thuê"` (For Rent). |
| `price` | `number` | 🟢 High (~99%) | Numeric price in Vietnamese đồng (`VND`, e.g., `6500000`, `2850000000`). |
| `priceDisplay` | `string` | 🟢 High (~99%) | Human-readable Vietnamese price string (e.g., `"7 triệu VND"`, `"2.9 tỷ VND"`). |
| `region` | `string` | 🟢 High (100%) | City or province name (`"Tp Hồ Chí Minh"`, `"Hà Nội"`, `"Đà Nẵng"`). |
| `district` | `string` | 🟢 High (100%) | District name (`"Quận 7"`, `"Quận Cầu Giấy"`, `"Thành phố Thủ Đức"`). |
| `ward` | `string` | 🟢 High (~96%) | Ward / commune name (`"Phường Tân Phong"`, `"Phường Kiến Hưng"`). |
| `latitude` / `longitude` | `number` | 🟢 High (~99%) | WGS-84 GPS coordinates for map plotting and spatial queries. |
| `condition` | `string` | 🟡 Conditional | Item condition (`"Đã sử dụng"` = Used, `"Mới"` = New) on vehicles/electronics/goods. |

#### 🏠 Real Estate Specific Fields (`1000`–`1050`)

| Field | Type | Coverage (Property) | Description |
| --- | --- | --- | --- |
| `area` | `number` | 🟢 High (~98% Property) | Living or land area in square meters (`m²`). Cleanly nulled on non-property listings. |
| `bedroomCount` | `number` | 🟢 High (~85% Apartments/Houses) | Number of bedrooms (`phòng ngủ`). |
| `bathroomCount` | `number` | 🟢 High (~80% Apartments/Houses) | Number of bathrooms (`phòng vệ sinh`). |
| `legalDocument` | `string` | 🟡 Conditional | Legal ownership status (`Sổ hồng`, `Sổ đỏ`, `Hợp đồng mua bán`). |
| `houseDirection` | `string` | 🟡 Conditional | Facing direction (`Đông`, `Tây`, `Nam`, `Bắc`, `Đông Nam`, etc.). |
| `furniture` | `string` | 🟡 Conditional | Furnishing status (`Nội thất đầy đủ`, `Nội thất cơ bản`, `Nhà trống`). |
| `floorCount` | `number` | 🟡 Conditional | Total number of floors (for houses/buildings). |

#### 🚗 Vehicle Specific Fields (`2010`, `2020`, `2050`)

| Field | Type | Coverage (Vehicles) | Description |
| --- | --- | --- | --- |
| `make` | `string` | 🟢 High (~98% Cars/Bikes) | Vehicle manufacturer (`"Toyota"`, `"Honda"`, `"Hyundai"`, `"VinFast"`, `"Yamaha"`). |
| `model` | `string` | 🟢 High (~95% Cars/Bikes) | Vehicle model (`"Vios"`, `"Air Blade"`, `"VF 5"`, `"Accent"`). |
| `year` | `number` | 🟢 High (~95% Cars/Bikes) | Registration / manufacture year (e.g., `2022`). |
| `mileage` | `number` | 🟢 High (~90% Used Vehicles) | Odometer reading in kilometers (`km`). |
| `transmission` | `string` | 🟢 High (~95% Cars) | Translated transmission type (`"Tự động"` = Automatic, `"Số sàn"` = Manual). |
| `fuelType` | `string` | 🟢 High (~95% Cars) | Translated fuel type (`"Xăng"` = Petrol, `"Dầu diesel"`, `"Điện"` = Electric, `"Hybrid"`). |
| `color` | `string` | 🟡 Conditional | Translated exterior color (`"Trắng"`, `"Đen"`, `"Đỏ"`, `"Bạc"`, etc.). |
| `seats` / `origin` | `number/string` | 🟡 Conditional | Number of seats and manufacturing origin (`"Việt Nam"`, `"Nhập khẩu"`). |

#### 👤 Seller, Media & Timestamp Fields

| Field | Type | Coverage | Description |
| --- | --- | --- | --- |
| `sellerName` | `string` | 🟢 High (100%) | Seller or shop display name. |
| `isVerified` | `boolean` | 🟢 High (100%) | `true` if the seller holds Chotot's verified account/shop badge. |
| `sellerPhone` | `string` | 🟡 Conditional (`scrapeDetails`) | Seller phone number fetched from the detail API when `scrapeDetails: true`. |
| `description` | `string` | 🟢 High (100%) | Ad description text (summary in list mode, full text in detail mode). |
| `images` | `array<string>` | 🟢 High (~98%) | Array of direct `cdn.chotot.com` photo URLs. |
| `listingUrl` | `string` | 🟢 High (100%) | Direct URL to the listing (`https://www.chotot.com/{listingId}.htm`). |
| `date` | `string` | 🟢 High (100%) | Normalized ISO posting date (`YYYY-MM-DD`). |
| `datePosted` | `string` | 🟢 High (~98%) | Relative Vietnamese timestamp string when provided. |
| `scrapedAt` | `string` | 🟢 High (100%) | ISO-8601 UTC extraction timestamp. |

***

### 📋 Sample JSON output

```json
{
  "listingId": "135580725",
  "subject": "Cho thuê căn hộ 70m2, 2 ngủ, 1 vệ sinh đầy đủ nội thất",
  "category": "Căn hộ/Chung cư",
  "type": "Cho thuê",
  "price": 6500000,
  "priceDisplay": "7 triệu VND",
  "area": 70,
  "ward": "Phường Kiến Hưng",
  "district": "Quận Hà Đông",
  "region": "Hà Nội",
  "bedroomCount": 2,
  "bathroomCount": 1,
  "houseDirection": null,
  "legalDocument": null,
  "furniture": null,
  "floorCount": null,
  "make": null,
  "model": null,
  "year": null,
  "mileage": null,
  "transmission": null,
  "fuelType": null,
  "color": null,
  "seats": null,
  "origin": null,
  "condition": null,
  "latitude": 20.952806,
  "longitude": 105.785,
  "isVerified": true,
  "sellerName": "nguyen duc cuong",
  "sellerPhone": null,
  "description": "Căn hộ 2 phòng ngủ, 1 vệ sinh, nội thất cơ bản, vào ở ngay...",
  "images": [
    "https://cdn.chotot.com/Q3ywS2lpcMQP0Obrbwj5rd9oiCqc0K2EgLnx1vF4vVQ/preset:view/plain/0a4d0aaf.jpg"
  ],
  "listingUrl": "https://www.chotot.com/135580725.htm",
  "date": "2026-11-10",
  "datePosted": "5 phút trước",
  "scrapedAt": "2026-11-10T02:30:00.000Z"
}
```

***

### 🔁 Pagination & 1,000+ scaling

- **Offset-Based Deep Pagination:** Each request fetches 20 listings (`limit=20, o=0, 20, 40...`). With `maxPages: 0` by default, the scraper continues incrementing the offset until `totalSaved` reaches `maxRecords` (whether `100`, `1,000`, or `10,000+`) or the category is exhausted.
- **Balanced Multi-Category Sampling (`category: "all"`):** When `category` is set to `"all"`, the actor automatically divides `maxRecords` across Real Estate (`1000`), Cars (`2010`), Motorbikes (`2020`), Phones (`5010`), Laptops (`5030`), and Appliances (`9000`) so your dataset is evenly balanced.
- **Fast Execution:** List mode (`scrapeDetails: false`) collects **100 listings in ~5–10 seconds** and **1,000 listings in ~40–60 seconds**.

***

### 💻 API & integration examples

#### Python (`apify-client`)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("haketa/chotot-scraper").call(run_input={
    "category": "1000",
    "region": "12000",
    "scrapeDetails": False,
    "maxRecords": 1000,
    "maxPages": 0,
})

for ad in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(ad["listingId"], ad["subject"], ad["priceDisplay"], ad["district"], ad["area"])
```

#### Node.js (`apify-client`)

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('haketa/chotot-scraper').call({
    category: '2020',
    region: '13000',
    maxRecords: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Saved ${items.length} Hanoi motorbike listings`);
```

***

### 🗂️ Chotot category & region code reference

#### Category Codes (`category`)

| Code | Vietnamese Name | English Category | Key Extracted Attributes |
| --- | --- | --- | --- |
| `all` | Tất cả danh mục | All Categories (Balanced Mix) | Balanced sample across Real Estate, Cars, Motorbikes, Phones, Laptops & Appliances |
| `1000` | Bất động sản | Real Estate (All) | `area` (`m²`), `bedroomCount`, `bathroomCount`, `legalDocument`, `houseDirection`, `furniture`, `floorCount` |
| `1010` | Căn hộ/Chung cư | Apartments & Condos | Apartment `area`, `bedroomCount`, `bathroomCount`, `furniture`, `legalDocument` |
| `1020` | Nhà ở | Houses & Villas | Land/living `area`, `floorCount`, `bedroomCount`, `houseDirection`, `legalDocument` |
| `1040` | Đất | Land Lots | Land `area` (`m²`), `legalDocument` (`Sổ đỏ`/`Sổ hồng`), `houseDirection`, GPS coordinates |
| `1050` | Phòng trọ | Rooms for Rent | Monthly rental `price` (VND), `area` (`m²`), `ward`, `district`, `furniture` |
| `2010` | Ô tô | Cars | `make`, `model`, `year`, `mileage`, `transmission`, `fuelType`, `color`, `seats`, `origin` |
| `2020` | Xe máy | Motorbikes & Scooters | `make`, `model`, `year`, `mileage`, `condition`, `price` (VND) |
| `2050` | Xe tải, xe ben | Commercial Trucks | `make`, `model`, `year`, `mileage`, `fuelType`, `origin` |
| `5010` | Điện thoại | Smartphones | `subject`, `price`, `condition`, `sellerName`, `isVerified`, `district` |
| `5030` | Laptop | Laptops & Notebooks | `subject`, `price`, `condition`, `description`, `images` |
| `5020` | Tivi, Âm thanh | TVs & Audio Equipment | `subject`, `price`, `condition`, `description`, `images` |
| `9000` | Đồ gia dụng, Nội thất | Home Appliances & Furniture | `subject`, `price`, `condition`, `district`, `region` |
| `3000` | Thời trang | Fashion & Personal Goods | `subject`, `price`, `condition`, `sellerName`, `images` |

#### Region Codes (`region`)

| Code | Vietnamese Region | English Name | Economic & Market Profile |
| --- | --- | --- | --- |
| `0` | Toàn quốc | All Vietnam (Nationwide) | Complete national inventory across all 63 provinces and municipalities |
| `12000` | Tp Hồ Chí Minh | Ho Chi Minh City (HCMC) | Vietnam's largest commercial hub; highest volume of condos, houses, cars & electronics |
| `13000` | Hà Nội | Hanoi | Capital city; high-volume residential property, automotive & consumer marketplace |
| `15000` | Đà Nẵng | Da Nang | Central Vietnam coastal tech, tourism & resort real estate hub |
| `17000` | Hải Phòng | Hai Phong | Major northern port, industrial logistics & residential market |
| `19000` | Cần Thơ | Can Tho | Mekong Delta commercial center |
| `24000` | Bình Dương | Binh Duong | Industrial park & commuter residential hub bordering HCMC |
| `25000` | Đồng Nai | Dong Nai | Fast-growing infrastructure & land market near Long Thanh International Airport |
| `48000` | Khánh Hòa | Khanh Hoa (Nha Trang) | Coastal hospitality, condo & land investment market |

***

### 🔌 Workflow automation & BI integrations

1. **Vietnam Property Price-Per-m² Tracker (Google Sheets / BigQuery):** Schedule daily runs for `category: "1000"` in `region: "12000"` (HCMC) and `"13000"` (Hanoi), compute `price / area` (VND/m²) by `district` and `ward`, and visualize trends in Looker Studio or Power BI.
2. **Used Vehicle Deal Alerts (Make / Zapier / n8n / Telegram):** Monitor `category: "2010"` (Cars) or `"2020"` (Motorbikes) and trigger instant alerts when a specific `make`, `model`, and `year` appears below your target VND threshold.
3. **B2B Seller Lead Enrichment:** Run with `scrapeDetails: true` to collect `sellerName`, `sellerPhone`, `isVerified`, `district`, and `region` for CRM import.

***

### ⚠️ Known limitations

- **Phone number masking on anonymous requests:** When `scrapeDetails: true` is enabled, `sellerPhone` returns the phone string provided by Chotot's public detail endpoint (which Chotot may partially mask on certain listings for unauthenticated visitors).
- **Detail mode speed:** Enabling `scrapeDetails: true` makes one additional request per listing (respecting `requestDelay`), so keep `scrapeDetails: false` when performing rapid 1,000+ listing market sweeps.

***

### ❓ Frequently Asked Questions

#### How do I scrape 1,000+ listings in a single run?

Set `maxRecords: 1000` (or `0` for unlimited) and keep `maxPages: 0`. The scraper will automatically paginate through as many 20-item pages as needed to reach your target.

#### Does the scraper preserve Vietnamese diacritics (`Tiếng Việt`)?

Yes. All text fields (`subject`, `description`, `region`, `district`, `ward`, `category`, `sellerName`) are preserved in clean UTF-8 encoding.

#### Why is `area` only populated on Real Estate listings?

`area` represents square meters (`m²`) of living or land space (`ad.size`), which only applies to real estate (`1000`–`1050`). Vehicle and electronics listings cleanly output `area: null`.

***

### 🔗 Related scrapers

- [Lamudi Philippines Real Estate Scraper](https://apify.com/haketa/lamudi-scraper) — Philippine property listings across Manila, Cebu, and Davao.
- [Realestate.com.kh Scraper (Cambodia)](https://apify.com/haketa/realestate-com-kh-scraper) — Cambodia property listings and agent data.
- [Lelong.my Scraper (Malaysia)](https://apify.com/haketa/lelong-my-scraper) — Malaysian e-commerce and marketplace listings.
- [Kleinanzeigen.de Scraper (Germany)](https://apify.com/haketa/kleinanzeigen-scraper) — Germany's largest classifieds marketplace.
- [OLX Brasil Scraper](https://apify.com/haketa/olx-brasil-scraper) — Brazil's largest classifieds platform.

***

### 📋 Changelog

| Version | Date | Highlights |
| --- | --- | --- |
| **v1.2** | `2026-11` | **Unlocked 1,000+ deep pagination & native Apify Proxy integration:** Standardized `Actor.createProxyConfiguration()` session rotation, added `maxItems` / `maxListings` input aliases alongside `maxRecords`, verified unlimited `maxPages: 0` pagination for 1,000+ listing pulls, and added explicit completion status messages. |
| **v1.1** | `2026-11` | Fixed CDN image URL double-prefixing, isolated property `area` (`m²`) from vehicle internal region codes, and converted `list_time` epoch timestamps into ISO `YYYY-MM-DD` `date` values. |
| **v1.0** | `2026-05` | Initial release covering Chotot real estate, vehicles, electronics, and multi-category nationwide extraction. |

# Changelog

This Actor's version history is a separate document: https://apify.com/haketa/chotot-scraper/changelog.md

# Actor input Schema

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

Which kind of listings to collect. Choose 'All Categories' for a mixed sample across real estate, vehicles, electronics and more. A parent category (e.g. Real Estate, Electronics) returns all of its sub-types.

## `region` (type: `string`):

Which city or province to search in. Choose 'All Vietnam' to cover the whole country.

## `scrapeDetails` (type: `boolean`):

Turn on to open each listing and collect the seller phone number, full description, every photo and extra specs. Richer results, but slower.

## `maxRecords` (type: `integer`):

Stop after this many listings. Set 0 for no limit. A good starting point is 100.

## `maxPages` (type: `integer`):

Optional cap on how many result pages to load per category. Each page holds up to 20 listings. Leave 0 for no limit.

## `requestDelay` (type: `integer`):

Pause between requests to stay gentle on the source. 500–1000 ms works well.

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

Recommended. Uses Apify Proxy for reliable, uninterrupted collection at higher volumes.

## Actor input object example

```json
{
  "category": "1000",
  "region": "12000",
  "scrapeDetails": false,
  "maxRecords": 100,
  "maxPages": 0,
  "requestDelay": 500,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `listingId` (type: `string`):

No description

## `subject` (type: `string`):

No description

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

No description

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

No description

## `priceDisplay` (type: `string`):

No description

## `area` (type: `string`):

No description

## `district` (type: `string`):

No description

## `region` (type: `string`):

No description

## `make` (type: `string`):

No description

## `model` (type: `string`):

No description

## `sellerPhone` (type: `string`):

No description

## `listingUrl` (type: `string`):

No description

## `scrapedAt` (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 = {
    "category": "1000",
    "region": "12000",
    "scrapeDetails": false,
    "maxRecords": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/chotot-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 = {
    "category": "1000",
    "region": "12000",
    "scrapeDetails": False,
    "maxRecords": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/chotot-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 '{
  "category": "1000",
  "region": "12000",
  "scrapeDetails": false,
  "maxRecords": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/chotot-scraper --silent --output-dataset

```

## MCP server setup

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