HelloWork Jobs Scraper API - France Job Board avatar

HelloWork Jobs Scraper API - France Job Board

Pricing

from $0.49 / 1,000 job returneds

Go to Apify Store
HelloWork Jobs Scraper API - France Job Board

HelloWork Jobs Scraper API - France Job Board

When a French employer publishes no salary, HelloWork prints its own estimate in the same slot, labelled Estimation Hellowork. Every row says which you're holding. Title, company, city, department, CDI, CDD, interim, stage, alternance, skills and posted date. $0.49 per 1,000.

Pricing

from $0.49 / 1,000 job returneds

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

When an employer publishes no salary, HelloWork fills the gap with its own estimate and labels it "Estimation Hellowork". In the page data the two arrive as separate fields, baseSalary and estimatedSalary, and across 90 postings they were never both present: 70 employer figures, 18 estimates, 2 with neither. Every row here carries salaryIsEstimate, so you always know which one you are holding. See Salary below, because that distinction matters more than it sounds.

HelloWork is one of France's biggest generalist job boards. Search by keyword and city, filter by contract type, remote band, experience or salary, and get structured rows back: title, company, city and department, CDI/CDD/intérim/stage/alternance, the salary when the ad carries one, the exact posted date, and the link to the posting.

There's no login and no API key involved. It runs over plain HTTP rather than a browser, which is what keeps it cheap.

Billing

$0.49 per 1,000 jobs, plus a $0.001 actor-start fee per run.

It's a flat rate, the same number on the free plan as on any paid one. The start fee stays $0.001 per run whatever memory you allocate, so what a run costs tracks the jobs it returns and nothing else.

You are charged once per real job row. Sample rows, error rows and runs that return nothing are never charged.

What you get

FieldNotes
title, companyName, jobUrl, jobId100% of rows
locationLabel, city, departmentCode, region, postalCodedepartment code is the French 75, 69, 33
contractTypeCDI, CDD, Intérim, Stage, Alternance, Freelance, …
contractDurationfor fixed-term postings: 6 mois, 12 mois, …
workingTimeFull time / Part time
teleworkLabel, isRemote, isHybridHelloWork's own télétravail band, where the employer set one
salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryTextsee Salary below
salaryIsEstimatefalse = the employer published it, true = HelloWork's estimate
salaryEstimateMin/Median/MaxHelloWork's own percentile estimate, kept separate
postedAtexact ISO timestamp from the posting page
postedRelative, postedAtEstimated"il y a 12 jours", and the date derived from it
expiresAtwhen HelloWork will take the posting down
occupationalCategory, sectors, skills, educationLevels, experienceRequired
reference, directApply, companyProfileUrl, companyLogo
descriptionHtml, descriptionText, requirementsTextonly when Include the full job description is on
searchQuery, searchLocation, page, position, scrapedAtprovenance for every row

Fill rates from a real 236-row run (comptable, Lyon): title, company, URL, contract, working time, posted date, expiry, sector and reference 100%; city and department 100%; postal code 98%; skills 96%; télétravail band 46%; experience 25%.

Salary, honestly

HelloWork shows two different things, and they're easy to confuse:

  • baseSalary is what the employer actually put in the ad.
  • estimatedSalary is HelloWork's own guess for that job title and region. Its own UI labels that one "Estimation Hellowork".

Measured over 177 postings from six unrelated searches (IT, accounting, care work, temp work, hospitality, internships):

share
Employer-published salary63%
HelloWork's own estimate only19%
No salary at all18%

The two never overlap. HelloWork only estimates when the employer published nothing. The split moves a lot by sector: a 236-row accounting run in Lyon came back 88% employer-published, a 1,497-row national retail run 57%.

Every row carries salaryIsEstimate. When it's false, salaryMin/salaryMax came from the ad. When it's true, they came from HelloWork's estimate, and the same numbers are repeated in salaryEstimateMin/salaryEstimateMax so you can drop them with one filter. If you only want real offers: salaryIsEstimate === false.

Set Only postings that show a salary to make HelloWork itself filter for you.

Example row

{
"jobId": "82120782",
"title": "Backend Developer H/F",
"companyName": "Team.is",
"jobUrl": "https://www.hellowork.com/fr-fr/emplois/82120782.html",
"city": "Paris 10e",
"departmentCode": "75",
"region": "Île-de-France",
"postalCode": "75010",
"contractType": "CDI",
"workingTime": "Full time",
"teleworkLabel": "Hybrid",
"isHybrid": true,
"salaryMin": 70000,
"salaryMax": 80000,
"salaryCurrency": "EUR",
"salaryPeriod": "YEAR",
"salaryIsEstimate": false,
"postedAt": "2026-08-07T03:11:37Z",
"expiresAt": "2026-09-06T03:11:37Z",
"occupationalCategory": "Informatique",
"skills": ["Node.js", "PostgreSQL", "API REST"]
}

Input

{
"searchQueries": ["développeur"],
"location": "Paris",
"contractTypes": ["cdi"],
"postedWithin": "week",
"maxItems": 200
}

Or paste URLs straight from your browser:

{
"startUrls": [
{ "url": "https://www.hellowork.com/fr-fr/emploi/recherche.html?k=comptable&l=Lyon" },
{ "url": "https://www.hellowork.com/fr-fr/emplois/82120782.html" }
]
}

Filters available: contract type, remote band, working time, experience band, employer type (company / recruitment agency / ESN / temp agency / training centre), posted-within, minimum salary, radius around a city, salary-shown-only, and sort by relevance or by date.

Speed and limits

Real runs, all at 1 GB:

RunRowsWall time
comptable in Nantes126 s
comptable in Lyon23640 s
commercial in Marseille, listing only24719 s
vendeur, France-wide2,0009 min 34 s
  • 30 postings per search request. There's no page cap. HelloWork pages all the way to the end of a result set, so a 24,879-result search really does have 830 pages.
  • A broad national search repeats roughly a quarter of its postings across pages, because HelloWork re-ranks between requests and lists multi-site jobs more than once. Duplicates are dropped, and maxItems counts unique postings, not raw cards.
  • With Open each posting on (the default), each row also costs one request to the posting page. Turn it off for a much faster listing-only run: you keep title, company, location, contract, working time, remote band, the employer's salary and an approximate posted date, and you lose the exact timestamp, description, skills, sector, postal code and the salary estimate.

What this does not do

  • It does not walk the intérim sub-site's own pages. Temp-work postings that appear in the main search are returned normally; hellowork.com/fr-fr/interim/… landing pages are not crawled.
  • No candidate CVs, no company reviews, no salary-benchmark pages. Jobs only.
  • No login-only content. Everything here is what a logged-out visitor sees.
  • It will not apply for you. jobUrl is where a human applies; HelloWork keeps most applications on its own site (directApply).
  • teleworkLabel is often empty. Between 1% and 46% of postings carry a télétravail tag depending on the sector, because most employers do not set one. It isn't a field you'll always get, so it isn't advertised as one.
  • postedAtEstimated is not postedAt. The search card only says "il y a 12 jours", so with Open each posting off you get a date good to the hour or the day, not a timestamp.
  • Deep runs are paced. HelloWork rate-limits a single address after a couple of thousand requests, so posting pages are spread over rotating addresses. Expect about 200 rows a minute with detail on (2,000 rows took 9m34s) and several times that with it off.

FAQ

What is HelloWork? HelloWork, formerly RegionsJob, is one of France's biggest generalist job boards. It carries CDI and CDD office roles, intérim, stage and alternance, across every sector. One broad keyword search returned 24,879 postings when this was measured.

Do I need a HelloWork account or an API key? No. Everything this actor reads is public. There is no login and no key to configure.

How do I scrape HelloWork jobs by city? Put the city in location ("Paris", "Lyon", "Marseille", "Bordeaux", "Nantes") and optionally set radiusKm to widen it. You can also paste a HelloWork search URL into startUrls.

Can I get only CDI jobs? Only alternance? Only stages? Yes. contractTypes accepts cdi, cdd, interim, stage, alternance, freelance, independant, fonctionnaire, franchise, associe and stage-lycee, and you can combine them.

Does it return salaries? For 63% of postings, yes, and that figure is the employer's own. For another 19% HelloWork supplies an estimate instead, which this actor returns with salaryIsEstimate: true so you never mistake a guess for an offer. 18% of postings have no salary at all.

How many jobs can I get from one search? As many as HelloWork has. It paginates a 24,879-result search to page 830. In practice, set maxItems to what you need and split very large pulls across several keywords or cities so they run in parallel.

How much does 1,000 jobs cost? $0.49, plus the $0.001 start fee for the run.

Is it fast? A 236-row run with full posting detail took 40 seconds. Turn off Open each posting and 247 rows took 19 seconds.

Can I schedule it? Yes, use Apify Schedules. postedWithin: "day" with sortBy: "date" gives you a clean daily feed of new French postings.

What happens if a search returns nothing? You get one uncharged diagnostic row explaining why, and the run is not billed for it.

Can I export to CSV or Excel? Yes. The dataset exports to JSON, CSV, Excel, XML and HTML, and it's readable through the Apify API.