France Travail Scraper — 961k+ French Jobs
Pricing
from $0.49 / 1,000 results
France Travail Scraper — 961k+ French Jobs
Scrape francetravail.fr — 961,000+ active listings. ROME code filter, city + GPS radius, incremental change-detection mode, server-side recency filter. Structured salary, ROME codes, skills & full descriptions. No API key required.
Pricing
from $0.49 / 1,000 results
Rating
0.0
(0)
Developer
Unfenced Group
Maintained by CommunityActor stats
1
Bookmarked
10
Total users
6
Monthly active users
19 hours ago
Last modified
Categories
Share
France Travail Scraper

Scrape structured job listings from France Travail (formerly Pôle Emploi) — France's official national employment service. 961,000+ active listings. No API key or proxy required.
Why this scraper?
🏛️ France's largest job database — 961,000+ listings
France Travail is the French government's national employment agency. Every employer posting a job vacancy in France is required to register it here — giving you the most complete picture of the French labour market.
🔍 ROME code targeting
Filter by France's official occupational classification (ROME). Instead of guessing keywords, target an entire profession: all software developers (M1861), all nurses (J1303), all accountants (M1607). No other scraper on Apify supports this.
📍 Precise city + GPS radius search
Enter a city name and radius in km. The scraper resolves the city via the French government's geo API, then filters each listing by exact GPS coordinates — not just department. Lyon + 30km returns only listings physically within 30km.
🔄 Incremental mode
changedOnly: true emits only listings that are new or changed since your last run. Run daily and receive only the delta — no reprocessing of 961k records. Ideal for ATS feeds, alerting pipelines, and monitoring workflows.
📅 Server-side recency filter
publieeDepuis applies a date filter at the API level (1/3/7/14/31 days), reducing pages scanned before any post-processing. For daily feeds of new listings this cuts compute cost by 95%+ versus scanning the full index.
💰 Structured salary data
Three salary formats: salaryMin/salaryMax/salaryPeriod (structured numbers), salaryText (human-readable label), and salaryBenefits (bonus, profit sharing, transport). Salary comments auto-parsed for listings where the employer used free text.
🏷️ ROME codes + skills + formations in output
Every listing includes ROME occupational code, required competences, required formation level, languages, and driving licences — structured arrays, not just a text blob.
⚙️ No API key required
Runs without any third-party credentials. Uses France Travail's public search API.
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
keywords | string | "" | Job title, skill, or sector keywords. |
romeCode | string | "" | ROME occupation code (e.g. M1861, J1303). Targets an entire profession. |
city | string | "" | City name (e.g. Paris, Lyon). Auto-resolves to department. |
radius | integer | 0 | Expand search to departments within N km of city centre (GPS-precise). |
departments | array | [] | French department codes (e.g. 75, 69). |
regions | array | [] | French region codes (e.g. 11 for Île-de-France). |
contractTypes | array | [] | CDI, CDD, Interim / Temporary, Freelance / Liberal, Seasonal, Franchise, Commercial contract. |
experience | array | [] | No experience required, 1-3 years, 3-5 years, 5+ years. |
qualificationLevel | string | "" | Qualification level from Manoeuvre to Cadre (director level). |
fullTimeOnly | boolean | false | Full-time positions only. |
partTimeOnly | boolean | false | Part-time positions only. |
teleworkOnly | boolean | false | Remote / telework positions only. |
handicapFriendly | boolean | false | Disability-friendly employers only. |
alternanceOnly | boolean | false | Apprenticeship / work-study only. |
sortBy | string | pertinence | pertinence (relevance) or date (most recent first). |
publieeDepuis | integer | 0 | Server-side recency filter in days (1/3/7/14/31). Faster than post-filtering. |
daysOld | integer | 0 | Post-filter precision: only listings within N days old. |
skipReposts | boolean | false | Skip listings already seen in a previous run (90-day dedup window). |
changedOnly | boolean | false | Incremental mode — only emit new or changed listings since last run. |
maxResults | integer | 100 | Maximum listings to save. |
startUrls | array | [] | Specific offer URLs to scrape directly. |
Output schema
Each result contains the following fields.
Always present:
| Field | Type | Description |
|---|---|---|
id | string | Unique offer ID from France Travail. |
url | string | Direct URL to the listing. |
title | string | Job title as published. |
companyName | string | Employer name. |
location | string | Full location string (e.g. 38 - GRENOBLE). |
city | string | City of work location. |
department | string | Department name (e.g. Isère). |
departmentCode | string | Department code (e.g. 38). |
region | string | Region name. |
regionCode | string | Region code. |
postalCode | string | Postal code. |
latitude | number | GPS latitude of work location. |
longitude | number | GPS longitude of work location. |
contractType | string | Contract type (e.g. CDI, Contrat travail). |
contractCode | string | API contract code (CDI, CDD, MIS…). |
workSchedule | string | Work hours string (e.g. 37H30/semaine). |
isFullTime | boolean | True for full-time positions. |
isAlternance | boolean | True for apprenticeship contracts. |
isHandicapFriendly | boolean | True for disability-inclusive employers. |
publishDateISO | string | Publication date (ISO 8601). |
updatedDateISO | string | Last update date (ISO 8601). |
romeCode | string | ROME occupation code (e.g. M1861). |
romeLabel | string | ROME occupation label. |
sector | string | NAF sector label. |
sectorCode | string | NAF sector code. |
qualification | string | Qualification level label. |
experienceRequired | string | Experience requirement label. |
experienceCode | string | Experience code (D, 1, 2, 3). |
skills | array | Required competences (structured list). |
formations | array | Required formation levels. |
languages | array | Required languages. |
drivingLicenses | array | Required driving licences. |
nbPositions | integer | Number of positions available. |
description | string | Full job description (HTML). |
descriptionText | string | Full job description (plain text). |
descriptionMarkdown | string | Full job description (Markdown). |
applyUrl | string | Direct application URL (where provided, ~30% of listings). |
source | string | Always francetravail.fr. |
scrapedAt | string | Scrape timestamp (ISO 8601). |
contentHash | string | MD5 fingerprint of title + description (used for change detection). |
isRepost | boolean | True if seen in a previous run. |
isChanged | boolean | True if listing content changed since last run. |
originalPublishDate | string | Date first seen (if repost). |
Salary fields (populated where employer provided data):
| Field | Type | Description |
|---|---|---|
salaryMin | number | Minimum salary. |
salaryMax | number | Maximum salary. |
salaryPeriod | string | Mensuel, Annuel, or Horaire. |
salaryCurrency | string | Always EUR when salary is present. |
salaryText | string | Human-readable salary label. |
salaryBenefits | array | Salary supplements (bonus, profit sharing, transport…). |
salaryMonths | number | Months of salary per year (e.g. 13). |
Company fields (where available):
| Field | Type | Description |
|---|---|---|
companyDescription | string | Company description text. |
companyUrl | string | Company website URL. |
Example input configurations
1. Daily feed of new developer jobs in Paris
{"keywords": "développeur","departments": ["75"],"sortBy": "date","publieeDepuis": 1,"daysOld": 1,"skipReposts": true,"maxResults": 500}
2. All nurses within 50km of Lyon (incremental)
{"romeCode": "J1303","city": "Lyon","radius": 50,"changedOnly": true,"maxResults": 1000}
3. Executive CDI jobs in Île-de-France
{"keywords": "directeur","regions": ["11"],"contractTypes": ["CDI"],"qualificationLevel": "Cadre (director level)","maxResults": 200}
4. Recent alternance listings nationwide
{"alternanceOnly": true,"sortBy": "date","publieeDepuis": 7,"maxResults": 500}
Scheduling for daily feeds
France Travail receives tens of thousands of new listings every day. For monitoring pipelines:
- Set
publieeDepuis: 1— filters at the API level to yesterday's listings only. - Set
sortBy: date— most recent first. - Set
skipReposts: trueorchangedOnly: true— skip anything seen in a prior run. - Schedule via Apify Schedules at your preferred cadence (daily, hourly).
This pattern scans only ~8,000–15,000 listings instead of 961,000 — dramatically lower compute and PPE cost.
Related scrapers
Other scrapers in our Jobs — France collection:
Need a custom scraper?
Unfenced Group builds pay-per-result scrapers for any job board, real estate platform, or directory worldwide. You only pay for results — we absorb compute and proxy costs.