HelloWork France Jobs Scraper avatar

HelloWork France Jobs Scraper

Pricing

from $0.48 / 1,000 item extracteds

Go to Apify Store
HelloWork France Jobs Scraper

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

Stas Persiianenko

Maintained by Community

Actor 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?

  1. Builds a HelloWork search from a keyword and optional French location, or accepts supplied HelloWork search/job URLs.
  2. Paginates public search results up to the configured page limit.
  3. Deduplicates vacancies by their stable HelloWork job URL.
  4. Opens each public vacancy and reads its structured JobPosting data.
  5. Applies keyword and location filters to direct job URLs too.
  6. 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?

FieldMeaning
jobIdStable numeric HelloWork vacancy ID
titlePublished vacancy title
employerHiring organization, or null
locationLocality, or null
regionFrench region, or null
postalCodePublished postal code, or null
countrySource country code, usually FR
contractTypeStructured employment type, or null
salaryMin / salaryMaxNumeric bounds when shown
salaryCurrencySalary currency, such as EUR
salaryPeriodSalary unit, such as YEAR
datePostedSource publication timestamp
validThroughSource validity timestamp when published
descriptionPlain-text vacancy description
skillsStructured skill names exposed by the source
industryIndustry when available
categoryHelloWork occupational category
employerUrlPublic HelloWork employer page when available
urlCanonical public vacancy URL
searchKeywordKeyword supplied to this run, or null
searchLocationLocation supplied to this run, or null
scrapedAtISO timestamp when the record was collected

Getting started

  1. Open the Actor in Apify Console.
  2. Enter a role or skill in Job keyword, for example développeur.
  3. Optionally enter a city, department, or region, for example Paris.
  4. Keep Maximum jobs small for your first run.
  5. Set Maximum search pages to bound discovery work.
  6. Click Start.
  7. 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 jobsEstimated 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:

  1. Save each run's dataset to your database or cloud storage.
  2. Schedule the same keyword, location, and limits daily or weekly.
  3. Compare current IDs with the previous run.
  4. Treat new IDs as newly observed vacancies.
  5. Compare selected fields to detect changed descriptions, salary, or validity dates.
  6. 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 jobId as an upsert key and scrapedAt as 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 os
from apify_client import ApifyClient
client = 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().items
for 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.
  • maxItems limits saved matches, while maxPages limits 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.

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.