# yes123 Job Scraper — Taiwan Jobs, Salaries & Hiring Companies (`youfuxu/yes123-taiwan-jobs-scraper`) Actor

Scrape job listings from yes123 (yes123.com.tw), one of Taiwan's major job boards. Titles, companies, city/district, parsed TWD salary ranges, employment type, posting dates and full job details as clean JSON.

- **URL**: https://apify.com/youfuxu/yes123-taiwan-jobs-scraper.md
- **Developed by:** [Youfu Xu](https://apify.com/youfuxu) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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.

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

## yes123 Job Scraper — Taiwan jobs, salary ranges & hiring companies

Get clean, structured job data from **[yes123 求職網](https://www.yes123.com.tw)** — one of Taiwan's major job boards, with strong coverage of manufacturing, service, retail, finance and SME employers that never show up on English-language sites. Search any keyword in Chinese or English, optionally filter by city or county, and download the results as JSON, CSV or Excel. No login, no browser, no proxy setup.

### What you get

Run it with the default input and each row looks like this:

```json
{
  "url": "https://www.yes123.com.tw/wk_index/job.asp?p_id=20110216152146_27882081&job_id=20251122203049_1240155",
  "jobId": "20251122203049_1240155",
  "title": "AMR軟體工程師",
  "companyName": "振邦科技股份有限公司",
  "companyId": "20110216152146_27882081",
  "companyUrl": "https://www.yes123.com.tw/wk_index/comp_info.asp?p_id=20110216152146_27882081",
  "location": "台北市內湖區",
  "city": "台北市",
  "district": "內湖區",
  "salaryText": "月薪 30,000元以上",
  "salaryMin": 30000,
  "salaryMax": null,
  "salaryCurrency": "TWD",
  "salaryPeriod": "month",
  "salaryNegotiable": false,
  "employmentType": "全職",
  "employmentTypeEn": "full_time",
  "industryIcon": "exclusive",
  "tags": ["年終獎金", "免經驗", "彈性上下班"],
  "postedAt": "2026-08-20",
  "postedAtRaw": "08.20",
  "scrapedAt": "2026-08-21T02:23:05.628Z"
}
```

**22 fields per job by default**, straight from the search results — so a 1,000-job export is about 35 quick page loads, not 1,000.

The salary string yes123 shows (`月薪 40,000~60,000元`, `時薪 190元以上`, `薪資面議(經常性薪資達4萬元含以上)`) is parsed into **numeric `salaryMin` / `salaryMax` in TWD plus a `salaryPeriod`** (`month`, `year`, `day`, `hour`, `piece` for 按件計酬). "Negotiable" listings are flagged with `salaryNegotiable: true` and still carry the legally required floor (NT$40,000/month) as `salaryMin`, so salary benchmarking works on 100 % of rows instead of the ~30 % that publish an exact range.

Turn on **Include detail page data** and each job grows to **46 fields**: the full job description, exact work address, yes123 job categories, education / experience / major requirements, applicant types, language and computer skills, certificates, vacancies, management scope, business-trip and overseas-assignment notes, work hours, start date, the complete benefits breakdown (`benefits.insurance`, `.bonus`, `.allowances`, `.leave`, …), legal protections, company features (e.g. `上市上櫃`, `500大服務業`), contact person and the exact `updatedAt` date.

### Who uses this

- **Recruiters & staffing agencies** — see which Taiwanese employers are hiring for a role right now, in which district, at what pay; yes123 carries many SMEs and factories that 104 / LinkedIn miss
- **Salary benchmarking & HR analytics** — numeric TWD ranges with period, plus education and experience requirements from detail mode
- **B2B lead generation** — every row carries the hiring company, its yes123 profile URL and the work address; detail mode adds the HR contact name
- **Job boards & alert bots** — poll a keyword + city daily and diff `jobId` against yesterday's dataset to catch new postings
- **Labour-market research** — count openings per city, industry badge or employment type for any keyword across all of Taiwan

### How to use

1. Enter a **keyword** — `python`, `會計`, `業務`, `護理師`, `作業員` all work (Chinese keywords match the most listings)
2. Optionally pick a **city / county** — Taipei, New Taipei, Taoyuan, Taichung, Kaohsiung and all 22 Taiwanese cities and counties are in the dropdown
3. Set **Max jobs** (default 50; yes123 pages 30 at a time)
4. Optionally enable **Include detail page data** for descriptions, requirements, benefits and contacts
5. Run, then download from the **Dataset** tab as JSON / CSV / Excel, or pull it through the Apify API

#### Example input

```json
{
  "keyword": "會計",
  "area": "1_1001_0009_0000",
  "maxItems": 300,
  "includeDetails": true
}
```

`area` is the yes123 zone code — pick it from the dropdown in the Apify console. The city-level codes are: Taipei `1_1001_0003_0000`, New Taipei `1_1001_0002_0000`, Taoyuan `1_1001_0004_0000`, Hsinchu City `1_1001_0006_0000`, Taichung `1_1001_0009_0000`, Tainan `1_1001_0016_0000`, Kaohsiung `1_1001_0017_0000`. Leave it empty for all of Taiwan.

### Output fields

| Field | Description |
| --- | --- |
| `url` | Job detail page on yes123 |
| `jobId`, `companyId` | yes123's own identifiers — stable across runs, use them to de-duplicate |
| `title`, `companyName`, `companyUrl` | Job title, employer and employer profile page |
| `location`, `city`, `district` | `台北市內湖區` split into city / county and district |
| `salaryText` | Salary exactly as shown on yes123 |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | Parsed numbers in TWD with `month` / `year` / `day` / `hour` / `piece` |
| `salaryNegotiable` | `true` when the listing says 面議 (negotiable) |
| `employmentType`, `employmentTypeEn` | `全職` / `兼職` … plus an English key (`full_time`, `part_time`, `internship`, …) |
| `industryIcon` | The badge yes123 shows on the card: `service`, `manufacturing`, `finance`, `recruitment`, `exclusive` |
| `tags` | Hashtags on the card, e.g. `年終獎金`, `免經驗`, `彈性上下班` |
| `postedAt`, `postedAtRaw` | Listing date as `YYYY-MM-DD` (yes123 only prints `MM.DD`; the year is resolved against today) |
| `scrapedAt` | ISO timestamp of the run |
| *Detail mode only* | |
| `description` | Full job description, line breaks preserved |
| `workAddress`, `workHours`, `startDate` | Exact address, shift hours, expected start |
| `jobCategories` | yes123 job categories, e.g. `["軟體工程師", "韌體工程師"]` |
| `vacancies`, `managementScope`, `businessTrip`, `overseasAssignment` | Headcount and travel notes |
| `education`, `majors`, `experience`, `applicantTypes` | Requirements |
| `languages`, `skills`, `computerSkills`, `certificates`, `drivingLicense` | Skill requirements |
| `benefits`, `benefitsText` | Object keyed by `insurance`, `leave`, `workSchedule`, `bonus`, `allowances`, `recreation`, `facilities`, `other`, `more` — and a flat text version for CSV |
| `legalProtections`, `companyFeatures` | e.g. `["勞保", "健保", "育嬰假"]`, `["上市上櫃", "1000大製造業"]` |
| `contactPerson`, `contactPhone`, `applyRemarks` | Application contact details where the employer publishes them |
| `updatedAt` | Exact date yes123 last refreshed the listing |

### Limitations

- yes123 requires a keyword; there is no "browse everything" mode. Use a broad Chinese word such as `工程師` (3,000+ results) or `作業員` if you want a wide sweep, and run several keywords for full coverage
- `salaryMax` is only present when the employer publishes a range; most Taiwanese listings state a floor (`以上`) or "negotiable"
- Phone numbers and e-mail addresses are rarely published on yes123 — `contactPhone` is usually empty by design of the site
- The list page shows `MM.DD` without a year; `postedAt` assumes the most recent past occurrence of that date, which is correct for active listings
- Runs are deliberately paced (about 1.2 s between pages and between detail requests) to stay polite to the site; a 500-job detail export takes roughly 12 minutes

### Legal

This Actor collects publicly available job advertisements only and does not log in or bypass any access control. You are responsible for complying with yes123's terms of service and Taiwan's Personal Data Protection Act when using the data, especially contact names.

# Actor input Schema

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

What to search for, e.g. <code>python</code>, <code>會計</code>, <code>業務</code>, <code>護理師</code>. Chinese keywords match the most listings; English works for tech roles. Required — yes123 does not list jobs without a search term.

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

Optional. Restrict results to one Taiwanese city or county. Leave on <b>All of Taiwan</b> to search nationwide.

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

Maximum number of jobs to return (yes123 pages 30 at a time). Keep it small for a quick test, raise it for a full export.

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

Visit each job page to add the full job description, exact work address, job categories, education / experience / major requirements, language and computer skills, the complete benefits breakdown, legal protections, contact person and the last-updated date. One extra request per job (about 1.5 s each), so a 500-job export takes roughly 15 minutes instead of 1.

## Actor input object example

```json
{
  "keyword": "python",
  "area": "",
  "maxItems": 50,
  "includeDetails": false
}
```

# Actor output Schema

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

All scraped records as a JSON array.

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

All scraped records as a CSV file.

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

All scraped records as an Excel workbook.

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

The default dataset of this run in Apify Console.

# 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 = {
    "keyword": "python",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("youfuxu/yes123-taiwan-jobs-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 = {
    "keyword": "python",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("youfuxu/yes123-taiwan-jobs-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 '{
  "keyword": "python",
  "maxItems": 50
}' |
apify call youfuxu/yes123-taiwan-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,youfuxu/yes123-taiwan-jobs-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/UccH2z5S77XkMMAJw/builds/aWnumTUfRVqKgNhoq/openapi.json
