# Jobui Scraper 职友集: China Jobs with CNY Salary & Employer Data (`getascraper/jobui-china-jobs-scraper`) Actor

Scrape Jobui 职友集 China job listings by keyword and city, with pay converted to monthly and yearly CNY numbers. Add employer profiles, market salary benchmarks or original posting links. Filter by salary, experience, education and company size. Scheduled runs return only new jobs. 中国招聘数据采集.

- **URL**: https://apify.com/getascraper/jobui-china-jobs-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (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 $1.88 / 1,000 jobui records

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

## 💼 Jobui Scraper 职友集: China Jobs with CNY Salary & Employer Data

<table width="100%" style="table-layout:fixed;border-collapse:collapse;margin-bottom:0">
<tr>
<td colspan="4" style="padding:14px 18px;background:#FFF7ED;border-top:3px solid #C2410C;border-left:1px solid #D6D3D1;border-right:1px solid #D6D3D1;border-radius:8px 8px 0 0">
<span style="font-size:16px;font-weight:700;color:#1C1917">Compare China's big job boards side by side.</span> <span style="font-size:15px;color:#57534E">Jobui adds pay benchmarks and employer profiles to the job and salary data from Zhaopin, 51job and Liepin.</span>
</td>
</tr>
<tr>
<td colspan="4" style="padding:10px 14px;background:#C2410C;border-left:1px solid #D6D3D1;border-right:1px solid #D6D3D1">
<span style="color:#FFFFFF;font-size:14px;font-weight:700;letter-spacing:0.5px">China jobs source comparison</span>
<span style="color:#FED7AA;font-size:13px">&nbsp;&nbsp;&bull;&nbsp;&nbsp;Jobui, Zhaopin, 51job and Liepin listings side by side</span>
</td>
</tr>
<tr>
<td style="padding:10px 12px;border-left:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25%;background:#FFFFFF;border-radius:0 0 0 8px">
<span style="color:#1C1917;overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-y4gjuGAC4xGshlm6m-lb3TrznfpI-CompressJPEG.Online_img%28512x512%29_%288%29.jpg" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/getascraper/zhaopin-jobs-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Zhaopin</a></span><br>
<span style="color:#57534E;font-size:11px">Jobs, salary &amp; hiring-change monitoring</span>
</td>
<td style="padding:10px 12px;border-left:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25%;background:#FFFFFF">
<span style="color:#1C1917;overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-e2mxWFMIH10tIVN0f-yhHOLwlfsM-CompressJPEG.Online_img%28512x512%29_%289%29.jpg" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/getascraper/51job-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">51job</a></span><br>
<span style="color:#57534E;font-size:11px">Jobs, salary &amp; employer context</span>
</td>
<td style="padding:10px 12px;border-left:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25%;background:#FFFFFF">
<span style="color:#1C1917;overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-BuC7iEzhhplgO8ZX4-l5qn04Im5u-CompressJPEG.Online_img%28512x512%29_%2811%29.jpg" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/getascraper/liepin-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Liepin</a></span><br>
<span style="color:#57534E;font-size:11px">White-collar roles &amp; salary data</span>
</td>
<td style="padding:10px 12px;border-left:1px solid #D6D3D1;border-right:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25%;background:#FFF7ED;border-radius:0 0 8px 0">
<span style="color:#C2410C;overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-jiHYgTx8EHgOhEhLP-Zeq08RODl6-images_%2869%29.png" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/getascraper/jobui-china-jobs-scraper" style="color:#C2410C;text-decoration:none;font-weight:700;font-size:13px">Jobui</a></span><br>
<span style="color:#C2410C;font-size:11px;font-weight:700">&#10148; You are here</span>
</td>
</tr>
</table>
<table width="100%" style="margin-top:0;margin-bottom:0">
<tr>
<td style="padding:24px 28px;background:#FFF7ED;border:1px solid #FED7AA;border-top:4px solid #C2410C;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Turn Jobui job posts into pay numbers you can compare across cities</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Search Jobui by role and city and get every posted salary as monthly and yearly yuan, with optional employer profiles and a market pay benchmark for the role.</span>
</td>
</tr>
</table>
<table width="100%" style="margin-top:0">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #FED7AA;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#C2410C">💰 Pay as numbers in yuan</span><br>
<span style="font-size:12px;color:#57534E">Day, month and 13薪 pay become comparable monthly and yearly figures.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #FED7AA;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#C2410C">🏢 Employer profile on demand</span><br>
<span style="font-size:12px;color:#57534E">Size, funding stage, hiring trend, pay bands and competitors for each employer.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #FED7AA;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#C2410C">📊 Market pay benchmark</span><br>
<span style="font-size:12px;color:#57534E">The most common pay band for a role and city, with its sample size.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #FED7AA;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#C2410C">🔔 Only new jobs</span><br>
<span style="font-size:12px;color:#57534E">Schedule a run and get just the jobs that are new or whose pay changed.</span>
</td>
</tr>
</table>

Search 职友集 (Jobui), one of China's best-known salary and employer sites, and export clean job rows with pay already converted to numbers. Every field comes from public Jobui pages. No login, account or cookie is needed.

### 🔍 What does Jobui Scraper do?

You give it job keywords and cities, or paste Jobui links, and it returns one row per job or employer.

- **Jobs by keyword and city.** Title, employer, industry, company size, posted pay, experience, education and posting date for every result.
- **Pay as numbers.** Posted pay such as "8千-1.2万·13薪" or "150-200元/天" becomes minimum, maximum, monthly and yearly figures in yuan. Negotiable pay (面议) is marked as such, with no numbers invented.
- **Employer rows.** Paste a Jobui company directory link and get ranked employers with open jobs, hiring growth, average pay and the titles they posted last.
- **Optional extras.** Add a full employer profile, a market pay benchmark for the role and city, or the original posting link.

A field Jobui does not show is left out. Nothing is filled with placeholder text.

### 💡 Why use it?

- **I am a recruiter** pricing a new role, so I need the posted pay for the same title across my city, as monthly numbers I can sort.
- **I am an HR analyst** benchmarking pay by city, experience and education, and I need 13薪 counted into a yearly figure.
- **I am a market researcher** profiling employers, and I need size, funding stage, hiring trend and pay bands before I write my report.
- **I sell to growing companies** and build a lead list from Jobui's ranked employers, with open jobs and hiring growth next to each name.

### 🚀 How to use it

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#FFF7ED;border:1px solid #FED7AA;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#C2410C;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Enter roles and cities</span><br>
<span style="font-size:12px;color:#57534E">Type job keywords and cities, or paste Jobui search and company links.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#FFF7ED;border:1px solid #FED7AA;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#C2410C;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Add filters and extras</span><br>
<span style="font-size:12px;color:#57534E">Set salary, experience and education limits, then switch on any extras you need.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#FFF7ED;border:1px solid #FED7AA;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#C2410C;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Download or schedule it</span><br>
<span style="font-size:12px;color:#57534E">Export to Excel, CSV or JSON, or run daily to get only new jobs.</span>
</td>
</tr>
</table>

Leave every source empty to see a sample: sales engineer jobs in Guangzhou. Jobui shows its top 20 jobs for each search, so for volume add more keywords and cities, turn on related roles, or open company pages, which list every public opening of one employer.

To get only what is new, turn on **Only new or changed jobs since last run** and schedule the same input daily. The first run returns everything, and later runs return new jobs plus jobs whose pay text changed. Use a different tracking name for each saved search.

### 📥 Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `searchKeywords` | array of strings | No | Job titles or skills to search, one per row. Chinese works best, such as 销售工程师 or 会计, and English terms like Java also work. Each keyword is searched in every city. |
| `cities` | array of strings | No | Cities to search, in Chinese (广州, 上海) or English. Use 全国 or Nationwide for all of China. |
| `startUrls` | array of URLs | No | Any public Jobui job search, company page or company directory link. The type is detected for you. |
| `companyUrls` | array of strings | No | Jobui company links or numeric company ids. Every public opening of each company is collected. |
| `sortBy` | enum | No | Relevance, or newest first. Newest first suits monitoring. |
| `relatedRolesPerSearch` | integer | No | Also searches the closest related job titles that Jobui suggests. Each related role adds up to 20 more jobs. Defaults to 0. |
| `companyJobPages` | integer | No | How many pages of openings to read for each company. Each page holds about 15 jobs. Defaults to 1. |
| `includeKeywords` | array of strings | No | Keep a job only if its title, employer, tagline or industry contains one of these words. |
| `excludeKeywords` | array of strings | No | Drop a job if its title, employer, tagline or industry contains any of these words, for example 实习 to skip internships. |
| `minMonthlySalary` | integer | No | Keep jobs whose top published monthly pay reaches this many yuan. Daily and yearly pay are converted first. Negotiable jobs are dropped when this is set. |
| `maxMonthlySalary` | integer | No | Keep jobs whose lowest published monthly pay is at most this many yuan. Use 0 for no maximum. |
| `onlyWithSalary` | boolean | No | Drop jobs that only say 面议 (negotiable) instead of showing a pay range. Off by default. |
| `experienceLevels` | array of enums | No | Keep jobs asking for the chosen experience levels, from fresh graduate to 10 years or more. |
| `educationLevels` | array of enums | No | Keep jobs whose minimum education is one of the chosen levels. |
| `companySizes` | array of enums | No | Keep jobs from employers in the chosen headcount bands, from under 50 to 10,000 or more. |
| `industryKeywords` | array of strings | No | Keep jobs whose employer industry contains one of these Chinese words, for example 互联网 or 房地产. |
| `postedWithinDays` | integer | No | Keep only jobs posted in the last N days. Use 0 to ignore posting age. |
| `minCompanyViews` | integer | No | Keep jobs from employers that Jobui users have viewed at least this many times, a simple signal of how well known the employer is. |
| `includeEmployerProfile` | boolean | No | Adds a full public employer profile to each row. Billed only on rows that carry it. Off by default. |
| `includeSalaryBenchmark` | boolean | No | Adds the Jobui pay report for the searched role and city to each job. Included at no extra charge. Off by default. |
| `resolveApplyUrl` | boolean | No | Adds the original posting link and the job board where each job was first posted. Billed only on rows that carry it. Off by default. |
| `onlyNewSinceLastRun` | boolean | No | Returns only jobs you have not received before, plus jobs whose pay text changed. Each row is marked as new or updated. |
| `monitorScope` | string | No | A name for this saved feed. Use different names to keep separate watches, such as guangzhou-sales and shanghai-finance, apart. |
| `maxItems` | integer | No | Stops after this many job rows are saved. Defaults to 20. |
| `maxEmployers` | integer | No | Stops after this many employer rows are saved. Only used with a company directory link. Defaults to 20. |
| `proxyConfiguration` | object | No | Turned on by default, which suits normal runs. If a run reports a verification page, switch to residential proxies. |

### 📊 Data table

Each job is one row. Employer directory links return one row per employer. Fields Jobui does not show are left out.

| Field | Type | Description |
| --- | --- | --- |
| `recordType` | text | `job` or `employer`. |
| `listingId`, `title`, `listingUrl` | text | Job id, title and Jobui link. |
| `applyUrl`, `sourceBoard` | text | Original posting link and board name (with the posting link option). |
| `companyId`, `companyName`, `companyUrl`, `companyProfileUrl`, `companyLogoUrl` | text | The employer and its Jobui pages. |
| `companyTagline`, `industry`, `companySize` | text | What the employer does, its industry and headcount band. |
| `companySizeMin`, `companySizeMax`, `companyViews` | number | Headcount range and how often Jobui users viewed the employer. |
| `salary` | text | Pay exactly as posted, such as 8千-1.2万·13薪. |
| `salaryMin`, `salaryMax`, `salaryMonths` | number | Pay range in yuan in the posted period, and months paid per year. |
| `salaryCurrency`, `salaryPeriod` | text | Currency and pay period: month, day, hour or year. |
| `salaryMonthlyMin`, `salaryMonthlyMax` | number | Monthly estimate, so day and year rates compare with month rates. |
| `salaryYearlyMin`, `salaryYearlyMax` | number | Yearly estimate that counts extra months such as 13薪. |
| `salaryNegotiable` | true or false | True when the posting says 面议. No numbers are invented in that case. |
| `experience`, `experienceBucket` | text | Experience asked for, as posted and as a group. |
| `experienceMinYears`, `experienceMaxYears` | number | Experience range in years. |
| `education`, `educationBucket` | text | Education asked for, as posted and as a group. |
| `educationRank` | number | Education level as a rank you can sort on. |
| `employmentType` | text | Full-time, part-time or internship (company pages). |
| `location`, `district` | text | City, and district when Jobui shows it. |
| `postedAtText`, `postedDate` | text | Posting age as shown, and as a calendar date. |
| `postedDaysAgo` | number | Days since the job was posted. |
| `searchKeyword`, `searchCity`, `sourceType`, `sourceUrl` | text | Where the row came from. |
| `changeType`, `previousSalary`, `firstSeenAt` | text | New or updated, the earlier pay text, and when it was first seen (change tracking). |
| `employer` | object | Employer profile (with the employer profile option). |
| `marketSalary` | object | Pay benchmark for the role and city (with the benchmark option). |
| `directoryRank`, `openJobs`, `hiringGrowthPercent`, `averageMonthlySalary` | number | Employer rows: rank, open jobs, hiring growth and average monthly pay. |
| `fundingStage`, `latestJobDate`, `directoryTitle` | text | Employer rows: funding stage, date of the latest job and directory name. |
| `businessTags`, `honors`, `latestJobTitles` | list | Employer rows: business focus, recognitions and the latest titles posted. |
| `scrapedAt` | text | When the row was collected. |

The employer profile includes the legal name, ownership type, size, years since founding, industries, funding stage and rounds, followers, open jobs, the most common pay band, pay bands, pay against peers, hiring trend by year, job category, city, education and experience mix, office addresses, honors, popularity rankings, registration status, registered capital, credit code, registered address and competitors with their open jobs and average pay. Details that Jobui hides behind its own sign-in are not included.

### 📤 Sample output

A job row from a real run with the posting link and market pay benchmark switched on. The benchmark is shortened to a few fields, and the employer profile is left out for space.

```json
{
  "recordType": "job",
  "listingId": "257055473",
  "title": "销售工程师",
  "listingUrl": "https://www.jobui.com/job/257055473/",
  "applyUrl": "https://jobs.51job.com/guangzhou-pyq/101476860.html?refer=jobui",
  "sourceBoard": "51job.com",
  "companyName": "广东奥迪威传感科技股份有限公司",
  "companyTagline": "超声波传感器制造商",
  "industry": "电子技术/半导体/集成电路",
  "companySize": "500-999人",
  "salary": "8千-1.2万·13薪",
  "salaryMin": 8000,
  "salaryMax": 12000,
  "salaryCurrency": "CNY",
  "salaryPeriod": "month",
  "salaryMonths": 13,
  "salaryNegotiable": false,
  "salaryMonthlyMin": 8000,
  "salaryMonthlyMax": 12000,
  "salaryYearlyMin": 104000,
  "salaryYearlyMax": 156000,
  "experience": "3-5年",
  "experienceBucket": "3-5年",
  "education": "本科以上",
  "educationBucket": "本科",
  "location": "广州",
  "postedAtText": "11天前",
  "postedDate": "2026-09-30",
  "marketSalary": {
    "role": "销售工程师",
    "city": "广州",
    "sampleSize": 4781,
    "asOfDate": "2026-10-11",
    "topMonthlyBand": "8-15K",
    "topMonthlyBandSharePercent": 61.5,
    "topYearlyBand": "10-18W"
  },
  "scrapedAt": "2026-10-11T09:28:02.190Z"
}
```

### 💰 Pricing

You pay per result. A run that finds nothing costs nothing, and there are no subscriptions or setup fees. Larger Apify plans pay less per result.

- **Job or employer row.** Every row saved to your dataset counts as one result.
- **Employer profile.** An extra charge only on rows that carry the full employer profile, and only when you switch that option on.
- **Original posting link.** An extra charge only on rows that carry the posting link, and only when you switch that option on.
- **Market pay benchmark.** Included at no extra charge.

A plain run, with every option off, is billed for the rows alone. If you set a maximum charge per run, the Actor stops cleanly once that budget is used.

### ⭐ Enjoying Jobui Scraper?

<table width="100%" style="display:table;width:100%">
<tr>
<td style="padding:20px 24px 14px;background:#FFF7ED;border:1px solid #FED7AA;border-left:5px solid #C2410C;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 run just turned posted pay into monthly and yearly yuan figures you can compare.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other recruiters, pay analysts and market researchers find this Actor. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#C2410C;border:1px solid #FED7AA;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/jobui-china-jobs-scraper/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

##### 职友集上的招聘职位和薪资怎么批量导出?

Type a role such as 会计 under job keywords and a city such as 上海 under cities, then run it. Each job comes back as a row with pay in yuan, ready to export to Excel or CSV.

##### 职友集某个职位在某个城市的市场薪资怎么查?

Switch on the market pay benchmark. Each job then carries the most common monthly pay band for that role and city, the share of jobs in that band, the number of pay samples behind it and the change against last year.

##### Why do I get 20 jobs per search?

Jobui shows 20 jobs on the public page of each search. Add more keywords and cities, turn on related roles, or open company pages to collect more distinct jobs in one run.

##### What is not included?

Jobui does not publish job descriptions, skills, benefits, recruiter names, map coordinates or company star ratings in its listings, so those fields are not returned. Phone numbers and emails are not collected. Pay numbers that Jobui hides from visitors who are not signed in are left out rather than guessed.

### 🔗 Other actors

- [Yingjiesheng Scraper 应届生求职网: China Graduate Jobs & Campus Talks](https://apify.com/getascraper/yingjiesheng-graduate-jobs-scraper) ↗ - graduate jobs, application deadlines and campus talks.
- [Zhaopin Scraper 智联招聘: China Jobs & Salary API](https://apify.com/getascraper/zhaopin-jobs-scraper) ↗ - jobs, salaries and employer details from Zhaopin.
- [Liepin Scraper 猎聘: China Jobs, Salary Ranges & Change Tracking](https://apify.com/getascraper/liepin-scraper) ↗ - professional jobs with change tracking.
- [51job Scraper 前程无忧: China Jobs, Salary Data & Recruiter Scores](https://apify.com/getascraper/51job-scraper) ↗ - jobs and salary data from 51job.
- [ChinaHR Jobs Scraper 中华英才网: China Hiring Data](https://apify.com/getascraper/chinahr-jobs-scraper) ↗ - ChinaHR hiring data.

# Changelog

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

# Actor input Schema

## `searchKeywords` (type: `array`):

Job titles or skills to search for, one per row. Chinese works best (for example 销售工程师 or 会计), and English terms such as Java also work. Each keyword is searched in every city below.

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

Cities to search, one per row. Use Chinese names (广州, 上海) or English (Shanghai, Shenzhen). Use 全国 or Nationwide for all of China. If you give keywords but no city, the search covers all of China.

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

Paste any public Jobui link: a job search (jobui.com/jobs...), a company page (jobui.com/company/...), or a company directory page (jobui.com/rank/company/view/...). The type is detected for you.

## `companyUrls` (type: `array`):

Jobui company links or numeric company ids, one per row. Every public opening of each company is collected. Example: 11960098.

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

Relevance is Jobui's default order. Newest puts the most recently posted jobs first, which is best for monitoring.

## `relatedRolesPerSearch` (type: `integer`):

Also search the closest related job titles that Jobui suggests for each keyword (for example 技术销售工程师 next to 销售工程师). Each related role adds up to 20 more jobs. Set 0 to search only what you asked for.

## `companyJobPages` (type: `integer`):

How many pages of openings to read for each company page or company id. Each page holds about 15 jobs.

## `includeKeywords` (type: `array`):

Keep a job only if its title, company name, company tagline or industry contains at least one of these words. Leave empty to keep everything.

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

Drop a job if its title, company name, company tagline or industry contains any of these words, for example 实习 to skip internships.

## `minMonthlySalary` (type: `integer`):

Keep jobs whose top published monthly pay is at least this many yuan. Daily and yearly pay are converted to a monthly estimate. Jobs with negotiable pay are dropped when this is set. Use 0 for no minimum.

## `maxMonthlySalary` (type: `integer`):

Keep jobs whose lowest published monthly pay is at most this many yuan. Jobs with negotiable pay are dropped when this is set. Use 0 for no maximum.

## `onlyWithSalary` (type: `boolean`):

Drop jobs that only say 面议 (negotiable) instead of showing a pay range.

## `experienceLevels` (type: `array`):

Keep jobs asking for one of the chosen experience levels. Leave empty for all.

## `educationLevels` (type: `array`):

Keep jobs whose minimum education requirement is one of the chosen levels. Leave empty for all.

## `companySizes` (type: `array`):

Keep jobs from employers in the chosen headcount bands. Leave empty for all.

## `industryKeywords` (type: `array`):

Keep jobs whose employer industry contains one of these Chinese words, for example 互联网 or 房地产. Leave empty for all industries.

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

Keep only jobs posted in the last this many days. Use 0 to ignore posting age.

## `minCompanyViews` (type: `integer`):

Keep jobs from employers that Jobui users have viewed at least this many times, a simple signal of how well known the employer is. Use 0 for no minimum.

## `includeEmployerProfile` (type: `boolean`):

Adds a company profile to each row: legal name, ownership type, size, founding age, funding stage, hiring trend by year, pay bands, education and city mix, offices, honors, business registration and competitors. Loads one extra page per employer, so runs take longer.

## `includeSalaryBenchmark` (type: `boolean`):

Adds the Jobui salary report for the searched role and city to each job: how many pay samples, the most common monthly pay band and its share, the year-on-year pay change, openings this year and the busiest districts. Only available for keyword and search-link sources.

## `resolveApplyUrl` (type: `boolean`):

Looks up the job board where each listing was originally posted and adds the apply link (applyUrl) and board name (sourceBoard). Loads one extra page per job.

## `onlyNewSinceLastRun` (type: `boolean`):

Returns only jobs you have not received before, plus jobs whose pay text changed. Each row is marked NEW or UPDATED. Schedule the same input daily to get a change feed.

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

A name for this saved feed. Use different names to keep separate watches (for example guangzhou-sales and shanghai-finance) from sharing one memory. Only used when change tracking is on.

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

Stop after this many job rows are saved. Jobs are counted after filters and change tracking.

## `maxEmployers` (type: `integer`):

Stop after this many employer rows are saved. Only used when you paste a Jobui company directory link.

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

Jobui limits repeated visits from one address. Apify datacenter proxies work for normal runs. If runs report a verification page, switch to residential proxies.

## Actor input object example

```json
{
  "searchKeywords": [],
  "cities": [],
  "startUrls": [],
  "companyUrls": [],
  "sortBy": "relevance",
  "relatedRolesPerSearch": 0,
  "companyJobPages": 1,
  "includeKeywords": [],
  "excludeKeywords": [],
  "minMonthlySalary": 0,
  "maxMonthlySalary": 0,
  "onlyWithSalary": false,
  "experienceLevels": [],
  "educationLevels": [],
  "companySizes": [],
  "industryKeywords": [],
  "postedWithinDays": 0,
  "minCompanyViews": 0,
  "includeEmployerProfile": false,
  "includeSalaryBenchmark": false,
  "resolveApplyUrl": false,
  "onlyNewSinceLastRun": false,
  "monitorScope": "default",
  "maxItems": 20,
  "maxEmployers": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `runSummary` (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 = {
    "searchKeywords": [],
    "cities": [],
    "startUrls": [],
    "companyUrls": [],
    "sortBy": "relevance",
    "relatedRolesPerSearch": 0,
    "companyJobPages": 1,
    "includeKeywords": [],
    "excludeKeywords": [],
    "minMonthlySalary": 0,
    "maxMonthlySalary": 0,
    "onlyWithSalary": false,
    "experienceLevels": [],
    "educationLevels": [],
    "companySizes": [],
    "industryKeywords": [],
    "postedWithinDays": 0,
    "minCompanyViews": 0,
    "includeEmployerProfile": false,
    "includeSalaryBenchmark": false,
    "resolveApplyUrl": false,
    "onlyNewSinceLastRun": false,
    "monitorScope": "default",
    "maxItems": 20,
    "maxEmployers": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/jobui-china-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 = {
    "searchKeywords": [],
    "cities": [],
    "startUrls": [],
    "companyUrls": [],
    "sortBy": "relevance",
    "relatedRolesPerSearch": 0,
    "companyJobPages": 1,
    "includeKeywords": [],
    "excludeKeywords": [],
    "minMonthlySalary": 0,
    "maxMonthlySalary": 0,
    "onlyWithSalary": False,
    "experienceLevels": [],
    "educationLevels": [],
    "companySizes": [],
    "industryKeywords": [],
    "postedWithinDays": 0,
    "minCompanyViews": 0,
    "includeEmployerProfile": False,
    "includeSalaryBenchmark": False,
    "resolveApplyUrl": False,
    "onlyNewSinceLastRun": False,
    "monitorScope": "default",
    "maxItems": 20,
    "maxEmployers": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/jobui-china-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 '{
  "searchKeywords": [],
  "cities": [],
  "startUrls": [],
  "companyUrls": [],
  "sortBy": "relevance",
  "relatedRolesPerSearch": 0,
  "companyJobPages": 1,
  "includeKeywords": [],
  "excludeKeywords": [],
  "minMonthlySalary": 0,
  "maxMonthlySalary": 0,
  "onlyWithSalary": false,
  "experienceLevels": [],
  "educationLevels": [],
  "companySizes": [],
  "industryKeywords": [],
  "postedWithinDays": 0,
  "minCompanyViews": 0,
  "includeEmployerProfile": false,
  "includeSalaryBenchmark": false,
  "resolveApplyUrl": false,
  "onlyNewSinceLastRun": false,
  "monitorScope": "default",
  "maxItems": 20,
  "maxEmployers": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call getascraper/jobui-china-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/jobui-china-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/jiHYgTx8EHgOhEhLP/builds/ELv3GzKpzdcKNJeba/openapi.json
