Free-Work is the main French job board for IT: about 10,000 live postings, half of them freelance missions with a daily rate (TJM). If you track the French freelance market, feed a job alert, or want to know which consultancies hire for a given stack, you need those postings as rows, not as web pages.
This is how to get them as clean JSON or CSV in a few minutes, with an Apify Actor I maintain. No login, no proxy, no code required, and it respects the site's robots.txt.
1. Run it once
Open the Actor page: Free-Work Jobs & Freelance Missions Scraper and click Try for free. The form is already filled with a working example: keywords data engineer, postings of the last 7 days, 50 results. Click Start. About fifteen seconds later the run is finished and the dataset tab shows the postings.
Each record looks like this:
{
"title": "Data Engineer",
"companyName": "STHREE SAS",
"contracts": ["contractor"],
"experienceLevel": "senior",
"remoteMode": "partial",
"locationLabel": "Paris, France",
"minDailyRate": 550,
"maxDailyRate": 650,
"currency": "EUR",
"durationValue": 12,
"durationPeriod": "month",
"skills": ["AWS Cloud", "Databricks", "PySpark", "Python", "SQL"],
"publishedAt": "2026-10-01T11:18:03+02:00",
"url": "https://www.free-work.com/fr/tech-it/job-mission/data-engineer/data-engineer-1419"
}
Permanent jobs carry minAnnualSalary and maxAnnualSalary instead of the daily rates. Export the dataset as JSON, CSV or Excel from the same page.
2. Make it a daily alert
- Save the run as a Task and set Published within (days) to
1. - Add a Schedule to the task: every weekday at 7:00.
- Add an Integration to the task: Google Sheets (append rows), Slack, or a webhook to your own endpoint.
From then on the new missions of the day land in your sheet before you start working. Deduplicate on the id field if you keep your own copy.
3. Or call it from your code
JavaScript:
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('bibian/free-work-jobs-scraper').call({
keywords: 'python',
publishedWithinDays: 7,
maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python:
from apify_client import ApifyClient
client = ApifyClient(token="<APIFY_TOKEN>")
run = client.actor("bibian/free-work-jobs-scraper").call(run_input={
"keywords": "python", "publishedWithinDays": 7, "maxItems": 100,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
Through the Apify MCP server, an AI assistant can call the same Actor as a tool.
Already on RapidAPI? The same search is available there as a plain REST API with monthly plans and a free tier, billed through your RapidAPI subscription: Free-Work Jobs on RapidAPI.
What it costs
Pay per result: $2.00 per 1,000 postings, plus $0.01 per run. The example above, 50 postings, costs about $0.11. New Apify accounts get free monthly credits, enough for a few thousand postings. There is no subscription.
What it does not do
It reads the public listing and posting pages only. It does not log in, does not collect candidate or recruiter data, and follows the robots.txt rules of free-work.com. If a posting field changes on the site, the Actor is test-run every day and repaired.
Questions or a missing field? Open an issue on the Actor page, I read them.
Top comments (1)
The weekday 7:00 schedule paired with a one-day lookback could leave a weekend gap on Monday. For a scheduled BrowserAct Cloud Bot, I would use an overlapping date window and deduplicate by listing ID downstream. Do you extend publishedWithinDays on Mondays, or does Free-Work hold weekend postings until the next working day?