Use HelloWork France Job Listings & Salary Filter Scraper with Python
Search HelloWork.com by keyword, region, city, sector or job function, and filter by contract type, remote-work frequency, experience level, company type and disclosed salary range.
1. Choose the data you need
Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.
2. Prepare a source-based input
This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.
{
"city": "",
"companyTypes": [],
"contractTypes": [],
"csrLabels": [],
"employmentType": [],
"exactMatchesOnly": false,
"experienceLevels": [],
"includeCompanyProfile": false,
"includeDetails": false,
"incrementalMode": false,
"jobFunctions": [],
"maxItems": 3,
"minSalary": 0,
"mode": "search",
"postedWithin": "all",
"radiusKm": "20",
"region": "",
"remoteWork": [],
"salaryOnly": false,
"searchQueries": [
"developpeur"
],
"sectors": [],
"sortBy": "relevance",
"startUrls": [],
"stateKey": "",
"superRecruiterOnly": false
}
Download input.example.json and save your reviewed copy as input.json.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to fetch. |
searchQueries | array | optional | One or more free-text keyword searches (mode=search). Each query runs with the same filters; duplicate jobs are removed. |
region | string | optional | French administrative region. Required for mode=byLocation unless `city` is set; also usable as a filter on other modes. |
city | string | optional | French city or commune (e.g. `Lyon`, `Bordeaux`). Takes priority over `region`; also usable as a filter on other modes. |
sectors | array | optional | One or more industry sectors (mode=bySector, optional filter elsewhere). |
jobFunctions | array | optional | One or more job functions (mode=bySector, optional filter elsewhere). |
contractTypes | array | optional | Filter by one or more contract types (optional, all modes). |
remoteWork | array | optional | Filter by disclosed remote-work (télétravail) frequency (optional, all modes). |
employmentType | array | optional | Filter by employment schedule -- full-time vs part-time (optional, all modes). |
experienceLevels | array | optional | Filter by the years of experience the employer asks for (optional, all modes). |
companyTypes | array | optional | Filter by the type of hiring organization (optional, all modes). |
csrLabels | array | optional | Filter to employers holding a specific CSR (corporate social responsibility) certification (optional, all modes). |
minSalary | integer | optional | Only include jobs whose disclosed salary meets this yearly gross EUR floor (optional, all modes). Matches HelloWork's own "Salaire minimum" slider (0-100,000, steps of 1,000). |
radiusKm | string | optional | Widen or narrow the search radius around `city` (ignored when only `region` is set -- HelloWork's radius filter only applies to a specific city/commune). |
postedWithin | string | optional | Only include jobs posted within this time window (optional, all modes). |
sortBy | string | optional | Result ordering. |
salaryOnly | boolean | optional | Only include job listings that disclose a salary range (optional, all modes). |
superRecruiterOnly | boolean | optional | Only include job listings from HelloWork-verified "super recruiter" companies (optional, all modes). |
exactMatchesOnly | boolean | optional | Drop HelloWork similar-result cards ("LO-Moteur-Approchant"). Useful for narrow technical queries. |
includeDetails | boolean | optional | Open each job page for description, skills, structured salary, exact dates and location. Adds one request per job. |
includeCompanyProfile | boolean | optional | Add headquarters, founding year, employee range, revenue and telework policy when the employer page exposes them. Requires includeDetails. Adds one request per unique company. |
incrementalMode | boolean | optional | Keep state per `stateKey` and emit only new, updated or reappeared jobs. Unchanged jobs are updated in state and skipped. |
stateKey | string | optional | Required when `incrementalMode` is on. Reuse the same key across scheduled runs. |
startUrls | array | optional | HelloWork search-result URLs and/or job detail URLs. Mixed lists are allowed; duplicates are removed. Enter one URL per row in the Console (the request-list editor wraps it as `{"url": "..."}`); via the API, send `{"url": "..."}` objects. |
maxItems | integer | optional | Hard cap on emitted job listings (1–10,000). |
3. Start an Actor run
Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.
Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.
import json
import os
import urllib.request
# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
actor_input = json.load(stream)
token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
"https://api.apify.com/v2/acts/jF1yrs5ZIMS6aoRcZ/runs?timeout=120&maxTotalChargeUsd=0.50",
data=json.dumps(actor_input).encode("utf-8"),
headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.
4. Inspect the actual results
Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.
One record per HelloWork.com job with descriptions, skills, structured salary and location, exact dates, search provenance and optional company details.
Questions before you run
Which inputs are required?
The published required fields are mode
What does this guide verify?
The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.
What if the run request times out?
Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.
Generated from source build ttW7DK9FHDnNc0eEf and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.