HelloWork Scraper - France Jobs, Experience & Skills avatar

HelloWork Scraper - France Jobs, Experience & Skills

Pricing

from $0.73 / 1,000 job returneds

Go to Apify Store
HelloWork Scraper - France Jobs, Experience & Skills

HelloWork Scraper - France Jobs, Experience & Skills

Every job on HelloWork with what the employer actually requires: years of experience, education level and the skills asked for - on every listing measured, not just some. Plus company, city with postal code, employment type, posted and expiry dates, and the salary when published. Unofficial.

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

8 hours ago

Last modified

Share

Pull 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.

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

No API key. No proxy needed. Reads the same public pages a visitor sees.


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
keywordstringdeveloppeurFrench keyword: commercial, comptable, infirmier
citystringparis, 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)
keywordsarrayKeep only jobs containing one of these words
keywordMatchstringanyany or all
excludeKeywordsarrayDrop jobs containing one of these
companyNamesarrayKeep 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=paris206 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.