France Travail Scraper: 700K+ FR Jobs (Pôle Emploi) avatar

France Travail Scraper: 700K+ FR Jobs (Pôle Emploi)

Pricing

$1.50 / 1,000 job scrapeds

Go to Apify Store
France Travail Scraper: 700K+ FR Jobs (Pôle Emploi)

France Travail Scraper: 700K+ FR Jobs (Pôle Emploi)

Scrape 700K+ public job offers from France Travail (ex Pôle Emploi). Filter by keywords, location, contract (CDI/CDD/alternance), experience, salary. Get title, company, location, required skills, work hours, full description. For ATS, recruitment agencies, market intel. $1.50/1K jobs.

Pricing

$1.50 / 1,000 job scrapeds

Rating

0.0

(0)

Developer

Walid

Walid

Maintained by Community

Actor stats

1

Bookmarked

58

Total users

36

Monthly active users

3 days ago

Last modified

Share

France Travail Scraper — 700K+ FR Jobs API (Pôle Emploi)

Bookmark this actor → apify.com/dltik/francetravail-scraper — Apify ranks by bookmarks, so it directly drives the visibility of this scraper. One click. No signup beyond your existing Apify account.

Scrape 700K+ job offers from France Travail (formerly Pôle Emploi) — the largest French public job board — via the official France Travail API. Get real competences, ROME code + label, lat/lon geo coords, structured salary, experience, education, sector in one call. Add optional AI fit-scoring, SIREN company intelligence, and incremental diff mode. No OAuth to configure, no API key for you, no monthly subscription.

✨ What makes this scraper different

FeatureThis scraperOther FT scrapers
Official France Travail API (structured, not HTML-guessed)❌ mostly HTML scraping
Real competences + ROME code + label per job
Structured salary (min, max, period, annualized_*)❌ raw string only
Geo coords (lat/lon) native, for each job
Experience years + education level detection
AI fit-scoring (candidate profile → 0-100 + apply/maybe/skip)
SIREN company intelligence (size, sector, status) per employer
Incremental diff mode (only new/changed, -70/95% cost)rare
Partner offers (Indeed, Apec) inclusion togglepartial
Success rate (live 30d)100%varies

What can this scraper do?

  • 🇫🇷 700K+ live French job offers indexed by France Travail (CDI, CDD, alternance, intérim, stage)
  • 🎯 11 search filters — keywords, location, contract, experience, qualification, salary, radius, posted since, full-time
  • 🏷️ ROME code + label + real competences — straight from the official API taxonomy (not keyword guessing)
  • 💰 Structured salary parsingmin, max, currency, period (year/month/hour), auto-annualized
  • 📍 Native geo coordinates — lat/lon in every record, no extra geocoding step
  • 🎓 Education level + experience years — from formations / experienceLibelle
  • 🤖 AI fit-scoring (opt-in) — give a candidate profile, get a fit_score 0-100 + apply/maybe/skip per job
  • 🏢 SIREN company intelligence (opt-in) — resolve each employer to size, sector (NAF), category, active/ceased status
  • 🧭 ROME métier reference (opt-in, free) — canonical definition, alternative job titles, and France Travail's emerging skills per occupation (official ROME 4.0 API)
  • 📊 Labour-market context (opt-in) — hires + jobseekers + recruitment-tension per ROME × department (official Marché du travail data): is this role in demand here?
  • ♻️ Incremental diff mode (opt-in) — recurring runs emit only NEW/UPDATED offers, 70-95% cheaper monitoring
  • 🚀 Zero setup for you — we carry the API credentials; you just click Start

What data can you extract per job?

FieldDescription
idFrance Travail offer ID
titleJob title
companyEmployer name (or anonymized)
location / postal_code / departmentCity, postal code, département (75, 92, 13...)
geo{ lat, lon, label } native from the API
contract_type / contract_type_labelCDI / CDD / MIS / SAI + human label
contract_nature / alternanceContract nature + alternance flag
rome_code / rome_label / appellationROME job classification + label
salaryRaw salary text from France Travail
salary_parsed{ min, max, currency, period, annualized_min, annualized_max, is_range }
competencesStructured skills from the API { code, libelle, exigence }
skills_detectedFlat skill list (competences + regex backfill, ≤25)
experience_years / experience_requiredMin years + raw requirement label
education_level / formationsDetected level + structured formations
langues / permisRequired languages + driving licences
sector / naf_codeSector label + NAF code
nombre_postes / accessible_thNumber of openings + disability-friendly flag
descriptionFull job description
apply_urlDirect application URL
posted_date / updated_dateYYYY-MM-DD
partner_sourcePartner site (Indeed, Apec...) if applicable
rome(opt-in) ROME 4.0 métier ref: { definition, appellations, skills_core, skills_emerging, work_contexts, riasec, isco_code, is_cadre, green_transition, digital_transition }
market(opt-in) Labour-market context for the job's ROME × dept: { period, hires, hires_stable, jobseekers, tension_ratio, tension_label }
company_data(opt-in) SIREN, size, sector, category, status — see AI/company sections
ai(opt-in) { summary, seniority, remote, must_have, red_flags, fit_score, recommended_action }
change_type(incremental mode) NEW / UPDATED / UNCHANGED / EXPIRED

How to scrape France Travail jobs in 5 steps

  1. Create a free Apify account — no credit card required
  2. Open France Travail Scraper on Apify Store
  3. Set your filters — keyword (e.g. "développeur python"), location (75D for Paris dept), contract (CDI)
  4. Pick maxResults (start with 20 to validate, scale to 5000 once happy)
  5. Click Start — clean JSON in seconds, exportable to CSV / JSON / Excel from Apify dataset UI

How much does it cost to scrape France Travail jobs?

PAY_PER_EVENT — $0.0015 per job scraped ($1.50 per 1,000 results). Failed/empty runs not charged. Full structured detail (competences, ROME, geo, salary) is included in the base price — no enrichment upsell needed.

Run sizeJobsApify costTime
Quick test20$0.03~3s
Standard200$0.30~10s
Deep1,000$1.50~40s
Massive5,000$7.50~4min

Optional add-on events (charged only when you turn them on, on top of job-scraped):

Add-onEventPriceWhat you get
enrichCompanycompany-enriched+$0.002/jobEmployer → SIREN, size, sector (NAF), category, active/ceased status
enrichMarketmarket-enriched+$0.002/jobRecruitment tension per ROME × dept (hires, jobseekers, tension ratio+label)
analyzeJobsjob-analyzed+$0.01/jobAI summary, seniority, remote, red-flags + fit-score vs. candidate profile (paid Apify plan)

Incremental mode (incrementalMode=true) charges only NEW + UPDATED offers on recurring runs — typically 70-95% cheaper for daily monitoring.

Input parameters

ParameterTypeDefaultDescription
keywordsstringFree-text search (title + description)
locationstring75D = Paris dept, 13D = Bouches-du-Rhône
contractTypestringCDI, CDD, MIS, SAI, multiple via comma
contractNaturestringE1 alternance, E2 apprentissage, FS formation
experienceenum1 débutant, 2 exigé, 3 expérimenté
qualificationstring5 cadre, 3 technicien, etc.
fullTimeOnlyboolfalseOnly full-time
minSalarystringAnnual minimum (30000)
radiusKmstringSearch radius from location
postedSinceenum1, 3, 7, 14, 31 days
includePartnersbooltrueInclude Indeed/Apec partner offers
enrichCompanyboolfalseResolve each employer → SIREN + company data (company-enriched event)
enrichRomeboolfalseAttach ROME 4.0 métier reference (definition, appellations, emerging skills) — free
enrichMarketboolfalseAttach labour-market tension per ROME × dept (market-enriched event)
analyzeJobsboolfalseAI analysis + fit-scoring (job-analyzed event, paid plan)
candidateProfilestringCandidate/role description for AI fit_score
incrementalModeboolfalseEmit only NEW/UPDATED offers vs. last run
includeExpiredboolfalseAlso emit EXPIRED markers (not charged)
stateKeystringdefaultBaseline name for incremental mode
maxResultsinteger201–5000 (API caps a single query at ~1150)
enrichDetailsboolfalseHTML fallback only — API already returns full detail
proxyConfigobjectdatacenterHTML fallback only — France Travail rarely blocks

Output example

{
"id": "ABCD123",
"title": "Data Engineer Senior H/F",
"company": "Acme Tech",
"location": "Paris 9e (75009)",
"geo": { "lat": 48.8775, "lon": 2.3380, "label": "Paris 9e Arrondissement" },
"department": "75",
"contract_type": "CDI",
"salary": "De 55 000 € à 75 000 € sur 12 mois",
"salary_parsed": {
"raw": "De 55 000 € à 75 000 € sur 12 mois",
"min": 55000, "max": 75000, "currency": "EUR",
"period": "year", "is_range": true,
"annualized_min": 55000, "annualized_max": 75000
},
"skills_detected": ["Python", "AWS", "Docker", "Kafka", "Snowflake", "SQL", "Airflow", "anglais"],
"competences": [{ "code": "...", "libelle": "Python", "exigence": "E" }],
"experience_years": 5,
"education_level": "Bac+5 et plus ou équivalents",
"rome_code": "M1805",
"rome_label": "Études et développement informatique",
"sector": "Programmation informatique",
"apply_url": "https://acme.example/apply",
"posted_date": "2026-06-19",
"company_data": {
"siren": "812345678", "legal_name": "ACME TECH SAS",
"naf_code": "6201Z", "category": "PME", "employee_range": "100-199",
"creation_date": "2015-03-01", "is_active": true, "risk_flag": null
},
"ai": {
"summary": "Poste de data engineer senior pour bâtir la plateforme data.",
"seniority": "senior", "remote": "hybrid",
"must_have": ["Python", "AWS", "SQL"],
"red_flags": [],
"fit_score": 88, "fit_reason": "Stack Python/AWS alignée, séniorité correspondante.",
"recommended_action": "apply"
},
"scraped_at": "2026-06-20T14:32:01Z"
}

company_data appears with enrichCompany=true, ai with analyzeJobs=true.

Use cases

  • 🎯 ATS auto-feed — daily import of new CDI/alternance offers matching company hiring filters
  • 💼 Recruitment intelligence — track who's hiring what in any ROME code / department
  • 💰 Salary benchmarking — aggregate salary_parsed across thousands of jobs by role + region
  • 🗺️ Geo job-map dashboards — leverage geo.lat/lon for interactive maps (Mapbox, Leaflet)
  • 📊 Labor-market analytics — track open job count per ROME × department × month
  • 🤖 Career bots — alert candidates daily when matching jobs are posted (combine with diff)
  • 🎓 Career coaching SaaS — show students alternance/apprentissage matching their CAP/BTS

Use the actor via API

Python:

import requests
run = requests.post(
"https://api.apify.com/v2/acts/dltik~francetravail-scraper/run-sync-get-dataset-items",
headers={"Authorization": "Bearer YOUR_APIFY_TOKEN", "Content-Type": "application/json"},
json={
"keywords": "développeur python",
"location": "75D",
"contractType": "CDI",
"experience": "2",
"postedSince": "7",
"enrichDetails": True,
"maxResults": 50
}
).json()
print(f"Scraped {len(run)} jobs")

curl:

curl -X POST "https://api.apify.com/v2/acts/dltik~francetravail-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords":"data engineer","location":"69D","contractType":"CDI","maxResults":100}'

FAQ

Does it use the official France Travail API? Yes. This scraper runs on the official France Travail API (api.francetravail.io Offres v2), so you get clean, fully-structured data — real competences, ROME code, native lat/lon, structured salary. We carry the API credentials, so there's nothing for you to register or rotate: you just click Start. If the API is ever unreachable, the actor automatically falls back to the public-HTML search so a run never fails.

Can I use my own France Travail API credentials? Yes — set FRANCETRAVAIL_CLIENT_ID and FRANCETRAVAIL_CLIENT_SECRET (from francetravail.io) as actor environment secrets and the actor will use them.

Does it cover alternance and stage? Yes, via contractNature (E1 alternance, E2 apprentissage, FS formation). All major contract types supported.

ROME code support? Every job comes back with its rome_code + rome_label from the official taxonomy, so you can group/aggregate by occupation. You can also search by ROME via the keywords filter.

Can I enrich the employer with company data? Yes — set enrichCompany=true and each employer is resolved to its SIREN with size, sector (NAF), category (PME/ETI/GE) and active/ceased status. Pair it with our Pappers Sirene Scraper or BODACC Scraper for full company financials and court-procedure history.

How fresh is the data? Pulled live at run time from the official France Travail API, so freshness matches France Travail itself. Use incrementalMode=true to poll daily and only pay for what changed.

Will France Travail block my runs? We've never been blocked at moderate volume (< 5000 jobs/run). Datacenter proxy is the default — toggle to residential only if you scrape at high frequency.

What's salary_parsed exactly? A structured breakdown of the raw salary string: detects ranges (30k-45k), single values (30000), periods (year/month/hour), and auto-annualizes to a comparable yearly figure. Unlike other scrapers, you can filter and sort numerically.


Found this France Travail Scraper useful? Bookmark it — Apify ranks actors by bookmarks, so it's the strongest single signal for Store visibility. One click.

Other scrapers by dltik

ActorWhat it doesPrice
Pappers Sirene Scraper26M French companies (SIREN, SIRET, dirigeants, capital)$0.001/result
Pappers Enrichment BundleBulk enrichment of SIREN lists with full company data$0.005/result
Pappers MCP ServerFrench company data for AI agents (Claude / GPT)$0.01/tool-call
BODACC ScraperFrench commercial court announcements (creations, faillites, M&A)$0.003/record
BODACC MCP ServerBODACC announcements for AI agents$0.01/tool-call
HelloWork ScraperFrance's #2 job board$0.003/job
Welcome to the Jungle ScraperTech-focused FR/EU jobs$0.003/job
JobTeaser ScraperStudent jobs, internships, alternance$0.003/job
Malt ScraperFrench freelancers (profiles, rates)$0.005/profile
Annuaire Administration FrançaiseFrench gov agencies & contacts$0.003/org
TED Europa ScraperEU public procurement tenders$0.005/tender
Boamp ScraperFrench national public procurement$0.005/tender
ADEME DPE ScraperEnergy performance diagnostics for FR buildings$0.002/DPE
HATVP ScraperFrench elected officials' financial declarationsvaries

License: MIT · Author: dltik