HelloWork France Job Listings & Salary Filter Scraper
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.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| 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. |
Show all input fields
| 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). |
Download the published input schema
View complete JSON
{
"description": "Search HelloWork.com by keyword, browse by region/city or sector/function, or paste search and job URLs. Optional full-detail enrichment adds descriptions, skills, salary and exact dates.",
"properties": {
"city": {
"default": "",
"description": "French city or commune (e.g. `Lyon`, `Bordeaux`). Takes priority over `region`; also usable as a filter on other modes.",
"editor": "textfield",
"prefill": "",
"title": "City (mode=byLocation)",
"type": "string"
},
"companyTypes": {
"default": [],
"description": "Filter by the type of hiring organization (optional, all modes).",
"editor": "select",
"items": {
"enum": [
"Entreprises",
"Cabinet_recr",
"SSII",
"Travail_temporaire",
"Centre_formation"
],
"enumTitles": [
"Direct employer",
"Recruitment agency",
"IT services company (ESN)",
"Temp staffing agency",
"Training center"
],
"type": "string"
},
"prefill": [],
"title": "Company type",
"type": "array",
"uniqueItems": true
},
"contractTypes": {
"default": [],
"description": "Filter by one or more contract types (optional, all modes).",
"editor": "select",
"items": {
"enum": [
"CDI",
"CDD",
"Travail_temp",
"Stage",
"Alternance",
"Independant",
"Franchise",
"Associe",
"Fonctionnaire",
"Freelance",
"Stage_de_lycee"
],
"enumTitles": [
"CDI (permanent contract)",
"CDD (fixed-term contract)",
"Intérim (temp work)",
"Stage (internship)",
"Alternance (apprenticeship)",
"Indépendant (self-employed)",
"Franchise",
"Associé (partner)",
"Fonctionnaire (civil servant)",
"Freelance",
"Stage de lycée (high-school internship)"
],
"type": "string"
},
"prefill": [],
"title": "Contract type",
"type": "array",
"uniqueItems": true
},
"csrLabels": {
"default": [],
"description": "Filter to employers holding a specific CSR (corporate social responsibility) certification (optional, all modes).",
"editor": "select",
"items": {
"enum": [
"_10556393",
"_b64a8fe7",
"_9ffe5c83",
"_3a9a1663",
"_a2f6a46f",
"_2d67f571",
"_79347e6b",
"_e7ce5995",
"_7b05b6d4",
"d5bab309073b"
],
"enumTitles": [
"B Corp",
"Ecocert 26000",
"EcoVadis",
"Engagé RSE",
"For Life",
"Lucie 26000",
"PME+",
"Positive Company",
"Responsible Care",
"Safe Place"
],
"type": "string"
},
"prefill": [],
"title": "CSR / sustainability label",
"type": "array",
"uniqueItems": true
},
"employmentType": {
"default": [],
"description": "Filter by employment schedule -- full-time vs part-time (optional, all modes).",
"editor": "select",
"items": {
"enum": [
"ft",
"pt",
"np"
],
"enumTitles": [
"Temps plein (full-time)",
"Temps partiel (part-time)",
"Non précisé (unspecified)"
],
"type": "string"
},
"prefill": [],
"title": "Employment time (temps de travail)",
"type": "array",
"uniqueItems": true
},
"exactMatchesOnly": {
"default": false,
"description": "Drop HelloWork similar-result cards (\"LO-Moteur-Approchant\"). Useful for narrow technical queries.",
"prefill": false,
"title": "Only exact keyword matches",
"type": "boolean"
},
"experienceLevels": {
"default": [],
"description": "Filter by the years of experience the employer asks for (optional, all modes).",
"editor": "select",
"items": {
"enum": [
"deb",
"0-1y",
"2-3y",
"4-5y",
"6-10y",
"gt10y",
"unknown"
],
"enumTitles": [
"Débutants acceptés (débutant / no experience required)",
"0-1 year (débutants accepted)",
"2-3 years",
"4-5 years",
"6-10 years",
"10+ years",
"Not specified"
],
"type": "string"
},
"prefill": [],
"title": "Experience level required",
"type": "array",
"uniqueItems": true
},
"includeCompanyProfile": {
"default": false,
"description": "Add headquarters, founding year, employee range, revenue and telework policy when the employer page exposes them. Requires includeDetails. Adds one request per unique company.",
"prefill": false,
"title": "Include company profile",
"type": "boolean"
},
"includeDetails": {
"default": true,
"description": "Open each job page for description, skills, structured salary, exact dates and location. Adds one request per job.",
"prefill": false,
"title": "Fetch full job details",
"type": "boolean"
},
"incrementalMode": {
"default": false,
"description": "Keep state per `stateKey` and emit only new, updated or reappeared jobs. Unchanged jobs are updated in state and skipped.",
"prefill": false,
"title": "Incremental runs (only new or changed jobs)",
"type": "boolean"
},
"jobFunctions": {
"default": [],
"description": "One or more job functions (mode=bySector, optional filter elsewhere).",
"editor": "select",
"items": {
"enum": [
"Achat",
"Assistanat_admin_accueil",
"BTP_gros_second_oeuvre",
"Bureau_etude_R_D",
"Commercial_particulier",
"Commercial_professionnel",
"Commercial_technico_com",
"Commercial_vendeur",
"Compta_gestion_finance_audit",
"Dir_management_resp",
"Dir_resp_centre_profit",
"Import_export_inter",
"Informatique_dev",
"Informatique_dev_hard",
"Informatique_syst_info",
"Informatique_syst_reseaux",
"Ingenierie_agro_agri",
"Ingenierie_chimie_pharma_bio",
"Ingenierie_electro_tech",
"Ingenierie_meca_aero",
"Ingenierie_telecom",
"Juridique_droit",
"Logistique_metiers_transport",
"Marketing_com_graphisme",
"Metiers_fonction_publique",
"Negociation_gest_immo",
"Production_gestion",
"Production_operateur",
"Qualite_securite_environnement",
"RH_Personnel_Formation",
"Restauration_hotellerie_tourisme",
"SAV_Hotline",
"Sante_social",
"Services_pers_entreprises"
],
"enumTitles": [
"Achat",
"Assistanat / Adm. ventes / Accueil",
"BTP / Gros Oeuvre / Second Oeuvre",
"Bureau d'Etudes / R&D / BTP archi",
"Commercial auprès des particuliers",
"Commercial auprès des professionnels",
"Commercial / Technico-commercial",
"Commercial / Vendeur en magasin",
"Compta / Gestion / Finance / Audit",
"Métiers de la distribution / Management",
"Direction / Resp. Co. et Centre de Profit",
"Import / Export / International",
"Informatique / Développement",
"Informatique / Dével. Hardware",
"Informatique / Systèmes d'Information",
"Informatique / Systèmes / Réseaux",
"Ingénierie / Agro / Agri",
"Ingénierie / Chimie / Pharmacie / Bio.",
"Ingénierie / Electro-tech. / Automat.",
"Ingénierie / Mécanique / Aéron.",
"Ingénierie / Telecoms / Electronique",
"Juridique / Droit",
"Logistique / Métiers du Transport",
"Marketing / Communication / Graphisme",
"Métiers de la Fonction Publique",
"Négociation / Gestion immobilière",
"Production / Gestion / Maintenance",
"Production / Opérateur / Manoeuvre",
"Qualité / Hygiène / Sécurité / Environnement",
"RH / Personnel / Formation",
"Restauration / Tourisme / Hôtellerie / Loisirs",
"SAV / Hotline / Téléconseiller",
"Santé / Social",
"Services à la personne / aux entreprises"
],
"type": "string"
},
"prefill": [],
"title": "Job functions / métiers",
"type": "array",
"uniqueItems": true
},
"maxItems": {
"default": 50,
"description": "Hard cap on emitted job listings (1–10,000).",
"maximum": 10000,
"minimum": 1,
"prefill": 3,
"title": "Max items",
"type": "integer"
},
"minSalary": {
"default": 0,
"description": "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).",
"maximum": 100000,
"minimum": 0,
"prefill": 0,
"title": "Minimum annual salary (EUR)",
"type": "integer"
},
"mode": {
"default": "search",
"description": "What to fetch.",
"editor": "select",
"enum": [
"search",
"byLocation",
"bySector",
"byUrls"
],
"enumTitles": [
"Search jobs by keyword",
"Browse jobs by region / city",
"Browse jobs by sector / function",
"Scrape pasted HelloWork URLs"
],
"prefill": "search",
"title": "Mode",
"type": "string"
},
"postedWithin": {
"default": "all",
"description": "Only include jobs posted within this time window (optional, all modes).",
"editor": "select",
"enum": [
"all",
"h",
"d",
"w",
"m"
],
"enumTitles": [
"Any time (no filter)",
"Last 24 hours",
"Last 3 days",
"Last week",
"Last month"
],
"prefill": "all",
"title": "Posted within",
"type": "string"
},
"radiusKm": {
"default": "20",
"description": "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).",
"editor": "select",
"enum": [
"0",
"5",
"10",
"20",
"50"
],
"enumTitles": [
"0 km (exact city only)",
"5 km",
"10 km",
"20 km (default)",
"50 km"
],
"prefill": "20",
"title": "Search radius in km (mode=byLocation with city)",
"type": "string"
},
"region": {
"default": "",
"description": "French administrative region. Required for mode=byLocation unless `city` is set; also usable as a filter on other modes.",
"editor": "select",
"enum": [
"",
"Auvergne-Rhône-Alpes",
"Bourgogne-Franche-Comté",
"Bretagne",
"Centre-Val de Loire",
"Corse",
"Grand Est",
"Hauts-de-France",
"Île-de-France",
"Normandie",
"Nouvelle-Aquitaine",
"Occitanie",
"Pays de la Loire",
"Provence-Alpes-Côte d'Azur",
"Guadeloupe",
"Martinique",
"Guyane",
"La Réunion",
"Mayotte"
],
"enumTitles": [
"(none)",
"Auvergne-Rhône-Alpes",
"Bourgogne-Franche-Comté",
"Bretagne",
"Centre-Val de Loire",
"Corse",
"Grand Est",
"Hauts-de-France",
"Île-de-France",
"Normandie",
"Nouvelle-Aquitaine",
"Occitanie",
"Pays de la Loire",
"Provence-Alpes-Côte d'Azur",
"Guadeloupe",
"Martinique",
"Guyane",
"La Réunion",
"Mayotte"
],
"prefill": "",
"title": "Region (mode=byLocation)",
"type": "string"
},
"remoteWork": {
"default": [],
"description": "Filter by disclosed remote-work (télétravail) frequency (optional, all modes).",
"editor": "select",
"items": {
"enum": [
"Complet",
"Partiel",
"Occasionnel",
"Pas_teletravail"
],
"enumTitles": [
"Télétravail complet (fully remote)",
"Télétravail partiel (hybrid remote)",
"Télétravail occasionnel (occasional remote)",
"Pas de télétravail (no remote work)"
],
"type": "string"
},
"prefill": [],
"title": "Remote work (télétravail)",
"type": "array",
"uniqueItems": true
},
"salaryOnly": {
"default": false,
"description": "Only include job listings that disclose a salary range (optional, all modes).",
"prefill": false,
"title": "Only offers with disclosed salary",
"type": "boolean"
},
"searchQueries": {
"default": [],
"description": "One or more free-text keyword searches (mode=search). Each query runs with the same filters; duplicate jobs are removed.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [
"developpeur"
],
"title": "Search queries",
"type": "array"
},
"sectors": {
"default": [],
"description": "One or more industry sectors (mode=bySector, optional filter elsewhere).",
"editor": "select",
"items": {
"enum": [
"Agri_peche",
"BTP",
"Banq_assur_finan",
"Distrib_commerce",
"Energie_envir",
"Enseign_forma",
"Immo",
"Ind_aero",
"Ind_agro",
"Ind_auto_meca_nav",
"Ind_hightech_telecom",
"Ind_manufact",
"Ind_petro",
"Ind_pharma_bio_chim",
"Inform_SSII",
"Media_internet_com",
"Resto",
"Sante_social",
"Serv_entreprise",
"Serv_pers_part",
"Serv_public_autre",
"Serv_public_collec_terri",
"Serv_public_etat",
"Serv_public_hosp",
"Tourism_hotel_loisir",
"Transport_logist"
],
"enumTitles": [
"Agriculture / Pêche",
"BTP",
"Banque / Assurance / Finance",
"Distribution / Commerce de gros",
"Energie / Environnement",
"Enseignement / Formation",
"Immobilier",
"Industrie Aéronautique / Aérospatial",
"Industrie Agro-alimentaire",
"Industrie Auto / Méca / Navale",
"Industrie high-tech / Telecom",
"Industrie Manufacturière",
"Industrie Pétrolière / Pétrochimie",
"Industrie Pharmaceutique / Biotechn. / Chimie",
"Informatique / ESN",
"Média / Internet / Communication",
"Restauration",
"Santé / Social / Association",
"Services aux Entreprises",
"Services aux Personnes / Particuliers",
"Service public autres",
"Service public des collectivités territoriales",
"Service public d'état",
"Service public hospitalier",
"Tourisme / Hôtellerie / Loisirs",
"Transport / Logistique"
],
"type": "string"
},
"prefill": [],
"title": "Sectors",
"type": "array",
"uniqueItems": true
},
"sortBy": {
"default": "relevance",
"description": "Result ordering.",
"editor": "select",
"enum": [
"relevance",
"date"
],
"enumTitles": [
"Relevance",
"Newest first"
],
"prefill": "relevance",
"title": "Sort by",
"type": "string"
},
"startUrls": {
"default": [],
"description": "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.",
"editor": "requestListSources",
"items": {
"properties": {
"url": {
"description": "HelloWork search-result or job detail URL.",
"title": "URL",
"type": "string"
}
},
"required": [
"url"
],
"type": "object"
},
"prefill": [],
"title": "Start URLs (mode=byUrls)",
"type": "array"
},
"stateKey": {
"default": "",
"description": "Required when `incrementalMode` is on. Reuse the same key across scheduled runs.",
"editor": "textfield",
"prefill": "",
"title": "Incremental state key",
"type": "string"
},
"superRecruiterOnly": {
"default": false,
"description": "Only include job listings from HelloWork-verified \"super recruiter\" companies (optional, all modes).",
"prefill": false,
"title": "Only \"super recruiter\" offers",
"type": "boolean"
}
},
"required": [
"mode"
],
"schemaVersion": 1,
"title": "HelloWork Jobs Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
jobs | string | optional | Dataset containing all scraped HelloWork job listings. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "One record per HelloWork.com job with descriptions, skills, structured salary and location, exact dates, search provenance and optional company details.",
"properties": {
"jobs": {
"description": "Dataset containing all scraped HelloWork job listings.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "HelloWork jobs",
"type": "string"
}
},
"title": "HelloWork France Jobs & Salary Details Scraper Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {}
},
"title": "Jobs",
"transformation": {
"fields": [
"title",
"company",
"location",
"contractType",
"salary",
"postedDate",
"isExactMatch",
"url"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
HelloWork France Jobs & Salary Details Scraper
Scrape HelloWork — one of France's largest job boards — with full job details, not just listing cards. Search by keyword, browse by region or city, browse by sector or job function, or paste search and job URLs. Every live HelloWork filter is exposed, and each record can include the full description, required skills, structured salary, exact posting and expiry dates, and a structured location. No login, cookies or API key required.
What this actor does
- Four modes:
search(one or more keywords),byLocation(region or city),bySector(sector or job function), andbyUrls(pasted search-result and job URLs, mixed) - Full detail enrichment: description HTML/text, skills, qualifications, education and experience requirements, industry, occupational category, company profile URL, exact posted/expiry dates, and structured salary/location
- Every live filter: contract type, remote-work frequency, full-time/part-time, experience level (including beginner-friendly
deb), company type, CSR label, posted-within window, minimum salary, salary disclosed only, super-recruiter only, search radius and exact-match only - Structured output: parsed salary min/max/period/currency, department, postal code, region and country, plus exact-vs-similar match flagging and multi-query provenance
- Optional extras: company profile enrichment and incremental runs that emit only new, updated or reappeared jobs
- Empty fields are omitted at every depth — no
null,"",[]or{}
Output per job
offerId— HelloWork offer IDtitle,company,companyLogoUrllocation— listing-card location text (e.g.Lyon - 69)department— French department code when derivable (69,2A, …)city,postalCode,region,country— structured detail-page locationcontractType,workTime,remoteWork,contractDuration,companyTypesalary— disclosed salary display textsalaryMin,salaryMax,salaryPeriod(yearly/monthly/hourly/daily/weekly),salaryCurrencypostedDate— exact UTC posting timestamp when the detail page exposes it; otherwise the approximate value derived from the listing textpostedDateRelative— HelloWork's original relative text (e.g.il y a 3 jours)validThrough— UTC expiry timestamp when publisheddescriptionHtml,descriptionText— full job descriptionskills[],qualifications,qualificationsHtmleducationLevel,experienceMonths,experienceLabelindustry[],occupationalCategory,employmentTypes[]companyUrl— employer profile pagecompanyProfile— optional nested object:name,headquarters,foundedYear,employeeRange,revenue,teleworkPolicy,averageAge,genderSplit,genderEqualityIndex,descriptiondirectApply— true when HelloWork marks direct application as availablehasApplicationTracking,isSuperRecruiterisExactMatch— false for HelloWork's similar-result cards; true for exact keyword matchessearchQuery,listPageUrl— provenance for search runschangeType,firstSeenAt,lastSeenAt— only in incremental mode (NEW,UPDATED,REAPPEARED)url,applyUrl— canonical job page and HelloWork application landing URLrecordType: "job",scrapedAt
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
string | search |
search / byLocation / bySector / byUrls |
searchQueries |
array | – | One or more keywords (mode=search); duplicates are removed across queries |
region |
string | – | French region (mode=byLocation unless city is set; optional filter elsewhere) |
city |
string | – | French city/commune (mode=byLocation unless region is set; optional filter elsewhere) |
sectors |
array | – | Industry sectors (mode=bySector; optional filter elsewhere) |
jobFunctions |
array | – | Job functions / métiers (mode=bySector; optional filter elsewhere) |
contractTypes |
array | – | CDI, CDD, Intérim, Stage, Alternance and more |
remoteWork |
array | – | Fully remote / hybrid / occasional / no remote work |
employmentType |
array | – | Full-time / part-time / unspecified |
experienceLevels |
array | – | Beginner-friendly (deb), 0-1y, 2-3y, 4-5y, 6-10y, 10+ years, unspecified |
companyTypes |
array | – | Direct employer, recruitment agency, ESN, temp agency, training center |
csrLabels |
array | – | CSR / sustainability certifications |
minSalary |
int | 0 |
Minimum disclosed annual salary in EUR (0–100,000) |
radiusKm |
string | 20 |
Radius around city in km (0/5/10/20/50); ignored without a city |
postedWithin |
string | all |
Any time / last 24h / last 3 days / last week / last month |
sortBy |
string | relevance |
Relevance or newest first |
salaryOnly |
boolean | false |
Only jobs that disclose a salary |
superRecruiterOnly |
boolean | false |
Only HelloWork-verified "super recruiter" employers |
exactMatchesOnly |
boolean | false |
Drop HelloWork's similar-result cards |
includeDetails |
boolean | true |
Fetch each job's full detail page |
includeCompanyProfile |
boolean | false |
Add employer profile facts when available (requires includeDetails) |
incrementalMode |
boolean | false |
Emit only new, updated or reappeared jobs |
stateKey |
string | – | State key required for incremental mode; reuse it across runs |
startUrls |
array | – | HelloWork search-result and/or job URLs as {"url": ...} objects (mode=byUrls) |
maxItems |
int | 50 |
Hard cap on emitted jobs (1–10,000) |
Example: multiple keyword searches with full details
{
"mode": "search",
"searchQueries": ["developpeur python", "data engineer"],
"city": "Lyon",
"contractTypes": ["CDI"],
"exactMatchesOnly": true,
"includeDetails": true,
"maxItems": 100
}
Example: recent jobs in a region
{
"mode": "byLocation",
"region": "Bretagne",
"postedWithin": "w",
"salaryOnly": true,
"sortBy": "date",
"maxItems": 100
}
Example: sector + function browse with a salary floor
{
"mode": "bySector",
"sectors": ["Inform_SSII"],
"jobFunctions": ["Informatique_dev"],
"minSalary": 45000,
"includeDetails": true,
"maxItems": 200
}
Example: paste a job URL and a saved search URL
{
"mode": "byUrls",
"startUrls": [
{"url": "https://www.hellowork.com/fr-fr/emplois/83761250.html"},
{"url": "https://www.hellowork.com/fr-fr/emploi/recherche.html?k=comptable&l=Bordeaux"}
],
"includeDetails": true,
"maxItems": 50
}
Example: incremental daily feed
{
"mode": "search",
"searchQueries": ["infirmier"],
"city": "Paris",
"incrementalMode": true,
"stateKey": "paris-nurses-daily",
"includeDetails": true,
"maxItems": 500
}
Use cases
- Recruitment agencies — monitor new listings and full requirements in a target city or sector
- Labor-market research — track posting volume, salary disclosure, education and experience requirements
- Job aggregators / HR tech — enrich existing listings with descriptions, skills and structured salary
- Salary benchmarking — analyse disclosed ranges by sector, function, experience and region
- Remote-work and ESG sourcing — combine remote-work frequency and CSR certifications
- Incremental alerting — feed only new or changed jobs into a CRM, ATS or notification pipeline
FAQ
What is HelloWork? One of France's largest job boards, aggregating listings from employers and recruitment agencies. This is an independent third-party actor, not affiliated with HelloWork.
Do I need a login, cookies or a proxy? No. The actor reads public job pages and needs no account, cookie, API key or proxy setup. Enter your search and run it.
What is the difference between the four modes? search runs one or more keyword queries; byLocation browses a region or city without a keyword; bySector browses a sector or job function; byUrls accepts pasted HelloWork search-result and job URLs, mixed in one list.
Why are some fields missing on some jobs? HelloWork only publishes certain details on some listings: foreign or interim pages that have no structured job data may lack an expiry date, structured city/postal code or skills, and many employers do not disclose a salary. Missing fields are omitted rather than filled with placeholder values.
What does isExactMatch mean? For narrow queries HelloWork can append similar results after the exact matches. isExactMatch: false marks those similar cards; set exactMatchesOnly: true to remove them.
Why is a salary missing when HelloWork shows an estimate? Only employer-disclosed salaries are emitted. HelloWork's own "Estimation Hellowork" hint is not treated as a disclosed salary, so it is omitted and salaryOnly will not return that job.
How does incremental mode work? It stores a content hash per job under your stateKey and emits only NEW, UPDATED or REAPPEARED records. Reuse the same key across scheduled runs; the run stops after a run of pages with no new or changed jobs.
Does maxItems guarantee that many results? No — it is a cap. If fewer jobs match your filters, you get fewer records. The actor supports up to 10,000 records per run.
How fresh is the data? HelloWork updates its listings continuously; every run reads the current live search and detail pages.
Can I get an external ATS application URL? No. Anonymous pages only expose HelloWork's own application flow, so applyUrl points to the HelloWork landing page and directApply reflects whether HelloWork marks direct application as available.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build ttW7DK9FHDnNc0eEf. Documentation is regenerated from the default published build; private drafts are not included.