# VietnamWorks \[💰$1.3] — Full Jobs, Salary & Bilingual Data (`corvuslab/vietnamworks-scraper`) Actor

\[Just 💰$1.3] Search job listings from vietnamworks.com — full descriptions, requirements, skills, benefits, structured salary, geo-located sites and applicant-demand counts, with bilingual English + Vietnamese fields. Keyword, location, category, level and type filters plus incremental monitoring.

- **URL**: https://apify.com/corvuslab/vietnamworks-scraper.md
- **Developed by:** [Corvuslab](https://apify.com/corvuslab) (community)
- **Categories:** Jobs, Automation, Lead generation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## VietnamWorks Job Scraper 🇻🇳

🥇 The **only dedicated scraper for vietnamworks.com** — Vietnam's largest recruitment platform.

Search by keyword or paste job URLs and get the **full job record in one fast pass**: the complete job description and requirements (as text, HTML and Markdown), required **skills**, **benefits**, structured **salary** (min / max / currency), every **work location with latitude & longitude**, and the live **applicant-demand count**. Every job also arrives **bilingual** — job function, category, level and city names in both **English and Vietnamese**. No code needed, and results export to JSON, CSV, Excel or the API — ready for spreadsheets, apps and AI agents.

**Why this scraper**

- ⚡ **Fast & low-cost** — the full record comes back in a single request per job (no slow second detail fetch), so large runs stay cheap.
- 🧾 **Rich, typed records** — up to 45 structured fields per job, not raw HTML.
- ♻️ **Cheap to monitor** — incremental mode re-scrapes only what changed (see below).
- 🔔 **Notifications built in** — Telegram, Slack, Discord or any webhook.
- 🤖 **AI- & API-ready** — compact output, MCP-friendly, one-click integrations.

***

### ✨ Key features

- 🥇 **The only dedicated VietnamWorks scraper** — purpose-built for vietnamworks.com, not a generic job crawler bolted onto the site.
- 🧾 **Complete job record in one pass** — title, company, salary, description, requirements, skills, benefits, locations and dates all come back together — no two-stage crawl, so it's faster and leaner.
- 🌏 **Bilingual English + Vietnamese** — job function, category, level and city names in both languages (`jobFunctionVi`, `jobCategoryVi`, `jobLevelVi`, `cityVi`) — unique to this market.
- 📍 **Geo-located work sites** — every working location carries a full address plus **latitude & longitude**, ready for maps and radius search.
- 💰 **Structured salary** — `salaryMin`, `salaryMax`, `salaryCurrency` and the display text, not just a string.
- 🎚️ **Rich filters** — keyword search plus location (city/province), job category, seniority level and employment type, applied on the site and combinable.
- 📇 **Contacts & demand signals** — emails, phones, URLs & social profiles pulled from each listing (filter with `requireContact`), plus the live **applicant count** and a demand label for spotting low-competition roles.
- ♻️ **Incremental monitoring** — schedule it and get only what changed (NEW / UPDATED / UNCHANGED / EXPIRED); unchanged items are skipped before their page is even fetched.
- 🔔 **Notifications** — Telegram, Slack, Discord or any webhook (n8n / Make / Zapier).
- 🤖 **AI-ready** — compact + drop-empty output modes keep payloads small for LLMs and MCP.

***

### 📚 What data can you extract from VietnamWorks?

- **Core** — id, title, url, city, structured salary (`salaryMin` / `salaryMax` / `salaryCurrency` / `salaryText`), employment type, posted / created / updated / expiry dates, plus bilingual job function, category and level.
- **Details** (with `includeDetails`) — full job `description` and `requirement` (each as text, HTML and Markdown), `skills[]` and `benefits[]`.
- **Locations** — every working site: English + Vietnamese city name, full street address, and **latitude / longitude**.
- **Contacts & signals** — emails, phones, URLs, social profiles, plus the live `applicantCount` and an `applicantVolumeLabel` demand tag.
- **Company** — name, id, logo, profile URL, company size, industry and an anonymous-employer flag.
- **Change tracking** (incremental mode) — `changeType`, repost detection (`isRepost`, `repostOfId`) and a content hash.

Every field is present in standard mode (missing values are `null`); **compact mode** returns the core fields only, for lean AI/MCP payloads.

***

### ⚙️ Input

Configure it in the visual editor — no code needed — or pass JSON via the API.

| Field | What it does |
|---|---|
| `query` | Keyword search — job title, skill or company (comma-separate for multiple searches, merged & de-duplicated). |
| `startUrls` | Scrape specific VietnamWorks search or job URLs directly. |
| `location` | Filter by city / province (Ho Chi Minh City, Hanoi, Da Nang and more). |
| `category` | Filter by job function / industry (IT, Sales, Marketing, Finance…). |
| `jobLevel` | Filter by seniority (Intern → Director and above). |
| `workType` | Filter by employment type (Permanent, Contract, Freelance, Part-time). |
| `includeDetails` | Add full description, requirements, skills and benefits. |
| `requireContact` | Keep only records that carry an email and/or phone. |
| `incrementalMode` | Emit only what changed since the last run. |
| `maxResults` | Cap the number of jobs (0 = unlimited). |
| `proxyConfiguration` | Optional — runs fine with no proxy at typical volumes. |

…and **28 inputs** in total — the table shows the essentials; the rest cover applicant-demand signals, description format & truncation, compact / drop-empty output, incremental tuning, notification channels and advanced options, all in the visual editor.

***

### 🧪 Input examples

Newest IT jobs in Ho Chi Minh City, full details:

```json
{ "query": "developer", "location": ["Ho Chi Minh"], "category": ["Information Technology/Telecommunications"], "sortBy": "date", "maxResults": 100 }
```

Manager-level roles with a contact email, lean output for a lead list:

```json
{ "jobLevel": ["Manager"], "requireContact": "email", "includeDetails": false, "maxResults": 200 }
```

Scheduled monitor — only what changed, with a Telegram ping:

```json
{ "query": "data engineer, product manager", "incrementalMode": true, "telegramToken": "123:ABC", "telegramChatId": "@yourchannel" }
```

***

### 📤 Output

Each job is one clean, typed record. Descriptions and requirements are available as plain **text**, **HTML** and **Markdown** — pick one format or keep all three. Missing values come back as `null` in standard mode; **compact mode** trims each record to the core fields for lean AI/MCP payloads. Export to JSON, CSV, Excel or the API.

### 🗂️ Example record

```json
{
  "id": "2095221",
  "title": "Ecommerce Technology Developer",
  "url": "https://www.vietnamworks.com/ecommerce-technology-developer--2095221-jv",
  "company": "Rodd & Gunn New Zealand Limited",
  "companyId": "372651",
  "companyLogo": "https://images.vietnamworks.com/pictureofcompany/48/11211604.png",
  "companySize": "1,000-4,999",
  "isAnonymous": false,
  "salaryMin": 1000.0,
  "salaryMax": 1500.0,
  "salaryCurrency": "USD",
  "salaryText": "$ 1,000-1,500 /tháng",
  "isSalaryVisible": true,
  "location": "District 2, Ho Chi Minh City, Vietnam",
  "city": "Ho Chi Minh",
  "locations": [
    {
      "city": "Ho Chi Minh",
      "cityVi": "Hồ Chí Minh",
      "address": "Lumiere Riverside, East Tower, Đường Võ Nguyên Giáp, An Phú, Quận 2, Hồ Chí Minh, Việt Nam",
      "lat": 10.803863,
      "lon": 106.748272
    }
  ],
  "jobFunction": "Software Developer",
  "jobFunctionVi": "Phần Mềm Máy Tính",
  "jobCategory": "Information Technology/Telecommunications",
  "jobCategoryVi": "Công Nghệ Thông Tin/Viễn Thông",
  "jobLevel": "Experienced (non-manager)",
  "jobLevelVi": "Nhân viên",
  "employmentType": "Permanent",
  "skills": ["Salesforce Development", "Salesforce Implementation", "Software Engineer"],
  "benefits": ["Bonus"],
  "description": "**JOB SUMMARY**\n\nWe are seeking a highly skilled Ecommerce Technology Developer to join our Ecommerce Team...",
  "requirement": "**Salesforce Marketing Cloud Development**\n\n• Develop and maintain marketing solutions within Salesforce Marketing Cloud...",
  "postedAt": "2026-08-14T09:26:58+07:00",
  "expiresAt": "2026-09-13T23:59:59+07:00",
  "postedAtText": "12 giờ trước",
  "applicantCount": 0,
  "applicantVolumeLabel": "None yet",
  "source": "vietnamworks.com",
  "searchKeyword": "developer",
  "scrapedAt": "2026-08-14T14:54:06Z"
}
```

***

### ♻️ Incremental monitoring — pay for changes, not repeats

Schedule the actor and turn on **incremental mode**: each run compares against the last and emits only **NEW / UPDATED / EXPIRED** records — unchanged items are skipped *before* their detail is fetched, so a daily watch costs a fraction of a full re-scrape.

| Daily churn | of 1,000 tracked | billable records | you save |
|---|---|---|---|
| 5 % | 1,000 | 50 | **95 %** |
| 15 % | 1,000 | 150 | **85 %** |
| 30 % | 1,000 | 300 | **70 %** |

The first run seeds the baseline and bills in full; every run after that bills only the delta.

***

### 🚀 How to scrape VietnamWorks

1. Open the actor and enter a **search keyword** (e.g. `developer`) and/or pick filters — or paste a VietnamWorks URL.
2. Set **Max results** and choose whether to **include full details**.
3. (Optional) Turn on **incremental mode** and a **notification** channel, then **Schedule** it.
4. Click **Start**.
5. Download the data as **JSON, CSV or Excel**, or pull it from the **API**.

New to Apify? Create a free account — it comes with monthly credit, no credit card required.

***

### 💡 What can you do with VietnamWorks data?

- **Lead generation** — build recruiter and employer lists with emails, phones and social profiles, filtered to only records that carry a contact.
- **Market & salary research** — analyse hiring demand, structured salary bands and skills across cities, categories and seniority levels in the Vietnamese market.
- **Vacancy monitoring** — schedule it with incremental mode + notifications for a live feed of new and updated postings.
- **Job boards & aggregation** — feed clean, bilingual job data into your own app, sheet or warehouse.
- **AI agents & pipelines** — compact output plugs straight into LLM/MCP workflows.

***

### 🔌 Integrations & export

Export to **JSON, CSV, Excel** or an HTML table, or pull from the **REST API** and the **JavaScript / Python** clients. Runs on a **schedule**, connects to **Google Sheets, Slack, Make, Zapier and n8n**, and works as an **MCP tool** for AI agents — compact mode keeps token usage small.

***

### ❓ FAQ

**Do I need a proxy or login?** No — it runs out of the box with no login and no proxy; Apify Proxy is available under Advanced for high-volume runs.

**Can I get only new items on a schedule?** Yes — turn on incremental mode and schedule it; each run emits only what changed and can notify your channel.

**Do I get the job description and requirements?** Yes — with full details on you get both the description and a separate requirements block, each as plain text, HTML and Markdown.

**Are the Vietnamese fields included?** Yes — job function, category, level and city names come in both English and Vietnamese.

**What formats can I export?** JSON, CSV, Excel, HTML table, or via the API.

**Is it good for AI agents?** Yes — enable compact mode; the output is MCP-friendly.

**How many records can I get?** As many as the search returns — set `maxResults` (0 = unlimited).

**Is scraping this legal?** The actor collects only **publicly available** data. You are responsible for how you use it, including any personal data and GDPR-style obligations.

***

### ⚖️ Is it legal to scrape VietnamWorks?

This actor accesses only publicly available data on vietnamworks.com. You are responsible for how you use the extracted data — in particular any personal information — and for complying with the site's terms and applicable law (including the GDPR where it applies). Not affiliated with, endorsed by, or sponsored by VietnamWorks or Navigos Group.

***

**Keywords:** vietnamworks scraper · vietnamworks api · vietnamworks.com scraper · vietnamworks job scraper · vietnam job scraper · vietnam jobs data · job listings scraper · recruitment data vietnam · salary data scraper · job market research · lead generation · applicant demand · bilingual job data · job monitoring · export jobs to CSV · export to Excel · no-code scraper · MCP tool for AI agents

# Actor input Schema

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

Keywords to search for (job title, skill, company). Separate multiple searches with commas — each runs on its own and the results are merged and de-duplicated.

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

Paste vietnamworks.com search or job URLs to scrape directly. A job URL (…-<id>-jv) is fetched as a single record.

## `maxResults` (type: `integer`):

Maximum number of jobs to return. Set 0 for unlimited (bounded by how many the search has).

## `location` (type: `array`):

City / province to filter by.

## `category` (type: `array`):

Top-level job function / industry category.

## `jobLevel` (type: `array`):

Seniority level.

## `workType` (type: `array`):

Type of employment.

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

How to order results within each search.

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

Keep only records that include a contact. off = keep everything; email / phone = require that channel; either = at least one; both = email and phone. Screened at emit time, so it also trims what you're billed for.

## `includeApplicantInsights` (type: `boolean`):

Add how many people have applied (applicantCount) and a demand label — handy for spotting low-competition listings.

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

Include the full job description, requirements, skills and benefits. Turn off for the fastest, leanest listing-only output.

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

Which representation(s) of the description and requirements to include.

## `descriptionMaxLength` (type: `integer`):

Truncate each description / requirements field to this many characters. Leave empty for full length.

## `compact` (type: `boolean`):

Emit only the core fields. Ideal for AI agents and MCP clients.

## `excludeEmptyFields` (type: `boolean`):

Remove null, empty-string and empty-array fields from each record.

## `incrementalMode` (type: `boolean`):

Track state between runs and tag every record with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED).

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

Stable name for the tracked search. Leave empty to derive one automatically from your search settings.

## `emitUnchanged` (type: `boolean`):

Also emit records that have not changed since the previous run.

## `emitExpired` (type: `boolean`):

Emit records for jobs present last run but gone now.

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

Bot token from @BotFather.

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

Chat or channel ID, e.g. "-100123456789" or "@yourchannel".

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

Slack incoming-webhook URL.

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

Discord incoming-webhook URL.

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

Any HTTPS endpoint. Receives a JSON POST with the matched records — works with n8n, Make and Zapier.

## `webhookHeaders` (type: `object`):

Extra headers for the webhook request, e.g. {"Authorization": "Bearer xyz"}.

## `notificationLimit` (type: `integer`):

How many records to include in each notification message.

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

Optional. This scraper runs fine with no proxy (the default). Enable Apify Proxy only if you run at high volume and start seeing failures.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed request before giving up on it.

## Actor input object example

```json
{
  "query": "developer",
  "maxResults": 25,
  "sortBy": "relevance",
  "requireContact": "off",
  "includeApplicantInsights": true,
  "includeDetails": true,
  "descriptionFormat": "all",
  "compact": false,
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "notificationLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxRequestRetries": 3
}
```

# Actor output Schema

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

No description

## `allItems` (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 = {
    "query": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("corvuslab/vietnamworks-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 = { "query": "" }

# Run the Actor and wait for it to finish
run = client.actor("corvuslab/vietnamworks-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 '{
  "query": ""
}' |
apify call corvuslab/vietnamworks-scraper --silent --output-dataset

```

## MCP server setup

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