# France Travail Scraper $1💰 Jobs, Salaries & Apply Links (`abotapi/francetravail-fr-scraper`) Actor

Scrape job offers from France Travail with titles, companies, locations, salaries, contracts, descriptions, skills, employer details, and apply links. Search by keyword, location, contract, sector, salary, sort options, or paste job/search URLs.

- **URL**: https://apify.com/abotapi/francetravail-fr-scraper.md
- **Developed by:** [AbotAPI](https://apify.com/abotapi) (community)
- **Categories:** Jobs, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## France Travail Scraper

Scrape structured job-offer data from **France Travail** ([francetravail.fr](https://francetravail.fr), formerly Pôle Emploi) — France's national employment platform with 700,000+ active listings.

Returns normalized job records: listing id + canonical URL, title, employer/recruiter, full location + postal code, contract type, salary range, full description, experience, skills & soft skills, additional information, employer page + apply/contact links, ROME codes, and listing labels.

### Why use this actor

- **Market researchers & analysts** — track hiring volume, salary ranges, contract mix, and regional/role demand (logistics, IT, healthcare, hospitality).
- **Recruiting intelligence** — benchmark employer hiring patterns, contract mix, and compensation across regions and sectors.
- **Data engineers** — feed structured records into dashboards, warehouses, ETL pipelines, alerts, or search/matching engines.
- **Lead generation** — identify employers, recruiters, and role-level context for prospect research.

### Input parameters

Provide keywords + filters (search mode) or paste France Travail search URLs (url mode).

| Parameter | Type | Description | Default |
| --- | --- | --- | --- |
| `mode` | `string` | `search` (keywords + filters) or `url` (paste search links). | `search` |
| `queries` | `string[]` | Search keywords (one per line), e.g. `data analyst`, `cariste`. Each runs a separate search. | — |
| `location` | `string` | City, department code, region, or postal area. Empty = all of France. | — |
| `radius` | `integer` | Search radius in km around the location (0 = none). | `10` |
| `publishedDate` | `string` | `Last 24 hours` \| `Last 3 Days` \| `Last Week` \| `Last 2 Weeks` \| `Last Month`. | — |
| `contractType` | `string[]` | Contract types (CDI, CDD, Intérim, Apprentissage, …). | — |
| `contractDuration` | `string[]` | `Full-time` \| `Part-time` \| `Not specified`. | — |
| `jobCategory` | `string[]` | Professional domains (IT, Healthcare, Logistics, Hospitality, …). | — |
| `minSalary` | `integer` | Minimum monthly gross salary in EUR. `0` = keep all. | `0` |
| `experience` | `string[]` | Entry / Mid / Senior / Not specified (applied from job detail). | — |
| `seniority` | `string[]` | Executive / Non-executive / Not specified. | — |
| `onlyFranceTravail` | `boolean` | Keep only offers published directly on France Travail (exclude partners). | `false` |
| `inclusiveEmployer` | `boolean` | Keep only disability-inclusive (Handi-engage) employers. | `false` |
| `adaptedCompany` | `boolean` | Keep only adapted companies. | `false` |
| `sortBy` | `string` | `Most relevant` \| `Newest`. | `Newest` |
| `urls` | `string[]` | France Travail search URLs (url mode). | — |
| `maxItems` | `integer` | **The run cap** — global max listings returned. | `20` |
| `maxPages` | `integer` | Per-search page limit (20 jobs/page). `0` = unlimited (stops at `maxItems`). | `0` |
| `fetchDetails` | `boolean` | Open each job page for the full description, salary, skills, employer block, apply/contact links. Billed as a detail-enrichment surcharge. | `true` |
| `proxy` | `object` | Apify proxy settings. Residential is recommended. | Residential |

#### One cap rule

`maxItems` is the single cap. `maxPages` defaults to **unlimited** and stops at `maxItems`. Set `maxPages` only when you want a hard per-search page limit.

### Output

Each record has the stable envelope `type` + `id` + `url` (dedupe key: `type + ":" + id`):

- **Core**: `type`, `id`, `url`, `title`, `seedId`, `seedType`, `seedValue`, `pageIndex`
- **Location**: `location`, `postalCode`, `addressLocality`, `addressRegion`, `addressCountry`, `mapUrl`
- **Contract**: `contractType`, `workTime`, `workHours`, `employmentType`, `publishedAt`, `validThrough`
- **Description**: `description`
- **Salary**: `salary`, `salaryCurrency`, `salaryMin`, `salaryMax`, `salaryUnit`, `salaryText`
- **Requirements**: `experienceRequirements[]`, `skills[]`, `softSkills[]`, `additionalInformation[]`
- **Employer**: `company`, `companySize`, `recruiterName`, `recruiterDescription`, `employerPageUrl`, `employerLogoUrl`, `employerPhone`, `employerEmail`, `applyActionUrl`, `contactActionUrl`, `industry`, `qualification`, `romeCodes[]`, `jobLabels[]`
- **Badges**: `inclusiveEmployer`, `adaptedCompany`, `scrapedAt`

### Example inputs

Query-driven run:

```json
{
  "mode": "search",
  "queries": ["data analyst", "business analyst"],
  "location": "Paris",
  "publishedDate": "Last Week",
  "contractType": ["Permanent contract (CDI) | CDI"],
  "sortBy": "Newest | Date",
  "maxItems": 50
}
````

Targeted category + salary:

```json
{
  "mode": "search",
  "queries": ["cariste"],
  "location": "Lille",
  "jobCategory": ["Logistics | Transport, Logistique"],
  "contractDuration": ["Full-time | Temps plein"],
  "minSalary": 2000,
  "maxItems": 30
}
```

### Pricing

Pay-per-event: a `Results` event per dataset row, plus a small `detail-enrichment` event per detail page fetched (only when `fetchDetails` is on). An Apify `Actor Start` event covers compute.

### Connection guidance

Apify **Residential** proxy (any country) gives the highest reliability. Some datacenter exit IPs may be geo-restricted; if a run returns no results on datacenter, switch the proxy to Residential or re-run for a fresh exit IP. If you are on the Apify Free plan, residential proxy access is not included — upgrade or paste your own residential proxy URLs in the proxy field.

### Compliance & ethics

This actor collects publicly available job-posting information from francetravail.fr for legitimate business purposes (labor-market research, recruiting intelligence, monitoring). Users are responsible for ensuring their collection, storage, and use complies with applicable laws, regulations, and platform terms. This section is informational, not legal advice.

# Actor input Schema

## `mode` (type: `string`):

search = build a search from keywords and filters. url = paste one or more France Travail search URLs and walk them forward.

## `queries` (type: `array`):

Job titles, skills, or hiring phrases such as "data analyst", "cariste", or "assistant comptable". Each line runs a separate search.

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

A city, department code, region, or postal area applied to all searches (e.g. "Paris", "75D", "69000"). Leave empty to search across France.

## `radius` (type: `integer`):

Radius around the location, in kilometres (0 = no radius). Only used when a location is set.

## `publishedDate` (type: `string`):

Keep only jobs posted within the chosen window.

## `contractType` (type: `array`):

Contract types to include (permanent, fixed-term, temporary, apprenticeship, …). Allowed values: CDI, CDD, Intérim, CDI Intérimaire, Saisonnier, Contrat apprentissage, Cont. professionnalisation, Prépa.opérationnel.emploi, CDI de chantier ou d'opération, Contrat d'Engagement Educatif ….

## `contractDuration` (type: `array`):

Keep only full-time, part-time, or unspecified working-time listings. Allowed values: Temps plein, Temps partiel, Non renseignée.

## `jobCategory` (type: `array`):

Professional domains to include (IT, healthcare, logistics, hospitality, construction, …). Allowed values: Achats, Comptabilité, Gestion, Arts, Artisanat d'art, Banque, Assurance, Bâtiment, Travaux Publics, Commerce, Vente, Communication, Multimédia, Conseil, Etudes, Direction d'entreprise, Espaces verts et naturels, Agriculture, Pêche, Soins aux animaux, Hôtellerie - Restauration, Tourisme, Animation ….

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

Drop listings whose salary is below this monthly gross amount. Leave at 0 to keep all.

## `experience` (type: `array`):

Experience requirements to include (applied client-side from the job detail). Allowed values: Moins de 1 an, De 1 à 3 ans, Plus de 3 ans, Non renseignée.

## `seniority` (type: `array`):

Executive, non-executive, or unspecified qualification levels. Allowed values: Cadre, Non cadre, Non renseignée.

## `onlyFranceTravail` (type: `boolean`):

When ON, keep only offers published directly on France Travail (partner offers excluded).

## `inclusiveEmployer` (type: `boolean`):

When ON, keep only offers from employers showing the Handi-engage commitment.

## `adaptedCompany` (type: `boolean`):

When ON, keep only offers from adapted companies (entreprises adaptées).

## `sortBy` (type: `string`):

Sort by relevance or by publication date.

## `urls` (type: `array`):

One or more France Travail search URLs, e.g. https://candidat.francetravail.fr/offres/recherche?motsCles=developpeur. Multi-URL supported. Filters above are ignored in this mode; pagination starts at the page implied by the URL's range and walks forward.

## `maxItems` (type: `integer`):

Global cap on the number of jobs to return across all searches. This is THE cap — Max pages defaults to unlimited and stops at this number.

## `maxPages` (type: `integer`):

Per-search page limit (20 jobs per page). 0 means no page limit — the run stops at Max listings.

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

Open each job page to add the full description, salary range, experience, skills, soft skills, employer block, and apply/contact links. Adds one request per job (billed as a detail-enrichment surcharge). Turn off for a faster, lighter run using only the search-card fields.

## `proxy` (type: `object`):

Apify Residential proxy (any country) is recommended for the highest reliability. Some datacenter exit IPs may be geo-restricted.

## `mcpConnectors` (type: `array`):

Optionally send a condensed summary of each result into the apps you already use, via Model Context Protocol (MCP) connectors. The full record stays in the dataset. Leave empty to skip. Supported: Notion, Linear, Airtable, Apify.

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "developpeur"
  ],
  "location": "Paris",
  "radius": 10,
  "publishedDate": "Last Week",
  "contractType": [
    "Permanent contract (CDI) | CDI"
  ],
  "contractDuration": [
    "Full-time | Temps plein"
  ],
  "jobCategory": [
    "IT | Informatique, Télécommunication"
  ],
  "minSalary": 0,
  "experience": [],
  "seniority": [],
  "onlyFranceTravail": false,
  "inclusiveEmployer": false,
  "adaptedCompany": false,
  "sortBy": "Newest | Date",
  "urls": [
    "https://candidat.francetravail.fr/offres/recherche?motsCles=developpeur"
  ],
  "maxItems": 20,
  "maxPages": 0,
  "fetchDetails": true,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (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 = {
    "mode": "search",
    "queries": [
        "developpeur"
    ],
    "location": "Paris",
    "radius": 10,
    "publishedDate": "Last Week",
    "contractType": [
        "Permanent contract (CDI) | CDI"
    ],
    "contractDuration": [
        "Full-time | Temps plein"
    ],
    "jobCategory": [
        "IT | Informatique, Télécommunication"
    ],
    "minSalary": 0,
    "experience": [],
    "seniority": [],
    "onlyFranceTravail": false,
    "inclusiveEmployer": false,
    "adaptedCompany": false,
    "sortBy": "Newest | Date",
    "urls": [
        "https://candidat.francetravail.fr/offres/recherche?motsCles=developpeur"
    ],
    "maxItems": 20,
    "maxPages": 0,
    "fetchDetails": true,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/francetravail-fr-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 = {
    "mode": "search",
    "queries": ["developpeur"],
    "location": "Paris",
    "radius": 10,
    "publishedDate": "Last Week",
    "contractType": ["Permanent contract (CDI) | CDI"],
    "contractDuration": ["Full-time | Temps plein"],
    "jobCategory": ["IT | Informatique, Télécommunication"],
    "minSalary": 0,
    "experience": [],
    "seniority": [],
    "onlyFranceTravail": False,
    "inclusiveEmployer": False,
    "adaptedCompany": False,
    "sortBy": "Newest | Date",
    "urls": ["https://candidat.francetravail.fr/offres/recherche?motsCles=developpeur"],
    "maxItems": 20,
    "maxPages": 0,
    "fetchDetails": True,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/francetravail-fr-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 '{
  "mode": "search",
  "queries": [
    "developpeur"
  ],
  "location": "Paris",
  "radius": 10,
  "publishedDate": "Last Week",
  "contractType": [
    "Permanent contract (CDI) | CDI"
  ],
  "contractDuration": [
    "Full-time | Temps plein"
  ],
  "jobCategory": [
    "IT | Informatique, Télécommunication"
  ],
  "minSalary": 0,
  "experience": [],
  "seniority": [],
  "onlyFranceTravail": false,
  "inclusiveEmployer": false,
  "adaptedCompany": false,
  "sortBy": "Newest | Date",
  "urls": [
    "https://candidat.francetravail.fr/offres/recherche?motsCles=developpeur"
  ],
  "maxItems": 20,
  "maxPages": 0,
  "fetchDetails": true,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call abotapi/francetravail-fr-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "France Travail Scraper $1💰 Jobs, Salaries & Apply Links",
        "description": "Scrape job offers from France Travail with titles, companies, locations, salaries, contracts, descriptions, skills, employer details, and apply links. Search by keyword, location, contract, sector, salary, sort options, or paste job/search URLs.",
        "version": "1.0",
        "x-build-id": "WVzWcR4iuJiC16K0V"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/abotapi~francetravail-fr-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-abotapi-francetravail-fr-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/abotapi~francetravail-fr-scraper/runs": {
            "post": {
                "operationId": "runs-sync-abotapi-francetravail-fr-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/abotapi~francetravail-fr-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-abotapi-francetravail-fr-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",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "1. Mode",
                        "enum": [
                            "search",
                            "url"
                        ],
                        "type": "string",
                        "description": "search = build a search from keywords and filters. url = paste one or more France Travail search URLs and walk them forward.",
                        "default": "search"
                    },
                    "queries": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "Job titles, skills, or hiring phrases such as \"data analyst\", \"cariste\", or \"assistant comptable\". Each line runs a separate search.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "A city, department code, region, or postal area applied to all searches (e.g. \"Paris\", \"75D\", \"69000\"). Leave empty to search across France."
                    },
                    "radius": {
                        "title": "Search radius (km)",
                        "minimum": 0,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Radius around the location, in kilometres (0 = no radius). Only used when a location is set.",
                        "default": 10
                    },
                    "publishedDate": {
                        "title": "Publication recency",
                        "enum": [
                            "Last 24 hours",
                            "Last 3 Days",
                            "Last Week",
                            "Last 2 Weeks",
                            "Last Month"
                        ],
                        "type": "string",
                        "description": "Keep only jobs posted within the chosen window."
                    },
                    "contractType": {
                        "title": "Contract types",
                        "type": "array",
                        "description": "Contract types to include (permanent, fixed-term, temporary, apprenticeship, …). Allowed values: CDI, CDD, Intérim, CDI Intérimaire, Saisonnier, Contrat apprentissage, Cont. professionnalisation, Prépa.opérationnel.emploi, CDI de chantier ou d'opération, Contrat d'Engagement Educatif ….",
                        "items": {
                            "type": "string"
                        }
                    },
                    "contractDuration": {
                        "title": "Working time",
                        "type": "array",
                        "description": "Keep only full-time, part-time, or unspecified working-time listings. Allowed values: Temps plein, Temps partiel, Non renseignée.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "jobCategory": {
                        "title": "Professional domains",
                        "type": "array",
                        "description": "Professional domains to include (IT, healthcare, logistics, hospitality, construction, …). Allowed values: Achats, Comptabilité, Gestion, Arts, Artisanat d'art, Banque, Assurance, Bâtiment, Travaux Publics, Commerce, Vente, Communication, Multimédia, Conseil, Etudes, Direction d'entreprise, Espaces verts et naturels, Agriculture, Pêche, Soins aux animaux, Hôtellerie - Restauration, Tourisme, Animation ….",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minSalary": {
                        "title": "Minimum monthly gross salary (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Drop listings whose salary is below this monthly gross amount. Leave at 0 to keep all.",
                        "default": 0
                    },
                    "experience": {
                        "title": "Experience levels",
                        "type": "array",
                        "description": "Experience requirements to include (applied client-side from the job detail). Allowed values: Moins de 1 an, De 1 à 3 ans, Plus de 3 ans, Non renseignée.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "seniority": {
                        "title": "Qualification levels",
                        "type": "array",
                        "description": "Executive, non-executive, or unspecified qualification levels. Allowed values: Cadre, Non cadre, Non renseignée.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "onlyFranceTravail": {
                        "title": "Keep only France Travail listings",
                        "type": "boolean",
                        "description": "When ON, keep only offers published directly on France Travail (partner offers excluded).",
                        "default": false
                    },
                    "inclusiveEmployer": {
                        "title": "Disability-inclusive employers only",
                        "type": "boolean",
                        "description": "When ON, keep only offers from employers showing the Handi-engage commitment.",
                        "default": false
                    },
                    "adaptedCompany": {
                        "title": "Adapted companies only",
                        "type": "boolean",
                        "description": "When ON, keep only offers from adapted companies (entreprises adaptées).",
                        "default": false
                    },
                    "sortBy": {
                        "title": "Sort results",
                        "enum": [
                            "Most relevant | Pertinence",
                            "Newest | Date"
                        ],
                        "type": "string",
                        "description": "Sort by relevance or by publication date."
                    },
                    "urls": {
                        "title": "Search URLs",
                        "type": "array",
                        "description": "One or more France Travail search URLs, e.g. https://candidat.francetravail.fr/offres/recherche?motsCles=developpeur. Multi-URL supported. Filters above are ignored in this mode; pagination starts at the page implied by the URL's range and walks forward.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max listings (the run cap)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Global cap on the number of jobs to return across all searches. This is THE cap — Max pages defaults to unlimited and stops at this number.",
                        "default": 20
                    },
                    "maxPages": {
                        "title": "Max pages per search (0 = unlimited)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Per-search page limit (20 jobs per page). 0 means no page limit — the run stops at Max listings.",
                        "default": 0
                    },
                    "fetchDetails": {
                        "title": "Fetch full job details",
                        "type": "boolean",
                        "description": "Open each job page to add the full description, salary range, experience, skills, soft skills, employer block, and apply/contact links. Adds one request per job (billed as a detail-enrichment surcharge). Turn off for a faster, lighter run using only the search-card fields.",
                        "default": true
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Residential proxy (any country) is recommended for the highest reliability. Some datacenter exit IPs may be geo-restricted.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    },
                    "mcpConnectors": {
                        "title": "Pipe results into your apps (optional)",
                        "type": "array",
                        "description": "Optionally send a condensed summary of each result into the apps you already use, via Model Context Protocol (MCP) connectors. The full record stays in the dataset. Leave empty to skip. Supported: Notion, Linear, Airtable, Apify."
                    },
                    "notionParentPageUrl": {
                        "title": "Notion parent page (Notion connector only)",
                        "type": "string",
                        "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
                    },
                    "maxNotifyListings": {
                        "title": "Max items to export per connector",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Cap on items written to each connector per run. Does not affect the dataset.",
                        "default": 50
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
