HelloWork France Jobs Scraper
Pricing
from $0.48 / 1,000 item extracteds
HelloWork France Jobs Scraper
Search HelloWork France by keyword and location and export public vacancies with employers, contracts, salaries, dates, skills, descriptions, and source URLs.
Pricing
from $0.48 / 1,000 item extracteds
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
6 days ago
Last modified
Categories
Share
Turn public HelloWork jobs search results into a structured French vacancy dataset. Search by role and location, follow public job pages, and export stable vacancy IDs, titles, employers, locations, contract and salary fields when shown, dates, skills, plain-text descriptions, and canonical source URLs.
The Actor is designed for repeatable recruiting research and French labor-market monitoring. It uses HelloWork's public server-rendered pages and does not require a HelloWork account, browser automation, or an automatic paid proxy fallback.
What does this Actor do?
- Builds a HelloWork search from a keyword and optional French location, or accepts supplied HelloWork search/job URLs.
- Paginates public search results up to the configured page limit.
- Deduplicates vacancies by their stable HelloWork job URL.
- Opens each public vacancy and reads its structured
JobPostingdata. - Applies keyword and location filters to direct job URLs too.
- Saves one typed record per accepted vacancy to the default Apify dataset.
This makes the output suitable for spreadsheets, databases, scheduled comparisons, recruiting pipelines, and labor-market dashboards.
Who is it for?
- Recruiters building a current shortlist of vacancies by role and city.
- Talent intelligence teams comparing employers, contract types, and skills.
- Labor-market analysts tracking French hiring demand by region.
- Job-board operators collecting source-attributed public vacancy records.
- Data engineers feeding normalized HelloWork France data into warehouses.
- Researchers studying salary and skill signals where employers publish them.
This Actor focuses on public HelloWork France vacancies. For official France Travail vacancies, use the related France Travail Actor listed below instead of assuming the two sources contain the same jobs.
Why use it?
- Search and detail extraction are combined in one run.
- Stable vacancy IDs make scheduled-run comparisons straightforward.
- Full descriptions are converted from HTML to plain text.
- Salary values retain currency and period instead of becoming an ambiguous string.
- Missing optional source fields remain
null; they are not invented. - Every output row keeps its canonical HelloWork URL for auditability.
- Direct URLs and discovered URLs use the same optional filters.
- Conservative limits and bounded retries avoid uncontrolled crawling.
What HelloWork data is extracted?
| Field | Meaning |
|---|---|
jobId | Stable numeric HelloWork vacancy ID |
title | Published vacancy title |
employer | Hiring organization, or null |
location | Locality, or null |
region | French region, or null |
postalCode | Published postal code, or null |
country | Source country code, usually FR |
contractType | Structured employment type, or null |
salaryMin / salaryMax | Numeric bounds when shown |
salaryCurrency | Salary currency, such as EUR |
salaryPeriod | Salary unit, such as YEAR |
datePosted | Source publication timestamp |
validThrough | Source validity timestamp when published |
description | Plain-text vacancy description |
skills | Structured skill names exposed by the source |
industry | Industry when available |
category | HelloWork occupational category |
employerUrl | Public HelloWork employer page when available |
url | Canonical public vacancy URL |
searchKeyword | Keyword supplied to this run, or null |
searchLocation | Location supplied to this run, or null |
scrapedAt | ISO timestamp when the record was collected |
Getting started
- Open the Actor in Apify Console.
- Enter a role or skill in Job keyword, for example
développeur. - Optionally enter a city, department, or region, for example
Paris. - Keep Maximum jobs small for your first run.
- Set Maximum search pages to bound discovery work.
- Click Start.
- Open the Dataset tab to preview or export JSON, CSV, or Excel.
A useful first input is:
{"keyword": "développeur","location": "Paris","maxItems": 10,"maxPages": 2}
Input parameters
keyword
Optional when startUrls is supplied. A role, skill, or phrase to search for.
At least keyword or one start URL is required.
location
Optional French city, department, or region. Examples include Paris, Lyon, and
Bretagne. With a direct job URL, the returned location must still match this filter.
startUrls
Optional list of public HelloWork URLs. Supported URL shapes are:
https://www.hellowork.com/fr-fr/emploi/recherche.html?...https://www.hellowork.com/fr-fr/emplois/<numeric-id>.html
Other hosts and paths fail closed. A search URL preserves its existing source filters;
maxPages controls how many pages are inspected.
maxItems
Maximum accepted records, from 1 to 1,000. Default: 20.
maxPages
Maximum pages per search URL, from 1 to 50. Default: 10. This is a work bound, not a guarantee that every page contains matching vacancies.
Output example
The following shape comes from a real public HelloWork job page; the long description is shortened here only for readability:
{"jobId": "81400027","title": "Développeur Applicatif - Analyste Développeur H/F","employer": "Havana IT & Apps","location": "Paris","region": "Île-de-France","postalCode": "75000","country": "FR","contractType": "FULL_TIME","salaryMin": 40000,"salaryMax": 55000,"salaryCurrency": "EUR","salaryPeriod": "YEAR","datePosted": "2026-08-17T00:06:36Z","validThrough": "2026-09-16T00:06:36Z","description": "Les missions du poste Groupe Havana...","skills": ["Transact-SQL", "HTML", "SQL", "Web services"],"industry": null,"category": "Informatique","employerUrl": "https://www.hellowork.com/fr-fr/entreprises/havana-it-et-apps-83662.html","url": "https://www.hellowork.com/fr-fr/emplois/81400027.html","searchKeyword": "développeur","searchLocation": "Paris","scrapedAt": "2026-08-22T20:05:20.129Z"}
How much does it cost to scrape HelloWork jobs?
Pricing uses one start event per run plus one item event for each saved vacancy.
The current BRONZE reference price is $0.005 per run and $0.0008 per job;
higher usage tiers receive lower per-job prices automatically.
Illustrative BRONZE totals:
| Saved jobs | Estimated Actor charge |
|---|---|
| 10 | $0.005 + (10 × $0.0008) = 0.013 USD |
| 100 | $0.005 + (100 × $0.0008) = 0.085 USD |
| 1,000 | $0.005 + (1,000 × $0.0008) = 0.805 USD |
These examples describe Actor event charges, not third-party infrastructure or storage fees. A run that finds fewer matching jobs emits and charges fewer item events.
Recurring vacancy monitoring
Use stable jobId values as the comparison key between scheduled runs:
- Save each run's dataset to your database or cloud storage.
- Schedule the same keyword, location, and limits daily or weekly.
- Compare current IDs with the previous run.
- Treat new IDs as newly observed vacancies.
- Compare selected fields to detect changed descriptions, salary, or validity dates.
- Mark IDs absent from later snapshots according to your own expiry policy.
The Actor returns snapshots; it does not persist history or send alerts itself. Apify schedules and webhooks can trigger your downstream comparison workflow.
Spreadsheet and data-pipeline exports
The default dataset supports Apify's standard export formats. Typical patterns include:
- download CSV or Excel for an analyst;
- send JSON rows to a warehouse after each scheduled run;
- trigger a webhook when a run succeeds;
- connect Make, Zapier, or another integration to the dataset;
- use
jobIdas an upsert key andscrapedAtas observation time.
Keep url in downstream systems so analysts can inspect the original public vacancy.
API usage with cURL
Set APIFY_TOKEN in your environment and run:
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~hellowork-france-jobs-scraper/runs?token=$APIFY_TOKEN&waitForFinish=120" \-H "Content-Type: application/json" \-d '{"keyword":"comptable","location":"Lyon","maxItems":20,"maxPages":3}'
Read the resulting default dataset using the defaultDatasetId returned by the run.
Avoid placing long-lived tokens directly in source code or shared notebooks.
API usage with JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/hellowork-france-jobs-scraper').call({keyword: 'développeur',location: 'Paris',maxItems: 50,maxPages: 5,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map(({ jobId, title, employer }) => ({ jobId, title, employer })));
API usage with Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("automation-lab/hellowork-france-jobs-scraper").call(run_input={"keyword": "infirmier","location": "Bordeaux","maxItems": 25,"maxPages": 3,})items = client.dataset(run["defaultDatasetId"]).list_items().itemsfor item in items:print(item["jobId"], item["title"], item.get("employer"))
Use with Apify MCP
Add the Actor to Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/hellowork-france-jobs-scraper"
Claude Desktop
Add this server to the Claude Desktop MCP configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/hellowork-france-jobs-scraper"}}}
Cursor
Add the same mcpServers.apify.url value in Cursor's MCP settings.
VS Code
Add the same HTTP MCP server URL through VS Code's MCP server configuration.
Example prompts:
- “Search HelloWork for 20 data engineer jobs in Paris and summarize employers.”
- “Extract this public HelloWork vacancy URL and return its salary and skills.”
- “Run the Lyon accounting-job monitor and give me the resulting dataset link.”
Limits and source behavior
- The Actor supports public HelloWork France search and vacancy pages only.
- HelloWork can change its HTML or structured data without notice.
- Optional fields such as salary, industry, skills, and validity date may be absent.
maxItemslimits saved matches, whilemaxPageslimits discovery work.- Search ranking and available vacancies can change between otherwise identical runs.
- Results reflect the source at collection time; they are not a historical archive.
- No login-only application data, candidate data, or private employer data is collected.
- No automatic browser or paid proxy fallback is enabled.
Failure and retry behavior
Transient network, rate-limit, and server responses are retried up to three times with bounded backoff. Deterministic unsupported URLs and non-retryable client errors fail immediately. A malformed individual job is skipped and logged; if every discovered job fails extraction, the run fails rather than silently returning a misleading empty success.
An empty dataset can be valid when the source has no vacancies matching the requested scope. Check the run log and repeat the same search in a browser before increasing limits.
Responsible use and legality
This Actor accesses public vacancy pages. You are responsible for ensuring that your use complies with HelloWork's terms, applicable law, database rights, employment law, and privacy obligations. Collect only the data you need, respect reasonable schedules, and avoid republishing descriptions or employer content without the necessary rights.
Do not use the output for unlawful discrimination, spam, impersonation, or decisions that require human review. Honor deletion and correction obligations in downstream systems. This documentation is operational guidance, not legal advice.
Troubleshooting
Why is my dataset empty?
Confirm the keyword and location currently return public results on HelloWork. Try a broader keyword, remove the location, or supply a known public search URL. Empty natural results are not replaced with unrelated vacancies.
Why is a salary null?
HelloWork does not show structured salary values for every vacancy. The Actor preserves that absence instead of estimating compensation.
Why did my start URL fail?
Only the supported HelloWork hostname and public search/job paths are accepted. Remove
tracking redirects and use the canonical www.hellowork.com/fr-fr/... URL.
Why did the run save fewer jobs than maxItems?
maxItems is a ceiling. The source may contain fewer matches, filters may exclude
direct URLs, or maxPages may stop discovery before that ceiling is reached.
Can I search several role/location pairs at once?
Use separate Actor runs or provide multiple pre-filtered HelloWork search URLs. Separate runs are easier to schedule, compare, and attribute to one monitoring scope.
Does this Actor apply to jobs?
No. It extracts public vacancy data only. It does not authenticate, upload résumés, submit applications, contact employers, or bypass user interaction.
Related Automation Lab actors
- France Travail Jobs Scraper for official France Travail vacancy data.
- Welcome to the Jungle Jobs Scraper for a separate French recruiting source.
- Company Career Page Jobs Scraper for supplied employer career pages rather than a HelloWork search.
Each source has a different inventory and contract. Keep source attribution in any combined feed and deduplicate using your own cross-source rules.
FAQ
Does the Actor require a HelloWork account?
No. It uses supported public search and vacancy pages.
Can I export to CSV or Excel?
Yes. Use the standard export controls on the default Apify dataset.
Are descriptions included in the same item charge?
Yes. A saved vacancy is one item event; descriptions do not create a separate event.
Can I schedule it?
Yes. Create an Apify schedule with a stable input, then compare datasets downstream.
Does it guarantee complete HelloWork coverage?
No. Coverage is bounded by your inputs, current public source results, and configured
page/item limits.
What should I use as a database key?
Use jobId within the HelloWork source namespace. Preserve url and scrapedAt for
traceability.