HelloWork Scraper - France Jobs, Experience & Skills
Pricing
from $0.73 / 1,000 job returneds
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
8 hours ago
Last modified
Categories
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:
| field | how often it is filled |
|---|---|
experienceMonths | 100% |
educationRequirements | 100% |
skills | 100% |
salaryMin / salaryMax | 37% |
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
| Field | Type | Default | Description |
|---|---|---|---|
keyword | string | developpeur | French keyword: commercial, comptable, infirmier… |
city | string | — | paris, lyon, marseille… (834 → 206 for Paris) |
maxJobs | integer | 30 | 1-1000. One job = one row = one charged event |
includeDescription | boolean | true | Full advert text, HTML stripped |
maxPages | integer | 0 | Safety cap. 0 = decide from maxJobs (30 per page) |
keywords | array | — | Keep only jobs containing one of these words |
keywordMatch | string | any | any or all |
excludeKeywords | array | — | Drop jobs containing one of these |
companyNames | array | — | Keep only these employers (partial match) |
minSalary | integer | 0 | A job with no published salary is kept |
requireSalary | boolean | false | Drop the ~63% that hide the salary |
postedWithinDays | integer | 0 | 0 = no limit. An unreadable date is kept |
monitoringMode | boolean | false | Return only jobs not returned on a previous run |
resetMonitoringState | boolean | false | One-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
| Column | Example |
|---|---|
jobId | 80665390 |
url | the job page |
title | Développeur H/F |
company / companyUrl | Akanea Développement |
city / region / postalCode | La Penne-sur-Huveaune / Provence-Alpes-Côte d'Azur |
salaryMin / salaryMax | 32000 / 40000 — or null when not published |
salaryPeriod / salaryCurrency | year / EUR |
employmentType | ["FULL_TIME"], ["TEMPORARY","FULL_TIME"] |
experienceMonths | 12 — the months of experience asked for, as a number |
educationRequirements | ["bachelor degree"] — always an array |
skills | ["SQL", "WinDev", …] — always an array |
qualifications | the advert’s own wording, HTML stripped |
industry / occupationalCategory | HelloWork's own classification |
datePosted / validThrough | 2026-09-02T18:21:34Z / … |
directApply | true when you can apply on HelloWork itself |
description | full advert text, HTML stripped |
status / note | only on rows that carry no job, with the reason |
Measured, not estimated
Checked against the live site on 2026-09-03:
developpeurreturns 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
JobPostingon 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.txthas noUser-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;
developerfinds far less thandeveloppeur. - Salaries are in EUR and exist on roughly a third of listings (measured 37%).
descriptionis 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: nullandregionfilled - the town is not invented from the region.
Other tools by NeverEmpty
- Reed Jobs Scraper - UK Salaries, Remote & Expiry
- Internshala Scraper - India Jobs & Internships, Salary
- Instahyre Scraper - India Tech Jobs & Company Data
Support
Found a row that looks wrong? Open an issue on the Actor page with the url from the row.