France Travail Scraper icon

France Travail Scraper

Scrape job offers from France Travail with titles, companies, locations, salaries, contracts, descriptions, skills, employer details, and apply links.…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

France Travail Scraper at a glance

France Travail Scraper is a ready-to-run Apify actor from abotapi for collecting jobs data. Its documented output includes offer id, change type (incremental mode), title, url and company, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.50 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Jobs, Automation, Lead Generation
Region
Europe
Pricing
$2.50 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
28 options

Scrape job offers from France Travail with titles, companies, locations, salaries, contracts, descriptions, skills, employer details, and apply links. Search by keyword, location, contract, sector, salary, sort options, or paste job/search URLs.

What France Travail Scraper $1đź’° Jobs, Salaries & Apply Links can do

  • Two ways to find jobs. Search by keyword plus filters, or paste France Travail search links and let the actor walk them forward page by page.
  • Full job records, not just the search card. Turn on detail fetching to add the full description, salary range, required skills, soft skills, employer block and apply/contact links to every result.
  • Location resolved the way the site itself resolves it. A typed city, department or region name is looked up against France Travail's own location autocomplete and sent as the matching area code, instead of a free-text value the server can silently ignore.
  • Granular filters. Contract type, working time, professional domain, salary floor, experience level, qualification level, and disability-inclusive or adapted-company employer badges.
  • One cap to think about. Max listings is the single run cap; Max pages defaults to unlimited and simply stops once Max listings is reached.
  • Built for schedules. Incremental mode returns only new, updated and reappeared jobs on recurring runs, with expired-job detection once a run completes a full scan of the tracked search.

Choose what to collect

These inputs let you configure France Travail Scraper $1đź’° Jobs, Salaries & Apply Links. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredsearch = build a search from keywords and filters. url = paste one or more France Travail search URLs and walk them forward.

Choices: search, url

queriesarrayJob titles, skills, or hiring phrases such as "data analyst", "cariste", or "assistant comptable". Each line runs a separate search.
locationstringA city, department code, region, or postal area applied to all searches (e.g. "Paris", "75D", "69000"). Free text is resolved to the site's own lieu code through its autocomplete (Paris -> 75D); a non-code value sent verbatim is IGNORED by the server and returns nationwide results, so unresolved text is still sent as-is. Leave empty to search across France.
radiusintegerRadius around the location, in kilometres (0 = no radius). Only used when a location is set.
publishedDatestringKeep only jobs posted within the chosen window.

Choices: Last 24 hours, Last 3 Days, Last Week, Last 2 Weeks, Last Month

contractTypearrayContract types to include (permanent, fixed-term, temporary, apprenticeship, …). Allowed values: CDI, CDD, Intérim, CDI Intérimaire, Saisonnier, Contrat apprentissage, Cont. professionnalisation, Prépa.opérationnel.emploi, CDI de chantier ou d'opération, Contrat d'Engagement Educatif ….
contractDurationarrayKeep only full-time, part-time, or unspecified working-time listings. Allowed values: Temps plein, Temps partiel, Non renseignée.
Show 21 more inputs
More input fields
InputWhat it controls
jobCategoryarrayProfessional domains to include (IT, healthcare, logistics, hospitality, construction, …). Allowed values: Achats, Comptabilité, Gestion, Arts, Artisanat d'art, Banque, Assurance, Bâtiment, Travaux Publics, Commerce, Vente, Communication, Multimédia, Conseil, Etudes, Direction d'entreprise, Espaces verts et naturels, Agriculture, Pêche, Soins aux animaux, Hôtellerie - Restauration, Tourisme, Animation ….
minSalaryintegerDrop listings whose salary is below this monthly gross amount. Leave at 0 to keep all.
experiencearrayExperience requirements to include (applied client-side from the job detail). Allowed values: Moins de 1 an, De 1 à 3 ans, Plus de 3 ans, Non renseignée.
seniorityarrayExecutive, non-executive, or unspecified qualification levels. Allowed values: Cadre, Non cadre, Non renseignée.
onlyFranceTravailbooleanWhen ON, keep only offers published directly on France Travail (partner offers excluded).
inclusiveEmployerbooleanWhen ON, keep only offers from employers showing the Handi-engage commitment.
adaptedCompanybooleanWhen ON, keep only offers from adapted companies (entreprises adaptées).
sortBystringSort by relevance or by publication date.

Choices: Most relevant | Pertinence, Newest | Date

urlsarrayOne or more France Travail URLs: search listings (keyword, location, domain, filters, sort, optional range as start page) or single offer pages (.../offres/recherche/detail/). The older candidat.pole-emploi.fr host is accepted. Filters above are ignored in this mode. Leaving the default list runs one example of each URL shape; clear it and paste your own URLs for a targeted run.
maxItemsintegerGlobal cap on the number of jobs to return across all searches. This is THE cap, Max pages defaults to unlimited and stops at this number.
maxPagesintegerPer-search page limit (20 jobs per page). 0 means no page limit, the run stops at Max listings.
fetchDetailsbooleanOpen each job page to add the full description, salary range, experience, skills, soft skills, employer block, and apply/contact links. Adds one request per job (billed as a detail-enrichment surcharge). Turn off for a faster, lighter run using only the search-card fields. Pasted single offer links are always opened for their details and billed one detail enrichment per delivered row.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large crawl of job listings without returning or charging for jobs already collected there. Use this after an interrupted run, or when continuing a job catalogue pull in another run. For recurring daily monitoring of the same search, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily or recurring monitoring. The first run returns all matching jobs as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED jobs. Turn on "Emit unchanged" or "Emit expired" only when you also want those jobs returned (and billed). State is kept separately for each mode/queries/filters/URL and detail-mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the mode/queries/filters/URL and detail settings, different searches then never mix state with each other.
emitUnchangedbooleanOff by default. Turn on to also return jobs that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return jobs that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max listings capped it or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.
ignoreFieldsForChangesarrayIncremental mode only. Field names (for example salaryText or description; a dotted path like a.b reaches nested fields) whose changes should NOT make a job UPDATED. The fields stay in the output and are never removed. Page position, search-query fields, the scrape time and relative publication text are always ignored. The id can never be ignored. Leave empty to compare everything else.
mcpConnectorsarrayOptionally send a condensed summary of each result into the apps you already use, via Model Context Protocol (MCP) connectors. The full record stays in the dataset. Leave empty to skip. Supported: Notion, Linear, Airtable, Apify.
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idOffer ID (text)
changeTypeChange type (incremental mode) (text)
titleTitle (text)
urlURL (link)
companyCompany (text)
locationLocation (text)
postalCodePostal code (text)
contractTypeContract (text)
workTimeWorking time (text)
salaryTextSalary (text)
salaryMinSalary min (number)
salaryMaxSalary max (number)
Show 22 more fields
publishedAtPublished (text)
industryIndustry (text)
qualificationQualification (text)
recruiterNameRecruiter (text)
employerPageUrlEmployer page (link)
seedValueQuery (text)
skillsSkills (text)
experienceYearsExperience required (years) (number)
descriptionDescription (text)
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)
salaryUnitSalary unit (text)
salaryCurrencyCurrency (text)
softSkillsSoft skills (array)
recruiterDescriptionEmployer description (text)
applyActionUrlApply link (link)
contactActionUrlContact link (link)
updatedAtLast modified (text)
romeLabelROME occupation (text)
educationLevelEducation (array)
educationRequiredEducation required (boolean)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "type": "job",
  "id": "123XYZA",
  "url": "https://candidat.francetravail.fr/offres/recherche/detail/123XYZA",
  "title": "Développeur web",
  "seedId": "a1b2c3d4e5f6",
  "seedType": "query",
  "seedValue": "developpeur",
  "pageIndex": 1,
  "company": "Sample Recruiter SARL",
  "location": "75 - Paris",
  "postalCode": "75015",
  "addressLocality": "Paris",
  "addressRegion": null,
  "addressCountry": "France",
  "mapUrl": null,
  "contractType": "CDI",
  "workTime": "Temps plein",
  "publishedAt": "Publié hier",
  "updatedAt": "2026-01-15",
  "validThrough": null,
  "description": "Sample job description text describing the role, responsibilities and required profile.",
  "salary": 45000,
  "salaryCurrency": "EUR",
  "salaryMin": 35000,
  "salaryMax": 45000,
  "salaryUnit": "YEAR",
  "salaryText": "35 - 45 k€ brut annuel",
  "employmentType": "FULL_TIME",
  "workHours": "Temps plein",
  "experienceRequirements": [
    "De 1 Ă  3 ans"
  ],
  "skills": [
    "JavaScript",
    "SQL"
  ],
  "softSkills": [
    "Autonomie"
  ],
  "additionalInformation": [],
  "companySize": "50 à 99 salariés",
  "recruiterName": "Sample Recruiter SARL",
  "recruiterDescription": null,
  "employerPageUrl": "https://recrute.francetravail.fr/page-employeur/sample-recruiter-000",
  "employerLogoUrl": null,
  "employerPhone": null,
  "employerEmail": null,
  "applyActionUrl": "https://candidat.francetravail.fr/offres/recherche/detail.detailstandalone.postuler.contact:chargercontact?t:ac=123XYZA",
  "contactActionUrl": "https://candidat.francetravail.fr/offres/recherche/detail.detailstandalone.postuler.contact:chargercontact?t:ac=123XYZA",
  "industry": "Informatique",
  "qualification": "Non cadre",
  "jobLabels": [],
  "romeCodes": [
    "M1805"
  ],
  "romeLabel": "Développeur / Développeuse full-stack",
  "educationLevel": [
    "Bac+5 et plus ou équivalents Informatique"
  ],
  "educationRequired": false,
  "inclusiveEmployer": false,
  "adaptedCompany": false,
  "scrapedAt": "2026-01-15T09:00:00.000Z"
}

Ways to use this data

  • Labor-market research: track hiring volume, salary ranges and contract mix across regions, professional domains and time windows.
  • Recruiting intelligence: benchmark an employer's or a sector's hiring patterns, contract mix and pay bands over time.
  • Data engineering and BI: feed structured job records into a warehouse, dashboard, alerting tool or a search/matching engine.
  • Lead generation: identify employers and recruiters actively hiring, with role-level context for outreach.
  • Workforce monitoring: schedule the actor against a saved search and get notified only of new or changed postings.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does France Travail Scraper return?

The documented output for France Travail Scraper includes offer id, change type (incremental mode), title, url, company, location, postal code and contract. Availability of each field depends on the source page and the selected mode.

How much does France Travail Scraper cost?

It costs $2.50 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Why isn't my location filter narrowing the results?

Location is resolved against France Travail's own autocomplete before the search runs, so a typed city or department name is normally matched to the site's own area code. When the autocomplete offers suggestions but none closely matches your text, the actor takes the site's top suggestion, as the search box would. Only when the autocomplete returns nothing at all (or the lookup fails) does the actor send your text verbatim, and France Travail then ignores an unrecognized value and returns nationwide results instead of erroring. Check the run log: it states which code and place name your location was resolved to, or that it was sent as is. Typing a precise name, or a site code such as 75D, avoids surprises.

Can I get only new or changed jobs on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared jobs, and unchanged ones are not billed unless you also turn on Emit unchanged.

Why did a run return zero jobs, and why did some runs fail instead?

Most rejected requests are retried automatically and simply narrow what a search returns; if every attempt for a search still fails, that search's log line says so and the run continues with the next search, so a hard connection issue usually shows up as fewer or zero jobs rather than a failed run. A run fails outright only in a few specific cases: no working connection at all could be set up, a pasted Resume run or dataset ID could not be read, or Incremental mode already has saved state for this exact search and you also passed a Resume run ID (a conflicting combination). The run's status message always explains which one applies.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

Ready to collect with France Travail Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.