# Welcome to the Jungle Jobs Scraper: Salary & Remote (`precious_bathmat/welcome-to-the-jungle-jobs-scraper`) Actor

Scrape Welcome to the Jungle jobs in France, the US, UK and Europe: title, company, size, sector, salary, remote policy, contract, experience, benefits and summary. Plus a hiring report per search with salary ranges, top employers and remote share. No login.

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

## Pricing

from $1.00 / 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.

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: Salary & Remote

Scrape **jobs from Welcome to the Jungle** (welcometothejungle.com) in **France, the US, the UK and the rest of Europe**, with no login, and get a **hiring report for every search**:

- **Every job**: title, company, **company size and founding year**, sectors, profession, **contract** (CDI, internship, alternance, freelance ...), **remote policy**, **years of experience**, education, **salary range** with WTTJ's yearly figure, city, region, country, coordinates, published date, **summary, key missions and benefits**
- **Filters**: countries, cities, contract, remote policy, maximum years of experience, jobs with a salary only, ad language, published in the last 24 hours / 3 / 7 / 14 / 30 days
- **No 1,000 limit**: "Newest first" reads every matching job, past the 1,000 results the site shows
- **Report per search**: every matching job by country, city, contract, remote policy, profession, sector, experience and education, the **top hiring companies** and **benefits**, plus **salary ranges per currency**, company size and freshness

### What does this Welcome to the Jungle scraper do?

```
Welcome to the Jungle · "software engineer" · 3,946 open jobs
 US 2,701 · UK 392 · France 294 · salary shown on 67%
 Median yearly minimum: $176,000 · €66,800
 Top hiring: Roblox 97 · Anthropic 92 · Affirm 76
```

1. Enter **keywords** (job titles, in English or French), or leave empty for every job.
2. Pick filters: **countries**, **cities**, **contract**, **remote**, **experience**, **salary only**, **posted within**.
3. You get **one row per job** and **one report per keyword**.

```mermaid
flowchart LR
    A[Keywords,<br/>countries,<br/>filters] --> B[Welcome to the Jungle<br/>job search]
    B --> C[Jobs<br/>salary, remote,<br/>contract, company]
    B --> D[Counts over<br/>every match]
    C --> E[Report<br/>salary ranges,<br/>top employers,<br/>remote share]
    D --> E
```

### Who is it for?

- **Recruiters and staffing agencies**: who is hiring for a role in Paris, London or New York, with pay and remote policy
- **Sales teams selling to tech companies and startups**: companies hiring now, with size, sector and founding year
- **Job seekers and career coaches**: every open job for a role, with salary and remote policy, in one sheet
- **HR and compensation teams**: salary ranges and benefits other employers offer for the same role
- **Analysts and journalists**: hiring demand, remote work and pay transparency across Europe and the US

### What data do you get?

**Jobs** (dataset, one row per job)

| Field | What it tells you |
|---|---|
| `title`, `url`, `publishedAt`, `language` | The job and when it was published |
| `company`, `companyUrl`, `companyEmployees`, `companyFounded`, `companySummary`, `companyLabels` | The employer |
| `sectors`, `sectorGroup`, `profession`, `professionCategory`, `professionSubcategory` | What kind of job and company |
| `contractType`, `contractMonthsMin`, `contractMonthsMax` | Contract and its length |
| `remote` | `fulltime`, `partial`, `punctual` (occasional), `no` or `unknown` |
| `minYearsExperience`, `educationLevel` | What is asked |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryYearlyMin` | Pay, when shown |
| `city`, `region`, `country`, `countryCode`, `otherLocations`, `latitude`, `longitude` | Where |
| `summary`, `keyMissions`, `benefits` | What the job is and what it offers |

**Report** (`REPORTS`, one per keyword)

| Field | What it tells you |
|---|---|
| `totalOnWttj`, `jobsRead`, `salaryShownPercent` | Every matching job, how many were read, and how many show pay |
| `allJobsByCountry`, `allJobsByCity`, `allJobsByContract`, `allJobsByRemote` | Counts over **every** matching job |
| `allJobsByProfession`, `allJobsBySpecialty`, `allJobsBySectorGroup`, `allJobsByMinYearsExperience`, `allJobsByEducation`, `allJobsByAdLanguage` | The same, by job type and profile |
| `topHiringCompanies`, `topBenefits` | Who hires most, and the most common benefits |
| `salaryByCurrency` | 25th percentile, median, 75th percentile and highest yearly minimum, per currency |
| `topCompaniesRead`, `companySize`, `topTitles`, `freshness` | Among the jobs read |

### Example: 20 October 2026

Five keywords, up to 3,000 jobs each: **8,617 jobs and 5 reports in 21 seconds, 13 requests**.

| Keyword | Open jobs | Salary shown | Median yearly minimum | Top country | Top hiring company |
|---|---|---|---|---|---|
| software engineer | 3,946 | 67% | $176,000 · €66,800 | US (2,701) | Roblox |
| product manager | 2,054 | 62% | $175,000 · €55,000 | US (1,222) | Wise |
| account executive | 1,982 | 47% | $140,000 · €68,000 | US (1,010) | Salesforce |
| développeur | 1,140 | 22% | €40,000 | France (1,133) | Sopra Steria |
| data analyst | 441 | 37% | $140,000 · €40,000 | France (237) | AXA |

- **Pay transparency splits by country**: two-thirds of software engineer ads show a salary (mostly US), against 22% of French "développeur" ads.
- French developer jobs are mostly **hybrid** (585 of 1,140 partial remote); US product and sales roles are more often **full remote**.
- **Large employers dominate**: 40% to 70% of the jobs read are at companies of 1,000+ employees.

### Pricing

**$0.001 per job** and **$0.02 per search report**.

- 200 jobs with a report: **$0.22**
- 1,000 jobs with a report: **$1.02**
- The run above (8,617 jobs, 5 reports): **$8.72**

### Good to know

- **Search in job titles** (default) gives precise matches; **"Everywhere"** matches like the site's own search box (titles, companies and descriptions) and finds many loosely related jobs ("product manager" everywhere: 14,746 instead of 2,053).
- **Newest first** has no limit; **Most relevant** stops at 1,000 jobs per search, like the site.
- **Salary**: `salaryYearlyMin` is Welcome to the Jungle's own yearly figure, used for the salary statistics; how many ads show pay depends on the role and country.
- **Cities** use Welcome to the Jungle's names ("Paris", "New York", "London"); countries take codes or names ("FR", "France", "UK").
- **Rows** carry the summary, key missions and benefits from the search; the full ad opens from `url`.
- Data comes from **Welcome to the Jungle's public job search**. **Not affiliated with Welcome to the Jungle.**

### Input

| Field | Meaning |
|---|---|
| **Keywords** | One search each; empty = every job |
| **Search in** | Job titles (default) or everywhere |
| **Countries**, **Cities** | Empty = everywhere |
| **Contract** | Full-time, part-time, internship, apprenticeship, temporary, freelance, graduate program, VIE, other |
| **Remote** | Full, partial, occasional, none |
| **Max years of experience asked** | 0 = entry level |
| **Only jobs with a salary** | Off by default |
| **Ad language** | e.g. `en`, `fr` |
| **Posted within** | 24 hours, 3, 7, 14 or 30 days |
| **Sort** | Newest first (no limit) or most relevant (up to 1,000) |
| **Jobs per search** | 1 to 50,000 (default 200) |
| **Reports** | On by default |

### Integrations

Export to JSON, CSV, Excel or Google Sheets, or connect through the Apify API, webhooks, Make, Zapier and n8n. **Schedule it daily** with "Last 24 hours" for a feed of new jobs, or **monthly** with reports on to follow salaries and hiring for a role.

# Actor input Schema

## `keywords` (type: `array`):

Job titles or skills, one search each, in English or French, e.g. "product manager", "data analyst", "développeur". Empty = every job (with the filters below).

## `searchIn` (type: `string`):

Match keywords in job titles only (precise), or everywhere like welcometothejungle.com's own search (titles, companies and descriptions: many more, looser matches).

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

Optional two-letter codes or names: FR, US, GB, CA, DE, ES, NL, IE, BE, CH ... Empty = every country.

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

Optional cities as Welcome to the Jungle names them: "Paris", "New York", "London", "Lyon", "San Francisco". Empty = every city.

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

Optional: only these contract types.

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

Optional: only these remote policies.

## `maxYearsExperience` (type: `integer`):

Optional: only jobs asking for at most this many years (0 = entry level).

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

Only jobs that show a salary range.

## `jobLanguages` (type: `array`):

Optional: only ads written in these languages, e.g. "en", "fr".

## `postedWithinDays` (type: `string`):

Only jobs published in this period.

## `sort` (type: `string`):

Which jobs are read first when a search has more than the maximum.

## `maxJobsPerSearch` (type: `integer`):

Most jobs to read per keyword (1 to 50,000).

## `includeReports` (type: `boolean`):

One report per keyword: every matching job by country, city, contract, remote policy, profession, sector, experience and education, the top hiring companies and benefits, plus salary ranges, company size and freshness of the jobs read.

## Actor input object example

```json
{
  "keywords": [
    "product manager"
  ],
  "searchIn": "title",
  "salaryOnly": false,
  "postedWithinDays": "any",
  "sort": "newest",
  "maxJobsPerSearch": 200,
  "includeReports": true
}
```

# Actor output Schema

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

One row per job: title, company, size, sector, profession, contract, remote, experience, education, salary, location, published date, summary, key missions, benefits, link.

## `reports` (type: `string`):

Per keyword: jobs by country, city, contract, remote, profession, sector, experience and education, top hiring companies and benefits, salary ranges by currency, company size, freshness.

## `reportsCsv` (type: `string`):

One flat row per keyword.

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

Requests, problems and the limits of the data.

# 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 = {
    "keywords": [
        "product manager"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/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 = { "keywords": ["product manager"] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/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 '{
  "keywords": [
    "product manager"
  ]
}' |
apify call precious_bathmat/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,precious_bathmat/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/TbbiqIYl7NRTWhMce/builds/fYcGNOPlkrhzzaCdU/openapi.json
