# HelloWork Scraper - French Job Offers Data (`studio-amba/hellowork-scraper`) Actor

Scrape job offers from HelloWork (hellowork.com), one of France's largest general job boards. Search by keyword, location, and contract type. Extract titles, companies, locations, salaries, contract types, skills, and full descriptions. No login or cookies required.

- **URL**: https://apify.com/studio-amba/hellowork-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 result 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Offers

Scrape job offers from [HelloWork](https://www.hellowork.com) (hellowork.com), one of France's largest general job boards. Search by keyword, location, and contract type, then export clean structured data with companies, locations, salaries, contract types, skills, and full descriptions. No login, no cookies.

### Why use this actor?

HelloWork is a mainstream French job board covering every sector and contract type — CDI, CDD, interim, alternance, stage, and freelance — across the whole country. If you build a jobs aggregator, run salary benchmarks, track hiring demand by region or industry, or feed a recruitment CRM, this actor turns the HelloWork search into a structured feed you can query on a schedule.

It reads the HelloWork search pages and each offer's own structured job data, so results are clean and complete. Every offer already carries its title, hiring company, location, contract type, salary (when published), and publication date. Turn on full descriptions and each row also gets the complete job text, listed skills, required education and experience, industry, and the exact ISO publish date.

### How to scrape HelloWork data

1. Open the actor and set a **Search Query** in French — for example `commercial`, `développeur`, `comptable`, or `infirmier`.
2. Optionally set a **Location** (city, department, or region such as `Paris`, `Lyon`, or `Bordeaux`) and a **Contract Type** (CDI, CDD, Interim, Alternance, Stage, Freelance).
3. Set **Max Results** to the number of offers you want.
4. Leave **Fetch Full Descriptions** on for the complete job text and skills, or turn it off for faster listing-only results.
5. Keep the French residential proxy prefill and click **Start**.
6. When the run finishes, export the dataset as JSON, CSV, or Excel, or pull it from the Apify API.

The actor paginates through the HelloWork search results automatically (30 offers per page) until it reaches your Max Results or runs out of matching offers.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | Job search keyword in French (e.g. `commercial`, `développeur`). Defaults to `commercial` if empty. |
| `location` | String | No | City, department, or region (e.g. `Paris`, `Lyon`, `Bordeaux`). Leave empty for all of France. |
| `contractType` | String | No | `all`, `CDI`, `CDD`, `INTERIM`, `ALTERNANCE`, `STAGE`, or `FREELANCE`. |
| `maxResults` | Integer | No | Maximum number of offers to scrape (default: 100). |
| `fetchDetails` | Boolean | No | Fetch each offer's detail page for the full description, exact salary, skills, and dates (default: true). |
| `proxyConfiguration` | Object | No | Proxy settings. French residential proxies recommended. |

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `jobTitle` | String | `"Ingénieur Commercial - Ingénieure Commerciale H/F"` |
| `company` | String | `"Solutec"` |
| `companyUrl` | String | Company page URL on hellowork.com |
| `location` | String | `"Paris - 75"` |
| `city` | String | `"Paris"` |
| `region` | String | `"Île-de-France"` |
| `postalCode` | String | `"75000"` |
| `department` | String | `"75"` |
| `contractType` | String | `"CDI"` |
| `workType` | String | `"Temps plein"` |
| `salary` | String | `"30 000 - 45 000 € / an"` |
| `salaryMin` | Number | `30000` |
| `salaryMax` | Number | `45000` |
| `salaryCurrency` | String | `"EUR"` |
| `salaryPeriod` | String | `"annual"` |
| `jobDescription` | String | Full job description text |
| `skills` | Array | `["Prospection", "Négociation", ...]` |
| `experience` | String | Required experience (when published) |
| `education` | String | Required education (when published) |
| `industry` | String | Industry / sector |
| `remote` | Boolean | `true` |
| `publishedDate` | String | `"2026-07-09T12:41:09Z"` |
| `publishedText` | String | `"il y a 2 jours"` |
| `validThrough` | String | `"2026-08-08T12:41:09Z"` |
| `offerId` | String | `"81138425"` |
| `url` | String | Full URL to the offer on hellowork.com |
| `scrapedAt` | String | ISO timestamp of when the row was scraped |

### Example output

```json
{
    "jobTitle": "Commercial - Commerciale Paris H/F",
    "company": "LIVEMENTOR",
    "companyUrl": "https://www.hellowork.com/fr-fr/entreprises/livementor-12345.html",
    "location": "Paris - 75",
    "city": "Paris",
    "region": "Île-de-France",
    "postalCode": "75000",
    "department": "75",
    "contractType": "CDI",
    "workType": "Temps plein",
    "salary": "30 000 - 45 000 € / an",
    "salaryMin": 30000,
    "salaryMax": 45000,
    "salaryCurrency": "EUR",
    "salaryPeriod": "annual",
    "jobDescription": "Nous recherchons un commercial pour développer notre portefeuille clients...",
    "skills": ["Prospection", "Négociation", "CRM"],
    "experience": "24 mois",
    "education": "Bac +3",
    "industry": "Formation",
    "remote": false,
    "publishedDate": "2026-07-09T12:41:09Z",
    "publishedText": "il y a 2 jours",
    "validThrough": "2026-08-08T12:41:09Z",
    "offerId": "80877246",
    "url": "https://www.hellowork.com/fr-fr/emplois/80877246.html",
    "scrapedAt": "2026-07-09T10:00:00.000Z"
}
````

### Salary parsing

HelloWork publishes salaries as free text (for example `"30 000 - 45 000 € / an"` or `"2 050 - 2 630 € / mois"`). The actor keeps the original text in `salary` and also parses it into `salaryMin`, `salaryMax`, `salaryCurrency`, and `salaryPeriod` where possible. Not every offer publishes a salary — those rows leave the salary fields empty, which is expected.

### Cost estimate

With **Fetch Full Descriptions** on, the actor makes one extra request per offer to read its structured job data; with it off, it fetches one page per 30 offers. A typical run of a few hundred offers costs a small fraction of a dollar in Apify compute plus the pay-per-result fee. Turn off `fetchDetails` when you only need titles, companies, locations, salaries, contract types, and links — everything on the listing card.

### Limitations / known issues

- **General job board.** HelloWork covers all sectors and contract types. For executive-only roles, pair it with an APEC scraper; for the national employment agency, pair it with a France Travail scraper.
- **Salary is not always published.** Many French offers omit salary. When present, both the raw text and parsed min/max are returned; when absent, the salary fields are empty.
- **Location filter is text-based.** The `location` input is passed to HelloWork's own search. It is not a radius search.
- **`education` and `experience` depend on the recruiter.** These come from each offer's structured data and are only populated when the recruiter filled them in.
- **French residential proxy recommended.** HelloWork serves reliably through French residential proxies; the prefill is set up for you.

### Related scrapers

- [APEC Scraper](https://apify.com/studio-amba/apec-scraper) — France's executive (cadre) job board.
- [France Travail Scraper](https://apify.com/studio-amba/france-travail-scraper) — France's national employment agency (Pôle Emploi), full job market.
- [Jobat Scraper](https://apify.com/studio-amba/jobat-scraper) — Belgian job board.
- [Pracuj Scraper](https://apify.com/studio-amba/pracuj-scraper) — Poland's largest job board.
- [InfoJobs Scraper](https://apify.com/studio-amba/infojobs-scraper) — Spain's largest job board.

### Disclaimer

This actor collects only publicly available job-offer data from hellowork.com for legitimate use such as market research and job aggregation. Respect HelloWork's terms of service and applicable data-protection law when using the output.

# Actor input Schema

## `searchQuery` (type: `string`):

Job search keyword in French (e.g. 'commercial', 'developpeur', 'comptable', 'infirmier'). Leave empty to browse the most recent offers.

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

City, department, or region to search in (e.g. 'Paris', 'Lyon', 'Bordeaux'). Leave empty for all of France.

## `contractType` (type: `string`):

Filter by contract type.

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

Maximum number of job offers to scrape.

## `fetchDetails` (type: `boolean`):

Open each offer's detail page for the full description, exact salary, skills, education, experience, and precise publish date. Slower but richer. Turn off for faster, listing-only results.

## `proxyConfiguration` (type: `object`):

Proxy settings. French residential proxies recommended for reliable access.

## Actor input object example

```json
{
  "searchQuery": "commercial",
  "location": "Paris",
  "contractType": "all",
  "maxResults": 20,
  "fetchDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FR"
  }
}
```

# 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 = {
    "searchQuery": "commercial",
    "location": "Paris",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "FR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/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 = {
    "searchQuery": "commercial",
    "location": "Paris",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "FR",
    },
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchQuery": "commercial",
  "location": "Paris",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FR"
  }
}' |
apify call studio-amba/hellowork-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/hellowork-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "HelloWork Scraper - French Job Offers Data",
        "description": "Scrape job offers from HelloWork (hellowork.com), one of France's largest general job boards. Search by keyword, location, and contract type. Extract titles, companies, locations, salaries, contract types, skills, and full descriptions. No login or cookies required.",
        "version": "0.1",
        "x-build-id": "PnC98j4FUIyBBwofX"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/studio-amba~hellowork-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-studio-amba-hellowork-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/studio-amba~hellowork-scraper/runs": {
            "post": {
                "operationId": "runs-sync-studio-amba-hellowork-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/studio-amba~hellowork-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-studio-amba-hellowork-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Job search keyword in French (e.g. 'commercial', 'developpeur', 'comptable', 'infirmier'). Leave empty to browse the most recent offers."
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "City, department, or region to search in (e.g. 'Paris', 'Lyon', 'Bordeaux'). Leave empty for all of France."
                    },
                    "contractType": {
                        "title": "Contract Type",
                        "enum": [
                            "all",
                            "CDI",
                            "CDD",
                            "INTERIM",
                            "ALTERNANCE",
                            "STAGE",
                            "FREELANCE"
                        ],
                        "type": "string",
                        "description": "Filter by contract type.",
                        "default": "all"
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of job offers to scrape.",
                        "default": 100
                    },
                    "fetchDetails": {
                        "title": "Fetch Full Descriptions",
                        "type": "boolean",
                        "description": "Open each offer's detail page for the full description, exact salary, skills, education, experience, and precise publish date. Slower but richer. Turn off for faster, listing-only results.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings. French residential proxies recommended for reliable access."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
