# Synergie Job Scraper — France Staffing Agency Listings (`studio-amba/synergie-scraper`) Actor

Scrape job listings from Synergie, the French staffing agency group — titles, salary, location, contract type, sector and full descriptions. No login or cookies required.

- **URL**: https://apify.com/studio-amba/synergie-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 result scrapeds

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/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

## Synergie Scraper

Scrape job listings from Synergie, the French staffing agency group. Search by keyword, get salary, location, contract type, sector and the full job description — no login or cookies required.

### Why use this actor?

Synergie posts thousands of live temp, CDD and CDI vacancies across France — industrial, construction, logistics, admin and finance roles from its national branch network. Recruiters, market researchers and job-board aggregators use this data to track hiring demand by trade and region, benchmark salary brackets, or feed a meta job board without maintaining a browser-based scraper themselves.

### How to scrape Synergie data

1. Open this actor on the Apify Store and click **Try for free**.
2. Enter a **Search Query** in French (e.g. `comptable`, `maçon`, `cariste`) — or leave it blank to pull the most recently posted listings across all trades.
3. Optionally set a **Location filter** (city or region name) and a **Max Results** cap.
4. Click **Start** and export the results dataset as JSON, CSV, or Excel once the run finishes.

Each result includes the job title, full description, location, salary bracket (when disclosed), contract type, sector and a direct link to the live listing on Synergie's own site.

### Input

| Field | Type | Required | Description |
|-------|------|----------|--------------|
| `searchQuery` | String | No | Keyword in French. Leave empty to return the most recently posted listings across all trades. |
| `location` | String | No | City or region to filter results by (matched against the listing's location text). |
| `maxResults` | Integer | No | Maximum number of listings to return (1–500, default 50). |
| `proxyConfiguration` | Object | No | Proxy settings. Synergie's search backend shows no bot-blocking — the default Apify datacenter proxy works fine. |

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `title` | String | `"Assistant comptable F/H"` |
| `company` | String | `"Synergie"` |
| `locationRaw` | String | `"Laon - 02000"` |
| `locationParsed` | Object | `{"city": "Laon", "postalCode": "02000", "country": "France"}` |
| `language` | String | `"fr"` |
| `contractType` | String | `"Interim"`, `"CDI"` — nullable |
| `sector` | String | `"Industrie"` — nullable |
| `salaryRaw` | String | `"25-30 K€"` — nullable, only when disclosed |
| `salaryMin` / `salaryMax` | Integer | `25000` / `30000` — nullable |
| `missionStartDate` / `missionEndDate` | String | ISO dates — nullable (open-ended CDI listings have no end date) |
| `postedAt` | String | ISO 8601 date the listing was posted |
| `jobDescription` | String | Full plain-text job description |
| `url` | String | Direct link to the live job page |
| `source` | String | `"synergie.fr"` |
| `scrapedAt` | String | ISO 8601 timestamp when data was collected |
| `jobId` | String | Synergie's internal Drupal node ID |

### Example output

```json
{
    "title": "Assistant comptable F/H",
    "company": "Synergie",
    "locationRaw": "Laon - 02000",
    "locationParsed": {
        "city": "Laon",
        "postalCode": "02000",
        "country": "France"
    },
    "language": "fr",
    "contractType": "Interim",
    "sector": "Industrie",
    "salaryRaw": "25-30 K€",
    "salaryMin": 25000,
    "salaryMax": 30000,
    "missionStartDate": "2026-08-25",
    "missionEndDate": "2026-12-18",
    "postedAt": "2026-08-10",
    "jobDescription": "Dans le cadre de cette mission, vous pouvez être amené(e) à réaliser...",
    "url": "https://www.synergie.fr/trouver-un-emploi/assistant-comptable-f-h-laon-02000/offre-665-107",
    "source": "synergie.fr",
    "scrapedAt": "2026-08-10T09:21:29.917Z",
    "jobId": "20185084"
}
```

### Covered market

| Country | Site |
|---------|------|
| France | www.synergie.fr |

Synergie also runs live sites in Spain, Italy and Portugal, but each of
those runs on a visibly different platform than the French site (different
frontend stack, different caching layer, no shared search API) — none of
them share the France site's search mechanism. Belgium doesn't have a live
Synergie site at all: `www.synergie.be` currently redirects to an unrelated
bakery brand. Each additional market would need its own dedicated build
rather than a shared country parameter.

### Cost estimate

This actor makes one small request per page of search results (8 listings
per page) plus one request per job to fetch the full description. It costs
$0.02 per run plus $0.002 per result — about $0.22 per 100 results.
Usage cost only settles once a run reports **SUCCEEDED** — reading the
dataset mid-run will undercount what you'll actually be charged.

### Limitations

- Salary is only returned when Synergie itself discloses a bracket — many
  listings omit it, and Synergie only ever publishes a bracket (e.g.
  "25-30 K€"), never an exact figure.
- Contract type and sector are only populated when Synergie tags the
  listing with that taxonomy — a portion of listings have neither.
- `location` is a client-side text filter on the listing's own location
  string — Synergie's backend location filter needs an internal city/region
  ID this actor doesn't resolve, so results are filtered after fetching
  rather than at the source.
- Data is scraped from Synergie's own public site and may change without
  notice.
- Respect Synergie's terms of service and use responsibly.

### Need this data on a schedule, or a custom version?

We run this scraper as a managed service for businesses: scheduled runs,
deduplication, delta detection, and delivery to your inbox, Google Sheets,
or API — maintenance included. We can also build a custom version with your
exact fields and filters, or combine multiple sources into one feed.

See [studioamba.dev/services](https://studioamba.dev/services/) or email
<hello@studioamba.dev> for a free data sample.
We maintain 300+ European web scrapers and answer within one business day.

# Actor input Schema

## `searchQuery` (type: `string`):

Keyword to search for, in French (e.g. 'comptable', 'maçon', 'cariste'). Leave empty to return the most recently posted listings across all trades.

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

Optional city or region to filter results by. Applied client-side against the listing's location text — Synergie's search backend has no reliable structured location filter without an internal term ID.

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

Maximum number of job listings to return.

## `proxyConfiguration` (type: `object`):

Proxy settings. Synergie's site shows no bot-blocking on its search backend — Apify's default datacenter proxy works fine.

## Actor input object example

```json
{
  "searchQuery": "comptable",
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchQuery": "comptable",
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/synergie-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 = {
    "searchQuery": "comptable",
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/synergie-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 '{
  "searchQuery": "comptable",
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/synergie-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/synergie-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/bg2AoHyPiZtc8nU6y/builds/vUqrAM51xJTgWE5dr/openapi.json
