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

Scrape Chotot.com (Chợ Tốt) — Vietnam's largest classifieds platform. Property, cars, motorbikes, electronics & furniture in HCMC & Hanoi. Direct API, no browser needed, fast & reliable.

- **URL**: https://apify.com/haketa/chotot-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Developer tools, Automation, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## 🛒 Chotot.com Scraper — Vietnam's Largest Classifieds Platform

Extract listings from **[Chotot.com](https://www.chotot.com/)** (Chợ Tốt) — Vietnam's #1 classifieds marketplace with millions of active listings.

**Property, cars, motorbikes, electronics, furniture and fashion** across Ho Chi Minh City, Hanoi, Da Nang and all 63 provinces.

---

### ⚡ Why This Scraper?

**Zero competitors on Apify Store.** This is the only Chotot.com scraper available.

Unlike Batdongsan.com.vn (which blocks scrapers with Cloudflare), Chotot has a **public API** that returns clean JSON — no browser needed, no anti-bot issues, no CAPTCHA. This makes it the fastest and most reliable Vietnam classifieds scraper possible.

| Feature | Details |
|---|---|
| **Data source** | Public API — clean JSON, no HTML parsing |
| **Speed** | 1,000 listings in ~2 minutes |
| **Reliability** | No browser, no Cloudflare, no bot detection |
| **Memory** | 128MB (ultra-lightweight) |
| **Cost** | ~$0.01 per 1,000 results |
| **Categories** | 7 categories in one scraper |

---

### 📦 What Categories Are Covered?

| Category | Vietnamese | Code | Typical Listings |
|---|---|---|---|
| **Property (Sale)** | Bán nhà đất | 2010 | Apartments, houses, land, villas |
| **Property (Rent)** | Cho thuê nhà đất | 2020 | Apartments, rooms, offices |
| **Cars** | Ô tô | 4020 | Used cars with make, model, year, km |
| **Motorbikes** | Xe máy | 4010 | Honda, Yamaha, Suzuki etc. |
| **Electronics** | Điện tử | 5000 | Phones, laptops, tablets |
| **Furniture** | Nội thất | 7000 | Home furniture and appliances |
| **Fashion** | Thời trang | 9000 | Clothing and accessories |

---

### 🔧 Quick Start

#### Property for sale in Ho Chi Minh City:
```json
{
  "category": "2010",
  "region": "12000",
  "maxRecords": 100
}
````

#### Used cars in Hanoi with seller phone numbers:

```json
{
  "category": "4020",
  "region": "13000",
  "scrapeDetails": true,
  "maxRecords": 200
}
```

#### All categories across all Vietnam:

```json
{
  "category": "all",
  "region": "0",
  "maxRecords": 500
}
```

***

### 📊 Sample Output — Property

```json
{
  "listingId": "102345678",
  "subject": "Bán căn hộ 2PN Quận 7 view sông giá tốt",
  "category": "Bán nhà đất",
  "type": "Bán",
  "price": 2800000000,
  "priceDisplay": "2.8 tỷ VND",
  "area": 65,
  "district": "Quận 7",
  "region": "Hồ Chí Minh",
  "bedroomCount": 2,
  "bathroomCount": 2,
  "houseDirection": "Đông Nam",
  "legalDocument": "Sổ hồng",
  "isVerified": true,
  "sellerName": "Nguyễn Thị B",
  "sellerPhone": "0912345678",
  "listingUrl": "https://www.chotot.com/102345678.htm"
}
```

### 📊 Sample Output — Car

```json
{
  "listingId": "105678901",
  "subject": "Toyota Camry 2020 tự động",
  "category": "Ô tô",
  "type": "Bán",
  "price": 750000000,
  "priceDisplay": "750 triệu VND",
  "make": "Toyota",
  "model": "Camry",
  "year": 2020,
  "mileage": 45000,
  "transmission": "Tự động",
  "fuelType": "Xăng",
  "color": "Trắng",
  "district": "Quận 1",
  "region": "Hồ Chí Minh",
  "listingUrl": "https://www.chotot.com/105678901.htm"
}
```

***

### 🇻🇳 Vietnam-Specific Features

#### Price Formatting

Prices are stored in raw VND and auto-formatted:

| Raw VND | Display |
|---|---|
| 2,800,000,000 | 2.8 tỷ VND |
| 750,000,000 | 750 triệu VND |
| 15,000,000 | 15 triệu VND |

#### Property Legal Documents

- **Sổ đỏ** — Land use rights certificate
- **Sổ hồng** — House ownership certificate
- **Hợp đồng** — Sales contract only

#### Detail API Enrichment

With `scrapeDetails: true`, each listing is enriched via the detail API endpoint:

- **Seller phone number** — Direct contact
- **Full description** — Complete listing text
- **All images** — Full image gallery
- **Extra specifications** — Direction, legal status, furniture level

***

### 🎯 Use Cases

#### 🏢 Vietnam Real Estate Intelligence

Track property prices across HCMC districts (Quận 1, Quận 7, Bình Thạnh, Thủ Đức) and Hanoi neighborhoods. Chotot listings tend to be from individual sellers with more negotiable prices than Batdongsan.

#### 🚗 Used Vehicle Market Analysis

Monitor car and motorbike pricing across Vietnam. Honda and Toyota dominate the market — track depreciation curves, popular models, and regional price differences.

#### 📱 E-commerce Arbitrage

Track electronics and furniture pricing for cross-platform arbitrage. Chotot prices are often 20-40% below retail.

#### 📊 PropTech & Market Research

Feed structured listing data into valuation models, market dashboards, or investment analysis tools. The API delivers clean JSON ideal for data pipelines.

#### 🌍 Foreign Investor Due Diligence

International investors entering Vietnam's property or automotive market need structured data. JSON output with VND prices enables analysis in any BI tool.

***

### ⚠️ Technical Notes

- **No browser needed** — Pure API calls, ultra-fast and lightweight
- **No proxy required** for moderate volumes — API works without authentication
- **Proxy recommended** for 1,000+ records to avoid rate limiting
- **Rate limiting** — 500ms default delay. If you get 429 errors, increase `requestDelay`
- **20 listings per page** — API maximum. 500 records = 25 API calls

***

### 📜 Changelog

| Version | Date | Notes |
|---|---|---|
| 1.0.0 | 2026-05-11 | Initial release — Public API, 7 categories, detail enrichment, tỷ/triệu formatting |

# Actor input Schema

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

Listing category to scrape.

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

Region code. 12000=HCMC, 13000=Hanoi, 15000=Da Nang, 17000=Hai Phong, 0=All Vietnam.

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

Call detail API for each listing to get phone number, full description, all images, seller info and extra specs. Slower but much richer data.

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

Maximum total listings. Set 0 for unlimited.

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

Maximum API pages. Each page has up to 20 listings. Set 0 for unlimited.

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

Delay between API calls. 500-1000ms recommended.

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

Optional. Chotot's public API works without proxy for moderate volumes. Proxy recommended for 1000+ records.

## Actor input object example

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

# Actor output Schema

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

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

No description

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

No description

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

No description

## `isVerified` (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": "2010",
    "region": "12000",
    "scrapeDetails": false,
    "maxRecords": 50,
    "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": "2010",
    "region": "12000",
    "scrapeDetails": False,
    "maxRecords": 50,
    "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("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "2010",
  "region": "12000",
  "scrapeDetails": false,
  "maxRecords": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/chotot-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=haketa/chotot-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Chotot.com Scraper | Vietnam Classifieds & Property",
        "description": "Scrape Chotot.com (Chợ Tốt) — Vietnam's largest classifieds platform. Property, cars, motorbikes, electronics & furniture in HCMC & Hanoi. Direct API, no browser needed, fast & reliable.",
        "version": "0.0",
        "x-build-id": "pQpznaSdisuw9ZqAZ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/haketa~chotot-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-haketa-chotot-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/haketa~chotot-scraper/runs": {
            "post": {
                "operationId": "runs-sync-haketa-chotot-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/haketa~chotot-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-haketa-chotot-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "category": {
                        "title": "Category",
                        "enum": [
                            "2010",
                            "2020",
                            "4020",
                            "4010",
                            "5000",
                            "7000",
                            "9000",
                            "all"
                        ],
                        "type": "string",
                        "description": "Listing category to scrape.",
                        "default": "2010"
                    },
                    "region": {
                        "title": "Region / City",
                        "enum": [
                            "0",
                            "12000",
                            "13000",
                            "15000",
                            "17000"
                        ],
                        "type": "string",
                        "description": "Region code. 12000=HCMC, 13000=Hanoi, 15000=Da Nang, 17000=Hai Phong, 0=All Vietnam.",
                        "default": "12000"
                    },
                    "scrapeDetails": {
                        "title": "Scrape Detail API",
                        "type": "boolean",
                        "description": "Call detail API for each listing to get phone number, full description, all images, seller info and extra specs. Slower but much richer data.",
                        "default": false
                    },
                    "maxRecords": {
                        "title": "Max Records",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum total listings. Set 0 for unlimited.",
                        "default": 0
                    },
                    "maxPages": {
                        "title": "Max Pages",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum API pages. Each page has up to 20 listings. Set 0 for unlimited.",
                        "default": 0
                    },
                    "requestDelay": {
                        "title": "Request Delay (ms)",
                        "minimum": 200,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Delay between API calls. 500-1000ms recommended.",
                        "default": 500
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Optional. Chotot's public API works without proxy for moderate volumes. Proxy recommended for 1000+ records."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
