# Emagister France Course Scraper (`unfenced-group/emagister-fr-scraper`) Actor

Scrape 137,000+ training courses from Emagister France. Extract title, provider, price, duration, location and rating.

- **URL**: https://apify.com/unfenced-group/emagister-fr-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** Other, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.79 / 1,000 course results

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

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

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

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

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

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

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

# README

## Emagister France Course Scraper

![Emagister France Course Scraper](https://api.apify.com/v2/key-value-stores/ClElVyZWvQgPQIuDL/records/emagister-fr-scraper)

Extract course listings from emagister.fr at scale, in a clean, consistent structure ready for market analysis, catalogue aggregation, price monitoring and competitor research. No API key required.

***

### Why this scraper?

#### 🎯 Built for France

A dedicated French course scraper, not a global tool with a country dropdown. Categories, price formats and currency (EUR) are tuned for emagister.fr.

#### 💶 Structured pricing

Course price as a clean number in EUR, including discounts and instalment prices where offered. Courses without a published price return `null`, never a guess.

#### 🏫 Provider details

Training provider name and profile link for every course, ready for provider-level analysis.

#### 🗓️ Format and schedule

Delivery format, duration and start dates in structured fields, so you can filter online from in-person and fixed-date from flexible-start.

#### ⭐ Review signals

Average rating and review count for every course that has them, for popularity and quality analysis.

#### 🎓 Certification data

Whether the course leads to an official certification, degree or qualification, where published.

#### 📄 Full course content

Complete course description, learning goals and requirements, with a direct link back to the source.

***

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `keywords` | string | `"marketing"` | Search keywords. |
| `maxResults` | integer | `5` | Maximum number of results to scrape. |

***

### Output schema

Every field below is present on every record. Fields the source does not publish for a given course are returned as `null` rather than omitted.

| Field | Type | Description |
|---|---|---|
| `courseId` | string | Unique course ID from the source. |
| `title` | string | Course title |
| `url` | string | Direct link to the course listing |
| `provider` | string | Course provider |
| `providerUrl` | string | Link to the provider's page on the source. |
| `methodology` | string | Delivery format (e.g. online, in person, blended). |
| `type` | string | Course type as published (e.g. course, master, certification). |
| `category` | string | Course category on the source. |
| `skills` | array | Skills covered by the course. |
| `city` | string | City where the course is held (null for online courses). |
| `province` | string | Province or region of the course location. |
| `country` | string | Country of the course. |
| `price` | string | Price as displayed |
| `priceOld` | string | Previous price before discount (null when there is no discount). |
| `monthlyPrice` | string | Monthly instalment price where offered (null otherwise). |
| `duration` | string | Course duration as published (null if not stated). |
| `startDate` | string | Next start date (null for flexible-start courses). |
| `flexibleStart` | boolean | `true` when the course can be started at any time. |
| `rating` | number | Average review rating (null when there are no reviews). |
| `reviewCount` | number | Number of reviews on the source. |
| `officialCertification` | boolean | `true` when the course leads to an official certification. |
| `description` | string | Full course description in plain text. |
| `descriptionMarkdown` | string | Description in Markdown/plain text. |
| `goal` | string | Learning goals as published by the provider. |
| `requirements` | string | Entry requirements as published. |
| `degree` | string | Degree or qualification awarded, where applicable. |
| `scrapedAt` | string | Timestamp when this record was scraped. |
| `sourceCountry` | string | Source country code of the marketplace. |

#### Example record

```json
{
  "courseId": "2353481",
  "title": "BTS tourisme en 2 ans",
  "url": "https://www.emagister.fr/formation_diplome_d_etat_l_education_nationale_bac_2-ec2353481.htm",
  "provider": "Grand Sud Tourism School",
  "providerUrl": "https://www.emagister.fr/grand_sud_tourism_school-en54497.htm",
  "methodology": "En présentiel",
  "type": "BTS",
  "category": "Gestion Touristique",
  "skills": [
    "Marketing touristique",
    "Conception de produits touristiques",
    "Accueil touristique",
    "Ventes de produits touristiques"
  ],
  "city": "Toulouse",
  "province": "(31) Haute-Garonne",
  "country": "France",
  "price": "5 500 €",
  "priceOld": null,
  "monthlyPrice": null,
  "duration": "2 Ans",
  "startDate": null,
  "flexibleStart": true,
  "rating": 9,
  "reviewCount": 2,
  "officialCertification": true,
  "description": "Le BTS que vous propose Grand Sud Formation vous permettra de devenir un professionnel polyvalent du tourisme. Vous acquerrez de solides compétences dans le secteur qui vous permettront d’accéder à de …",
  "descriptionMarkdown": "Le BTS que vous propose Grand Sud Formation vous permettra de devenir un professionnel polyvalent du tourisme. Vous acquerrez de solides compétences dans le secteur qui vous permettront d’accéder à de …",
  "goal": "Le titulaire du BTS Tourisme – diplôme de référence dans le secteur – est un Professionnel\ndu Tourisme polycompétent dont les fonctions visent :\n\n• Le conseil, la vente et le suivi de la clientèle\n• L …",
  "requirements": "Etre titulaire du BAC / Anglais + 2ème langue / le goût du contact / Etre motivé, dynamique / projet motivé dans le tourisme.",
  "degree": "Diplôme de l'Education Nationale BAC+2",
  "scrapedAt": "2026-07-02T15:44:29.558Z",
  "sourceCountry": "fr"
}
```

***

### Examples

**Search for comptabilité courses:**

```json
{
  "keywords": "comptabilité",
  "maxResults": 100
}
```

**Broad crawl with a cap:**

```json
{
  "keywords": "comptabilité",
  "maxResults": 1000
}
```

**Larger run with a hard cap:**

```json
{
  "keywords": "comptabilité",
  "maxResults": 500
}
```

**Weekly catalogue refresh (run on a schedule):**

```json
{
  "keywords": "comptabilité",
  "maxResults": 500
}
```

Schedule this input to run once a week in the Apify Scheduler to keep an up-to-date copy of the catalogue and catch new courses and price changes.

***

### 💰 Pricing

**$0.99 per 1,000 results** — you only pay for successfully retrieved courses. Failed retries are never charged.

| Results | Cost |
|---|---|
| 100 | ~$0.10 |
| 1,000 | ~$0.99 |
| 10,000 | ~$9.9 |
| 100,000 | ~$99 |

> Flat-rate alternatives typically charge $29–$49/month regardless of usage.

Subscription tiers lower the rate further, down to $0.59 per 1,000 at the highest tier. Use the **Max results** cap in the input to control your spend exactly.

***

### Performance

| Run size | Typical time |
|---|---|
| 100 results | under 1 minute |
| 1,000 results | 2–4 minutes |
| 10,000 results | 20–35 minutes |

***

### Known limitations

- Price, duration and start dates are only returned when the provider publishes them — expect `null` on a share of records.
- Review data varies per course; new or niche courses often have no ratings yet.
- Very large result sets are bounded by the source's own paging limits.
- Providers can withdraw courses at any time, so a small share of URLs may expire shortly after scraping.

***

### Technical details

- **Source:** emagister.fr — courses for France
- **Coverage:** everything the public catalogue exposes, filterable via the input parameters above
- **Retry:** automatic retry on network errors with exponential backoff

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

## `keywords` (type: `string`):

Search keywords.

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

Maximum number of results to scrape.

## Actor input object example

```json
{
  "keywords": "marketing",
  "maxResults": 100
}
```

# 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 = {
    "keywords": "marketing",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/emagister-fr-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": "marketing",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/emagister-fr-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "keywords": "marketing",
  "maxResults": 100
}' |
apify call unfenced-group/emagister-fr-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,unfenced-group/emagister-fr-scraper"
        }
    }
}
```

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

## OpenAPI specification

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