# APEC Jobs Scraper - French Executive Jobs (`benthepythondev/apec-jobs-scraper`) Actor

Scrape APEC French executive job listings by keyword, location and filters.

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

## Pricing

from $1.20 / 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.

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

## APEC Jobs Scraper - French Executive Jobs

Collect structured job listings from **APEC**, France's specialist employment platform for executives, managers, engineers, specialists, and graduates entering cadre-level careers. The Actor searches by keyword and location or accepts a complete APEC search URL, then returns clean records for hiring research, salary analysis, market monitoring, recruiting pipelines, and job alerts.

The output goes beyond a search-card export. When detail enrichment is enabled, each result can include the full job description, candidate profile, company description, skills, salary range, telework indicator, contract type, publication dates, public recruiter identity, company logo, and direct APEC listing URL. Results are ready for JSON, CSV, Excel, API, webhook, Make, Zapier, and n8n workflows.

### What can you use it for?

- Monitor French executive and specialist vacancies by role or technology.
- Build a daily feed of new engineering, data, sales, finance, or management jobs.
- Compare disclosed salary ranges across employers and locations.
- Track which companies are hiring for selected skills.
- Create recruiter and employer prospect lists from public listing data.
- Research telework, contract, and regional hiring patterns.
- Feed a dashboard, spreadsheet, CRM, talent-intelligence system, or alert workflow.
- Archive job descriptions before listings are removed or changed.

APEC focuses on the French cadre market, so it is especially useful for higher-skill and management research where general job boards produce too much noise.

### Input options

You can start a search in either of two ways.

#### Keyword and location

Enter a `keyword`, such as `python`, `data engineer`, `directeur commercial`, or `cybersécurité`. Add an optional French `location`, such as `Paris`, `Lyon`, `Toulouse`, a department, or a region. The Actor resolves the location using APEC's own location suggestions before running the search.

Use `contractTypes` to restrict results to CDI, CDD, stage, interim, or alternance. Leave the list empty to include every contract type.

#### APEC search URLs

Paste one or more URLs copied from APEC's search page into `searchUrls`. This is the best option for complex filters. The Actor preserves APEC query parameters for locations, functions, sectors, contracts, experience, telework, salary, origin, and other supported criteria. When URLs are supplied, the separate keyword and location fields are ignored.

Example:

```json
{
  "searchUrls": [
    "https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=python&lieux=75"
  ],
  "includeDetails": true,
  "maxResults": 25
}
````

Structured-input example:

```json
{
  "keyword": "data engineer",
  "location": "Paris",
  "contractTypes": ["CDI"],
  "includeDetails": true,
  "maxResults": 50
}
```

`maxResults` is a hard cap across the whole run. The default is deliberately small so first runs and scheduled health checks finish quickly. Increase it for larger exports.

### Output fields

Every dataset row represents one unique APEC job. Common fields include:

| Field | Description |
| --- | --- |
| `id`, `reference` | Stable APEC job identifiers |
| `title` | Job title |
| `company` | Public employer or recruiting company name |
| `location`, `locations` | Primary and additional listed locations |
| `department` | French department parsed from the listing location |
| `salary` | Salary text shown by APEC |
| `salary_min_eur`, `salary_max_eur` | Normalized annual EUR range when disclosed |
| `contract_type` | Human-readable contract type |
| `contract_type_id` | APEC contract reference ID |
| `telework`, `telework_id` | Telework information when exposed |
| `published_at` | Current publication timestamp |
| `first_published_at` | Original publication timestamp when available |
| `updated_at` | Last listing modification timestamp |
| `description` | Clean full job description |
| `candidate_profile` | Candidate requirements and profile |
| `company_description` | Employer or recruiting-company description |
| `skills` | Flat list of public skills and competencies |
| `skills_by_type` | Skills grouped by APEC competency type |
| `application_type` | Application method classification |
| `contact_name`, `contact_role` | Public recruiter identity shown with the offer |
| `positions` | Number of positions when supplied |
| `part_time` | Part-time indicator |
| `lead_score` | Completeness score for employer/recruiter research |
| `logo` | Company logo URL |
| `url` | Direct APEC detail page |
| `search` | Search label that produced the result |
| `scraped_at` | UTC collection timestamp |

Fields remain present with `null` or empty values when APEC does not disclose them. A job without a salary, recruiter name, or telework flag is still a valid result.

### Detail enrichment

Keep `includeDetails` enabled for recruiting, salary, and market-intelligence work. The Actor makes one lightweight detail request per job and returns the richest dataset. Disable it when you only need search summaries and want the shortest possible run.

The engine calls APEC's public JSON search and listing-detail services directly. It does not launch a browser, require an account, or consume residential-proxy traffic. Requests are paginated conservatively, retried on transient errors, and deduplicated by the stable APEC reference before rows are saved.

### Pricing

This Actor uses pay-per-event pricing:

- A small Actor-start event covers run initialization.
- Each unique job written to the default dataset is one `result` event at **$0.0012**.
- Failed detail enrichment does not create an extra charge; the available search summary is returned instead.
- Duplicate references found across search URLs are saved only once.

At the current result price, 1,000 unique jobs cost $1.20 plus the small start event. Platform usage is handled according to the pricing configuration shown before each run.

### Scheduling and automation

Save a Task with a focused query and run it daily or weekly. Apify can send a webhook when the run finishes, and the dataset API can be consumed directly by your workflow.

A practical daily workflow is:

1. Run a saved Task for one role and location.
2. Read the default dataset through the API.
3. Compare `reference` values with the previous run.
4. Keep only new jobs.
5. Send a Slack, email, Telegram, CRM, or spreadsheet update.

For repeat monitoring, use the stable `reference` rather than the title because employers can edit titles and descriptions after publication.

### Reliability and responsible use

The Actor reads public job information made available by APEC at runtime. It does not log in, submit applications, bypass access controls, or collect private candidate data. It is not affiliated with or endorsed by APEC. Users are responsible for complying with applicable terms, database rights, privacy rules, and employment regulations for their use case.

Keep request sizes reasonable, schedule only as often as your workflow needs, and avoid republishing full descriptions as a competing job board. Public recruiter identity should be used for legitimate recruiting, hiring, or business research rather than unsolicited bulk messaging.

### FAQ

#### Does it need an APEC account or API key?

No. It uses APEC's public search and public offer-detail services.

#### Can it scrape filtered searches from the website?

Yes. Apply filters on APEC, copy the search-results URL, and add it to `searchUrls`. Repeated query parameters are preserved.

#### Why are some salary fields empty?

Some employers show “A négocier” instead of a numeric range. The original text remains in `salary`, while normalized minimum and maximum values stay empty.

#### Does it return full descriptions?

Yes, when `includeDetails` is enabled. It also returns the candidate profile, company description, and skills when APEC provides them.

#### Can I run more than one search?

Yes. Add several APEC URLs. Results are deduplicated across the run and the global `maxResults` cap still applies.

#### What happens when a detail request fails?

The Actor logs the issue and returns the search-summary fields instead of discarding the job. A run fails explicitly only when no matching jobs are returned at all.

#### How can I request support?

Open an issue on the Actor page with the input that reproduced the problem, the run ID, and the expected behavior. Do not include credentials or private data. If the Actor saves useful results, a Store review helps other teams evaluate it.

### Related Actors

- [France Travail Jobs Scraper](https://apify.com/benthepythondev/france-travail-jobs-scraper) for broader French employment data and public employer contacts.
- [StepStone Scraper](https://apify.com/benthepythondev/stepstone-scraper) for European job-board monitoring.
- [Welcome to the Jungle Jobs Scraper](https://apify.com/benthepythondev/welcome-to-the-jungle-jobs-scraper) for startup and company-profile job research.
- [Remote Jobs Aggregator](https://apify.com/benthepythondev/remote-jobs-aggregator) for normalized remote vacancies across multiple sources.
- [Google Maps Email Scraper](https://apify.com/benthepythondev/google-maps-email-scraper) for local-company lead research.

Keywords: APEC scraper, APEC jobs API, France executive jobs, cadre jobs scraper, French jobs data, salary data France, recruiter leads France, hiring intelligence, employment market research, APEC job export, French job alerts, executive recruitment data.

# Actor input Schema

## `searchUrls` (type: `array`):

Optional APEC search-result URLs. Their keyword, location, contract, experience, sector, telework and salary query parameters are preserved. When supplied, the structured keyword/location fields are ignored.

## `keyword` (type: `string`):

French job title, role or skill, for example python, data engineer, directeur commercial or cybersécurité.

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

Optional French city, department or region. The Actor resolves it with APEC's own location suggestions.

## `contractTypes` (type: `array`):

Optional contract filter. Leave empty for all contract types.

## `includeDetails` (type: `boolean`):

Fetch each job's full description, candidate profile, company description, skills and public recruiter identity. Disable for faster summary-only collection.

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

Maximum unique jobs returned across all searches. Keep scheduled tests small and increase for research exports.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=python&lieux=75"
  ],
  "keyword": "python",
  "location": "Paris",
  "contractTypes": [],
  "includeDetails": true,
  "maxResults": 5
}
```

# Actor output Schema

## `results` (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 = {
    "searchUrls": [
        "https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=python&lieux=75"
    ],
    "keyword": "python",
    "location": "Paris",
    "contractTypes": [],
    "includeDetails": true,
    "maxResults": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/apec-jobs-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 = {
    "searchUrls": ["https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=python&lieux=75"],
    "keyword": "python",
    "location": "Paris",
    "contractTypes": [],
    "includeDetails": True,
    "maxResults": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/apec-jobs-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 '{
  "searchUrls": [
    "https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=python&lieux=75"
  ],
  "keyword": "python",
  "location": "Paris",
  "contractTypes": [],
  "includeDetails": true,
  "maxResults": 5
}' |
apify call benthepythondev/apec-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "APEC Jobs Scraper - French Executive Jobs",
        "description": "Scrape APEC French executive job listings by keyword, location and filters.",
        "version": "1.0",
        "x-build-id": "Oa4YkiAxdpZvlCBXq"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/benthepythondev~apec-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-benthepythondev-apec-jobs-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/benthepythondev~apec-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-benthepythondev-apec-jobs-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/benthepythondev~apec-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-benthepythondev-apec-jobs-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": {
                    "searchUrls": {
                        "title": "APEC search URLs",
                        "type": "array",
                        "description": "Optional APEC search-result URLs. Their keyword, location, contract, experience, sector, telework and salary query parameters are preserved. When supplied, the structured keyword/location fields are ignored.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "keyword": {
                        "title": "Keyword",
                        "type": "string",
                        "description": "French job title, role or skill, for example python, data engineer, directeur commercial or cybersécurité.",
                        "default": "python"
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Optional French city, department or region. The Actor resolves it with APEC's own location suggestions.",
                        "default": ""
                    },
                    "contractTypes": {
                        "title": "Contract types",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Optional contract filter. Leave empty for all contract types.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "CDI",
                                "CDD",
                                "STAGE",
                                "INTERIM",
                                "ALTERNANCE"
                            ],
                            "enumTitles": [
                                "CDI",
                                "CDD",
                                "Stage",
                                "Interim",
                                "Alternance"
                            ]
                        },
                        "default": []
                    },
                    "includeDetails": {
                        "title": "Enrich job details",
                        "type": "boolean",
                        "description": "Fetch each job's full description, candidate profile, company description, skills and public recruiter identity. Disable for faster summary-only collection.",
                        "default": true
                    },
                    "maxResults": {
                        "title": "Maximum results",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum unique jobs returned across all searches. Keep scheduled tests small and increase for research exports.",
                        "default": 10
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
