# Welcome to the Jungle Jobs Scraper (`deriverge/welcome-to-the-jungle-jobs-scraper`) Actor

Jobs from Welcome to the Jungle in France, the UK, the US and more, with published salary as numbers, remote policy, the employer's apply link and company data. Search by keyword or paste any search link; one run can read every match, past the 1,000 results the site shows.

- **URL**: https://apify.com/deriverge/welcome-to-the-jungle-jobs-scraper.md
- **Developed by:** [deriverge s.r.o.](https://apify.com/deriverge) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.25 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Welcome to the Jungle Jobs Scraper

Welcome to the Jungle (welcometothejungle.com) listed about 90,000 jobs in September 2026, most of them in France, each next to a profile of the company. This actor returns one row per job: salary as numbers when the company publishes it, contract type, remote policy, experience and education asked, offices, the full description and the link to apply at the employer, plus company size, industries and website. Type a keyword such as `data engineer` and click **Start**. About a third of the jobs publish a salary. It costs $0.50 per 1,000 jobs on the Free plan ($0.25 on Business), and the $5 of monthly credit in Apify's Free plan covers about 10,000 jobs.

### Job and company fields

| Field | Description |
|---|---|
| `title`, `company`, `companySlug` | Job title as the company wrote it, the company name and its slug on the site, e.g. `fabriq`, which also works in **Companies**. |
| `contractType`, `contractDurationMinMonths`, `contractDurationMaxMonths` | `full_time`, `part_time`, `internship`, `apprenticeship`, `temporary`, `freelance`, `vie`, `graduate_program`, `volunteer` or `other`, and the length in months for internships and fixed-term contracts. |
| `remote` | `fully_remote`, `hybrid`, `occasional` or `on_site`. Empty when the company does not say. |
| `city`, `region`, `country`, `countryCode` | The job's main office, e.g. `Paris`, `Ile-de-France`, `France` and `FR`. |
| `locations`, `address`, `latitude`, `longitude` | Every office as `City, Country`, the street address of the main one (`18 Rue Yves Toudic, 75010 Paris, France`) and its coordinates. |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | Published pay as numbers, e.g. `80000` to `95000` `EUR` `yearly`. Empty when the company keeps it private. |
| `experienceYearsMin`, `educationLevel` | Years of experience asked, where `0` means open to beginners, and the education, e.g. `Master's degree (Bac+5)`. |
| `category`, `subCategory`, `profession` | The site's job classification, e.g. `Tech & Engineering` and `Engineering Disciplines`. |
| `language` | Language the job is written in, read from its text: `fr`, `en` and others. |
| `summary`, `keyMissions` | A short summary and the main tasks as the site shows them above the job text. |
| `benefits` | Perks the company lists, e.g. `Between 2-3 days at home` or `Sports allowance`. |
| `skills`, `tools` | Skills the job asks for and tools the team uses, e.g. `Terraform` and `Kubernetes`. |
| `description`, `descriptionHtml`, `profile`, `recruitmentProcess` | The job text as plain text and HTML, the candidate profile, and the hiring steps when the company describes them. |
| `applyUrl` | Where to apply: the employer's own page, often on Greenhouse, SmartRecruiters, Ashby or Workday, or the job page when applications go through Welcome to the Jungle. |
| `companyEmployees`, `companyFounded`, `companyIndustries`, `companyLabels` | Company headcount and founding year, industries such as `SaaS / Cloud Services`, and labels such as `great-place-to-work` or `ecovadis-bronze`. |
| `companyWebsite`, `companyLinkedin`, `companyJobsCount` | The company's own website and LinkedIn page, and how many jobs it has open on the site. |
| `postedAt`, `updatedAt`, `startDate` | When the job was published and last updated, and the desired start date when given. |
| `url`, `companyUrl` | The job page and the company page on welcometothejungle.com. |

### How to scrape Welcome to the Jungle jobs

1. Type a job title, skill or company into **Keywords**, e.g. `data engineer`, `product manager` or `python`, or leave it empty for every job.
2. Filter with **Countries** (34 to choose from), **Cities** spelled as on the site (`Paris`, `London`, `Lyon`), **Contract types**, **Remote policy**, **Job categories**, **Posting language**, **Companies** and **Maximum years of experience required**. Jobs that do not state their experience stay in.
3. For pay, turn on **Only jobs with a published salary**, or set **Minimum yearly salary (EUR)**. For that comparison, monthly and daily rates and other currencies are converted at approximate rates, and jobs without a salary drop out. An amount that comes without a period counts only when it reaches the minimum on its own. **Posted within the last N days** keeps only recent jobs.
4. A search set up on the site can be reused: paste the address of its jobs page, or of a company's jobs page, into **Search links from welcometothejungle.com**. The filters in the form are added to each link.
5. Keep **Include full job details** on for the description, apply link, skills, tools, address and company website; 3,000 jobs with details took about 2 minutes, at the same price. Click **Start**, then take the rows from the **Output** tab as CSV, Excel or JSON, or from the API.

A search for hybrid or remote data engineering jobs in France paying at least 50,000 EUR, as API input:

```json
{
  "query": "data engineer",
  "countries": ["FR"],
  "contractTypes": ["full_time"],
  "remote": ["hybrid", "fully_remote"],
  "minYearlySalary": 50000,
  "maxItems": 500
}
```

### Example output

One job from a run on 28 September 2026. The description, its HTML, the profile and the hiring steps are shortened. The run is older than the language fix of 30 September 2026: the row shows `fr`, the language the company set, while the job is written in English, and the actor now returns `en` for it.

```json
{
  "key": "wttj:7718fe86-d28a-4996-a8aa-466bfff3663c",
  "jobId": "7718fe86-d28a-4996-a8aa-466bfff3663c",
  "reference": "FABRI_5OVgqlx",
  "title": "Platform Engineering Manager (F/H)",
  "url": "https://www.welcometothejungle.com/en/companies/fabriq/jobs/platform-engineer_paris",
  "applyUrl": "https://fabriq.homerun.co/platform-engineer/fr",
  "company": "Fabriq",
  "companySlug": "fabriq",
  "companyUrl": "https://www.welcometothejungle.com/en/companies/fabriq",
  "companyLogo": "https://cdn-images.welcometothejungle.com/m_FajYhU2vRldtgCA3MRWIbK6Ja4fJd7y1TDgkB8q_s/rs:auto:400::/q:85/czM6Ly93dHRqLXByb2R1Y3Rpb24vdXBsb2Fkcy9vcmdhbml6YXRpb24vbG9nby84NzUyLzE1NzE2NC82YTE1Y2QwZC05Zjc2LTQ3NGEtOTY4NS1hYzY2NjZiNzVhOWIucG5n",
  "companySummary": "Solution de pilotage d'atelier pour améliorer la productivité des équipes.",
  "companyEmployees": 110,
  "companyFounded": 2019,
  "companyIndustries": [
    "Software",
    "SaaS / Cloud Services"
  ],
  "companyLabels": [],
  "companyWebsite": "https://www.fabriq.tech",
  "companyLinkedin": "https://www.linkedin.com/company/19229603",
  "companyJobsCount": 10,
  "category": "Tech & Engineering",
  "subCategory": "Engineering Disciplines",
  "profession": "Industrial Engineer",
  "contractType": "full_time",
  "contractDurationMinMonths": null,
  "contractDurationMaxMonths": null,
  "remote": "fully_remote",
  "city": "Paris",
  "region": "Ile-de-France",
  "country": "France",
  "countryCode": "FR",
  "locations": [
    "Paris, France"
  ],
  "address": "18 Rue Yves Toudic, 75010 Paris, France",
  "latitude": 48.86983,
  "longitude": 2.36397,
  "salaryMin": 80000,
  "salaryMax": 95000,
  "salaryCurrency": "EUR",
  "salaryPeriod": "yearly",
  "experienceYearsMin": 7,
  "educationLevel": "Master's degree (Bac+5)",
  "language": "fr",
  "summary": "Join our team as a Platform Engineering Manager, where you will lead and grow our platform team while maintaining a strong technical direction. You will be responsible for a team of three senior platform engineers and will focus on making them and the wider engineering organization more effective. This is a player-coach role, where you will spend most of your time leading, coaching engineers, setting standards, owning the platform roadmap, and partnering with stakeholders. You will also stay close to the technology to review work, pair when necessary, and make sound architectural decisions with your team.",
  "keyMissions": [
    "Lead, coach, and grow a team of three confirmed/senior platform engineers, supporting their development through regular feedback, career conversations, and technical mentoring.",
    "Own the platform roadmap and technical vision, balancing reliability, security, cost, and delivery speed, and deliver infrastructure changes through automation while maintaining high availability.",
    "Partner with engineering, product, and security stakeholders to align priorities and facilitate change management, and communicate clearly through documentation, technical decisions, and customer-facing relationships."
  ],
  "benefits": [
    "Flexible working hours",
    "Between 2-3 days at home",
    "Free food & snacks",
    "Reduction of working time (RTT)",
    "Cooptation bonus",
    "Match charitable contributions",
    "Social Committee subsidies (Sports, Culture, ...)",
    "Team building",
    "Afterworks, Team lunches",
    "Professional development plan",
    "Paid industry certifications",
    "Family medical leave",
    "Sick child leave",
    "Pregnancy loss leave",
    "Sports allowance",
    "Bicycle storage",
    "Sustainable mobility package"
  ],
  "skills": [
    "Cybersecurity knowledge",
    "Leadership",
    "Communication skills",
    "Adaptability",
    "Domain driven design",
    "Coaching and mentoring",
    "Collaboration and teamwork"
  ],
  "tools": [
    "Spinnaker",
    "Linux",
    "Kubernetes",
    "TypeScript",
    "Jenkins",
    "Pulumi",
    "Foundation",
    "CloudFlare",
    "Terraform",
    "Github Actions",
    "ArgoCD",
    "Django",
    "OpenTelemetry",
    "AWS",
    "Capacitor",
    "Abstract",
    "JavaScript",
    "Sentry"
  ],
  "description": "About the role\n\nWe are looking for a Platform Engineering Manager to lead and grow our platform team while keeping a strong hand on technical direction. You will be responsible for a team of three confirmed / senior platform engineers, and your mission is to make them, and the wider engineering organization, more effective: shipping reliable, secure, and scalable infrastructure, and enabling product teams to move fast through strong self-service capabilities.\n\n...",
  "descriptionHtml": "<h3>About the role</h3><p>We are looking for a Platform Engineering Manager to lead and grow our platform team while keeping a strong hand on technical direction. You will be responsible for a team of three confirmed / senior platform engineers, and your mission is to make them, and the wider engineering organization, more effective: shipping reliable, secure, and scalable infrastructure, and enabling product teams to move fast through strong self-service capabilities.</p>...",
  "profile": "Required experience and skills\n\nLeadership\n- Experience managing or leading engineers, ideally including senior / confirmed profiles, with a track record of growing people through mentoring and technical guidance\n...",
  "recruitmentProcess": "Interview Process\n\n1. Screening - 30 min A first call to align on your background, motivations, and what Fabriq can offer.\n\n2. ITW Managent Skills - 45 min A role-play exercise based on your past management experiences.\n\n...",
  "startDate": "2026-07-05T22:00:00Z",
  "postedAt": "2026-09-28T14:04:02Z",
  "updatedAt": "2026-09-28T14:04:02.417074Z"
}
```

### How much does it cost to scrape Welcome to the Jungle?

| | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| 1,000 jobs | $0.50 | $0.40 | $0.325 | $0.25 |

You pay only for the events in the table. There is no start fee, and compute time and proxies are included.

The whole board, about 90,000 jobs, costs about $45.00 on the Free plan and $22.50 on Business. Jobs removed by the salary or experience filter and jobs the new-only mode holds back are not charged.

### Limits

- A search on the website stops at 1,000 results. The actor reads the site's date-sorted search index in windows of up to 1,000 jobs, so one run can go through every match.
- Published pay is mostly yearly: of the 29,934 jobs with an amount on 30 September 2026, 25,461 were yearly, 4,377 monthly and 96 daily, and 626 of the 1,020 internships with an amount gave it per month. When an amount comes without a period, `salaryPeriod` is empty and **Minimum yearly salary (EUR)** keeps the job only if the amount alone reaches the minimum; the run summary counts the jobs left out for that reason.
- `remote` was empty on 1,111 of those 3,000 jobs.
- The language a company sets on the site does not always match the text: among the 2,000 newest jobs in France on 30 September 2026, 32 of the 93 set to English were written in French. `language` and **Posting language** therefore go by the text, the description with full details on. With details off, the actor reads the candidate profile and then the summary, which Welcome to the Jungle writes itself, sometimes in another language than the job; 6 of those 93 jobs still got the wrong code that way. Summary and key missions can differ from the job's language too; an English job in Barcelona had its key missions in Spanish.
- A job that closes between the search and the details keeps only the search fields, and the run summary counts such jobs.

### New and closed jobs

With a **Watch name** such as `paris-data-jobs`, or a saved task, each run compares the jobs it read with the run before. **Return only jobs new since the last run** limits the output to new jobs. If **Maximum jobs** ends a run early, the jobs it did not reach stay out of the snapshot and come with the next run. The `CHANGES` record in the run's key-value store lists the IDs of new jobs and, when the run read the whole search, of jobs that closed since the previous run.

### FAQ

#### Is it legal to scrape Welcome to the Jungle?

The actor reads the job search and job pages that welcometothejungle.com shows to every visitor, through the same public search index and job service the site uses. It leaves out recruiter names and the employee videos on company pages. Job texts come as the companies wrote them, and some hiring steps name the people who interview. You are responsible for how you use the data.

#### Can I export every job on the board?

Yes. Leave **Keywords** and the filters empty and set **Maximum jobs** to 100000; with **Include full job details** off the run is much faster. France alone matched 67,551 jobs on 27 September 2026.

### Related scrapers

- [Arbeitsagentur Jobs Scraper](https://apify.com/deriverge/arbeitsagentur-jobs-scraper)
- [Career Site Jobs Search](https://apify.com/deriverge/career-site-jobs-search)
- [Career Site Jobs Scraper](https://apify.com/deriverge/greenhouse-lever-workday-jobs-scraper)

### Support

This actor is built and maintained by deriverge s.r.o., a software company based in the Czech Republic. If a run fails or a field you need is missing, please open an issue in the **Issues** tab or write to us at info@deriverge.com. We respond in English and Czech. Runs can be scheduled in Apify Console or started from the **API** tab, which has examples for Python, JavaScript and cURL and works with Make, Zapier, n8n and the Apify MCP server. If the actor saves you time, a short review helps other people find it.

# Changelog

This Actor's version history is a separate document: https://apify.com/deriverge/welcome-to-the-jungle-jobs-scraper/changelog.md

# Actor input Schema

## `query` (type: `string`):

What to search for, as on the site: a job title, skill or company, for example "data engineer", "product manager" or "python". Leave empty for every job.

## `searchUrls` (type: `array`):

Optional. Paste searches you set up on the site (the address of the jobs page with your filters), or a company jobs page. Each link is run as its own search, together with the filters below.

## `countries` (type: `array`):

Keep only jobs with an office in one of these countries. Leave empty for all.

## `cities` (type: `array`):

Keep only jobs with an office in one of these cities, spelled as on the site, for example Paris, London, Lyon or New York.

## `contractTypes` (type: `array`):

Keep only these contract types. Leave empty for all.

## `remote` (type: `array`):

Keep only jobs with one of these remote policies. Leave empty for all.

## `categories` (type: `array`):

Keep only jobs in these categories. Leave empty for all.

## `languages` (type: `array`):

Keep only jobs written in these languages. The language is read from the job text, because the language a company sets on the site does not always match it. Leave empty for all.

## `companies` (type: `array`):

Only jobs at these companies, as their Welcome to the Jungle page (welcometothejungle.com/en/companies/doctolib) or the slug from it (doctolib).

## `maxExperienceYears` (type: `integer`):

Keep only jobs that ask for at most this many years. Use 0 for jobs open to beginners. Jobs that do not say are kept.

## `minYearlySalary` (type: `integer`):

Keep only jobs whose published pay reaches this amount per year, in euros. Monthly, weekly, daily and hourly pay and other currencies are converted at approximate rates. Pay that does not say whether it is per year, month, day or hour cannot be converted, so such a job is kept only when the amount itself reaches the minimum. Jobs without a published salary or without its currency are dropped.

## `salaryOnly` (type: `boolean`):

Drop jobs where the company does not publish pay.

## `postedWithinDays` (type: `integer`):

Keep only jobs published recently, for example 7 for the last week.

## `includeDetails` (type: `boolean`):

Adds the full description (text and HTML), candidate profile, recruitment process, apply link, skills, tools, office address and the company website and LinkedIn page. About 30 jobs per second; the price is the same. Turn it off for the fastest export of the whole board.

## `newOnly` (type: `boolean`):

Keeps a snapshot per watch name (or per saved task) and returns only jobs that were not there before. Schedule it daily for a job alert.

## `watchName` (type: `string`):

Name of the snapshot used by the new-only mode, for example "paris-data-jobs". Runs from a saved task get one automatically.

## `maxItems` (type: `integer`):

Hard cap on returned jobs. Set it high (for example 100000) to export every match; the whole board is about 90,000 jobs.

## Actor input object example

```json
{
  "query": "data engineer",
  "salaryOnly": false,
  "includeDetails": true,
  "newOnly": false,
  "maxItems": 20
}
```

# Actor output Schema

## `jobs` (type: `string`):

One row per job with salary as numbers, contract, remote policy, location, full description, apply link and company details.

## `changes` (type: `string`):

Jobs that appeared and jobs that closed compared with the previous run of the same task or watch name.

## `summary` (type: `string`):

Jobs matching each search, jobs returned, how many each filter dropped, and request counts.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "query": "data engineer",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("deriverge/welcome-to-the-jungle-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "query": "data engineer",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("deriverge/welcome-to-the-jungle-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "data engineer",
  "maxItems": 20
}' |
apify call deriverge/welcome-to-the-jungle-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,deriverge/welcome-to-the-jungle-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/apt4CoWuJboiUoOmL/builds/PTr4pLCvHuCUePvZI/openapi.json
