- 🔎 Search several keywords and several cities in one run. Jobs are de-duplicated by job ID, and every city on Liepin can be named by code, Chinese name or English name.
- 🧑💼 Every job now says who posted it: the hiring company or a headhunting firm (
postedByType), with the poster's job title. A new filter keeps only one kind.
- 💰 Salary figures that are easier to compare: median monthly pay, daily and annual pay converted to monthly, optional US dollars at a dated rate, and a
SALARY_STATS record with median and percentiles by keyword and city, degree, seniority and poster type.
- 📈 Change tracking now shows the previous salary and the percentage change on updated jobs.
- 🔁 Moving from another Liepin scraper is easy: the
urls, max_page and max_results inputs, including m.liepin.com search links, are accepted, and includeSourceFields adds the raw values.
- 🏢 More company context on every row: funding stage, industry and size are now filled for keyword searches, plus a cross-city duplicate flag, seniority from the job title and a full-time enrolment flag.
- 📄 Job detail now adds the full company name, work address, headcount, last update date and recruiter activity.
- 🎛️ Filters for disclosed salary only, minimum salary, excluded words and poster type.
- ⚡ Runs are much faster and lighter. Keyword searches finish in seconds instead of minutes, with no browser.
- 🏷️ The job-type label that said full-time or part-time was not supported by Liepin's data and is no longer returned (
jobKindName). Use postedByType instead.
- 🎯 Keywords are matched to the closest Liepin job category. A keyword with no matching category ends the run with a clear message and suggestions instead of returning unrelated jobs.
- 🚫 Featured jobs are no longer returned when a keyword search finds nothing, unless you turn on
fallbackToFeaturedJobs.
- 📄 Jobs whose requested description could not be read are no longer returned or charged.
- 💲 Lower prices on every plan.
- 🧹 Memory per run lowered to match the lighter workload.
- ✅ Company name, city, industry and size are now present on keyword-search rows.
- ✅ Daily pay such as 300-500元/天 is now read as a salary.
- ✅ Every ending, including blocked, unreachable and unreadable pages, finishes as a normal run with a clear status message and nothing charged. Rows collected before a problem are kept.
- ✅ Change tracking no longer reports jobs as removed from a scan that stopped at your job or page limit.
- ✅ Runs no longer end in an error when Liepin cannot be read. They finish normally, charge nothing, and the run's status message says whether Liepin confirmed there are no matching jobs or whether the attempt was blocked or could not be reached.
- 🌐 Runs that use your own proxy servers now start correctly in search and links modes.
- 🔑 Accounts without residential proxy access can now run searches. The Actor continues with automatic proxy routing instead of stopping at start-up.
- 🔁 Retries after an unreadable page now switch to a different connection instead of repeating the one that just failed.
- 🧩 One job-detail page that fails to load no longer discards the whole page of listings.
- 📥 Saved tasks that still send the retired output-format option now run instead of failing.
- 🛡️ Change tracking no longer treats an incomplete scan as complete, so jobs are never wrongly reported as removed after a partly failed run.
- ✅ Keyword searches that Liepin could not answer now reliably return the labelled featured-jobs fallback rows instead of ending as a failed run with no data. Fallback rows stay clearly marked so they are never mistaken for keyword matches.
- 🔔 Cross-run change tracking: turn on "Track changes" to get only new, updated, and removed jobs on a recurring schedule, instead of the full list every time. A watchlist name scopes independent schedules. A job is only reported removed after two consecutive complete scans confirm it, so one blocked run never falsely reports a job as gone.
- 🏠 A blocked keyword search now automatically falls back to Liepin's public featured-jobs board instead of returning an empty failed run, with every fallback row clearly labelled so it is never mistaken for a keyword match.
- ✅ A run that collected real jobs from some sources no longer fails outright just because one other source was temporarily blocked. The blocked source is still reported, but the run succeeds with the jobs it did collect.
- 🛡️ Search now defaults to residential proxies. Explicit proxy settings remain fully supported.
- 🖥️ Lowered the Actor's memory allocation to match its actual footprint. No effect on results.
- ⚡ Lowered the default result cap so a standard run finishes faster.
- 🔁 Increased retry attempts on job-detail enrichment for better resilience against transient failures.
- Fixed the default proxy route after the initial Cloud canary showed that a fixed Singapore residential pool could be challenged. Automatic Apify routing is now the default, while explicit proxy settings remain fully supported.
- Improved blocked-session recovery: the Actor now rotates through up to four isolated sessions before returning a visible source failure.
- Switched generated home and search requests to Liepin's official
blade.liepin.com listing frontend after it returned verified Cloud results while the www listing frontend was challenging all tested routes. Supplied public search URLs are safely canonicalized to the same frontend; emitted job links remain source-provided www.liepin.com URLs.
- Fixed source classification for normal Blade listings that embed generic verification text in their application shell: verified job cards now take precedence, while redirects to Liepin's dedicated safety host continue to fail visibly.
- Fixed search-result ordering: visible cards on the requested board now take priority over unrelated background recommendation responses.
- Fixed generated keyword, city, and pagination parameters to Liepin's public
key, city, dq, and currentPage names. The prior parameter names silently returned an unfiltered feed.
- Restricted search-response extraction to Liepin's dedicated public job-search endpoint, excluding unrelated background recommendations.
All notable changes to this project will be documented in this file.
- 🛡️ Challenge, malformed, and unexplained empty pages now fail visibly instead of producing successful zero-row runs.
- 🔎 Search mode captures verified Liepin job responses and keeps home-page collection as the fast default.
- 📋 Dataset rows now match the published flat schema, with genuine source job and company URLs.
- 🎯 Pagination, deduplication, and output limits now produce an exact maximum without duplicate job IDs.
- 🧾 Detail collection is opt-in and preserves the genuine listing row when a description is unavailable.
- 📊 Added a non-chargeable
OUTPUT summary with completeness and source totals.
- ⚙️ Disabled standby mode because this Actor runs as a batch job.
- 🔗 Added quick links to our other 3 China jobs actors, so you can find mainstream, tech, and white-collar job leads all in one place.