# France Jobs API (`aspen-technology-labs-inc/france-jobs-api`) Actor

Find job postings in France by role, structured location, company, category, salary, posting age, employment type, remote status, and seniority.

- **URL**: https://apify.com/aspen-technology-labs-inc/france-jobs-api.md
- **Developed by:** [Aspen Technology Labs, Inc.](https://apify.com/aspen-technology-labs-inc) (community)
- **Categories:** Jobs, Developer tools, Other
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 job records

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## France Jobs API - JobsIndex by Aspen Tech Labs

Access French jobs data through the JobsIndex API, built by Aspen Tech Labs. This Actor is fixed to France and sources listings directly from employer career sites and ATS platforms rather than job boards, giving you first-party data. Coverage spans both French-language and English-language postings, so multinational employers and English-first roles in France are captured alongside domestic French job ads. Part of a broader JobsIndex feed aggregating 11M+ active postings daily across 300K+ employer source sites globally.

Filter by role keyword, location, salary, posting age, employment type, remote status, seniority, and pagination to pull exactly the French job postings data you need for recruitment tools, workforce analytics, or labour market research.

*Pour le marché français : nos offres d'emploi couvrent à la fois les annonces en français et en anglais, collectées directement sur les sites carrière des employeurs. Idéal pour l'analyse du marché du travail, les outils de recrutement et les projets de données multilingues.*

### Need More or Something Different?

If this Actor is working well for you, we'd love a review. For more data, custom feeds, feedback, or any questions, reach out via our [website](https://jobsindex.com/) or [email](mailto:inquiry+apify@aspentechlabs.com). You can also explore [JobMarketPulse](https://jobmarketpulse.com/), our labor and job market intelligence platform.

### Built-In Country Preset

This Actor is fixed internally to `country=France`. The runtime always enforces that value even if a different country is submitted.

Because the enforced country takes precedence over `where` in the current JobsIndex API, `where` is intentionally not exposed. Use `region`, `city`, `postal_code`, and `metro_area` to narrow locations within France. `what` remains available for free-text job searches.

### Quick Start

```json
{
  "title": "Software Engineer",
  "size": 5
}
```

### Input Parameters

| Parameter | Description | Example |
|---|---|---|
| `salary` | Salary amount or range filter. | `20h-30h` |
| `what` | Job search query. Supports keywords, boolean logic, exact phrases, and field-targeted search. | `software engineer OR data analyst` |
| `country` | Fixed preset. Runtime always uses `France`; changes are ignored. | `France` |
| `region` | Region, state, or province. | `Region name` |
| `city` | City filter. | `City name` |
| `postal_code` | Postal code filter. | `Postal code` |
| `metro_area` | Metropolitan area filter. | `Metro area` |
| `title` | Job title filter. | `Software Engineer` |
| `company_name` | Employer name filter. | `Employer name` |
| `company_domain` | Employer website domain. | `example.com` |
| `category` | Job category. | `Information Technology` |
| `sub_category` | More specific job function or role. | `Software Developer` |
| `industry` | Employer industry. | `Technology` |
| `posted` | Relative posting age or ISO date. | `1w` |
| `employment_type` | Employment type. | `Full-Time` |
| `remote` | Work arrangement. Supported values: `remote`, `on-site`, `hybrid`. | `hybrid` |
| `seniority` | Seniority level. | `Senior` |
| `page` | Page number, starting from 0. | `0` |
| `size` | Results per page. Minimum 1, maximum 100. | `5` |

### Salary Filter Format

Use `NUMBER[UNIT]` or `NUMBER[UNIT]-NUMBER[UNIT]`.

Supported units:

- `h` - per hour
- `d` - per day
- `w` - per week
- `m` - per month
- `y` - per year

Examples: `20h-30h`, `35h`, `50000y-90000y`.

### Advanced Filters

`what` supports plain-text search, boolean logic, exact phrases, and field-targeted search. If no field is provided, the API expands the query across a default set of relevant job and content fields.

```text
what = engineer OR manager
what = @title engineer OR manager
what = @(title,description) (python)
what = @(title,title_raw,description) (engineer OR manager)
```

#### Structured Filter Precedence

When `what` is provided together with structured job filters, the structured filters take priority and may override or narrow the keyword query. Use `what` when the corresponding structured fields are not set.

### Location Filtering

The country is fixed. Use structured fields to narrow results within France:

- `region`
- `city`
- `postal_code`
- `metro_area`

### Limits and Pagination

Results are paginated with `page` and `size`.

| Parameter | Min | Max |
|---|---:|---:|
| `page` | 0 | Depends on `size` and the item cap |
| `size` | 1 | 100 |

Invalid values can return `400 Invalid page or size parameters`.

#### Item Caps

| Query shape | Max items | Effective max `size` | Over-size behavior |
|---|---:|---:|---|
| No company filter | 1000 | 100 | Validation error; not silently capped |
| Company filter plus another keyword or filter | 20 | 20 | Silent cap with capping metadata |
| Company filter only | 5 | 5 | Silent cap with capping metadata |

A company filter means `company_name`, `company_domain`, or a company field referenced inside `what`. Capped responses can include `size_requested` and `size_capped_by` metadata.

#### Free-Text Query Limits

`what` has a maximum of 700 raw URL characters or 500 decoded characters. Unsafe expressions, excessive operators, or malformed filters can return a `400` response.

#### Field Validation

Invalid filter values can return `400 Invalid value for parameter: <name>`. Common validation examples include malformed company domains, invalid dates or relative `posted` values, invalid salary format, unsupported location formats, or overly long field values.

### Output

Each run stores job records in the default Apify dataset. Common fields include job title, category, company, structured location, salary, employment type, remote status, posting dates, source URL, application URL, description, and JobsIndex ID.

Field availability depends on the source job posting.

# Actor input Schema

## `salary` (type: `string`):

Salary amount/range filter. Format: 1-9 digits followed by y, m, w, d, or h; optional range A-B. Examples: 20h-30h, 35h, 20h-200000y.

## `what` (type: `string`):

Main job search query. Supports keywords, exact phrases, boolean logic (AND, OR, NOT or &, |, !), and field targeting. Maximum 700 raw URL chars or 500 decoded chars. Examples: python developer OR junior javascript, "data scientist", @(title) (manager).

## `country` (type: `string`):

Fixed preset. Runtime always uses `France`; changes are ignored.

## `region` (type: `string`):

State, province, or region. Maximum 80 characters.

## `city` (type: `string`):

City filter. Maximum 100 characters.

## `postal_code` (type: `string`):

Postal or ZIP code. Maximum 20 characters.

## `metro_area` (type: `string`):

Metropolitan area filter. Maximum 100 characters. Example: Denver-Aurora-Centennial, CO.

## `title` (type: `string`):

Job title filter. Maximum 200 characters.

## `company_name` (type: `string`):

Company name filter. Company filters reduce the retrievable item cap; see README.

## `company_domain` (type: `string`):

Company website domain in valid DNS form, for example ibm.com. Company filters reduce the retrievable item cap; see README.

## `category` (type: `string`):

Job category. Maximum 100 characters.

## `sub_category` (type: `string`):

More specific job function or role.

## `industry` (type: `string`):

Company industry. Maximum 100 characters. Example: Food Products or Hotels and Restaurants.

## `posted` (type: `string`):

Relative posting age, such as 1h, 1d, 1w, 1m, or an ISO date: YYYY, YYYY-MM, YYYY-MM-DD.

## `employment_type` (type: `string`):

Employment type, for example Full-Time. Comma-separated values are supported; each value can be up to 31 characters.

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

Work arrangement filter. Supported values: remote, on-site, hybrid.

## `seniority` (type: `string`):

Seniority level, for example Junior, Middle, Senior. Comma-separated values are supported; each value can be up to 31 characters.

## `page` (type: `integer`):

Page number. Starts from 0. Pagination is capped by query shape: no company filter up to 1000 items, company filter with another filter up to 20 items, company filter only up to 5 items.

## `size` (type: `integer`):

Number of results per page. Default 5, min 1, max 100. Effective maximum can be lower for company-filtered queries; see README.

## Actor input object example

```json
{
  "what": "",
  "country": "France",
  "region": "",
  "city": "",
  "postal_code": "",
  "metro_area": "",
  "title": "",
  "company_name": "",
  "company_domain": "",
  "category": "",
  "sub_category": "",
  "industry": "",
  "posted": "",
  "employment_type": "",
  "remote": "",
  "seniority": "",
  "page": 0,
  "size": 5
}
```

# Actor output Schema

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

No description

## `meta` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("aspen-technology-labs-inc/france-jobs-api").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("aspen-technology-labs-inc/france-jobs-api").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{}' |
apify call aspen-technology-labs-inc/france-jobs-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aspen-technology-labs-inc/france-jobs-api"
        }
    }
}
```

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

## OpenAPI specification

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