# Apec Jobs Details Scraper (`soft_alexist/apec-jobs-details-scraper`) Actor

Scrape detailed job postings from APEC.fr, France's premier executive recruitment platform. Collect 47+ data fields including job title, location, salary, company info, and candidate requirements — perfect for recruiters, HR professionals, and labor market researchers.

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

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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.fr Jobs Scraper: Extract French Executive Job Data at Scale

---

### What Is APEC.fr?

APEC (Agence pour l'Emploi des Cadres) is France's largest job board specializing in executive and professional positions. It hosts thousands of actively managed listings across industries, from engineering and finance to healthcare and management consulting. For anyone researching French talent markets or building recruitment datasets, manual data collection from APEC is inefficient — the **APEC.fr Jobs Scraper** automates extraction of complete job records, delivering structured data ready for analysis and integration.

---

### Overview

The **APEC Jobs Scraper** extracts comprehensive job detail pages from APEC.fr, converting rich HTML listings into clean, structured JSON records. It is designed for:

- **Executive recruiters** building talent pipelines and market intelligence
- **HR teams** conducting salary benchmarking and skill demand analysis
- **Labor market researchers** studying French employment trends
- **Job aggregators** feeding APEC data into multi-source job boards
- **Business intelligence professionals** building recruitment analytics dashboards

Key features include URL-based targeted scraping, error resilience via `ignore_url_failures`, and comprehensive field extraction covering job metadata, company details, and candidate criteria.

---

### Input Format

The scraper accepts a JSON configuration object:

```json
{
  "urls": [
    "https://www.apec.fr/candidat/recherche-emploi.html/emploi/detail-offre/178879759W?motsCles=ingenieur&selectedIndex=1&page=0"
  ],
  "ignore_url_failures": true
}
````

| Field | Description | Example |
|---|---|---|
| `urls` | Array of APEC job detail page URLs to scrape | `https://www.apec.fr/candidat/.../detail-offre/[OFFER_ID]` |
| `ignore_url_failures` | Boolean; if `true`, scraper continues if individual URLs fail | `true` or `false` |

> **Tip:** Paste individual APEC job URLs directly from the browser address bar. Each URL must be a detail-offer page (not a search results page).

***

### Output Format

**Sample output**

```json
{
  "adresse_offre": {
    "adresse_batiment_imm_residence": "ZONE D AMENAGEMENT CONCERTE DU VERGER",
    "adresse_code_postal": "44470",
    "adresse_numero_et_voie": "1 RUE DES MERISIERS",
    "adresse_ville": "CARQUEFOU",
    "id_pays": 799,
    "id": 147413262
  },
  "audit": {
    "date_modification": "2026-06-15T13:50:36.000+0000"
  },
  "compte_personnel_id_nom_organisation": 200182,
  "date_publication": "2026-06-15T13:35:12.000+0000",
  "date_premiere_publication": "2026-06-15T13:35:12.000+0000",
  "id": 178879759,
  "id_etablissement": 759990,
  "id_interlocuteur_direct": 100223334,
  "id_nom_fonction": 101796,
  "id_nom_metier": 599941,
  "id_nom_fonction_interlocuteur": 101835,
  "id_nom_niveau_experience": 597151,
  "id_nom_secteur_activite": 101609,
  "id_secteur_activite_parent": 101772,
  "id_nom_statut": 101872,
  "id_nom_origine": 101866,
  "id_nom_type_contrat": 101888,
  "id_nom_type_poste": 101900,
  "id_nom_zone_deplacement": 596724,
  "id_responsable": "999993",
  "intitule": "Ingénieur.e Optique F/H",
  "lieux": [
    {
      "id_nom_lieu": 594626,
      "libelle_lieu": "Poitiers - 86"
    }
  ],
  "competences": [
    {
      "libelle": "Qualité rédactionnelle",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_ETRE",
      "id_offre_competence": 343124237,
      "id_nom_competence": 4358,
      "id_offre": 178879759,
      "id": 343124237
    },
    {
      "libelle": "Amélioration continue",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_FAIRE",
      "id_nom_niveau": 599732,
      "id_offre_competence": 343124239,
      "id_nom_competence": 5819,
      "id_offre": 178879759,
      "id": 343124239
    },
    {
      "libelle": "Architecture des systèmes",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_FAIRE",
      "id_nom_niveau": 599732,
      "id_offre_competence": 343124241,
      "id_nom_competence": 4849,
      "id_offre": 178879759,
      "id": 343124241
    },
    {
      "libelle": "Architecture matérielle",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_FAIRE",
      "id_nom_niveau": 599732,
      "id_offre_competence": 343124243,
      "id_nom_competence": 3667,
      "id_offre": 178879759,
      "id": 343124243
    },
    {
      "libelle": "Automatisme",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_FAIRE",
      "id_nom_niveau": 599732,
      "id_offre_competence": 343124245,
      "id_nom_competence": 7692,
      "id_offre": 178879759,
      "id": 343124245
    },
    {
      "libelle": "Commissioning",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_FAIRE",
      "id_nom_niveau": 599732,
      "id_offre_competence": 343124247,
      "id_nom_competence": 5554,
      "id_offre": 178879759,
      "id": 343124247
    },
    {
      "libelle": "Matlab Simulink",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_FAIRE",
      "id_nom_niveau": 599732,
      "id_offre_competence": 343124249,
      "id_nom_competence": 1935,
      "id_offre": 178879759,
      "id": 343124249
    },
    {
      "libelle": "Optique",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_FAIRE",
      "id_nom_niveau": 599732,
      "id_offre_competence": 343124251,
      "id_nom_competence": 5328,
      "id_offre": 178879759,
      "id": 343124251
    },
    {
      "libelle": "Protocoles de tests",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_FAIRE",
      "id_nom_niveau": 599732,
      "id_offre_competence": 343124253,
      "id_nom_competence": 4721,
      "id_offre": 178879759,
      "id": 343124253
    },
    {
      "libelle": "Aéronautique",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_ETRE",
      "id_offre_competence": 343124255,
      "id_nom_competence": 1191,
      "id_offre": 178879759,
      "id": 343124255
    },
    {
      "libelle": "Architecture",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_ETRE",
      "id_offre_competence": 343124257,
      "id_nom_competence": 8635,
      "id_offre": 178879759,
      "id": 343124257
    },
    {
      "libelle": "Electricité",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_ETRE",
      "id_offre_competence": 343124259,
      "id_nom_competence": 8435,
      "id_offre": 178879759,
      "id": 343124259
    },
    {
      "libelle": "Energie durable",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_ETRE",
      "id_offre_competence": 343124261,
      "id_nom_competence": 5886,
      "id_offre": 178879759,
      "id": 343124261
    },
    {
      "libelle": "Mécanique",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_ETRE",
      "id_offre_competence": 343124263,
      "id_nom_competence": 2163,
      "id_offre": 178879759,
      "id": 343124263
    },
    {
      "libelle": "Optronique",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_ETRE",
      "id_offre_competence": 343124265,
      "id_nom_competence": 634,
      "id_offre": 178879759,
      "id": 343124265
    },
    {
      "libelle": "Présentation du projet",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_ETRE",
      "id_offre_competence": 343124267,
      "id_nom_competence": 3017,
      "id_offre": 178879759,
      "id": 343124267
    },
    {
      "libelle": "Processus de recrutement",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_ETRE",
      "id_offre_competence": 343124269,
      "id_nom_competence": 2998,
      "id_offre": 178879759,
      "id": 343124269
    },
    {
      "libelle": "Ressources humaines",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_ETRE",
      "id_offre_competence": 343124271,
      "id_nom_competence": 199,
      "id_offre": 178879759,
      "id": 343124271
    },
    {
      "libelle": "Transport",
      "audit": {
        "date_creation": "2026-06-15T13:35:11.000+0000",
        "utilisateur_creation": "ADEP SEP"
      },
      "numero_version": 0,
      "type": "SAVOIR_ETRE",
      "id_offre_competence": 343124273,
      "id_nom_competence": 8481,
      "id_offre": 178879759,
      "id": 343124273
    }
  ],
  "legacy_lieux": false,
  "logo_etablissement": "/media_entreprise/759990/logo_RDT_INGENIEURS_FRANCE_759990_1120659.jpg",
  "nombre_postes": 1,
  "nom_compte_etablissement": "RDT INGENIEURS FRANCE",
  "nom_interlocuteur": "FAVRE",
  "numero_offre": "178879759W",
  "offre_confidentielle": false,
  "offre_qualifiee": true,
  "prenom_interlocuteur": "Emilie",
  "reference_client_offre": "29199952/IO/86P",
  "salaire_texte": "35 - 40 k€ brut annuel",
  "temps_partiel": false,
  "texte_html": "<p><b>Nature du poste :</b> Ingénieur.e Optique</p><p><b>Structure : </b>Secteur industriel de la défense </p><p><b>Responsabilités principales : </b>Mise au point et mise en service de bancs d'essais.</p><ul><li>Tu contribues à la mise au point et mise en service de bancs d'essais. </li><li>Tu participes à la définition de l'architecture des système optiques, optroniques et sur les composants.<br>Il y aura aussi un aspect rédactionnel sur la partie procédures et tu vas participer également à l'amélioration continue en automatisant les procédures de test.</li><li>Tu utiliseras Matlab et tu pourras être amené à te déplacer régulièrement sur un autre site en France.</li></ul><p>En quelques mots tu es amené.e à participer à la définition et à la qualification de l’architecture des solutions techniques des systèmes optroniques ainsi qu’à l’élaboration et à la validation des processus d’intégration de leurs produits en série.<br><br><b>Quand </b>: Immédiatement </p><p><b>L’équipe avec qui tu travailleras :</b></p><p>Tu intégreras directement l'équipe d'ingénieurs optiques où déjà sont présents 3 collaborateurs de RDT Ingénieurs. </p><p>Tu auras l’occasion de croiser d’autres ingénieur.es de RDT au sein des différents services (une dizaine actuellement) et pas très loin tu pourras retrouver une partie de l’équipe fonction support au sein de l’agence de Poitiers le midi ou le soir si tu le souhaites (l’agence est plutôt proche ).</p>",
  "type_candidature": "EMAIL_ONLY",
  "offre_salon": false,
  "latitude": 46.5836244,
  "longitude": 0.3594715,
  "geolocalisable": true,
  "texte_html_profil": "<p>Pour mener à bien cette mission et t’épanouir, <b>tu dois posséder certaines qualités et compétences : </b><br><br>- Formation d'Ingénieur.e Optronique ou Optique</p><p>- Doté.e de bonnes capacités rédactionnelles </p><p>- Maitrise de Matlab</p>",
  "texte_html_entreprise": "<p>Oui, RDT Ingénieurs est une <b>société de conseil en Ingénierie Généraliste</b>. Ce qui signifie que nous intervenons dans <b>différents domaines industriels</b> tels que le transport, l'énergie, les énergies nouvelles et renouvelables, la défense, l’aéronautique et que nos équipes sont constituées à la fois d'Ingénieur.e.s, Technicien.ne.s en Mécanique, Electronique, Logiciel, Méthodes et Electricité notamment.<br><br>Nous sommes fiers de compter plus de <b>70 Ingénieur.e.s, Technicien.ne.s</b> RDT depuis notre création en France en 2019. Nous sommes aujourd’hui majoritairement présents sur la façade ouest de la France et nous avons deux<b> bureaux dont un bureau d’études</b> à Nantes et Poitiers.</p><p>Mais l'histoire démarre bien plus tôt, en <b>2006 en Espagne</b> avec la création de RDT Engineers. </p><p>Le groupe est présent dans <b>15 pays</b>, accompagne près de <b>1800 professionnels</b> et s'appuie sur de nombreux référencements internationaux.<br><br>Ce que nous vous proposons est un <b>accompagnement </b>fonctionnel via votre manager, et carrière avec l'équipe Ressources Humaines. </p><p>Au total <b>sept points de suivi la 1ère année</b> ! Ces échanges seront réalisés au sein de l'un de nos bureaux Nantais ou Pictavien. Parce que la <b>proximité est essentielle</b> pour garantir une bonne relation, non ?</p><p><b>Notre processus de recrutement ? </b></p><p>Un processus structuré permettant de rencontrer une grande partie de l'équipe support afin d’évaluer comment avancer ensemble et créer des synergies autour de nos projets respectifs. Celui-ci est donc établi selon divers échanges :</p><p>Un <b>échange téléphonique</b> avec une chargée de développement et recrutement ou un responsable grands comptes pour prendre connaissance de ton projet personnel et professionnel, ta mobilité et te présenter en quelques mots RDT Ingénieurs.</p><p>Un <b>entretien culturel</b> avec une personne de l’équipe Recrutement pour faire plus ample connaissance, comprendre ton parcours et ton projet, te présenter notre fonctionnement nos métiers nos environnements de travail et évaluer notre compatibilité.</p><p>Un <b>entretien technique</b> pour aller plus loin notamment sur tes compétences, réalisations et présentation des projets RDT Ingénieurs. </p><p>L’<b>entretien contractuel</b> est prévu pour te présenter les aspects contractuels : salarial et avantages. Il te permet également de faire connaissance si ce n’est pas déjà le cas avec la team pilote : Céline, Directrice Développement et Recrutement ou Christopher, Directeur de RDT Ingénieurs.</p>",
  "texte_presentation": "<p><b>Nos avantages : </b></p><p>- Titres restaurant : carte Swile 10€ / jour </p><p>- Chèque cadeau en fin d’année créditée via Swile </p><p>- Mutuelle / prévoyance</p><p>- Compte Epargne Temps </p><p>- Indemnités kilométriques vélo </p><p>- Prise en charge à 100% des transports en commun</p><p>- Différentes primes (vacances, représentation, cooptation,)</p><p>- Campus RDT</p><p>- Formations</p><br><p><b>Les conditions : </b>Contrat CDI en temps plein </p><p>Ce qui est important pour nous est que tu souhaites t’inscrire dans le développement de RDT Ingénieurs France. Comment ? En étant force de proposition, en proposant de nouveaux projets pour RDT, en partageant tes passions par exemple.<br><br>Les valeurs qui ressortent au sein de RDT Ingénieurs sont le Conseil, l'Ethique, l'Equité et le Partage. Est-ce que ça te parle aussi ?</p>",
  "enseigne": "RDT Ingenieurs",
  "affichage_logo": true,
  "indicateur_lm": false,
  "indicateur_faible_candidature": false
}
```

Each scraped job returns a structured record with 47 fields covering identification, dates, location, compensation, company details, and candidate requirements:

#### Job Identification & Metadata

| Field | Meaning |
|---|---|
| `ID` | Unique APEC internal job offer identifier |
| `Numero Offre` | Official APEC job reference number |
| `Intitule` | Job title as published on APEC.fr |
| `Type Candidature` | Application type (direct, via recruiter, etc.) |
| `Offre Confidentielle` | Confidentiality flag (true/false) |
| `Offre Qualifiee` | Quality-verified status of the offer |

#### Publication & Timeline Dates

| Field | Meaning |
|---|---|
| `Date Publication` | When the job was published on APEC |
| `Date Premiere Publication` | Date of first publication (if re-posted) |
| `Audit` | Last audit/verification timestamp |

#### Location Information

| Field | Meaning |
|---|---|
| `Lieux` | Primary job location(s) — city and region |
| `Legacy Lieux` | Alternative location format (legacy system) |
| `Adresse Offre` | Full postal address of the workplace |
| `Latitude` | Geographic latitude coordinate |
| `Longitude` | Geographic longitude coordinate |
| `Geolocalisable` | Whether location is geocoded and mappable |
| `ID Nom Zone Deplacement` | Travel zone identifier (local, regional, national, international) |

#### Company & Employer Details

| Field | Meaning |
|---|---|
| `Nom Compte Etablissement` | Official company account name in APEC system |
| `Enseigne` | Company trading name or brand (if different from legal name) |
| `Logo Etablissement` | URL to company logo image |
| `Affichage Logo` | Flag: whether logo is displayed to candidates |
| `ID Etablissement` | Unique identifier for the employer |
| `Reference Client Offre` | Client/company internal job reference |
| `Compte Personnel ID Nom Organisation` | Organisation name in personal account records |

#### Contact & Recruiter Information

| Field | Meaning |
|---|---|
| `Nom Interlocuteur` | Last name of primary contact (recruiter/HR) |
| `Prenom Interlocuteur` | First name of primary contact |
| `ID Interlocuteur Direct` | Unique ID for direct contact person |
| `ID Nom Fonction Interlocuteur` | Job title/function of the contact |
| `ID Responsable` | Manager or responsible party identifier |

#### Job Classification & Role Details

| Field | Meaning |
|---|---|
| `ID Nom Metier` | Job sector/industry classification ID |
| `ID Nom Fonction` | Job function/role type ID |
| `ID Nom Secteur Activite` | Business sector activity ID |
| `ID Secteur Activite Parent` | Parent sector (industry classification hierarchy) |
| `ID Nom Type Poste` | Post type identifier (e.g., permanent, temporary) |
| `ID Nom Type Contrat` | Contract type ID (CDI, CDD, stage, etc.) |
| `Nombre Postes` | Number of open positions for this role |

#### Compensation & Employment Terms

| Field | Meaning |
|---|---|
| `Salaire Texte` | Salary information as free text (e.g., "€40–50k/year") |
| `Temps Partiel` | Flag: part-time position (true/false) |

#### Candidate Profile & Requirements

| Field | Meaning |
|---|---|
| `Competences` | Required skills and competencies (comma-separated or array) |
| `ID Nom Niveau Experience` | Required experience level ID (junior, senior, expert, etc.) |
| `ID Nom Statut` | Employment status requirement (e.g., cadre/manager) |

#### Job Description & Company Profile

| Field | Meaning |
|---|---|
| `Texte HTML` | Full HTML-formatted job description and requirements |
| `Texte HTML Profil` | HTML-formatted ideal candidate profile |
| `Texte HTML Entreprise` | HTML-formatted company description and presentation |
| `Texte Presentation` | Plain-text company introduction/overview |

#### Content & Special Flags

| Field | Meaning |
|---|---|
| `ID Nom Origine` | Source/origin identifier of the job offer |
| `Offre Salon` | Flag: job showcased at APEC career fair/event |
| `Indicateur LM` | Indicator for high-demand or leadership roles |
| `Indicateur Faible Candidature` | Indicator for low application rate (potential recruitment difficulty) |

***

### How to Use

1. **Find job URLs** — Visit APEC.fr and search for jobs by keyword, location, or sector. Click on any job title to open the detail page.
2. **Copy the URL** — Copy the full URL from your browser address bar (should contain `/detail-offre/` and an offer ID).
3. **Paste into configuration** — Add the URL to the `urls` array in your scraper input.
4. **Set error handling** — Keep `ignore_url_failures: true` to skip broken or removed listings in bulk runs.
5. **Launch the scraper** — Start the run and monitor progress in the execution log.
6. **Download results** — Export data as JSON, CSV, or Excel once complete.

**Best practices:**

- Test with 2–3 URLs first to verify output structure
- Use descriptive URL sources (e.g., add comments with keywords used)
- Check that job detail pages load successfully before scraping (some offers may require authentication or may be archived)
- Handle confidential offers (`Offre Confidentielle: true`) appropriately per your data governance policies

***

### Use Cases & Business Value

- **Talent acquisition:** Build targeted candidate profiles based on job descriptions and required competencies
- **Market intelligence:** Track salary trends, experience requirements, and hiring hotspots across French industries
- **Competitive recruiting:** Monitor competitor hiring activity and positioning
- **Academic research:** Analyze French labor market demand for skills, sectors, and experience levels
- **Job board aggregation:** Enrich multi-source job feeds with APEC data for comprehensive coverage

The APEC Jobs Scraper delivers production-ready data that eliminates days of manual browsing and data entry, enabling faster insights and smarter recruiting decisions.

***

### Conclusion

The **APEC.fr Jobs Scraper** is the definitive solution for anyone needing structured data from France's premier executive job platform. With 47 carefully extracted fields spanning job details, company info, location, compensation, and candidate criteria, you gain immediate access to market intelligence and recruitment-ready datasets. Streamline your hiring process, benchmark compensation, and understand French talent markets — all from automated, structured job data.

# Actor input Schema

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

Add the URLs of the Specific jobs 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.

## Actor input object example

```json
{
  "urls": [
    "https://www.apec.fr/candidat/recherche-emploi.html/emploi/detail-offre/178879759W?motsCles=ingenieur&selectedIndex=1&page=0"
  ],
  "ignore_url_failures": true
}
```

# 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/detail-offre/178879759W?motsCles=ingenieur&selectedIndex=1&page=0"
    ],
    "ignore_url_failures": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("soft_alexist/apec-jobs-details-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/detail-offre/178879759W?motsCles=ingenieur&selectedIndex=1&page=0"],
    "ignore_url_failures": True,
}

# Run the Actor and wait for it to finish
run = client.actor("soft_alexist/apec-jobs-details-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/detail-offre/178879759W?motsCles=ingenieur&selectedIndex=1&page=0"
  ],
  "ignore_url_failures": true
}' |
apify call soft_alexist/apec-jobs-details-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Apec Jobs Details Scraper",
        "description": "Scrape detailed job postings from APEC.fr, France's premier executive recruitment platform. Collect 47+ data fields including job title, location, salary, company info, and candidate requirements — perfect for recruiters, HR professionals, and labor market researchers.",
        "version": "0.0",
        "x-build-id": "lnI0O5GkjLlopNPTB"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/soft_alexist~apec-jobs-details-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-soft_alexist-apec-jobs-details-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-details-scraper/runs": {
            "post": {
                "operationId": "runs-sync-soft_alexist-apec-jobs-details-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-details-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-soft_alexist-apec-jobs-details-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 Specific jobs urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the Specific jobs 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."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
