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.
| Input | What it controls |
|---|---|
modestring · required | search = build a search from keywords and filters. url = paste one or more France Travail search URLs and walk them forward. |
queriesarray | Job titles, skills, or hiring phrases such as "data analyst", "cariste", or "assistant comptable". Each line runs a separate search. |
locationstring | A 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. |
radiusinteger | Radius around the location, in kilometres (0 = no radius). Only used when a location is set. |
publishedDatestring | Keep only jobs posted within the chosen window. |
contractTypearray | Contract 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 …. |
contractDurationarray | Keep only full-time, part-time, or unspecified working-time listings. Allowed values: Temps plein, Temps partiel, Non renseignée. |
Show 21 more inputs
| Input | What it controls |
|---|---|
jobCategoryarray | Professional 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 …. |
minSalaryinteger | Drop listings whose salary is below this monthly gross amount. Leave at 0 to keep all. |
experiencearray | Experience 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. |
seniorityarray | Executive, non-executive, or unspecified qualification levels. Allowed values: Cadre, Non cadre, Non renseignée. |
onlyFranceTravailboolean | When ON, keep only offers published directly on France Travail (partner offers excluded). |
inclusiveEmployerboolean | When ON, keep only offers from employers showing the Handi-engage commitment. |
adaptedCompanyboolean | When ON, keep only offers from adapted companies (entreprises adaptées). |
sortBystring | Sort by relevance or by publication date. |
urlsarray | One 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. |
maxItemsinteger | Global 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. |
maxPagesinteger | Per-search page limit (20 jobs per page). 0 means no page limit, the run stops at Max listings. |
fetchDetailsboolean | Open 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. |
resumeFromRunIdstring | Paste 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. |
incrementalModeboolean | Turn 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. |
stateKeystring | Optional. 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. |
emitUnchangedboolean | Off 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. |
emitExpiredboolean | Off 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. |
ignoreFieldsForChangesarray | Incremental 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. |
mcpConnectorsarray | Optionally 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. |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap 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.
