# Cadremploi Jobs Scraper (`solidcode/cadremploi-scraper`) Actor

\[💰 $1.25 / 1K] Extract French executive & management jobs from Cadremploi — title, company, location, salary, contract type, job function, posted date, full description, contacts, and apply link. Search by keyword, location, function, and date, or paste Cadremploi URLs.

- **URL**: https://apify.com/solidcode/cadremploi-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.25 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Cadremploi Jobs Scraper

Pull executive and management job listings from Cadremploi — France's leading job board for "cadres" — with structured salary, full descriptions, and apply links on every posting. Search by keyword and location, filter by contract type and job function, or paste any Cadremploi search or job URL. Built for French recruiters, talent-sourcing teams, and labor-market analysts who need clean, structured executive-job data without copy-pasting listings one page at a time.

### Why This Scraper?

- **Structured salary parsed into numbers** — `salaryMin`, `salaryMax`, `salaryCurrency`, and `salaryPeriod` broken out wherever the recruiter states a range (around half of postings); the rest keep the raw `salaryText` ("selon profil") so nothing is lost.
- **7 contract types, from CDI to Alternance** — filter to Permanent (CDI), Fixed-term (CDD), Civil service (Statutaire), Freelance, Internship (Stage), Apprenticeship (Alternance), or Franchise.
- **18 executive job-function categories** — narrow to Marketing, IT & Telecom, Accounting & Finance, Sales & Business Development, Human Resources, Legal & Tax, General Management, and 11 more — the same functions job seekers filter by, not vague sectors.
- **Full job description in text and HTML** — every detail-enriched job returns the complete plain-text `description` plus a `descriptionHtml` version, not just the truncated card preview.
- **Apply link on every enriched job** — `applyUrl` points to the job's Cadremploi application page, plus best-effort `contactEmail` and `contactPhone` on the rare listing that publishes them in the description text.
- **km-radius geo search across France** — enter any city, région, or département and set a radius in kilometres; the location is resolved exactly the way Cadremploi's own search box resolves it.
- **ISO 8601 posted dates** — every enriched job carries a machine-readable `postedDate`, plus the original "Publiée il y a X jours" text in `postedRelative` for quick scanning.
- **Recency and remote filters** — keep only jobs from the last 24 hours, 7, 14, or 30 days, and restrict to télétravail (remote) roles when you only want work-from-home positions.
- **Paste a search or a single job URL** — drop any cadremploi.fr URL straight from your browser to reproduce an advanced search or grab one specific posting, mixed freely with keyword searches.

### Use Cases

**Recruitment & Talent Sourcing**
- Build shortlists of open executive roles by function and city
- Track competing openings for the roles you are hiring into
- Capture apply links and hiring-company names for outreach
- Monitor new "cadre" postings daily with a recency filter

**Salary Benchmarking**
- Collect structured salary ranges by job function and region
- Compare pay for the same role across Paris, Lyon, and other markets
- Feed real min/max salary figures into compensation models
- Spot how many roles list a range versus "selon profil"

**Labor-Market Research**
- Map executive hiring demand across French départements
- Measure contract-type mix (CDI vs. CDD vs. Freelance) by sector
- Track remote-work availability across management roles
- Analyse posting volume trends with ISO-dated listings

**Lead Generation for Staffing Agencies**
- Identify companies actively hiring managers in your niche
- Extract hiring-company names and any contact details a listing publishes
- Target recruiters by job function and location
- Build prospect lists from fresh, recency-filtered postings

**Competitive Hiring Intelligence**
- See which competitors are scaling which teams
- Watch new openings in a specific function or region
- Benchmark job descriptions and required experience
- Detect hiring surges by monitoring posting frequency

### Getting Started

#### Search by Keyword

The simplest run — one or more job titles or skills:

```json
{
    "searchQueries": ["responsable marketing"],
    "maxResults": 50
}
````

#### Keyword + Location + Contract Type

Narrow to permanent roles within 30 km of a city:

```json
{
    "searchQueries": ["directeur financier"],
    "location": "Lyon",
    "radius": 30,
    "contractType": "CDI",
    "postedSince": "7",
    "maxResults": 100
}
```

#### Job Function Across a Région (Advanced)

Combine functions with a région and remote-only, and mix in a pasted search URL:

```json
{
    "searchQueries": ["chef de projet"],
    "location": "Île-de-France",
    "jobFunction": ["MARKETING", "INFORMATIQUE"],
    "remoteOnly": true,
    "includeDetails": true,
    "startUrls": [
        "https://www.cadremploi.fr/emploi/liste_offres?motscles=data+analyst&ville=paris-75"
    ],
    "maxResults": 200
}
```

### Input Reference

#### What to Search

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQueries` | array | `["responsable marketing"]` | Job titles, roles, or skills. Each keyword runs its own search. Leave empty to scan the latest jobs feed. |
| `location` | string | `""` | City, région, or département to search around, such as "Paris", "Lyon", or "Île-de-France". Applied to every keyword. |
| `radius` | integer | `20` | How far around the location to search, in kilometres (1–200). Only used when a location is set. |
| `startUrls` | array | `[]` | Paste full Cadremploi search or individual job URLs directly. Mix freely with keyword searches. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `contractType` | string | `""` (Any) | Limit to one contract type: Permanent (CDI), Fixed-term (CDD), Civil service (Statutaire), Freelance, Internship (Stage), Apprenticeship (Alternance), or Franchise. |
| `jobFunction` | array | `[]` (all) | Keep only jobs in one or more of 18 job functions — Marketing, IT & Telecom, Accounting & Finance, Sales & Business Development, Human Resources, Legal & Tax, and more. |
| `postedSince` | string | `""` (Any time) | Keep only jobs posted within a window: Last 24 hours, 7 days, 14 days, or 30 days. |
| `remoteOnly` | boolean | `false` | Keep only jobs mentioning remote work or télétravail. Works best with full details on. |

#### Output & Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `includeDetails` | boolean | `true` | Fetch each job's own page for the full description, exact posted date, structured salary, apply link, and contacts. Turn off for faster runs with list fields only. |
| `maxResults` | integer | `50` | Cap on total unique jobs across all searches and URLs. Set to 0 for every matching job with no limit. |

### Output

Each row is one job posting. Detail-only fields fill in when **Fetch Full Job Details** is on and the recruiter provides them.

```json
{
    "jobId": "12345678",
    "title": "Responsable Marketing Digital H/F",
    "company": "Groupe Exemple",
    "location": "Paris",
    "region": "Île-de-France",
    "postalCode": "75008",
    "salaryText": "45 000 - 55 000 € par an",
    "salaryMin": 45000,
    "salaryMax": 55000,
    "salaryCurrency": "EUR",
    "salaryPeriod": "YEAR",
    "contractType": "CDI",
    "employmentType": "FULL_TIME",
    "sector": "Marketing",
    "isRemote": true,
    "postedDate": "2026-06-28T00:00:00+00:00",
    "postedRelative": "Publiée il y a 5 jours",
    "description": "Rattaché(e) à la direction marketing, vous pilotez...",
    "descriptionHtml": "<p>Rattaché(e) à la direction marketing...</p>",
    "applyUrl": "https://www.cadremploi.fr/emploi/detail_offre?offreId=12345678",
    "contactEmail": null,
    "contactPhone": null,
    "url": "https://www.cadremploi.fr/emploi/detail_offre?offreId=12345678",
    "searchQuery": "responsable marketing",
    "searchUrl": "https://www.cadremploi.fr/emploi/liste_offres?motscles=responsable+marketing",
    "isSponsored": false,
    "detailFetched": true,
    "scrapedAt": "2026-07-03T09:15:00+00:00"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `jobId` | string | Stable Cadremploi job identifier |
| `title` | string | Job title |
| `company` | string | Hiring company or recruiter name |
| `contractType` | string | Contract type (CDI, CDD, Stage, …) |
| `employmentType` | string | Full-time / part-time classification |
| `sector` | string | Business sector or function of the role |
| `isRemote` | boolean | True when the job mentions remote / télétravail |

#### Location

| Field | Type | Description |
|-------|------|-------------|
| `location` | string | Job location (city or région) |
| `region` | string | Région name when available |
| `postalCode` | string | Postal code when available |

#### Salary

| Field | Type | Description |
|-------|------|-------------|
| `salaryText` | string | Raw salary text as shown on the listing |
| `salaryMin` | number | Parsed minimum salary (null when not stated) |
| `salaryMax` | number | Parsed maximum salary (null when not stated) |
| `salaryCurrency` | string | Currency code, EUR by default |
| `salaryPeriod` | string | Pay period (e.g. YEAR, MONTH) when stated |

#### Description & Apply

| Field | Type | Description |
|-------|------|-------------|
| `description` | string | Full job description as plain text |
| `descriptionHtml` | string | Full job description with original HTML markup |
| `applyUrl` | string | Apply link — the job's Cadremploi application page (present on enriched jobs) |
| `url` | string | Canonical Cadremploi job URL |

#### Contacts (best-effort)

Most Cadremploi listings route applications through the apply link rather than
publishing direct contact details, so these fields are populated only on the
occasional listing that writes an email or phone into its description text.

| Field | Type | Description |
|-------|------|-------------|
| `contactEmail` | string | Employer email if the listing publishes one in its text (usually null) |
| `contactPhone` | string | Employer phone if the listing publishes one in its text (usually null) |

#### Dates & Meta

| Field | Type | Description |
|-------|------|-------------|
| `postedDate` | string | Posted date in ISO 8601 (from the job's own page) |
| `postedRelative` | string | Original relative date text ("Publiée il y a X jours") |
| `searchQuery` | string | The keyword that produced this row |
| `searchUrl` | string | The search this job came from |
| `isSponsored` | boolean | Paid-placement flag (always false — Cadremploi does not mark sponsored jobs) |
| `detailFetched` | boolean | Whether the full detail page was fetched for this row |
| `scrapedAt` | string | ISO 8601 timestamp of when the row was collected |

### Tips for Best Results

- **Combine `jobFunction` with `location`** for tight executive shortlists — pairing a function like Marketing with a city gives you a far cleaner list than either filter alone.
- **Leave `includeDetails` on** whenever you want structured salary ranges, apply links, ISO posted dates, or the full description — the card preview alone does not include any of these.
- **A keyword like "responsable marketing" still returns nearby matches** — Cadremploi blends exact, related, and around-the-city results into one feed, so an exact title yields a broader, richer set. Use `jobFunction` to tighten it.
- **Set `remoteOnly` together with full details on** — remote status is judged from the full description, so with details off only the title and preview are checked and you may miss télétravail roles.
- **Use `postedSince` for monitoring runs** — schedule a daily run with a 24-hour or 7-day window to capture only fresh executive postings.
- **Paste a search URL to reproduce a complex filter** — if you have refined a search in your browser, copy its URL into `startUrls` and every row is tagged with the search it came from.
- **Raise `maxResults` deliberately** — set it to 0 only when you truly want every matching job; a modest cap returns results faster and keeps costs predictable.

### Pricing

**From $1.25 per 1,000 results** — undercuts other Cadremploi extractors on the market while returning richer, fully structured data. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows the total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.15 | $0.14 | $0.14 | $0.13 |
| 1,000 | $1.50 | $1.40 | $1.35 | $1.25 |
| 10,000 | $15.00 | $14.00 | $13.50 | $12.50 |
| 100,000 | $150.00 | $140.00 | $135.00 | $125.00 |

A "result" is one job posting written to your dataset. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor collects publicly available job-listing data for legitimate business purposes such as recruitment, market research, and salary benchmarking. Use it responsibly: respect Cadremploi's terms of service, handle any personal data (including recruiter contact details) in line with GDPR and applicable privacy laws, and do not use collected data for spam or unsolicited outreach. You are responsible for how you use the data you collect.

# Actor input Schema

## `searchQueries` (type: `array`):

Job titles, roles, or skills to search for, such as 'responsable marketing', 'directeur financier', or 'chef de projet'. Each keyword runs its own search. Leave empty to scan the latest jobs, or if you only want to use the URLs further down.

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

City, region, or département to search around, such as 'Paris', 'Lyon', or 'Île-de-France'. Matches what you would type into Cadremploi's location box. Applied to every keyword search above.

## `radius` (type: `integer`):

How far around the chosen location to search, in kilometres. Only used when a location is set. Leave at 20 (Cadremploi's default) unless you want a wider or tighter area.

## `contractType` (type: `string`):

Limit the search to a single contract type. Leave on 'Any' to include all contract types.

## `jobFunction` (type: `array`):

Keep only jobs in these job functions (business areas), such as Marketing, IT, Finance, or Sales. Pick one or more. Leave empty to include every function.

## `postedSince` (type: `string`):

Only keep jobs posted within this time window. Cadremploi has no server-side date filter, so this is applied to the jobs we collect: a filtered search stops early once it runs past the window (results are roughly newest-first). Leave on 'Any time' to include all jobs.

## `remoteOnly` (type: `boolean`):

Keep only jobs that mention remote work or télétravail. Applied to the jobs we collect (Cadremploi has no remote checkbox). Works best with 'Fetch Full Job Details' on, so the full description is searched — with details off, only the job title and preview are checked.

## `startUrls` (type: `array`):

Optional. Paste full Cadremploi search or individual job URLs directly from your browser. Useful for advanced searches the fields above don't cover. You can mix URLs with the keyword search.

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

On by default. Each job card already includes the title, company, location, salary, contract type, and posted date. Keep this on to also fetch the full job description, exact posted date, structured salary, apply link, and any contact details from each job's own page. Turn it off for faster runs that return list fields only — each job needs an extra page visit, so large searches run longer with this on.

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

Cap on the total number of jobs returned across all searches and URLs. Leave blank or use the default (50) for a quick first run; raise it for larger pulls. Set it to 0 only if you want EVERY matching job with no limit — the run then keeps paging until Cadremploi runs out of jobs, up to a 100,000-result safety ceiling (billed per result), so use 0 deliberately. Results are fetched a page at a time, so a small cap can return up to a full page more than you asked for.

## Actor input object example

```json
{
  "searchQueries": [
    "responsable marketing"
  ],
  "radius": 20,
  "contractType": "",
  "jobFunction": [],
  "postedSince": "",
  "remoteOnly": false,
  "startUrls": [],
  "includeDetails": true,
  "maxResults": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of jobs with key fields like title, company, location, salary, contract type, posted date, and link.

## `details` (type: `string`):

Full per-job detail rows including description, contact details, apply link, and canonical URL.

# 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 = {
    "searchQueries": [
        "responsable marketing"
    ],
    "location": "",
    "radius": 20,
    "contractType": "",
    "jobFunction": [],
    "postedSince": "",
    "remoteOnly": false,
    "startUrls": [],
    "includeDetails": true,
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/cadremploi-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 = {
    "searchQueries": ["responsable marketing"],
    "location": "",
    "radius": 20,
    "contractType": "",
    "jobFunction": [],
    "postedSince": "",
    "remoteOnly": False,
    "startUrls": [],
    "includeDetails": True,
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/cadremploi-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 '{
  "searchQueries": [
    "responsable marketing"
  ],
  "location": "",
  "radius": 20,
  "contractType": "",
  "jobFunction": [],
  "postedSince": "",
  "remoteOnly": false,
  "startUrls": [],
  "includeDetails": true,
  "maxResults": 50
}' |
apify call solidcode/cadremploi-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Cadremploi Jobs Scraper",
        "description": "[💰 $1.25 / 1K] Extract French executive & management jobs from Cadremploi — title, company, location, salary, contract type, job function, posted date, full description, contacts, and apply link. Search by keyword, location, function, and date, or paste Cadremploi URLs.",
        "version": "1.0",
        "x-build-id": "kSTxX80ywA4b9lvi7"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~cadremploi-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-cadremploi-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/solidcode~cadremploi-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-cadremploi-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/solidcode~cadremploi-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-cadremploi-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": {
                    "searchQueries": {
                        "title": "Search Keywords",
                        "type": "array",
                        "description": "Job titles, roles, or skills to search for, such as 'responsable marketing', 'directeur financier', or 'chef de projet'. Each keyword runs its own search. Leave empty to scan the latest jobs, or if you only want to use the URLs further down.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "City, region, or département to search around, such as 'Paris', 'Lyon', or 'Île-de-France'. Matches what you would type into Cadremploi's location box. Applied to every keyword search above."
                    },
                    "radius": {
                        "title": "Search Radius (km)",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "How far around the chosen location to search, in kilometres. Only used when a location is set. Leave at 20 (Cadremploi's default) unless you want a wider or tighter area.",
                        "default": 20
                    },
                    "contractType": {
                        "title": "Contract Type",
                        "enum": [
                            "",
                            "CDI",
                            "CDD",
                            "STATUTAIRE",
                            "FREELANCE",
                            "STAGE",
                            "ALTERNANCE",
                            "FRANCHISE"
                        ],
                        "type": "string",
                        "description": "Limit the search to a single contract type. Leave on 'Any' to include all contract types.",
                        "default": ""
                    },
                    "jobFunction": {
                        "title": "Job Function",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Keep only jobs in these job functions (business areas), such as Marketing, IT, Finance, or Sales. Pick one or more. Leave empty to include every function.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "DIRECTION",
                                "COMMERCIAL",
                                "MARKETING",
                                "COMMUNICATION",
                                "FINANCE",
                                "AUDIT",
                                "RH",
                                "JURIDIQUE",
                                "INFORMATIQUE",
                                "INTERNET_ECOMMERCE",
                                "ETUDES_RECHERCHE",
                                "PRODUCTION",
                                "LOGISTIQUE_ACHATS",
                                "EXPORT",
                                "CONSEIL",
                                "ADMINISTRATION",
                                "SANTE_MEDICAL",
                                "SANTE_INDUSTRIE"
                            ],
                            "enumTitles": [
                                "General Management",
                                "Sales & Business Development",
                                "Marketing",
                                "Communication & Creative",
                                "Accounting & Finance",
                                "Audit",
                                "Human Resources",
                                "Legal & Tax",
                                "IT & Telecom",
                                "Internet & e-Commerce",
                                "Studies & Research",
                                "Production, Maintenance & Quality",
                                "Logistics, Purchasing & Supply Chain",
                                "Export",
                                "Consulting",
                                "Administration & General Services",
                                "Healthcare (Medical) & Social",
                                "Healthcare (Industry)"
                            ]
                        },
                        "default": []
                    },
                    "postedSince": {
                        "title": "Date Posted",
                        "enum": [
                            "",
                            "1",
                            "7",
                            "14",
                            "30"
                        ],
                        "type": "string",
                        "description": "Only keep jobs posted within this time window. Cadremploi has no server-side date filter, so this is applied to the jobs we collect: a filtered search stops early once it runs past the window (results are roughly newest-first). Leave on 'Any time' to include all jobs.",
                        "default": ""
                    },
                    "remoteOnly": {
                        "title": "Remote Jobs Only",
                        "type": "boolean",
                        "description": "Keep only jobs that mention remote work or télétravail. Applied to the jobs we collect (Cadremploi has no remote checkbox). Works best with 'Fetch Full Job Details' on, so the full description is searched — with details off, only the job title and preview are checked.",
                        "default": false
                    },
                    "startUrls": {
                        "title": "Cadremploi URLs",
                        "type": "array",
                        "description": "Optional. Paste full Cadremploi search or individual job URLs directly from your browser. Useful for advanced searches the fields above don't cover. You can mix URLs with the keyword search.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeDetails": {
                        "title": "Fetch Full Job Details",
                        "type": "boolean",
                        "description": "On by default. Each job card already includes the title, company, location, salary, contract type, and posted date. Keep this on to also fetch the full job description, exact posted date, structured salary, apply link, and any contact details from each job's own page. Turn it off for faster runs that return list fields only — each job needs an extra page visit, so large searches run longer with this on.",
                        "default": true
                    },
                    "maxResults": {
                        "title": "Maximum Results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap on the total number of jobs returned across all searches and URLs. Leave blank or use the default (50) for a quick first run; raise it for larger pulls. Set it to 0 only if you want EVERY matching job with no limit — the run then keeps paging until Cadremploi runs out of jobs, up to a 100,000-result safety ceiling (billed per result), so use 0 deliberately. Results are fetched a page at a time, so a small cap can return up to a full page more than you asked for.",
                        "default": 50
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
