# China Jobs Feed 中国招聘: Zhaopin, Liepin, 51job, Lagou, Shixiseng (`getascraper/china-jobs-feed`) Actor

Search nine Chinese job boards in one run: Zhaopin 智联招聘, Liepin 猎聘, 51job 前程无忧, ChinaHR, Shixiseng, Lagou and more. Get one job format with monthly CNY salary, English city and education labels, cross-board duplicate groups, and new, updated or closed jobs on each scheduled run.

- **URL**: https://apify.com/getascraper/china-jobs-feed.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.34 / 1,000 job postings

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

## 🇨🇳 China Jobs Feed 中国招聘: Zhaopin, Liepin, 51job, Lagou, Shixiseng

<table width="100%" style="margin-bottom:0">
<tr>
<td style="padding:24px 28px;background:#FDF2F4;border:1px solid #F3C6CF;border-top:4px solid #9F1239;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Search nine Chinese job boards in one run and get every job in one clean format</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Pull jobs from Zhaopin, Liepin, 51job, ChinaHR, Shixiseng, iGuopin, Jobui, Lagou and eChinaCities with monthly salary in CNY, English city names and education labels, and a flag on jobs that appear on more than one board.</span>
</td>
</tr>
</table>
<table width="100%" style="margin-top:0">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F3C6CF;border-radius:10px 0 0 10px;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#7F1030">💴 Comparable pay</span><br><span style="font-size:12px;color:#57534E">1.5-2万, 8千-1万 and 13薪 all become monthly CNY ranges.</span></td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F3C6CF;border-left:none;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#7F1030">🏙️ English and Chinese</span><br><span style="font-size:12px;color:#57534E">Every city, education level and company type in both languages.</span></td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F3C6CF;border-left:none;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#7F1030">🧬 Same job, one group</span><br><span style="font-size:12px;color:#57534E">Postings repeated across boards share one group id.</span></td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F3C6CF;border-left:none;border-radius:0 10px 10px 0;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#7F1030">🔔 What changed</span><br><span style="font-size:12px;color:#57534E">New, updated and closed jobs between scheduled runs.</span></td>
</tr>
</table>

Recruiters, HR analysts and job aggregators who need China hiring data usually open one board at a time and then reconcile pay, cities and titles by hand. This feed reads 智联招聘 (Zhaopin), 猎聘 (Liepin), 前程无忧 (51job), 中华英才网 (ChinaHR), 实习僧 (Shixiseng), 国聘 (iGuopin), 职友集 (Jobui), 拉勾网 (Lagou) and eChinaCities in a single run, applies the same filters to all of them, and returns one table you can sort, export or schedule.

### 🔎 What does China Jobs Feed do?

You give it keywords, cities and filters. It searches every board you select, converts what each one publishes into the same fields, and marks which rows are new since your last run. Chinese and English keywords both work. Nothing is guessed: if a board does not publish a value, the field is left out.

| Board | Strongest for | Good to know |
| --- | --- | --- |
| Zhaopin 智联招聘 | Mainstream roles across all of China | Fast. Shows recruiter reply activity when you ask for it. |
| iGuopin 国聘 | State-owned employers and campus recruitment | City search works for Beijing, Shanghai, Guangzhou, Shenzhen, Hangzhou, Chengdu and Wuhan. Other cities are skipped with a message. Jobs have no public web address. |
| ChinaHR 中华英才网 | Mainstream roles across all of China | Fast. Rows have no description, posting date or recruiter details. A city search can include nationwide postings. Salary, education and experience filters are applied after the jobs are read. |
| Liepin 猎聘 | Mid-level and senior roles | Your keyword is matched to the closest Liepin job category, so common job titles work best. Each category and city returns up to about 400 jobs. |
| eChinaCities | English-language jobs for foreigners, including teaching | English keywords only. Returns the first page of each search, up to 25 jobs. |
| Jobui 职友集 | Company-linked openings in many industries | Returns up to 20 jobs per keyword and city. Add more keyword and city pairs for more rows. A search never reports closed jobs. |
| Shixiseng 实习僧 | Internships and campus recruitment | Campus roles show pay only when descriptions are included. The full time setting returns nothing here, because every job is an internship or campus role. |
| 51job 前程无忧 | Broad hiring in every industry | Slower, because it needs a heavier collection method. Rows from this board count as premium rows. |
| Lagou 拉勾网 | Technology and internet roles | Premium board, off by default. Some attempts are blocked and then return nothing for that search, so run it again later. Rows count as premium rows. Full descriptions are usually unavailable. |

Zhaopin, iGuopin, ChinaHR and Liepin are selected by default. Add eChinaCities, Jobui, Shixiseng, 51job or Lagou to the board list when you want them.

### 🎯 Who uses it

- **I am a recruiter** sourcing candidates in China and comparing what Beijing, Shanghai and Shenzhen employers pay for the same title in one table.
- **I am an HR analyst** benchmarking salary ranges by city, education and experience, with every pay figure on the same monthly CNY scale.
- **I am a job aggregator** feeding a site or app with fresh China listings and a group id that stops one posting from showing up twice.
- **I am a relocation consultant** finding English-language and foreigner-friendly roles in Chinese cities for clients who do not read Chinese.
- **I am a researcher** tracking state-owned and campus hiring over time, using new and closed job flags from scheduled runs.

### 🚀 How it works

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#FDF2F4;border:1px solid #F3C6CF;border-radius:10px 0 0 10px;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#9F1239;letter-spacing:1px">STEP 1</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Pick boards and a search</span><br><span style="font-size:12px;color:#57534E">Choose boards, keywords, cities and filters, or paste a board search link.</span></td>
<td style="padding:16px 14px;width:33%;background:#FDF2F4;border:1px solid #F3C6CF;border-left:none;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#9F1239;letter-spacing:1px">STEP 2</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Get one table</span><br><span style="font-size:12px;color:#57534E">Every row has the same fields, whichever board it came from.</span></td>
<td style="padding:16px 14px;width:33%;background:#FDF2F4;border:1px solid #F3C6CF;border-left:none;border-radius:0 10px 10px 0;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#9F1239;letter-spacing:1px">STEP 3</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Schedule it</span><br><span style="font-size:12px;color:#57534E">Name a monitor scope and each run flags new, updated and closed jobs.</span></td>
</tr>
</table>

Start small. The default search (Python in Beijing, 25 rows) finishes in well under a minute. Raise the limits once the rows look right.

#### Filters that work on every board

- **Salary:** minimum and maximum monthly CNY, or only jobs that show a salary. Yearly and daily pay is converted to monthly first.
- **Experience and education:** education means "at least" (bachelor includes master and PhD). Experience matches any overlap with your band.
- **Company type:** private, state-owned, foreign-owned, joint venture or listed.
- **Freshness, kind and words:** posted within N days, full time, internship or campus, words to exclude, and company names to keep.
- **Unknown values:** a job that does not state the value you filter on is dropped, so a filter never lets unchecked rows through. eChinaCities does not publish education, so an education filter leaves that board empty, and ChinaHR does not publish posting dates, so a freshness filter leaves that board empty.

#### Same job on several boards

Rows that share a title, employer and city get the same `clusterId`. Turn on `uniqueOnly` to keep one row per job, the one with the most information. Matching is strict on purpose: a Chinese company name and its English spelling are not treated as the same employer, so some repeats stay separate.

#### Monitoring over time

Give `monitorScope` a name and reuse it on a schedule. Each row is marked `NEW`, `UPDATED`, `UNCHANGED` or `REOPENED`. A job is marked `CLOSED` only after two complete scans in a row did not find it, and a scan that stopped at your row limit never counts as complete. Choose `changesOnly` to receive just the rows that changed. If a run reaches its time limit it returns the rows it already has, marks them `PARTIAL` and leaves your saved history untouched.

### ⚙️ Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `sources` | array of boards | No | Boards to search: Zhaopin, iGuopin, ChinaHR, Liepin, eChinaCities, Jobui, Shixiseng, 51job, Lagou. Defaults to Zhaopin, iGuopin, ChinaHR and Liepin. |
| `startUrls` | array of URLs | No | Search links copied from a supported board. With the board list emptied, only the pasted links are read. Links from other sites are reported as unsupported. |
| `keywords` | array of text | No | Job titles or skills, in Chinese or English. Each keyword is searched in each city. eChinaCities skips Chinese keywords, and Liepin matches the keyword to its closest job category. |
| `expandKeywords` | boolean | No | Also search common synonyms of a job title. Finds more jobs and reads more pages. |
| `cities` | array of text | No | Cities in English, Chinese or GB code. Empty or Nationwide searches all of China. An unknown city is reported and never turned into a nationwide search. |
| `employmentKind` | enum | No | Any, full time, internship or campus recruitment. |
| `minMonthlySalaryCny` | integer | No | Keep jobs whose pay range reaches at least this monthly amount in CNY. |
| `maxMonthlySalaryCny` | integer | No | Keep jobs whose pay range starts at or below this monthly amount in CNY. |
| `onlyDisclosedSalary` | boolean | No | Drop jobs with negotiable or missing pay. |
| `experience` | enum | No | Fresh graduate, 1 to 3, 3 to 5, 5 to 10 or 10 plus years. |
| `education` | enum | No | Minimum education: associate, bachelor, master or PhD. |
| `companyTypes` | array of enums | No | Private, state-owned, foreign-owned, joint venture or listed employers. |
| `postedWithinDays` | integer | No | Keep jobs posted or updated within this many days. |
| `excludeKeywords` | array of text | No | Drop jobs containing any of these words in title, company, category or tags. English words match whole words only; Chinese words match anywhere. |
| `companyNames` | array of text | No | Keep only companies whose name contains one of these words. |
| `includeDescription` | boolean | No | Add the full job description where the board shows it. |
| `includeRecruiterSignals` | boolean | No | Add how recently and how often the recruiter replies. Counts only, no names. |
| `includeRecruiterNames` | boolean | No | Add recruiter name, title and picture. Off by default because they are personal details. |
| `includeSourceFields` | boolean | No | Attach the untouched board record for audits. |
| `convertToUsd` | boolean | No | Add monthly pay in US dollars at the current exchange rate. |
| `monitorScope` | text | No | Name that links scheduled runs so each one can mark new, updated and closed jobs. |
| `outputMode` | enum | No | `all` rows, `changesOnly`, or `compact` short rows for spreadsheets and AI agents. |
| `uniqueOnly` | boolean | No | Keep one row per job when it appears on several boards. |
| `includeClosed` | boolean | No | When monitoring, add a short row for each job that disappeared. Defaults to on. |
| `maxTotalRows` | integer | No | Limit on rows for the whole run, shared fairly between boards. Defaults to 25. |
| `maxItemsPerSource` | integer | No | Limit on jobs from one board, split across your keyword and city combinations. Defaults to 25. |
| `maxPagesPerSource` | integer | No | Result pages read per keyword and city on a board. Defaults to 5. |
| `proxyConfiguration` | proxy | No | Optional. Each board is tried without a proxy first and moves to one only if it is refused. |
| `boardOptions` | JSON object | No | Optional extra settings per board, keyed by board id. Unknown keys are ignored. |

#### Free plan

Free-plan accounts get a small sample: up to 25 rows, 3 runs a day and a 30 minute pause between runs. The run ends normally with a message that explains the limit.

### 🧾 Data table

Each row is one job. Fields a board does not publish are left out. Text fields keep the board's original wording, and English labels sit next to them.

| Field | Type | Description |
| --- | --- | --- |
| `listingKey` | string | Stable key made of the board and the board's job id. |
| `sourcePlatform` | string | Board the row came from: `zhaopin`, `iguopin`, `chinahr`, `liepin`, `echinacities`, `jobui`, `shixiseng`, `51job` or `lagou`. |
| `sourceRecordId` | string | The board's own job id. |
| `clusterId` | string | Shared by rows that look like the same job on different boards. |
| `clusterSize` | integer | Rows in this run that share the group id, when more than one. |
| `isCanonical` | boolean | True on the most complete row of a group. |
| `inventoryType` | string | `job`, `internship` or `campus`. |
| `searchKeyword`, `searchCity` | string | The keyword and city that found the row. |
| `title` | string | Job title as published. |
| `company` | string | Employer name as published. |
| `companyType`, `companyTypeEn` | string | Ownership type in Chinese and English. |
| `isSoe` | boolean | True for state-owned employers. |
| `companyIndustry`, `companySize` | string | Industry and employee range when published. |
| `locationRaw` | string | Location text exactly as shown. |
| `province`, `city`, `cityEn`, `district` | string | Resolved location in Chinese and English. |
| `latitude`, `longitude` | number | Coordinates when the board publishes them. |
| `isRemote` | boolean | True when the board marks the job remote. |
| `salaryRaw` | string | Salary text exactly as shown. |
| `salaryDisclosed`, `salaryNegotiable` | boolean | Whether a range is shown, or pay is negotiable. |
| `salaryCurrency`, `salaryPeriod` | string | Currency and period as published. |
| `salaryMin`, `salaryMax` | number | Range in the published unit. |
| `salaryMonthsPerYear` | number | Pay months per year, for example 13. |
| `salaryMonthlyMinCny`, `salaryMonthlyMaxCny` | number | Range as monthly CNY. |
| `salaryAnnualMinCny`, `salaryAnnualMaxCny` | number | Range as annual CNY. |
| `salaryMonthlyMinUsd`, `salaryMonthlyMaxUsd` | number | Only with USD conversion on. |
| `experienceRaw`, `experienceMinYears`, `experienceMaxYears` | string, number | Experience text and years. |
| `educationRaw`, `educationEn`, `educationRank` | string, number | Education text, English label and rank. |
| `employmentType`, `jobCategory`, `openings` | string, number | Type, category and number of positions. |
| `skills`, `tags`, `benefits`, `majors` | array of strings | Requirement tags and benefits as published. |
| `description` | string | Job description. Only with descriptions on. |
| `postedAt`, `updatedAt`, `expiresAt` | string | Dates in ISO 8601. China time without an offset is read as UTC+8. |
| `applicationStartsAt`, `applicationEndsAt` | string | Application window when published. |
| `listingUrl`, `applicationUrl` | string | Links to the job when the board publishes them. |
| `lifecycleStatus` | string | `NEW`, `UPDATED`, `UNCHANGED`, `REOPENED`, `CLOSED` or `PARTIAL`. |
| `firstSeenAt`, `lastSeenAt`, `closedAt` | string | When a job was first seen, last seen and closed. |
| `changedFields` | array of strings | Which groups changed since the last run. |
| `recruiterSignals`, `recruiter` | object | Reply activity, and recruiter details. Only when you turn them on. |
| `platformData` | object | Everything else the board publishes that has no common field. |

Compact mode returns only `title`, `company`, `location`, `salary`, `url`, `source`, `lifecycle` and `clusterId`.

Example row:

```json
{
  "listingKey": "zhaopin:40906731305",
  "sourcePlatform": "zhaopin",
  "inventoryType": "job",
  "title": "Python 开发工程师",
  "company": "北京京必达科技有限公司",
  "companyIndustry": "汽车后市场",
  "companySize": "20-99人",
  "locationRaw": "工作地点：房山区 · 西潞",
  "city": "北京",
  "cityEn": "Beijing",
  "district": "房山",
  "salaryRaw": "1.4-2.8万",
  "salaryDisclosed": true,
  "salaryCurrency": "CNY",
  "salaryPeriod": "month",
  "salaryMonthlyMinCny": 14001,
  "salaryMonthlyMaxCny": 28000,
  "salaryAnnualMinCny": 168012,
  "salaryAnnualMaxCny": 336000,
  "experienceRaw": "经验不限",
  "experienceMinYears": 0,
  "educationRaw": "学历不限",
  "educationEn": "No requirement",
  "employmentType": "全职",
  "postedAt": "2026-10-25T01:01:39.000Z",
  "clusterId": "title-company-city/v1:27855d57d91c845125389a7a",
  "lifecycleStatus": "NEW"
}
```

Also saved with every run: `RUN_SUMMARY` (rows per board, limits reached, what was skipped and why) and `RUN_HEALTH` (the status of each board).

### 💰 Pricing

Pricing is pay per result: you pay for each job row delivered, shown as "Job posting" in the pricing panel. A run that finds nothing costs nothing, and there is no subscription. Rows from 51job and Lagou carry one small extra "Premium board" charge on top of the job row, also shown in the pricing panel, because those two boards take much more effort to read. Rows from every other board carry no extra charge. If a Lagou search is blocked and returns nothing, you are not charged for it.

### ⭐ Enjoying China Jobs Feed?

<table width="100%" style="display:table;width:100%">
<tr>
<td style="padding:20px 24px 14px;background:#FDF2F4;border:1px solid #F3C6CF;border-left:5px solid #9F1239;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">One search across nine Chinese job boards instead of nine separate exports to merge.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other recruiters, analysts and job aggregators find it. Your feedback also tells us which boards and filters to add next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#9F1239;border:1px solid #F3C6CF;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/china-jobs-feed/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### ❓ FAQ

##### How do I search several Chinese job boards at once?

Leave the default boards on, enter your keywords and cities, and run. Every board is searched with the same filters and returns rows in the same format. 如何一次搜索多个招聘网站的职位？Select the boards, type a job title in Chinese or English, and one run returns them all.

##### 怎么把不同招聘网站的薪资统一成人民币月薪？

The feed does it for you. Pay written as 1.5-2万, 8千-1万, a yearly figure or a daily rate is converted to a monthly CNY range. Months of extra pay such as 13薪 are kept and used for the yearly figure. Hourly pay is kept as published without a monthly figure.

##### Does it need a login or an account on the job boards?

No. It reads public job listings only. You never enter a password, key or cookie. If a board refuses a request, the run reports that board with a plain message and keeps going with the others.

##### How fresh is the data?

Each run reads the boards at the time you start it, so rows are as current as the boards. Schedule the Actor with a `monitorScope` to see what is new, updated or closed since the last run.

##### Which boards and cities are covered?

Zhaopin, Liepin, 51job, ChinaHR, Shixiseng, iGuopin, Jobui, Lagou and eChinaCities. Beijing, Shanghai, Guangzhou, Shenzhen and about 60 other major cities are recognised by name. iGuopin city search covers seven cities for now, eChinaCities returns the first page of each search (up to 25 jobs) and Jobui returns up to 20 jobs per search. Hong Kong, Macau and Taiwan are not covered.

##### Are recruiter names included?

Not unless you ask. Names, titles and pictures are personal details, so they stay off by default. Reply activity counts without names are a separate option.

### 🔗 Other actors

- [Zhaopin Scraper 智联招聘: China Jobs & Salary API](https://apify.com/getascraper/zhaopin-jobs-scraper) ↗ - Zhaopin jobs on their own, with recruiter reply signals.
- [iGuopin Jobs Scraper 国聘: China SOE & Campus Jobs](https://apify.com/getascraper/iguopin-jobs-scraper) ↗ - State-owned and campus jobs from iGuopin.
- [eChinaCities Jobs Scraper: China English Jobs Data](https://apify.com/getascraper/echinacities-jobs-scraper) ↗ - English-language jobs in China for foreigners.
- [51job Scraper 前程无忧: China Jobs, Salary Data & Percentile Stats](https://apify.com/getascraper/51job-scraper) ↗ - 51job listings with salary statistics.
- [India Jobs Feed: Internshala, Instahyre, CutShort, Apna, Shine](https://apify.com/getascraper/india-job-inventory-feed) ↗ - The same one-run approach for Indian job boards.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/china-jobs-feed/changelog.md

# Actor input Schema

## `sources` (type: `array`):

Which Chinese job boards to read. Each board is searched with the same keywords, cities and filters, and every row says which board it came from. 51job and Lagou need a real browser, so they are slower and count as premium boards; they run on their own after the other boards finish and need at least 1024 MB of run memory (900 MB minimum). Lagou is switched off by default because it is blocked on some attempts and then returns nothing.

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

Optional search links copied from a supported board (Zhaopin, iGuopin, ChinaHR, Liepin, eChinaCities, Jobui, Shixiseng, 51job, Lagou). The board is detected from each link. Empty the Job boards list to read only the pasted links; a link that belongs to no supported board is reported and skipped.

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

Job titles or skills to search. Chinese and English both work, for example Python or 数据分析. Every keyword is searched in every city. eChinaCities only understands English words, so Chinese keywords are skipped there. Liepin matches your keyword to its closest job category. Leave empty to browse without a keyword on boards that allow it.

## `expandKeywords` (type: `boolean`):

Also search a short built-in list of synonyms for common titles (for example Python also searches Python工程师 and Python开发). Finds more jobs and uses more requests.

## `cities` (type: `array`):

Chinese cities in English, Chinese or GB code, for example Shanghai, 深圳 or 440300. Leave the list empty, or enter Nationwide, to search all of China. An unknown city is reported with suggestions and never turned into a nationwide search. Each board supports the cities it has verified codes for and says so when it skips one.

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

Keep full-time jobs, internships or campus recruitment only. Boards that do not publish a kind simply return nothing for kinds they do not have.

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

Keep jobs whose required experience overlaps this band. Jobs that do not state experience are dropped when a band is chosen.

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

Keep jobs that ask for at least this level. Jobs that do not state an education level are dropped when a level is chosen.

## `companyTypes` (type: `array`):

Keep employers of these ownership types (private, state-owned, foreign-owned, joint venture, listed). Leave empty for all.

## `minMonthlySalaryCny` (type: `integer`):

Keep jobs whose published salary range reaches at least this monthly amount. Yearly and daily pay is converted to a monthly figure first. Jobs with no published salary are dropped when a salary limit is set.

## `maxMonthlySalaryCny` (type: `integer`):

Keep jobs whose published salary range starts at or below this monthly amount.

## `onlyDisclosedSalary` (type: `boolean`):

Drop jobs that say salary is negotiable or show no salary at all.

## `postedWithinDays` (type: `integer`):

Keep jobs posted or updated within this many days. Jobs that carry no date cannot be checked and are dropped when this is set.

## `companyNames` (type: `array`):

Keep only jobs from companies whose name contains one of these words.

## `excludeKeywords` (type: `array`):

Drop jobs whose title, company, category or tags contain any of these words. English words match whole words only (excluding go keeps Google jobs); Chinese words match anywhere in the text.

## `includeDescription` (type: `boolean`):

Add the job description text where the board provides it. Makes rows larger.

## `includeRecruiterSignals` (type: `boolean`):

Add how recently and how often the recruiter replies, where the board shows it. Counts and recency only, no names.

## `includeRecruiterNames` (type: `boolean`):

Add the recruiter name, title and avatar where the board shows them. These are personal details, so they stay off unless you need them.

## `includeSourceFields` (type: `boolean`):

Attach the untouched record from the board under provenance, for audits and fields not mapped to the common format.

## `convertToUsd` (type: `boolean`):

Add monthly salary in US dollars using the current exchange rate. If the rate cannot be loaded the USD fields are left out.

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

Give a name to track this search over time. Each run marks every row NEW, UPDATED, UNCHANGED or REOPENED, and a job that stays gone on two complete scans is reported CLOSED. Use the same name and settings on every scheduled run. Leave empty for a one-off run.

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

All rows with every field, only rows that are new or changed since the last run, or a short compact row for feeds. Compact rows keep one row per job.

## `uniqueOnly` (type: `boolean`):

When the same job is listed on several boards, keep only the richest copy. Every row carries a cluster id either way, so you can also group them yourself.

## `includeClosed` (type: `boolean`):

When monitoring, add a short CLOSED row for each job that disappeared on two complete scans. Closed rows count as delivered rows.

## `maxTotalRows` (type: `integer`):

Hard limit on rows delivered by the whole run. It is shared fairly between the boards, and a board that finds less hands its share to the others.

## `maxItemsPerSource` (type: `integer`):

Most jobs read from one board in this run (split across your keyword and city combinations).

## `maxPagesPerSource` (type: `integer`):

Most result pages read for each keyword and city on a board. A search that stops here is not treated as complete, so it can not report closed jobs.

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

Optional. By default each board is tried without a proxy first and moves to a proxy only if it is refused. A proxy chosen here is used for every board instead.

## `boardOptions` (type: `object`):

Optional per-board settings as JSON, keyed by board id. For example {"iguopin": {"categoryIds": \["..."]}} or {"51job": {"industry": "...", "sortBy": "1"}}. Unknown keys are ignored.

## Actor input object example

```json
{
  "sources": [
    "zhaopin",
    "iguopin",
    "chinahr",
    "liepin"
  ],
  "keywords": [
    "Python"
  ],
  "expandKeywords": false,
  "cities": [
    "Beijing"
  ],
  "employmentKind": "any",
  "experience": "any",
  "education": "any",
  "companyTypes": [],
  "onlyDisclosedSalary": false,
  "companyNames": [],
  "excludeKeywords": [],
  "includeDescription": false,
  "includeRecruiterSignals": false,
  "includeRecruiterNames": false,
  "includeSourceFields": false,
  "convertToUsd": false,
  "monitorScope": "",
  "outputMode": "all",
  "uniqueOnly": false,
  "includeClosed": true,
  "maxTotalRows": 25,
  "maxItemsPerSource": 25,
  "maxPagesPerSource": 5,
  "boardOptions": {}
}
```

# Actor output Schema

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

No description

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

No description

## `health` (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 = {
    "sources": [
        "zhaopin",
        "iguopin",
        "chinahr",
        "liepin"
    ],
    "keywords": [
        "Python"
    ],
    "expandKeywords": false,
    "cities": [
        "Beijing"
    ],
    "employmentKind": "any",
    "experience": "any",
    "education": "any",
    "companyTypes": [],
    "onlyDisclosedSalary": false,
    "companyNames": [],
    "excludeKeywords": [],
    "includeDescription": false,
    "includeRecruiterSignals": false,
    "includeRecruiterNames": false,
    "includeSourceFields": false,
    "convertToUsd": false,
    "monitorScope": "",
    "outputMode": "all",
    "uniqueOnly": false,
    "includeClosed": true,
    "maxTotalRows": 25,
    "maxItemsPerSource": 25,
    "maxPagesPerSource": 5,
    "boardOptions": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/china-jobs-feed").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 = {
    "sources": [
        "zhaopin",
        "iguopin",
        "chinahr",
        "liepin",
    ],
    "keywords": ["Python"],
    "expandKeywords": False,
    "cities": ["Beijing"],
    "employmentKind": "any",
    "experience": "any",
    "education": "any",
    "companyTypes": [],
    "onlyDisclosedSalary": False,
    "companyNames": [],
    "excludeKeywords": [],
    "includeDescription": False,
    "includeRecruiterSignals": False,
    "includeRecruiterNames": False,
    "includeSourceFields": False,
    "convertToUsd": False,
    "monitorScope": "",
    "outputMode": "all",
    "uniqueOnly": False,
    "includeClosed": True,
    "maxTotalRows": 25,
    "maxItemsPerSource": 25,
    "maxPagesPerSource": 5,
    "boardOptions": {},
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/china-jobs-feed").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 '{
  "sources": [
    "zhaopin",
    "iguopin",
    "chinahr",
    "liepin"
  ],
  "keywords": [
    "Python"
  ],
  "expandKeywords": false,
  "cities": [
    "Beijing"
  ],
  "employmentKind": "any",
  "experience": "any",
  "education": "any",
  "companyTypes": [],
  "onlyDisclosedSalary": false,
  "companyNames": [],
  "excludeKeywords": [],
  "includeDescription": false,
  "includeRecruiterSignals": false,
  "includeRecruiterNames": false,
  "includeSourceFields": false,
  "convertToUsd": false,
  "monitorScope": "",
  "outputMode": "all",
  "uniqueOnly": false,
  "includeClosed": true,
  "maxTotalRows": 25,
  "maxItemsPerSource": 25,
  "maxPagesPerSource": 5,
  "boardOptions": {}
}' |
apify call getascraper/china-jobs-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/china-jobs-feed"
        }
    }
}
```

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/1pJSp13lO8ggYNu80/builds/THfklW4UnrCMoEgUj/openapi.json
