# Chotot Vietnam Listings Scraper (`zinin/chotot-listings`) Actor

Pull live classified ad listings (real estate, vehicles, electronics, jobs and more) straight from Chotot's own public JSON API by region and category. No login, no browser, no proxies.

- **URL**: https://apify.com/zinin/chotot-listings.md
- **Developed by:** [Tim Zinin](https://apify.com/zinin) (community)
- **Categories:** Real estate, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Chotot Listings — Vietnam Classifieds Scraper

Chotot is Vietnam's biggest classifieds marketplace — real estate, vehicles, electronics and more, listed by individual sellers across the country, entirely in Vietnamese. This Actor pulls live ads straight from Chotot's own public listing API by region and category, and returns one row per ad: title, price, area, category, seller and a direct link — no browser, no proxies, no login.

### What you get

- **Live ads, not a stale export.** The same feed that powers chotot.com search results — title, price, area, category, seller and direct listing URL for every ad matching your region/category query.
- **Any Chotot region or category.** Ho Chi Minh City, Hanoi, or any other of Chotot's location codes, filtered to real estate, vehicles, or left open to all categories in that region.
- **No login, no proxies, no browser.** One keyless GET per query, straight to Chotot's own public listing API.
- **Built for lists.** Concurrency up to 20, one query per line, so a portfolio of regions/categories is a single run.
- Runs on Apify: schedule it, monitor it, call it from the API or the MCP server, export to JSON, CSV or Excel, or push results straight into your own pipeline.

### How to run it

1. Click **Try for free** — no card needed on the free plan.
2. Paste your region/category queries into **Region / category queries**, one per line — e.g. `13000:1000` for Ho Chi Minh City real estate, or `12000` for all of Hanoi.
3. Press **Start**. Results appear in the dataset — read them in the UI, pull them from the API, or have a webhook push them onward.

### Pricing

Pay-per-event: **$0.005 per run start + $0.002 per ad found**. No monthly seat, no minimum. 100 ads cost about **$0.21**; 1,000 ads about **$2.01**.

A query that returns nothing is still logged with `found: false` and the reason — and it is **not** charged for. You pay for ads actually delivered, not for attempts.

### Input

| Field | Required | What it does |
|---|---|---|
| `items` | yes | One entry per query: `region_v2` or `region_v2:cg`. `region_v2` is Chotot's location code (13000 = Ho Chi Minh City, 12000 = Hanoi); `cg` is the category code (1000 = real estate, 2000 = vehicles). Omit `cg` for all categories in that region. Up to 25 per run. |
| `maxConcurrency` | no | How many queries to run in parallel, 1–20 (default 5). |

```json
{
    "items": [
        "13000:1000",
        "12000"
    ]
}
```

### Output

One dataset row per ad found. This is a real row from a real run:

```json
{
    "input": "13000:1000",
    "found": true,
    "adId": 133774586,
    "title": "CHÍNH CHỦ BÁN NHÀ GẦN Q1",
    "price": 3950000000,
    "priceStr": "3,95 tỷ",
    "areaName": "Quận Bình Thạnh",
    "category": "Nhà ở",
    "postedAt": "2026-07-26T13:55:52.000Z",
    "image": "https://cdn.chotot.com/__JQpIRzNi-Ql0rrJlvaXEsNoEuUk2u6sGnjkZUWtQQ/preset:listing/plain/10170567e3d06cca404097085c321738-2994852814587351920.jpg",
    "seller": "Quỳnh Bùi Thảo",
    "url": "https://www.chotot.com/133774586.htm",
    "scrapedAt": "2026-07-26T13:56:29.273Z"
}
```

| Field | What it means |
|---|---|
| `input` | The region/category query you passed |
| `found` | Whether the query returned at least one ad |
| `adId` | Chotot's internal ad ID |
| `title` | Ad title, in Vietnamese as listed |
| `price` / `priceStr` | Numeric price and Chotot's own formatted price string |
| `areaName` | District/area name |
| `category` | Category name |
| `postedAt` | ISO timestamp of when the ad was listed |
| `image` | Listing thumbnail image URL |
| `seller` | Seller/account display name |
| `url` | Direct link to the ad on chotot.com |
| `scrapedAt` | When this Actor fetched the row |

#### Need the rest of the picture?

These run on the same account, take the same shape of input and bill the same way, so they slot into an existing pipeline without new plumbing.

| Actor | What it does |
|---|---|
| [Shopify Store Intelligence](https://apify.com/zinin/shopify-store-intelligence) | Confirm a site runs on Shopify and pull store intelligence from its public feeds — product count, price… |
| [Zid Store Products Scraper](https://apify.com/zinin/zid-store-products) | Pull live product catalogs (name, price, sale price, category, image) straight from Zid storefronts — a… |
| [AI Answer Change Alert](https://apify.com/zinin/ai-answer-change-alert) | Track whether an AI assistant's answer to a query you care about changed since last time — new sources… |
| [AI Crawler Access Checker](https://apify.com/zinin/ai-crawler-access-checker) | Check which AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended & more) can access your website |
| [AI Overview Citation Tracker](https://apify.com/zinin/ai-overview-tracker) | For each query that matters, see which sources and domains AI assistants cite in their answer — grounded… |

### FAQ

**Does it need an API key / login?** No — Chotot's listing API is fully public keyless JSON.

**How fresh is the data?** Live at request time — the same feed that powers chotot.com search results.

**What region/category codes can I use?** Any of Chotot's own internal location (`region_v2`) and category (`cg`) codes, visible in the query string of any chotot.com search-results URL. `13000` (Ho Chi Minh City), `12000` (Hanoi), `1000` (real estate) and `2000` (vehicles) are common ones to start from.

**Can I call it from an AI agent?** Yes — standard Apify Actor, callable from the Apify API, the SDK, or the Apify MCP server.

**What this is NOT.** It does not translate Vietnamese listing text, does not extract seller phone numbers or private contact details beyond the public display name, and caps at 50 ads per query — a live sample of a region/category, not a full historical archive.

Found a wrong result, or need a check we don't run? Open an issue on this Actor's page.

***

Built by [zinin](https://apify.com/zinin). Questions? Telegram [@timzinin](https://t.me/timzinin).

# Actor input Schema

## `items` (type: `array`):

One entry per query, format `region_v2` or `region_v2:cg`. `region_v2` is Chotot's location code (e.g. 13000 = Ho Chi Minh City, 12000 = Hanoi) and `cg` is the category code (e.g. 1000 = real estate, 2000 = vehicles). Codes are visible in the query string of any chotot.com search-results URL. Omit `cg` to pull all categories for that region.

## `maxConcurrency` (type: `integer`):

How many queries to run in parallel.

## Actor input object example

```json
{
  "items": [
    "13000:1000",
    "12000"
  ],
  "maxConcurrency": 5
}
```

# 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 = {
    "items": [
        "13000:1000",
        "12000"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zinin/chotot-listings").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 = { "items": [
        "13000:1000",
        "12000",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("zinin/chotot-listings").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 '{
  "items": [
    "13000:1000",
    "12000"
  ]
}' |
apify call zinin/chotot-listings --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/VsR1Kmlj3RhIIsHHw/builds/EQbEmU2DJEjRevnsQ/openapi.json
