HelloWork Scraper & New-Job Monitor - France Jobs & Skills avatar

HelloWork Scraper & New-Job Monitor - France Jobs & Skills

Pricing

from $0.73 / 1,000 job returneds

Go to Apify Store
HelloWork Scraper & New-Job Monitor - France Jobs & Skills

HelloWork Scraper & New-Job Monitor - France Jobs & Skills

For France recruitment, skills research and job boards: HelloWork listings with what most job feeds leave out - years of experience wanted, education level, and the exact skills asked for. Salaries are scarcer: only 7 of 20 listings publish one. Monitoring returns only jobs new to you.

Pricing

from $0.73 / 1,000 job returneds

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

Share

HelloWork Scraper - France Jobs, Experience & Skills

For filtering French roles by required experience or education, tracking the skills a role asks for across a city or sector, and feeding a job board or newsletter: jobs from HelloWork with the part most job feeds leave out — how many years of experience the employer wants, what education level, and the exact skills asked for.

Present on every listing measured, not on a lucky few. Checked against the live site on 2026-09-03: experienceMonths, educationRequirements and skills came back on 20 of 20 listings (100%). A salary came back on 7 of 20 (37%) — French employers frequently do not publish one, so minSalary keeps a job whose salary is unknown rather than treating it as low, which would silently hide most of the market.

A filter here actually filters. ?l=paris narrows developpeur from 834 jobs to 206. A city HelloWork does not have returns zero results — it never falls back to the full list and lets you think you filtered. A keyword it does not have does the same.

Each job is read from the JSON-LD JobPosting block HelloWork publishes for search engines — 21 fields, present on 19 of 20 pages measured. That block is maintained for Google, so it survives visual redesigns that break HTML scrapers.

No API key. No proxy needed. Reads the same public pages a visitor sees. Export as JSON, CSV or Excel.

Unofficial. This Actor is not affiliated with, endorsed by, or sponsored by HelloWork. All product names are trademarks of their respective owners.


Run it tomorrow and you only get what is new

Schedule this Actor with monitoringMode: true and each run returns only the jobs it has not returned before. Not "here is everything again, please de-duplicate it yourself" — the Actor remembers what it already gave you, so a daily feed costs you the handful of new roles, not the whole board every morning. You are never charged for the same job twice.

Jobs your filters removed are remembered too, so widening a filter later does not resurrect them as false "new" jobs. Jobs that did not fit under your limit are not remembered, so they are still waiting on the next run instead of being silently lost.


Why this one is different

The salary is honest about how often it exists

Measured on 20 live listings: only 7 (37%) publish a salary. French employers frequently do not.

So a job with no published salary comes back with salaryMin: null - not 0. A zero would quietly turn into "€0 per year" in a spreadsheet, which is worse than an empty cell. The currency and the period (year, month, hour) are taken from what HelloWork actually states; when it states nothing, salaryPeriod is null rather than a guess.

What the employer requires, on every job

The same 20 listings, measured:

fieldhow often it is filled
experienceMonths100%
educationRequirements100%
skills100%
salaryMin / salaryMax37%

That is the reason to use this one: you can filter French roles by required experience and education without opening a single advert.

An empty search is an answer, not a silent fallback

Measured: ?l=paris narrows developpeur from 834 to 206 jobs. A city HelloWork does not have returns zero results - it never falls back to every job and lets you think you filtered. A keyword it does not have does the same.

When that happens you get one no-results row saying so, and it is not charged. A page that could not be read at all is a different row (unreadable) carrying the HTTP status.

Read from the structured data, not from the layout

Each job is taken from the JSON-LD JobPosting block HelloWork publishes for search engines - 21 fields, present on 19 of 20 pages measured. That block is maintained for Google, so it survives visual redesigns that break HTML scrapers. HTML tags are stripped from every text field before you get it.


Input

FieldTypeDefaultDescription
keywordstring—French keyword: commercial, comptable, infirmier… Leave empty to search every job in city (?l=paris) or all of France. Only when keyword, city, keywords and companyNames are all empty is the example developpeur used, and every row says so in note. Every row carries searchUrl
citystring—paris, lyon, marseille… (834 → 206 for Paris)
maxJobsinteger301-1000. One job = one row = one charged event
includeDescriptionbooleantrueFull advert text, HTML stripped
maxPagesinteger0Safety cap. 0 = decide from maxJobs (30 per page)
keywordsarray—Keep only jobs containing one of these words
keywordMatchstringanyany or all
excludeKeywordsarray—Drop jobs containing one of these
companyNamesarray—Keep only these employers (partial match)
minSalaryinteger0A job with no published salary is kept
requireSalarybooleanfalseDrop the ~63% that hide the salary
postedWithinDaysinteger00 = no limit. An unreadable date is kept
monitoringModebooleanfalseReturn only jobs not returned on a previous run
resetMonitoringStatebooleanfalseOne-shot: forget what was already returned

Filters are applied before you are charged

The filters narrow the jobs already read - nothing extra is fetched from HelloWork - and a job that does not match is never delivered and never charged. If a search returns jobs but none match your filters you get one unpaid row saying exactly that (no-filter-match), so you can tell "the filter was too tight" apart from "HelloWork has nothing".

Two of them refuse to guess. Only 37% of French listings publish a salary, so minSalary keeps a job whose salary is unknown rather than treating it as low - otherwise the filter would silently hide most of the market. A job with an unreadable posted date is kept by postedWithinDays for the same reason. Turn on requireSalary when you really do want only the priced ones.

Monitoring mode turns this into a daily feed

Schedule it with monitoringMode: true and each run returns only the jobs it has not returned before. Already-seen jobs are skipped before their pages are opened, so a repeat run is fast as well as free. The first run returns everything and remembers it.

The minimal call is an empty input: 30 developer jobs across France.


Output columns

ColumnExample
jobId80665390
urlthe job page
titleDéveloppeur H/F
company / companyUrlAkanea Développement
city / region / postalCodeLa Penne-sur-Huveaune / Provence-Alpes-Côte d'Azur
salaryMin / salaryMax32000 / 40000 — or null when not published
salaryPeriod / salaryCurrencyyear / EUR
employmentType["FULL_TIME"], ["TEMPORARY","FULL_TIME"]
experienceMonths12 — the months of experience asked for, as a number
educationRequirements["bachelor degree"] — always an array
skills["SQL", "WinDev", …] — always an array
qualificationsthe advert’s own wording, HTML stripped
industry / occupationalCategoryHelloWork's own classification
datePosted / validThrough2026-09-02T18:21:34Z / …
directApplytrue when you can apply on HelloWork itself
descriptionfull advert text, HTML stripped
status / noteonly on rows that carry no job, with the reason

Measured, not estimated

Checked against the live site on 2026-09-03:

  • developpeur returns 834 jobs, 30 per page; page 2 shares only 2 with page 1.
  • ?l=paris → 206 jobs. A city that does not exist → 0 results, not a full list.
  • JSON-LD JobPosting on 19 of 20 pages (21 fields).
  • Salary on 7 of 20 (37%); experience, education and skills on 20 of 20.
  • https://www.hellowork.com/robots.txt has no User-agent: * section at all.

The Actor ships with 15 checks run against saved copies of a listing page, a job with a salary and a job without one, plus a mutation suite of 21 deliberate breakages - all 21 are caught.


Typical uses

  • Filter French roles by required experience or education without reading adverts.
  • Track which skills a role asks for across a city or a whole sector.
  • Build a salary picture where one exists, without pretending the other 63% are zero.
  • Feed a job board or a newsletter with fresh French roles and their expiry dates.

Notes and limits

  • HelloWork lists French jobs. Keywords are in French; developer finds far less than developpeur.
  • Salaries are in EUR and exist on roughly a third of listings (measured 37%).
  • description is the advert text with HTML removed, not the original markup.
  • Some employers publish only a region, not a town (measured: 1 in 8). Those rows have city: null and region filled - the town is not invented from the region.

Other tools by NeverEmpty

Support

Found a row that looks wrong? Open an issue on the Actor page with the url from the row.