Everything you need to know to read the figures on this site: where they come from, what we keep, what we discard, and what they do not tell you.
The figures come from job offers published by France Travail (the French public employment service) and available through the “Offres d'emploi” (job offers) API on francetravail.io. We collect these offers continuously, department by department, and keep a raw archive so that everything can be recalculated if the rules change.
Their reuse is governed by the France Travail licence. It requires us to name the source, give the date of the last update and, if an offer is displayed, show it in full with its logo. That is why the site does not reproduce any individual offer: it only publishes aggregated statistics and sends you to France Travail to view the offers. The notice “Source: France Travail job offers, updated on …” appears under every block of figures.
An offered salary is the amount written in a job offer by the employer who is hiring. It is not the salary finally negotiated, nor the pay of people already in the job. The site's unit of measurement is gross annual pay, full-time, in euros. When the offer gives a range, we use the midpoint; the minimum and maximum are still stored.
France Travail expresses most salaries in a standard form (“Monthly from 2,000 to 2,400 euros over 12 months”, “Annual 35,000 euros”, “Hourly 12.50 euros”). A deterministic parser, tested on dozens of real cases, reads these labels:
Labels the parser cannot read (free text, “€2,200 gross + bonuses”) go through a language model, Claude Haiku, which extracts the amount, the period and the basis (gross or net) with a confidence score. The code then applies the same rules and limits; an uncertain extraction is discarded. The model reads, the code calculates: no figure shown on the site comes from a language model.
An offer is included in the statistics if it meets all of these conditions:
The following are excluded, with the reason kept for auditing:
The statistics cover offers created in the last 365 days (a rolling 12 months). As long as collection has been running for less than a year, the period shown is “since {collection start date}”. Collection runs every ten minutes, normalisation every fifteen minutes, and the aggregates are recalculated every night. The update date is shown under every block of figures.
A cell = one job (an entry in ROME, France Travail's job classification) × one geographical level (city, department, region, France) × one experience band. For each cell we calculate the number of offers, the percentiles P10, P25, P50 (median), P75 and P90, as well as the mean (stored, but never highlighted because extreme values skew it). Percentiles are calculated by linear interpolation, like PostgreSQL's percentile_cont.
| Offers in the cell | Display | Search engine indexing |
|---|---|---|
| 30 or more | Normal | Yes |
| 10 to 29 | With the “limited data” badge | No |
| Fewer than 10 | Hidden, falls back to the next geographical level up | No |
| Contributions, fewer than 10 | Never shown (anonymity) | No |
When a city does not reach the threshold, the page shows the department, then the region, then France, and says so clearly at the top of the page. No value is ever invented or modelled.
The bands refer to the experience required in the offer, not the candidate's: entry level (less than a year, or “beginners welcome”), 1 to 3 years, 3 to 5 years, 5 to 10 years, 10 years and over. An offer that states no experience is only counted under “All levels”.
Hierarchy: city → department → region → France. The arrondissements (districts) of Paris, Lyon and Marseille are merged into their municipality. The list of municipalities, departments and regions comes from the official administrative boundaries (Etalab, the French government's open data service).
The net pay shown is monthly net pay before income tax, estimated from gross pay with the open-source calculation engine of mon-entreprise (by URSSAF, the body that collects French social security contributions). A cell is treated as cadre (executive status) if more than 50% of its offers are for cadre positions. It is an estimate: top-up health insurance, death and disability cover or contributions specific to a collective agreement can shift it by a few dozen euros. It is always labelled “estimated”.
On screen, annual amounts are rounded to the nearest hundred euros and monthly amounts to the nearest ten. Calculations use the exact values. Monthly series only include months with at least 10 offers, and the trend is only shown from 6 months onwards.
The analysis paragraphs and the questions and answers on the pages are written automatically by a language model (Claude Sonnet) using only the figures on the page. Before publication, the code extracts every number from the text and checks that it is among the figures provided, give or take rounding; otherwise the text is rejected and the previous version stays in place. Until a text has been validated, a deterministic template is shown.
You can report your salary anonymously (no email, no account, no free text). These contributions form a separate series, “reported salaries”, never mixed with the offers. They are only shown at France and region level, and only from 10 contributions per cell, so that no individual salary can be identified. A plausibility check compares each contribution with the offers for the job; an out-of-range value is held for moderation. In return, a signed cookie unlocks the breakdown by company size, sector, contract type and cadre status for 365 days. See the privacy policy and the terms of use.
The “What am I worth?” tool relies on a different source from the salary pages: salaries actually paid, published by INSEE (France's national statistics office) under the Open Licence. Private-sector figures come from INSEE's all-employees dataset, Base Tous salariés, for 2024 (361 occupations, 19 million full-time-equivalent (FTE) employees, including work-study students and interns), and public-sector figures from the information system on public service employees for 2023 (74 occupations). These are average net monthly salaries in full-time equivalent: averages, not medians.
What the AI does. A Claude model from Anthropic (Claude Fable 5.1 by default) reads the CV, in French or English, and returns a structured, validated response: the type of document (a document that is not a CV is rejected), the occupation chosen from INSEE's classification (and the closest job in ROME, to point you to its page), the dates of each position copied exactly as written, the highest qualification, the city and its department, the level of management responsibility, its view on the criteria used by ATS robots, its view on the profile's value (see our AI's view), word-for-word fixes and up to 4 related jobs. If you paste a job offer, it compares your CV with that offer. The texts must not contain any amount or percentage: they go through the same number validator as the rest of the site, and any item that contains one is removed. The CV is treated as data, never as an instruction.
What the code calculates.
The three negotiation target amounts are calculated from there: cautious = your market value, ambitious = the level at large companies, balanced = in between. The 5- and 10-year projections apply the same method with more experience.
Limitations. These are averages: for the same profile, the sector, bonuses and your negotiation make the real salary vary. Age is used as a proxy for experience, and the geographical and size adjustments are measured at the level of the broad group, not the occupation. The data is one or two years old: salaries have risen since. In the public sector, gross pay is estimated with the private sector's contribution rates (a difference of a few per cent). Self-employed people are not covered.
Privacy. The file is not kept: it is read in memory and sent to the model for analysis. The model is instructed not to copy any name, contact details or age. The result stays in your browser, unless you save it to your account. Analyses are limited per visitor each day, with a higher limit if you have an account. Details in the privacy policy.
INSEE's average describes an occupation, not a person: with the same experience, a rare skill, responsibilities or a better-paying sector make the difference. So the model gives its view, as a recruitment expert, on what puts your profile above or below that average, without counting experience, qualifications or the city a second time:
The model never gives an amount or a percentage: the site converts these judgements using the scale above, then caps the total between −15% and +20%. Each factor is shown with its effect, you see the INSEE baseline next to the adjusted value, and a checkbox lets you remove our AI's view. An instruction slipped into a CV to inflate this view is ignored and flagged as hidden text.
Many employers receive applications in an applicant tracking system (ATS) that extracts the text of the CV, sorts it into fields and compares it with the job offer. The ATS CV check tests the 14 criteria this reading depends on. Two are measured by the code (the file format and the presence of a text layer, by extracting the text from the PDF as the software would); the others are judged by the AI, which answers “good”, “to improve” or “to fix” for each one, with its finding and the fix. The code then checks whatever can be checked: an email address and a phone number in the text, hidden instructions aimed at an AI.
| Criterion | Weight | Assessed by |
|---|---|---|
| File format (blocking) | 2 | the code |
| Text a robot can read (blocking) | 3 | the code |
| Simple layout | 3 | the AI, checked by the code |
| Standard section headings | 2 | the AI, checked by the code |
| Detectable contact details | 2 | the AI, checked by the code |
| Job title at the top | 1.5 | the AI, checked by the code |
| Readable dates | 1 | the AI, checked by the code |
| Job keywords | 3 | the AI, checked by the code |
| Concrete achievements | 2 | the AI, checked by the code |
| No information hidden in graphics | 1.5 | the AI, checked by the code |
| Right length | 1 | the AI, checked by the code |
| Spelling | 1.5 | the AI, checked by the code |
| Acronyms spelled out | 0.5 | the AI, checked by the code |
| No hidden text (blocking) | 3 | the AI, checked by the code |
The score is the weighted average of the criteria: a “good” criterion is worth 100% of its weight, “to improve” 50%, “to fix” 0%, with the result expressed out of 100. A failed blocking criterion (a scan with no text, an unreadable format, hidden text) caps the score at 35: nothing else counts if the robot cannot read the CV. The levels: Excellent from 85, Good from 70, At risk from 50, Blocking from 0.
Limitations. Each piece of software has its own rules and each recruiter their own filters: the score measures how readable and well built the CV is for a robot, not your chances of being hired.
The AI suggests up to 10 fixes: the sentence from your CV, its improved version and the reason. The code only keeps those whose original sentence really appears in your CV, and replaces with “[X]” any figure in the improved version that is not already in your CV: the AI cannot make up a result for you.
You tick your goals when you upload your CV or in the “Improved CV” tab: get past ATS robots, raise your value, change careers, target a specific job offer. With several goals, the AI combines them (career change comes first, then value, when trade-offs are needed). If you tick them when you upload, the rewrite starts on its own after the analysis. The AI may first ask you up to 5 questions (a figure, a tool, a result), then rewrites your CV in a structured format: headline, profile, experience, education, skills, languages. The code then checks the document:
The PDF does not keep the formatting of your original CV: it follows a plain template, designed to be read without errors by applicant tracking systems. If you would rather keep your layout, the word-for-word fixes tell you what to change, line by line.
When you are aiming for another job, the AI links it to an INSEE occupation and judges how transferable your background is: strong, partial or weak. The code then counts 80%, 50% or 25% of your years of experience in the new job and calculates your starting salary with the same method as your market value, then how it grows after 5 and 10 years. It is a ballpark figure: your training and your negotiation will make the difference.
The average salary pages publish, for each of INSEE's 435 occupations, the average net monthly salary in full-time equivalent, its gross annual equivalent (URSSAF engine), the average by age band, the gap between women and men when it is published, and, for the private sector, the differences by company size and the best-paid departments, measured at the level of the occupation's broad group. No text on these pages is generated by AI.
A question, or spotted an error? Write to the address given in the legal notice.