FranceTravail.fr France Travail Scraper
Pricing
from $1.50 / 1,000 results
FranceTravail.fr France Travail Scraper
Scrape francetravail.fr — France's official government job board with 450,000+ listings. Structured output: title, company, salary, GPS coordinates, ROME occupational codes & full descriptions in HTML, text and Markdown. Contract type & location filters. No API key required.
Pricing
from $1.50 / 1,000 results
Rating
0.0
(0)
Developer
Unfenced Group
Actor stats
1
Bookmarked
4
Total users
3
Monthly active users
2 days ago
Last modified
Categories
Share
France Travail Scraper
Extract structured job listings from francetravail.fr (formerly Pôle Emploi) — France's national employment platform with over 900,000 active listings across all sectors and regions. No API key required. Search by city name (e.g. "Paris", "Lyon") with an optional radius, or filter by department, region, contract type, and experience.

Why use this scraper?
| Feature | Details |
|---|---|
| Scale | 900,000+ active listings across all French departments and regions |
| Rich data | Title, company, salary range, location with GPS coordinates, full job description in HTML, plain text and Markdown |
| Precise filtering | City name + radius, keywords, departments, regions, contract type (CDI/CDD/Intérim), experience level, full-time/part-time, telework, alternance |
| Deduplication | Cross-run repost detection with a 90-day fingerprint window — incremental pipelines only receive new listings |
| Three description formats | HTML, plain text and Markdown — ready for any downstream processing or storage |
| Labour market intelligence | ROME occupation codes, sector codes, GPS coordinates, salary data and experience requirements for every listing |
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
keywords | String | "" | Job title, skill, or sector keywords |
city | String | "" | City name to search in (e.g. "Paris", "Lyon", "Bordeaux"). Automatically resolved to the correct department. Combine with radius to expand to nearby areas. |
radius | Integer | 0 | When city is set, expand to departments within this radius in km. 0 = city's own department only. Example: city="Lyon", radius=50 covers Rhône, Ain, Isère and Loire. |
departments | Array | [] | French department codes (e.g. ["75", "69", "13"]) |
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 |
fullTimeOnly | Boolean | false | Full-time positions only |
partTimeOnly | Boolean | false | Part-time positions only |
teleworkOnly | Boolean | false | Telework / remote positions only |
handicapFriendly | Boolean | false | Disability-inclusive employers only |
alternanceOnly | Boolean | false | Apprenticeship / work-study contracts only |
sortBy | String | pertinence | pertinence (relevance) or date (most recent first) |
maxResults | Integer | 100 | Maximum number of listings to save |
daysOld | Integer | 0 | Maximum listing age in days (0 = no limit) |
skipReposts | Boolean | false | Skip listings already seen in a previous run |
startUrls | Array | [] | Specific France Travail offer URLs to scrape directly |
Department and region codes
Common departments: 75 Paris · 69 Rhône · 13 Bouches-du-Rhône · 31 Haute-Garonne · 33 Gironde · 59 Nord · 67 Bas-Rhin · 92 Hauts-de-Seine · 93 Seine-Saint-Denis · 94 Val-de-Marne
Common regions: 11 Île-de-France · 84 Auvergne-Rhône-Alpes · 75 Nouvelle-Aquitaine · 76 Occitanie · 32 Hauts-de-France · 44 Grand Est · 52 Pays de la Loire · 53 Bretagne · 93 Provence-Alpes-Côte d'Azur
Note: Department and region codes follow the official French administrative system (INSEE). Both can be combined in the same run.
Output schema
Each result is a JSON object with the following fields:
| Field | Type | Description |
|---|---|---|
id | String | Unique France Travail offer ID (e.g. 206CYPD) |
title | String | Job title |
url | String | Direct URL to the listing on candidat.francetravail.fr |
companyName | String | Employer name |
companyDescription | String | null | Employer description text |
companyUrl | String | null | Employer website |
companyLogo | String | null | Employer logo URL |
description | String | Full job description (HTML) |
descriptionText | String | Full job description (plain text) |
descriptionMarkdown | String | Full job description (Markdown) |
contractType | String | Contract type label (e.g. Contrat à durée indéterminée) |
contractCode | String | Contract type code (e.g. CDI, CDD, MIS) |
workSchedule | String | null | Working hours label (e.g. 35H Travail en journée) |
isFullTime | Boolean | null | true = full-time, false = part-time |
isAlternance | Boolean | Whether this is an alternance / work-study contract |
isHandicapFriendly | Boolean | Whether the employer is RQTH/disability-inclusive |
location | String | null | Location label (e.g. 75 - Paris) |
city | String | null | City name |
department | String | null | Department name |
departmentCode | String | null | Department code (e.g. 75) |
region | String | null | Region name |
regionCode | String | null | Region code (e.g. 11) |
postalCode | String | null | Postal code |
latitude | Number | null | GPS latitude |
longitude | Number | null | GPS longitude |
salaryMin | Number | null | Minimum salary (currency per salaryPeriod) |
salaryMax | Number | null | Maximum salary |
salaryPeriod | String | null | Pay frequency (Mensuel, Annuel, Horaire) |
salaryCurrency | String | null | Currency code (EUR) |
salaryText | String | null | Full salary description as posted |
salaryBenefits | Array | Additional compensation items (e.g. meal vouchers, mutual insurance) |
salaryMonths | Number | null | Number of salary months per year (e.g. 13) |
publishDateISO | String | Listing creation date (ISO 8601) |
updatedDateISO | String | null | Last update date (ISO 8601) |
experienceRequired | String | null | Experience requirement label |
experienceCode | String | null | Experience code (D, 1, 2, 3) |
sector | String | null | Sector label |
sectorCode | String | null | Sector code |
romeCode | String | null | ROME occupation classification code |
romeLabel | String | null | ROME occupation label |
qualification | String | null | Qualification level |
skills | Array | Required skills and competencies |
formations | Array | Required training or education |
languages | Array | Required languages |
drivingLicenses | Array | Required driving licenses |
nbPositions | Number | null | Number of open positions |
applyUrl | String | null | Direct application URL (when available) |
source | String | Always francetravail.fr |
scrapedAt | String | Scrape timestamp (ISO 8601) |
contentHash | String | MD5 fingerprint for deduplication |
isRepost | Boolean | true if this listing was seen in a previous run |
originalPublishDate | String | null | First time this listing was seen (repost detection) |
Example output
{"id": "206CYPD","title": "Développeur Full Stack Node.js / React H/F","url": "https://candidat.francetravail.fr/offres/recherche/detail/206CYPD","companyName": "Digital Solutions SAS","description": "<div class=\"job-description\"><p>Nous recherchons un développeur...</p></div>","descriptionText": "Nous recherchons un développeur...","contractType": "Contrat à durée indéterminée","contractCode": "CDI","isFullTime": true,"isAlternance": false,"city": "Paris","department": "Paris","departmentCode": "75","region": "Île-de-France","regionCode": "11","latitude": 48.8566,"longitude": 2.3522,"salaryMin": 40000,"salaryMax": 55000,"salaryPeriod": "Annuel","salaryCurrency": "EUR","salaryText": "Annuel de 40000 Euros à 55000 Euros sur 12 mois","salaryBenefits": ["Tickets restaurant", "Mutuelle"],"publishDateISO": "2026-03-28T08:00:00Z","romeCode": "M1805","romeLabel": "Études et développement informatique","skills": ["Node.js", "React", "TypeScript", "PostgreSQL"],"source": "francetravail.fr","scrapedAt": "2026-03-30T09:15:00Z","contentHash": "a3f8c1d2e4b7...","isRepost": false,"originalPublishDate": null}
Pricing
This actor uses Pay-Per-Result pricing — you only pay for the job listings actually saved to your dataset.
| Volume | Cost |
|---|---|
| 1,000 results | $1.50 |
| 10,000 results | $15.00 |
| 100,000 results | $150.00 |
Compared to manual data collection: At $1.50 per 1,000 results, extracting 10,000 France Travail listings costs the same as roughly 15 minutes of a data analyst's time — without the setup, maintenance, or compliance overhead.
Pricing is charged per saved result. Filtering, retries, and skipped reposts do not count toward your bill.
Performance
| Scenario | Throughput | Approximate cost |
|---|---|---|
| 1,000 results, no filter | ~2 minutes | $1.50 |
| 10,000 results, keyword + department | ~15 minutes | $15.00 |
| Full catalogue snapshot (900k+) | ~4-6 hours | ~$1,350 |
Memory usage is consistently low — the actor runs in 256 MB and does not require a browser.
Typical use cases
- Recruitment platforms — aggregate France Travail listings alongside private-sector boards for a comprehensive French job market view
- Labour market research — track vacancy trends by ROME code, region, sector, or contract type over time
- HR technology — feed job data into matching engines, skills taxonomies, or salary benchmarking tools
- Competitive intelligence — monitor hiring activity within specific companies, departments, or sectors
Known limitations
- Location filtering reduces throughput. City, department and region filters are applied after fetching results — the scraper scans the full catalogue and keeps only matching listings. For narrow geographic filters (e.g. a single city), expect to scrape more results than
maxResultsto fill the quota. Combine withkeywordsto improve yield. A widerradiusincreases both coverage and throughput. - Salary data is absent for ~60% of listings. Many employers post without salary information. The
salaryTextfield contains the raw salary label when present. applyUrlis null for some listings. Application links are only available when employers include an external redirect. In all other cases the application is managed through the France Travail platform.- Maximum 10,000 results per search query. France Travail's search engine returns up to 10,000 results per filter combination. To collect more, use multiple targeted runs with different keyword combinations.
isHandicapFriendlyreflects listing metadata. When filtering withhandicapFriendly=true, the API applies its own internal handicap accessibility index. The output fieldisHandicapFriendlyreflects the listing's explicit metadata fields (topAccesTH,employeurHandiEngage) which may differ from the API's internal filter criterion.
Technical details
| Property | Value |
|---|---|
| Actor type | Stateless scraper |
| Default memory | 256 MB |
| Default timeout | 60 minutes |
| Deduplication TTL | 90 days |
| Output formats | JSON (default), CSV, XML, XLSX via Apify |
Additional services
Need a custom scraper, extended field mapping, or a dedicated data pipeline for France Travail or other European job boards? Contact us at info@unfencedgroup.nl — we build and maintain bespoke data infrastructure for HR tech teams and recruitment platforms.
Built and maintained by unfenced-group · Specialists in European job board data infrastructure