# Websosanh Scraper - Vietnam Price Comparison & Store Offers (`normdata/websosanh-scraper`) Actor

Scrape Websosanh.vn, Vietnam's price comparison site: products and store listings by category, keyword, brand or store, with price in dong, store count, store, phone, payment and shipping. Add specs, description, every store's offer and the store's own link.

- **URL**: https://apify.com/normdata/websosanh-scraper.md
- **Developed by:** [Norm Data](https://apify.com/normdata) (community)
- **Categories:** E-commerce
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 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

![Norm Data](https://raw.githubusercontent.com/FabriAV/normdata/refs/heads/main/assets/banner_norm2.png)

## 🛒 Websosanh Scraper - Vietnam Price Comparison & Store Offers

Extract products and store listings from **Websosanh.vn**, Vietnam's price comparison site. Every result comes with its **price in dong, the number of stores, the store, its phone and its page**, and for stores that list them **payment methods (cash on delivery, card and its fee, bank transfer), delivery times and shipping costs**. Turn on **Details** for **specs, description, category, the highest price and every store's offer on a product (price, store, phone, payment, shipping, rating and the store's own link)**, and the store's own link for each listing. Pick from **1,158 categories**, search by keyword, filter by brand, store, type and price, paste links, or run it on a schedule to get **only new results**.

> 👉 **Try it now:** press **Start**. The ready-made input gives you 10 results in a few seconds.<br>
> 💰 **$0.012 per result** on the Free plan (10 results per run), from $0.0115 on paid plans. [See pricing](#-pricing)

### ✨ Why this scraper?

> - **The only Websosanh scraper**<br>
>   On the Apify Store.
>
> - **Past the 2,000 limit**<br>
>   A category with 200,000 results is read whole, one price band at a time.
>
> - **Every store's offer**<br>
>   The add-on reads the whole comparison list of a product, not just the cheapest store.
>
> - **Checked against the site**<br>
>   In our tests every price, store, payment and shipping value, spec and offer matched Websosanh's own pages and data.
>
> - **Fast and gentle**<br>
>   About 200 results per request, paced to stay under Websosanh's rate limit. No proxy, no login, no browser.
>
> - **1,158 categories**<br>
>   The main ones in English and the deeper ones in Vietnamese. Pick them from the list or type a name like Refrigerators or Tủ lạnh.
>
> - **Apify platform**<br>
>   Schedule runs, get only new results, export to Excel or CSV, use the API, or connect Google Sheets, Zapier and Make.

### 🚀 How to scrape Websosanh

1. Create a free Apify account.
2. Pick the filters you need, or keep the ready-made input.
3. Click **Start**.
4. Download the results as Excel, CSV or JSON from the **Output** tab.

### 💰 Pricing

#### How much does it cost to scrape Websosanh?

You pay a one-time **$0.003** per run, plus a price for each result saved (and for each add-on you turn on):

| Charged for | Free | Bronze | Silver | Gold+ |
| --- | --- | --- | --- | --- |
| **Result**: One product or store listing saved to the dataset. | 0.012 | 0.0115 | 0.0105 | 0.01 |
| **Details**: Specs, description, category and every store offer for a product, or the store link for a listing. | 0.008 | 0.0075 | 0.007 | 0.0065 |

Example: 1,000 results cost about **$11.5** on Bronze. No proxy or compute costs on top.

### 📦 What data you get

| Field | Description |
| --- | --- |
| `imageUrl` | Product photo. |
| `type` | product (one model compared across stores) or listing (one store's own item). |
| `id` | Websosanh id of the product or listing. |
| `name` | Name as Websosanh shows it (mostly Vietnamese). |
| `price` | Price in dong. Products: the lowest store price. |
| `highestPrice` | *(Details)* Products: the highest store price. |
| `discountPercent` | Listings: the store's discount off its old price, when it shows one. |
| `storeCount` | Number of stores selling it (1 for listings). |
| `store`, `storeId`, `storePhone`, `cardFeePercent` | Listings: the store (its domain), its Websosanh id and phone. Products list every store under offers instead. |
| `deliveryInCity`, `deliveryOtherCities`, `shippingInCity`, `shippingOtherCities` | Listings: delivery time and shipping cost in the store's city and to other cities (Free, a cost, or Ask the store). |
| `promotion` | Listings: the store's promotion text. |
| `category`, `categoryId` | *(Details)* Products: Websosanh category (Vietnamese) and its id. |
| `description` | *(Details)* Products: the description on the comparison page. |
| `searchQuery` | The search that found it: category, keyword, brands and stores (null for product links). |
| `cashOnDelivery`, `cardPayment`, `bankTransfer` | Listings: payment by cash on delivery, card (with its fee) and bank transfer, as the store lists them. |
| `storePage` | Listings: the store's page on Websosanh. |
| `url` | Products: the comparison page on Websosanh. Listings: the Websosanh link that opens the store. |
| `storeUrl` | *(Details)* Listings: the item's page on the store's own site. |
| `provinces` | Listings: the provinces the store sells from (Nationwide when it ships everywhere). |
| `specs` | *(Details)* Products: specs as Websosanh lists them (Vietnamese name → value). |
| `offers` | *(Details)* Products: every store's offer: store, storeId, name, price, featured, storeRating, storePhone, storePage, provinces, payment and shipping fields, promotion, storeUrl (the store's own page) and url. |
| `scrapedAt` | When this row was saved. |
| `error` | Only present when a row failed. The fields that loaded are still there. |

Fields marked *Details* only appear when that add-on is on.

Each row only has the fields of its kind: products have no store fields (their stores are under `offers`), listings have no product fields.

#### Example row (trimmed)

```json
{
  "imageUrl": "https://img.websosanh.vn/v2/users/root_product/images/tu-lanh-sanyo-284-lit/x62vQPfl_KCn.jpg",
  "type": "product",
  "id": "1031605290",
  "name": "Tủ lạnh Sanyo 284 lít SR-285RB",
  "price": 7590000,
  "highestPrice": 8500800,
  "storeCount": 3,
  "category": "Cooling appliances > Refrigerators > Tủ lạnh Sanyo",
  "categoryId": "3451",
  "description": "Tủ lạnh Sanyo SR-PQ285RB- diệt khuẩn, khử mùi tối ưu Thiết kế sang trọng, hiện đại Tủ lạnh Sanyo SR-PQ285RB với thiết kế kiểu mới: ngăn lạnh trên, ngăn đông dưới lớn phù hợp với ...",
  "searchQuery": "Cooling appliances > Refrigerators",
  "url": "https://websosanh.vn/sanyo-sr-285rb-tu-lanh-2-cua-284l/1031605290/so-sanh.htm",
  "specs": { "Hãng sản xuất": "Sanyo", "Năm ra mắt": "2013", "Xuất xứ": "Việt Nam", "Kiểu tủ": "Ngăn đá dưới", "Sổ cửa": "2 cửa", "Dung tích tổng": "284 lít", "Dung tích ngăn đá": "122 lít", "Dung tích ngăn lạnh": "162 lít", "Công nghệ làm lạnh": "Đa chiều", "Công nghệ kháng khuẩn, khử mùi": "Ultra Plasma", "Chất liệu khay": "Kính chịu lực", "Tiện ích": "Làm đá nhanh", "Khối lượng": "57 kg" },
  "offers": [
    { "store": "dienmaythanhson.com", "storeId": "2559201812799382793", "name": "Sanyo SR-285RB", "price": 6900000, "featured": false, "storeRating": null, "storePhone": null, "storePage": "https://websosanh.vn/cua-hang/dienmaythanhson_com.htm", "provinces": [], "cashOnDelivery": null, "cardPayment": null, "cardFeePercent": null }
  ],
  "scrapedAt": "2026-10-31T00:38:22.018Z"
}
```

### ⚙️ Input

| Section | What it's for |
| --- | --- |
| **Maximum results** | Always first, caps the whole run. Empty means no limit. |
| **What to scrape** | Categories, keywords, brands and stores. |
| **Filters** | Result type, sort by, minimum price (₫) and maximum price (₫). |
| **Add-ons** | Details. |
| **Monitoring** | Only new products and monitor name. |
| **Links** | Links instead of the fields above. Filters are ignored with links. |

#### Input examples

**Every smartphone on Websosanh (the whole category):**

```json
{
  "categories": ["82"]
}
```

**Every store's price for the iPhone 15, with specs:**

```json
{
  "keywords": ["iphone 15"],
  "type": "products",
  "includeDetails": true,
  "maxItems": 20
}
```

**Daikin and Panasonic air conditioners from 5 to 15 million dong, cheapest first:**

```json
{
  "categories": ["Air conditioners"],
  "brands": ["Daikin", "Panasonic"],
  "minPrice": 5000000,
  "maxPrice": 15000000,
  "sort": "priceLow"
}
```

**Everything one store sells in a category:**

```json
{
  "categories": ["Refrigerators"],
  "stores": ["dienmaytoanquoc.vn"]
}
```

**New washing machines each day (schedule it):**

```json
{
  "categories": ["Washing machines"],
  "onlyNew": true,
  "monitorName": "washing-machines"
}
```

**Pages you already have:**

```json
{
  "startUrls": [
    { "url": "https://websosanh.vn/s/may+giat.htm" },
    { "url": "https://websosanh.vn/dien-thoai-iphone-15-plus-128gb/1282949854/so-sanh.htm" }
  ],
  "includeDetails": true
}
```

### 🔗 Related scrapers

> - [Zap.co.il Scraper](https://apify.com/normdata/zap-scraper): Israel Price Comparison & Store Offers.
> - [Hinnavaatlus Scraper](https://apify.com/normdata/hinnavaatlus-scraper): Estonia Price Comparison.
> - [Buscapé & Zoom Price Scraper](https://apify.com/normdata/buscape-price-scraper)
> - [Knasta Scraper](https://apify.com/normdata/knasta-scraper): Chile & Peru Price Tracker & Real Deals.

### ❓ FAQ and troubleshooting

#### Is there a Websosanh API? Do I need an API key?

> Websosanh has no public data API for this. This Actor works as a Websosanh API alternative: it reads the public pages and gives you clean JSON, CSV or Excel, with no API key, no login and no code to maintain. You can also call it from your own code with the Apify API, or from an AI agent through MCP.

#### Why do I get only 10 results?

> On the Apify free plan each run saves up to 10 results, so you can try it before paying. Any paid plan removes the limit.

#### What are the limits?

> - Websosanh slows down visitors above about 2 requests a second, so the scraper keeps a steady pace: about 5,000 results a minute (about 2,500 on searches split by price), or about 30 products and 80 listings a minute with Details. If Websosanh still refuses, the run stops and keeps what it saved.
> - Websosanh's price order is approximate: a few results sit slightly out of order, as on the site. Price filters are exact.
> - Payment, delivery and shipping values exist only for stores that give them to Websosanh (a few percent of listings).
> - Some product specs are as the site has them, including the odd swapped value.
> - Names, specs and store texts are in Vietnamese, as on Websosanh.
> - Only public pages are read. No login, no personal data.

#### Is this an official Websosanh tool?

> No. It is independent and not affiliated with Websosanh. It reads only data Websosanh publishes on its public pages, at a moderate pace. Use the data in line with Websosanh's terms and the laws that apply to you.

### 📧 Contact

Need a scraper for a different site, or found something wrong with this one? norm.data.scrapers@gmail.com

# Actor input Schema

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

Stop after this many products in total. Leave empty for no limit. The Apify Free plan is always capped at 10.

## `categories` (type: `array`):

Websosanh categories (1,158; main ones in English, deeper ones in Vietnamese; type to search).

## `keywords` (type: `array`):

Search words in Vietnamese or English, like iphone 15, tủ lạnh or máy giặt. Alone they search all of Websosanh; with categories they search inside them.

## `brands` (type: `array`):

Brand names, like Samsung, Daikin or Panasonic, matched to the brand filter of each category (with or without accents). Keyword searches without a category have no brand filter.

## `stores` (type: `array`):

Store domains or names, like shopee.vn or tiki, matched to the stores with the most results in each search. Any store id from the results (storeId) also works.

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

Products are compared across stores; listings are one store's own item.

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

Order of the results. Searches with more than 2,000 results are read by price band, cheapest first, unless you sort by price high to low.

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

Only results priced at least this, in dong (15000000 = 15 million).

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

Only results priced at most this, in dong.

## `includeDetails` (type: `boolean`):

Products: category, specs, description, the highest price and every store's offer (store, price, phone, payment, shipping, rating and the store's own link), two more requests each. Listings: the store's own link to the item, one more request each.

## `onlyNew` (type: `boolean`):

Skip products saved by earlier runs with the same monitor name.

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

Runs with the same name share their history. Use a different name for each schedule.

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

Websosanh search pages (websosanh.vn/s/iphone+15.htm), category pages (websosanh.vn/dieu-hoa/cat-51.htm) or product comparison pages (websosanh.vn/.../1286662108/so-sanh.htm). Details on product links follow the add-on. Filters are ignored with links.

## Actor input object example

```json
{
  "maxItems": 10,
  "categories": [
    "60"
  ],
  "includeDetails": true
}
```

# Actor output Schema

## `results` (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 = {
    "maxItems": 10,
    "categories": [
        "60"
    ],
    "includeDetails": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("normdata/websosanh-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 = {
    "maxItems": 10,
    "categories": ["60"],
    "includeDetails": True,
}

# Run the Actor and wait for it to finish
run = client.actor("normdata/websosanh-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 '{
  "maxItems": 10,
  "categories": [
    "60"
  ],
  "includeDetails": true
}' |
apify call normdata/websosanh-scraper --silent --output-dataset

```

## MCP server setup

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