Vexaloom Labs

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.

FieldTypeRequiredDescription
modestringrequiredWhat to fetch.
searchQueriesarrayoptionalOne or more free-text keyword searches (mode=search). Each query runs with the same filters; duplicate jobs are removed.
regionstringoptionalFrench administrative region. Required for mode=byLocation unless `city` is set; also usable as a filter on other modes.
citystringoptionalFrench city or commune (e.g. `Lyon`, `Bordeaux`). Takes priority over `region`; also usable as a filter on other modes.
sectorsarrayoptionalOne or more industry sectors (mode=bySector, optional filter elsewhere).
jobFunctionsarrayoptionalOne or more job functions (mode=bySector, optional filter elsewhere).
contractTypesarrayoptionalFilter by one or more contract types (optional, all modes).
remoteWorkarrayoptionalFilter by disclosed remote-work (télétravail) frequency (optional, all modes).
employmentTypearrayoptionalFilter by employment schedule -- full-time vs part-time (optional, all modes).
experienceLevelsarrayoptionalFilter by the years of experience the employer asks for (optional, all modes).
companyTypesarrayoptionalFilter by the type of hiring organization (optional, all modes).
csrLabelsarrayoptionalFilter to employers holding a specific CSR (corporate social responsibility) certification (optional, all modes).
minSalaryintegeroptionalOnly 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).
radiusKmstringoptionalWiden or narrow the search radius around `city` (ignored when only `region` is set -- HelloWork's radius filter only applies to a specific city/commune).
postedWithinstringoptionalOnly include jobs posted within this time window (optional, all modes).
sortBystringoptionalResult ordering.
salaryOnlybooleanoptionalOnly include job listings that disclose a salary range (optional, all modes).
superRecruiterOnlybooleanoptionalOnly include job listings from HelloWork-verified "super recruiter" companies (optional, all modes).
exactMatchesOnlybooleanoptionalDrop HelloWork similar-result cards ("LO-Moteur-Approchant"). Useful for narrow technical queries.
includeDetailsbooleanoptionalOpen each job page for description, skills, structured salary, exact dates and location. Adds one request per job.
includeCompanyProfilebooleanoptionalAdd headquarters, founding year, employee range, revenue and telework policy when the employer page exposes them. Requires includeDetails. Adds one request per unique company.
incrementalModebooleanoptionalKeep state per `stateKey` and emit only new, updated or reappeared jobs. Unchanged jobs are updated in state and skipped.
stateKeystringoptionalRequired when `incrementalMode` is on. Reuse the same key across scheduled runs.
startUrlsarrayoptionalHelloWork 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.
maxItemsintegeroptionalHard 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.