# HelloWork Scraper: French Job Board (`dltik/hellowork-scraper`) Actor

Scrape HelloWork jobs by keyword, city, contract type, salary range. Get title, company, location, contract (CDI/CDD/alternance/stage), salary, remote policy, full description, posted date. France's #1 generalist job board. For ATS providers, recruitment agencies, sourcing teams. $1/1K jobs.

- **URL**: https://apify.com/dltik/hellowork-scraper.md
- **Developed by:** [Walid](https://apify.com/dltik) (community)
- **Categories:** Business, Lead generation, Marketing
- **Stats:** 29 total users, 7 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 job scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## HelloWork Scraper — French Job Board API (800K+ Active Offers)

> Scrape **HelloWork.com**, France's #1 private job board with 800K+ active offers. Filter by keyword, city, contract type, salary range, remote policy. Get title, company, location, contract (CDI/CDD/alternance/stage), salary, **skills, sector, full description**, posted date — plus optional **AI match scoring** and **French company registry (SIREN) enrichment**. HTTP-only, from **$0.001 per job** ($1 per 1,000).

⭐ **Bookmark this HelloWork Scraper** — Apify ranks actors by bookmarks, so it directly helps the visibility of this scraper on the Apify Store.

### What is the HelloWork Scraper?

The **HelloWork Scraper** is an Apify actor that pulls live job offers from [HelloWork](https://www.hellowork.com/) — France's largest private job board, complementary to the public France Travail. HelloWork hosts 800K+ active offers across every sector, contract type, and seniority level. This HelloWork Scraper accepts complex filters (keyword, city, contract, salary, remote) and returns clean structured JSON.

Unlike the commodity HelloWork scrapers on the Store, the enriched mode parses each offer's `JobPosting` structured data — so you get **required skills, sector, job function, years of experience, education level, structured salary (min/max/period), the hiring company's URL + logo, and the full postal address** — not just what the search card shows. Two premium options go further than any competitor: **AI relevance scoring** against a candidate profile, and **official French company-registry enrichment** (SIREN, workforce, revenue, directors) of the hiring company.

No HelloWork account, no OAuth, no quota. Pure HTTP scraping.

### Features

- **Structured extraction** — title, company, location, contract type, salary, remote policy, posted date, apply URL.
- **Deep enrichment (`enrichDetails`)** — skills, sector, job function, experience, education, employment type, structured salary, company URL + logo, full address, full description.
- **AI match (`analyzeJobs`)** — plain-language summary, required skills, inferred seniority, and an `apply / maybe / skip` recommendation. Add a `candidateProfile` to get a **0-100 relevance score** per offer and turn a 500-row feed into a ranked shortlist.
- **Company intelligence (`enrichCompany`)** — resolve the hiring company against the official French registry: SIREN, legal status, NAF/sector, workforce band, latest revenue & net result, directors.
- **Repost dedup (`skipReposts`)** — HelloWork re-posts the same role under a new id; we fingerprint by company + title + department (90-day memory) so you only pay for genuinely new offers.

### Use cases

- **ATS feeders / job aggregators** — auto-import filtered HelloWork offers into your platform daily, with `skipReposts` so you never re-ingest a duplicate.
- **Salary benchmarking** — aggregate `data engineer Paris CDI` salaries across HelloWork to inform your comp band.
- **Recruitment intelligence** — see which companies post which roles, enriched with the employer's SIREN, size, and financials.
- **Candidate job-matching bots** — a daily Telegram alert with new HelloWork jobs ranked by AI relevance to a candidate profile.
- **Niche job board** — build a sector-specific board (e.g., construction jobs in Auvergne) on top of HelloWork.
- **Labor-market analytics** — count open positions per region per sector over time.

### Input

```json
{
  "keywords": ["developpeur python"],
  "location": "Paris",
  "contractTypes": ["CDI", "Freelance"],
  "minSalary": 45000,
  "remote": "partial",
  "enrichDetails": true,
  "enrichCompany": true,
  "analyzeJobs": true,
  "candidateProfile": "Développeur Python/Django, 4 ans, cherche CDI remote",
  "skipReposts": true,
  "maxResults": 200
}
```

### Output

```json
{
  "id": "77200967",
  "title": "Développeur Python",
  "company": "XEFI",
  "company_url": "https://www.hellowork.com/fr-fr/entreprises/xefi-50409.html",
  "company_logo": "https://f.hellowork.com/img/entreprises/160_160/204058.png",
  "city": "Rillieux-la-Pape",
  "postal_code": "69140",
  "region": "Auvergne-Rhône-Alpes",
  "contract_type": "CDI",
  "employment_type": "FULL_TIME",
  "sector": "Services aux Entreprises",
  "job_function": "Informatique",
  "skills": ["Python"],
  "experience_years": 1.0,
  "education_level": "high school",
  "salary_min": 26400,
  "salary_max": 40000,
  "salary_period": "year",
  "salary_currency": "EUR",
  "remote": "partial",
  "published_at": "2026-06-25T00:13:43Z",
  "url": "https://www.hellowork.com/fr-fr/emplois/77200967.html",
  "company_registry": {
    "siren": "504091234",
    "categorie_entreprise": "PME",
    "tranche_effectif_salarie": "250 à 499",
    "ca_latest": 42000000,
    "url_pappers": "https://www.pappers.fr/entreprise/504091234"
  },
  "ai": {
    "summary": "Poste de développeur Python back-end sur une stack Django.",
    "seniority": "confirme",
    "recommended_action": "apply",
    "relevance_score": 88,
    "relevance_reason": "Stack Python/Django alignée, CDI, localisation OK."
  }
}
```

### Pricing

**PAY\_PER\_EVENT.** You only pay for the events you opt into. Failed runs are not charged.

| Event | When | Price |
|---|---|---|
| `job-scraped` | every offer (base fields) | **$0.001** / job ($1 / 1K) |
| `job-enriched` | `enrichDetails=true` (skills, sector, structured salary, company logo, address…) | $0.004 / job |
| `company-enriched` | `enrichCompany=true`, once per distinct company (SIREN, revenue, directors) | $0.005 / company |
| `job-analyzed` | `analyzeJobs=true` (AI match, paid Apify plan only) | $0.006 / job |

Base scraping stays the cheapest tier so you can validate output before turning on premium enrichment.

### FAQ — HelloWork API alternatives

**HelloWork official API?** HelloWork doesn't expose a public job-search API. This HelloWork Scraper is the way to get bulk data.

**Does it cover both `hellowork.com` and the legacy `regionsjob.com`?** Yes — they merged into HelloWork; this scraper queries the unified search.

**Salary fields are often missing — why?** ~40% of French postings don't publish salary. We populate `salary_min` / `salary_max` only when the offer states them; enriched mode reads the structured `baseSalary` field for maximum coverage.

**What's the difference vs other HelloWork scrapers?** Only this actor reads the full `JobPosting` structured data (skills, sector, experience, education, company logo, address), adds AI relevance scoring, and cross-links each employer to the official French company registry — none of which the commodity clones do.

**Is `skipReposts` reliable?** It uses a content fingerprint (company + title + department) with a 90-day memory across your runs, so it catches the same role re-posted under a fresh id.

***

⭐ **Found this useful? Bookmark this HelloWork Scraper** — it's the strongest signal for Apify Store ranking.

#### Related actors — French job & company suite

Chain these to cover the whole French hiring market and enrich it end-to-end:

- [France Travail Scraper](https://apify.com/dltik/francetravail-scraper) — France's largest **public** job board (700K+ offers).
- [Welcome to the Jungle Scraper](https://apify.com/dltik/wtj-scraper) — tech-focused FR/EU jobs & employer branding.
- [JobTeaser Scraper](https://apify.com/dltik/jobteaser-scraper) — student jobs, internships, alternance.
- [Malt Scraper](https://apify.com/dltik/malt-scraper) — freelancer profiles + day rates.
- [Pappers / Sirene Scraper](https://apify.com/dltik/pappers-sirene-scraper) — 26M French companies (SIREN, finances, directors) — powers the `enrichCompany` option.

License: MIT · Author: [dltik](https://apify.com/dltik)

# Actor input Schema

## `keywords` (type: `array`):

Job search keywords (e.g. 'developpeur python', 'commercial', 'data analyst').

## `location` (type: `string`):

City or department (e.g. 'Paris', 'Lyon', 'Bordeaux').

## `contractTypes` (type: `array`):

Filter by contract: CDI, CDD, Stage, Alternance, Freelance, Interim, etc.

## `remote` (type: `string`):

Filter jobs by remote policy.

## `minSalary` (type: `integer`):

Filter jobs with min annual salary above this amount (€).

## `enrichDetails` (type: `boolean`):

Fetch each job's detail page and parse its JobPosting structured data: full description, required skills, sector, job function, years of experience, education level, employment type, structured salary (min/max/period), company URL + logo, and full postal address. Slower and billed as a separate 'job-enriched' event on top of 'job-scraped'.

## `enrichCompany` (type: `boolean`):

Resolve each hiring company against the official French company registry (recherche-entreprises.api.gouv.fr) and attach a 'company\_registry' object: SIREN, legal status, NAF/sector, workforce band, latest revenue & net result, and directors. Turns a job feed into company intelligence. Billed as a separate 'company-enriched' event, charged once per distinct company. Works best with 'Enrich with full job details' on (gives a postal code for a sharper match).

## `skipReposts` (type: `boolean`):

Exclude offers already seen in your previous runs of this actor. HelloWork re-publishes the same opening under a new id, so we fingerprint by company + title + department (90-day memory) and drop repeats — you only pay for genuinely new offers. Ideal for daily monitoring pipelines.

## `analyzeJobs` (type: `boolean`):

Enrich each offer with an AI 'ai' object: a plain-language summary, the concrete required skills, an inferred seniority, and a recommended action (apply / maybe / skip). Add a 'Candidate profile' below to also get a 0-100 relevance score per offer — turns a long result list into a ranked shortlist. Requires a paid Apify plan; billed as a separate 'job-analyzed' event. If not on a paid plan the scrape still runs without analysis.

## `candidateProfile` (type: `string`):

One or two sentences describing the candidate (or the role you are sourcing for), e.g. 'Developpeur Python/Django, 4 ans d'experience, cherche CDI remote a Lyon' or 'Je recrute un commercial B2B SaaS senior, secteur tech, Paris'. When set (and AI analysis is on), each offer gets a relevance\_score (0-100) and a one-line reason for how well it fits. Leave empty to get summaries only.

## `maxResults` (type: `integer`):

Maximum jobs per keyword. HelloWork paginates at 30 per page. Aliases accepted: 'limit', 'max'. Each result charged at the per-event price — start small to validate output.

## Actor input object example

```json
{
  "keywords": [
    "developpeur python"
  ],
  "contractTypes": [],
  "remote": "any",
  "enrichDetails": false,
  "enrichCompany": false,
  "skipReposts": false,
  "analyzeJobs": false,
  "maxResults": 20
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset of HelloWork job postings with title, company, location, contract, salary, remote.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "developpeur python"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dltik/hellowork-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "keywords": ["developpeur python"] }

# Run the Actor and wait for it to finish
run = client.actor("dltik/hellowork-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "developpeur python"
  ]
}' |
apify call dltik/hellowork-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dltik/hellowork-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/QbjHr13gK7hgHaAXi/builds/oWxavqabzd027c4kg/openapi.json
