HelloWork Jobs Scraper
Pricing
Pay per usage
HelloWork Jobs Scraper
Scrape job offers from HelloWork.com (France's largest job board) by keyword, location and advanced filters. Outputs rich job data including salary, remote policy, company info and full HTML description.
Scrapes job offers from HelloWork, France's largest job board (800,000+ offers). Search by keyword and location, apply the same filters as the website (contract type, publication date, remote policy, company type, experience, salary), and get rich, structured job data — including the full HTML description, salary range, remote policy and company details.
Features
- 🆓 Free — no rental fee and no per-result charge; you only pay your own Apify platform usage
- 📄 39 structured fields per job — full HTML description and a clean plain-text version, salary parsed into min/max/currency/period, remote policy, contract duration, company details, requirements, skills and tags
- 🎛️ All the site's filters — contract, publication date, remote (télétravail), distance, company type, experience level, job function, industry sector, full/part-time, CSR labels (RSE), super-recruiter badge, minimum salary — each verified against the live site
- 🔎 Multiple searches per run — one search per keyword, merged and de-duplicated by job id, with
maxItemssplit evenly so a broad keyword cannot starve the others - 🔗 Direct search URLs — paste any
recherche.html?...URL from the website and every filter in it is respected - 🛟 Expired offers are never lost — when a detail page is gone (HTTP 410), the search-card data is still saved and flagged
partial_data: true - ⚡ HTTP-only crawling — no browser, fast and cheap to run
Input example
{"keywords": ["développeur web", "data engineer"],"location": "Paris","contractTypes": ["CDI"],"publishedSince": "7d","remotePolicy": ["Complet", "Partiel"],"maxItems": 200}
Or with a direct URL instead of keywords:
{"startUrls": [{ "url": "https://www.hellowork.com/fr-fr/emploi/recherche.html?k=comptable&l=Lyon&c=CDI&d=w" }],"maxItems": 100}
Output example (abridged)
{"job_id": "80817007","job_title": "Comptable H/F","link": "https://www.hellowork.com/fr-fr/emplois/80817007.html","company": "Harry Hope","company_id": "88047","company_link": "https://www.hellowork.com/fr-fr/entreprises/harry-hope-88047.html","company_logo": "https://f.hellowork.com/img/entreprises/160_160/197317.png","company_type": "cabinet-recr","location": "Lyon 3e - 69","city": "Lyon","postal_code": "69000","department": "69","region": "Auvergne-Rhône-Alpes","country": "FR","contract": "CDI","employment_type": "temps plein","salary": "35 000 - 40 000 € / an","salary_min": 35000,"salary_max": 40000,"salary_currency": "EUR","salary_period": "year","remote": null,"experiences": ["Exp. 1 à 7 ans"],"educations": ["Bac +2"],"industries": ["Services aux Entreprises"],"skills": ["Établissement des déclarations fiscales", "Accompagnement du client"],"description": "<h2>Les missions du poste</h2><p>…</p>","description_text": "Les missions du poste\n…","list_tags": ["montagne", "cdi", "stable", "conseil", "junior"],"is_recruiting_firm": true,"published_at": "2026-07-01T01:07:28Z","valid_through": "2026-07-31T01:07:28Z","time": "il y a 2 jours","reference": "30024685 EC-DCO-61435","direct_apply": true,"source_query": "comptable","extraction_date": "2026-07-03T12:00:00.000Z"}
Notes & limits
- ~2,010 offers max per search: HelloWork stops serving results after ~67 pages per query. To collect more, split your run into several narrower searches (more specific keywords, filters, or locations) — the actor de-duplicates overlapping results automatically.
- No geo coordinates: HelloWork does not expose latitude/longitude anywhere in its job pages, so the output has no coordinate fields. Use
city/postal_code/regionfor geocoding. maxItemsis split evenly across searches: with several keywords (or start URLs), each search getsmaxItems / number of searchesso one broad keyword cannot consume the whole budget. A search that runs out of offers early simply returns fewer items.partial_data: truemarks jobs whose detail page was unavailable (expired offers); those items only contain the search-card fields.
Proxy & keeping runs cheap
The actor defaults to Apify residential proxies — the lowest chance of being blocked. Country is left at "Anywhere"; HelloWork does not require French IPs.
Residential traffic is billed per GB on your own account, which adds up on large runs and can eat a free plan's allowance quickly. For bulk scraping, switch to datacenter proxies:
{"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["DATACENTER"] }}
Two more ways to cut cost:
- Turn off detail pages. With
fetchJobDetails: falsethe actor reads only search pages, which carry ~30 offers each — about 1 request per 30 jobs instead of 31. You lose the description, structured salary, requirements and tags, but keep title, company, location, contract, salary text and link. - Lower
maxConcurrency(default 10) if you are hitting proxy errors; the crawler retries automatically, but fewer parallel requests means fewer retries to pay for.
Disclaimer
This is an unofficial scraper. It is not affiliated with, endorsed by, or sponsored by HelloWork or its operators. "HelloWork" is a trademark of its respective owner and is referenced here only to describe the public website this actor collects data from.
Job listings can contain personal data. You are responsible for using the output lawfully, including under the GDPR, and in line with HelloWork's terms of use.
Running locally
npm installapify run --purge # reads storage/key_value_stores/default/INPUT.json
Deployment
apify loginapify push