# HelloWork Jobs Scraper — France Hiring Data (`khadinakbar/hellowork-jobs-scraper`) Actor

Search public HelloWork France job listings. Return normalized job titles, employers, locations, contracts, salaries, descriptions, posting dates, and direct listing URLs for recruiting and job-market research.

- **URL**: https://apify.com/khadinakbar/hellowork-jobs-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Jobs, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 hellowork job record scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 Jobs Scraper

Search public HelloWork France job listings and export normalized hiring data for recruiters, job-market analysts, and AI workflows.

Use this Actor when you need public French vacancies by role or skill, such as `data engineer`, with an optional city or region. It returns one dataset record per public listing with its title, employer, location, contract, public salary, posting date, description, and direct HelloWork URL.

It does not apply for jobs, sign in, collect applicant data, or bypass access controls.

### Input

```json
{
  "searchQuery": "data engineer",
  "location": "Paris",
  "maxResults": 50,
  "includeJobDetails": true,
  "responseFormat": "concise"
}
```

`maxResults` caps both output rows and row-level events. Set `includeJobDetails` to `false` for fast search-card data. Use `concise` descriptions for agent workflows and `detailed` for up to 5,000 characters of public job text.

### Output

Every row is a validated public job record. Stable fields include `jobId`, `title`, `companyName`, `location`, `employmentType`, `salaryText`, `postedAt`, `description`, `jobUrl`, and `scrapedAt`. Fields not published by HelloWork are explicitly `null`; the Actor never guesses salary, employer details, or an external apply link.

The default key-value store also holds:

- `OUTPUT` — compact machine-readable outcome.
- `RUN_SUMMARY` — pages, detail enrichment, validated writes, event counts, warnings, and errors.

The possible outcomes are `COMPLETE`, `PARTIAL`, `VALID_EMPTY`, `INVALID_INPUT`, `UPSTREAM_FAILED`, and `CONFIG_ERROR`. A successful empty search is distinct from an upstream failure. When useful public records were collected despite individual request failures, they are retained with a `PARTIAL` outcome.

### Cost

The Actor is priced through Pay per event + platform usage. It charges $0.00005 once at start and $0.003 only after each validated public job record is saved. Apify compute and proxy usage are additional where enabled in the Actor’s live pricing configuration.

### Limitations

HelloWork can change public search pages, ranking, pagination, and data availability without notice. Salary, dates, company websites, and job descriptions appear only when HelloWork publishes them. The scraper uses French residential proxies when available and falls back to respectful public requests if proxy setup is unavailable.

### Development

```bash
npm install
npm test
npm run build
```

Keep the Actor private until its cloud release evidence passes and you have added an icon and chosen to publish it yourself.

# Actor input Schema

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

Use this when you want to find a role or skill on HelloWork France, for example 'data engineer'. Enter plain French or English search text up to 120 characters. Defaults to 'developpeur'. This is not a HelloWork URL or an applicant search.

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

Use this when you want to focus results on a French city, department, or region, for example 'Paris' or 'Lyon'. Leave it empty to search across France. Defaults to an empty value. This is not a street address or country selector.

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

Use this when you need to cap both returned records and per-job charges. Enter an integer from 1 to 500, for example 50. Defaults to 20. This is a record cap, not a page count.

## `includeJobDetails` (type: `boolean`):

Use this when you need the public job description, structured posting date, salary and employer data from each listing page. Set false for faster search-card data only. Defaults to true. It never applies to jobs or accesses candidate data.

## `responseFormat` (type: `string`):

Use this when you need to control description length for an AI workflow. Choose 'concise' for descriptions up to 1,000 characters or 'detailed' for up to 5,000. Defaults to concise. This does not change the number of jobs returned.

## Actor input object example

```json
{
  "searchQuery": "data engineer",
  "location": "Lyon",
  "maxResults": 50,
  "includeJobDetails": true,
  "responseFormat": "concise"
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

## `output` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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": "developpeur",
    "location": "Paris",
    "maxResults": 20,
    "includeJobDetails": true,
    "responseFormat": "concise"
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/hellowork-jobs-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": "developpeur",
    "location": "Paris",
    "maxResults": 20,
    "includeJobDetails": True,
    "responseFormat": "concise",
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/hellowork-jobs-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": "developpeur",
  "location": "Paris",
  "maxResults": 20,
  "includeJobDetails": true,
  "responseFormat": "concise"
}' |
apify call khadinakbar/hellowork-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/7s6It12YDXKiLzzrf/builds/lPG5fuW1ZeRjbphk5/openapi.json
