# France Travail Scraper - French Job Listings (`studio-amba/france-travail-scraper`) Actor

Scrape job listings from France Travail (formerly Pole Emploi), France's national employment agency with 700K+ active job offers. Search by keyword, location, and contract type. Extract titles, companies, salaries, skills, and descriptions. No login or cookies required.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

### What does France Travail Scraper do?

**France Travail Scraper** extracts job listings from [France Travail](https://candidat.francetravail.fr/) (formerly Pole Emploi), France's official national employment agency. The platform aggregates **700,000+ active job offers** across all industries and regions in France, making it the single largest source of French employment data.

This Actor scrapes structured job data including titles, companies, salaries, locations, contract types, required skills, experience levels, and full descriptions. Run it on the Apify platform to get API access, scheduling, proxy rotation, and integrations with tools like Google Sheets, Slack, Zapier, and webhooks.

**No login, cookies, or API keys required.** The scraper works with publicly available job listings only.

### Why use France Travail Scraper?

- **Labor market research**: Analyze job demand across French regions, industries, and skill sets
- **Salary benchmarking**: Compare salary ranges by role, location, and experience level
- **Recruitment intelligence**: Track which companies are hiring, what skills they need, and where
- **Academic research**: Study employment trends, regional disparities, and sector dynamics
- **Job aggregation**: Feed French job listings into your own job board or career platform
- **Skills gap analysis**: Identify which competencies employers demand most frequently

France Travail is a government platform, so data tends to be well-structured, comprehensive, and covers the full French labor market including positions that never appear on commercial job boards.

### How to scrape France Travail data

1. Go to the [France Travail Scraper](https://apify.com/blackfalcondata/france-travail-scraper) page on Apify Store
2. Click **Try for free** to open the Actor in Apify Console
3. Enter your search keyword (e.g. "developpeur", "comptable", "infirmier")
4. Optionally set a location (e.g. "Paris", "Lyon", "Marseille")
5. Choose a contract type filter if needed (CDI, CDD, Interim, etc.)
6. Set the maximum number of results you want
7. Click **Start** and wait for the run to complete
8. Download your data as JSON, CSV, Excel, or HTML from the Output tab

### Input

| Field | Type | Description |
|-------|------|-------------|
| `searchQuery` | String | Job search keyword (default: "developpeur") |
| `location` | String | City or region to filter by |
| `contractType` | Select | CDI, CDD, Interim, Seasonal, Freelance, Internship, Franchise, or All |
| `minSalary` | Integer | Minimum annual salary in EUR |
| `maxResults` | Integer | Maximum listings to scrape (default: 100, max: 5000) |
| `proxyConfiguration` | Object | Proxy settings (FR residential recommended) |

#### Example input

```json
{
    "searchQuery": "developpeur",
    "location": "Paris",
    "contractType": "CDI",
    "maxResults": 50
}
````

### Output

Each job listing contains detailed structured data. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Example output

```json
{
    "title": "Developpeur BI / Data (h/f)",
    "company": "LHH RECRUITMENT SOLUTIONS",
    "location": "86 - Poitiers",
    "city": "Poitiers",
    "region": "",
    "department": "86",
    "contractType": "CDI",
    "workType": "Temps plein",
    "salary": "35 000 - 45 000 EUR annuel sur 12 mois",
    "salaryMin": 35000,
    "salaryMax": 45000,
    "salaryPeriod": "annual",
    "description": "Rattache au Responsable Data, vous participez a la conception et au developpement de solutions BI...",
    "skills": ["SQL", "ETL", "Power BI", "Python"],
    "experience": "2 Ans indispensable",
    "education": "Bac+3 a Bac+5",
    "publishedDate": "27 mai 2026",
    "applicationUrl": "https://candidat.francetravail.fr/offres/recherche/detail/208VSRJ/postuler",
    "url": "https://candidat.francetravail.fr/offres/recherche/detail/208VSRJ",
    "scrapedAt": "2026-05-27T14:30:00.000Z"
}
```

### Data fields

| Field | Description |
|-------|-------------|
| `title` | Job position title |
| `company` | Hiring company or agency name |
| `location` | Full location string (department code + city) |
| `city` | City name |
| `department` | French department code (e.g. "75" for Paris) |
| `region` | Region name when available |
| `contractType` | CDI, CDD, Interim, Seasonal, etc. |
| `workType` | Temps plein (full-time) or Temps partiel (part-time) |
| `salary` | Raw salary text as displayed |
| `salaryMin` | Parsed minimum salary (numeric) |
| `salaryMax` | Parsed maximum salary (numeric) |
| `salaryPeriod` | annual, monthly, or hourly |
| `description` | Full job description text |
| `skills` | List of required skills and competencies |
| `experience` | Required experience level |
| `education` | Required education level |
| `publishedDate` | When the job was posted |
| `applicationUrl` | Direct link to apply |
| `url` | Full URL to the listing on France Travail |
| `scrapedAt` | ISO 8601 timestamp of data collection |

### How much does it cost to scrape France Travail?

The Actor uses lightweight HTTP requests (no browser needed), making it very efficient:

- **100 jobs**: ~0.05 USD in platform credits
- **500 jobs**: ~0.20 USD in platform credits
- **1000 jobs**: ~0.40 USD in platform credits

Apify gives new users **$5 of free credits** each month, enough for thousands of job listings.

### Tips and advanced options

- **Use French keywords** for best results: "developpeur" instead of "developer", "comptable" instead of "accountant"
- **Location filter** accepts city names, department numbers, or region names
- **Contract type filter** helps narrow results when you only want permanent (CDI) or temporary (CDD) positions
- **Schedule runs** daily or weekly to track new job postings over time
- **Combine with other scrapers** like Indeed France, Cadremploi, or LinkedIn to get comprehensive market coverage
- **French residential proxies** are recommended for reliable access to the platform

### About France Travail

France Travail (formerly Pole Emploi, rebranded in January 2024) is France's national public employment service. It is the official government agency responsible for registering unemployed workers, helping job seekers find employment, and providing labor market services. Every employer in France can post jobs on the platform at no cost, making it the most comprehensive source of French job listings.

The platform covers all sectors, all contract types, and all regions of metropolitan France and overseas territories (DOM-TOM).

### FAQ, disclaimers, and support

**Is it legal to scrape France Travail?**
This Actor collects publicly available job listing data from a government website. No login or authentication is required. Always review and comply with the website's Terms of Service and applicable data protection laws (RGPD/GDPR) before using scraped data.

**Why are some fields empty?**
Not all job postings include salary, skills, or education requirements. The Actor extracts what is available on each listing page.

**The scraper returned 0 results**
Try different search keywords or remove location filters. Ensure your proxy configuration is working correctly. French residential proxies are recommended.

**I need a custom solution**
If you need modifications, additional fields, or a custom integration, open an issue in the [Issues tab](https://console.apify.com/actors/blackfalcondata~france-travail-scraper/issues) or contact us for a tailored solution.

# Actor input Schema

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

Job search keyword (e.g. 'developpeur', 'comptable', 'infirmier'). Leave empty to browse all jobs.

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

City or region (e.g. 'Paris', 'Lyon', 'Marseille'). Leave empty for all of France.

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

Filter by contract type.

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

Minimum annual salary in EUR. Leave empty for no minimum.

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

Maximum number of job listings to scrape.

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

Proxy settings. French residential proxies recommended for best results.

## Actor input object example

```json
{
  "searchQuery": "developpeur",
  "contractType": "all",
  "maxResults": 100,
  "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": "developpeur",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "FR"
    }
};

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

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/france-travail-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",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FR"
  }
}' |
apify call studio-amba/france-travail-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "France Travail Scraper - French Job Listings",
        "description": "Scrape job listings from France Travail (formerly Pole Emploi), France's national employment agency with 700K+ active job offers. Search by keyword, location, and contract type. Extract titles, companies, salaries, skills, and descriptions. No login or cookies required.",
        "version": "0.1",
        "x-build-id": "y2xAHMLPMc30kS5RR"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/studio-amba~france-travail-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-studio-amba-france-travail-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~france-travail-scraper/runs": {
            "post": {
                "operationId": "runs-sync-studio-amba-france-travail-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~france-travail-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-studio-amba-france-travail-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 (e.g. 'developpeur', 'comptable', 'infirmier'). Leave empty to browse all jobs."
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "City or region (e.g. 'Paris', 'Lyon', 'Marseille'). Leave empty for all of France."
                    },
                    "contractType": {
                        "title": "Contract Type",
                        "enum": [
                            "all",
                            "CDI",
                            "CDD",
                            "MIS",
                            "SAI",
                            "LIB",
                            "REP",
                            "FRA"
                        ],
                        "type": "string",
                        "description": "Filter by contract type.",
                        "default": "all"
                    },
                    "minSalary": {
                        "title": "Minimum Salary",
                        "type": "integer",
                        "description": "Minimum annual salary in EUR. Leave empty for no minimum."
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of job listings to scrape.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings. French residential proxies recommended for best results."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
