# Apec Jobs Search Scraper (`soft_alexist/apec-jobs-search-scraper`) Actor

Scrape detailed job listings from APEC.fr with precision. Collect 25+ fields including job titles, salary ranges, locations with coordinates, contract types, and company data — perfect for recruiters, market researchers, and career analysts targeting French executive talent.

- **URL**: https://apify.com/soft\_alexist/apec-jobs-search-scraper.md
- **Developed by:** [Soft Alexist](https://apify.com/soft_alexist) (community)
- **Categories:** Automation, Developer tools, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 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

## APEC Jobs Scraper: Extract Executive Job Listings from France's Premier Job Board

---

### What Is APEC.fr?

APEC (Association pour l'emploi des cadres) is France's leading job platform specializing in professional and executive positions. It hosts thousands of active listings across industries, targeting managers, engineers, consultants, and skilled professionals. Manually extracting job data from APEC is tedious and inefficient — the **APEC Jobs Search Scraper** automates this process, delivering structured, multilingual job records ready for analysis or integration.

---

### Overview

The **APEC Jobs Search Scraper** extracts comprehensive job listings from APEC.fr search results, converting HTML pages into clean, structured records with 25+ fields. It is designed for:

- **Recruiters** monitoring French professional job markets
- **HR analysts** benchmarking salaries and roles by sector
- **Market researchers** tracking hiring trends in executive segments
- **Career aggregators** integrating French job data into multi-country platforms
- **Talent intelligence platforms** feeding market insights

Key strengths include configurable item limits, robust URL failure handling, and rich geographic data with latitude/longitude coordinates for mapping and location-based analysis.

---

### Input Format

The scraper accepts a JSON configuration object:

```json
{
  "urls": [
    "https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=ingenieur&page=1"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 200
}
````

| Field | Description | Example |
|---|---|---|
| `urls` | APEC job search results pages to scrape | Search by keyword, location, or advanced filters |
| `max_items_per_url` | Maximum records per URL (up to 200) | `200` for comprehensive collection |
| `ignore_url_failures` | If `true`, continues if URLs fail | Ensures long-running jobs complete despite timeouts |

**Tips for building URLs:**

- Use the APEC search form to build URLs with filters: `?motsCles=` (keywords), `&page=` (pagination)
- Example: `motsCles=ingenieur` (engineer), `motsCles=data%20scientist` (data scientist)
- Adjust `max_items_per_url` based on expected result count per search

***

### Output Format

**Sample output**

```json
{
  "id": 178886600,
  "numero_offre": "178886600W",
  "intitule": "Ingénieur de Recherche F/H",
  "intitule_surbrillance": "Ingénieur de Recherche F/H",
  "nom_commercial": "ECOLE D INGENIEURS DE PURPAN",
  "lieu_texte": "Toulouse - 31",
  "salaire_texte": "35 - 35 k€ brut annuel",
  "texte_offre": "L'Ecole d'Ingénieurs de PURPAN a développé une activité de recherche sur l’étude de solutions alternatives aux produits phytosanitaires utilisant les technologies oxydatives pour l’agriculture et l’agro-Alimentaire et s’appuie pour cela sur la plateforme mutualisée de recherche T...",
  "date_validation": "2026-06-16T12:30:44.000+0000",
  "date_publication": "2026-06-16T12:30:44.000+0000",
  "indicateur_oqa": true,
  "latitude": "43.596013",
  "longitude": "1.4321019",
  "localisable": true,
  "score": 27.5133,
  "offre_confidentielle": false,
  "secteur_activite": 101675,
  "secteur_activite_parent": 101767,
  "client_reel": true,
  "contract_duration": 28,
  "type_contrat": 101887,
  "origine_code": 101859,
  "id_nom_teletravail": 20766,
  "indicateur_faible_candidature": false,
  "from_url": "https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=ingenieur"
}
```

Each scraped job returns a detailed record with 25 fields:

#### Job Identification & Metadata

| Field | Meaning | Example |
|---|---|---|
| `ID` | Unique APEC internal identifier | Auto-generated UUID |
| `Numéro Offre` | Official APEC job posting number | "2024001234" |
| `Intitulé` | Job title as displayed | "Ingénieur Data Senior" |
| `Intitulé Surbrillance` | Highlighted/emphasized job title variant | Title with keyword emphasis |
| `Nom Commercial` | Company display name | "TechCorp France" |

#### Location & Geography

| Field | Meaning | Example |
|---|---|---|
| `Lieu Texte` | Job location as plain text | "Paris (75), Île-de-France" |
| `Latitude` | Geographic latitude for mapping | "48.8566" |
| `Longitude` | Geographic longitude for mapping | "2.3522" |
| `Localisable` | Whether location is mappable | `true` or `false` |

#### Compensation & Contract

| Field | Meaning | Example |
|---|---|---|
| `Salaire Texte` | Salary range as text | "45 000 - 55 000 €/an" |
| `Type Contrat` | Employment contract type | "CDI" (permanent), "CDD" (fixed-term) |
| `Contract Duration` | Expected contract length | "12 months", "Indefinite" |
| `ID Nom Télétravail` | Remote work availability indicator | "Télétravail possible", "100% remote" |

#### Content & Description

| Field | Meaning |
|---|---|
| `Texte Offre` | Full job description in HTML/text format |
| `Secteur Activité` | Primary industry/sector classification |
| `Secteur Activité Parent` | Broader sector parent category |
| `Client Réel` | Actual hiring company (vs. recruitment agency) |

#### Publication & Quality Indicators

| Field | Meaning |
|---|---|
| `Date Publication` | When the listing was published on APEC |
| `Date Validation` | When the listing was last validated/updated |
| `Indicateur OQA` | Quality assurance flag (APEC's internal QA metric) |
| `Offre Confidentielle` | Whether the listing is confidential/restricted |
| `Indicateur Faible Candidature` | Flag if listing has unusually low applications |
| `Score` | Internal ranking/relevance score |
| `Origine Code` | Listing source code (recruiter type, channel) |

***

### How to Use

1. **Build your search URL** — Use APEC's search form to filter by keywords, location, sector, and salary. Copy the resulting URL (e.g., `motsCles=ingenieur&page=1`).

2. **Configure pagination** — For large result sets, add multiple URLs with different `page` parameters:

```json
   "urls": [
     "https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=ingenieur&page=1",
     "https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=ingenieur&page=2"
   ]
```

3. **Set item limits** — Adjust `max_items_per_url` based on your needs (200 is maximum and recommended for bulk collection).

4. **Enable failure handling** — Keep `ignore_url_failures: true` to prevent interruptions if a page is temporarily unavailable.

5. **Run and export** — Start the scraper and download results as JSON, CSV, or Excel.

**Best practices:**

- Use multiple focused searches rather than one broad search to organize data by skill level or sector.
- Latitude/longitude fields enable map visualizations and geographic filtering.
- The `Indicateur OQA` and `Score` fields help identify high-quality, recent listings.

***

### Use Cases & Business Value

- **Executive recruitment:** Build candidate pools aligned with current market demand
- **Salary benchmarking:** Analyze compensation trends by role, sector, and location
- **Market intelligence:** Track hiring volume and skill demand in French professional sectors
- **Career planning:** Identify skill gaps and emerging opportunities in your field
- **Data science:** Build datasets for predictive hiring models and labor market analysis

The APEC Jobs Search Scraper transforms France's job market into actionable data, eliminating hours of manual research and enabling data-driven recruitment and business strategy.

***

### Conclusion

The **APEC Jobs Search Scraper** is the fastest way to extract structured executive job data from France's largest professional job board. With 25 detailed fields, geographic coordinates, and robust configuration options, it delivers reliable data for recruitment, research, and market analysis. Start scraping APEC today and unlock French executive talent market insights.

# Actor input Schema

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

Add the URLs of the Jobs list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=ingenieur&page=1"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=ingenieur&page=1"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("soft_alexist/apec-jobs-search-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 = {
    "urls": ["https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=ingenieur&page=1"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("soft_alexist/apec-jobs-search-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 '{
  "urls": [
    "https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=ingenieur&page=1"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call soft_alexist/apec-jobs-search-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Apec Jobs Search Scraper",
        "description": "Scrape detailed job listings from APEC.fr with precision. Collect 25+ fields including job titles, salary ranges, locations with coordinates, contract types, and company data — perfect for recruiters, market researchers, and career analysts targeting French executive talent.",
        "version": "0.0",
        "x-build-id": "zFv8zkoAyfzRIZmBD"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/soft_alexist~apec-jobs-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-soft_alexist-apec-jobs-search-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/soft_alexist~apec-jobs-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-soft_alexist-apec-jobs-search-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/soft_alexist~apec-jobs-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-soft_alexist-apec-jobs-search-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": {
                    "urls": {
                        "title": "URLs of the Jobs list urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the Jobs list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
