# Welcome to the Jungle Scraper — Jobs, Salaries & Remote Work (`highbrow_fame/welcome-to-the-jungle-jobs`) Actor

Job ads from Welcome to the Jungle: title, company, size, sectors, offices, contract, remote policy, salary, experience, date and the full ad. Search links, keywords or places. No recruiter names.

- **URL**: https://apify.com/highbrow\_fame/welcome-to-the-jungle-jobs.md
- **Developed by:** [yestrue](https://apify.com/highbrow_fame) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 job delivereds

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 Scraper — Jobs, Salaries & Remote Work

Get job ads from Welcome to the Jungle, the job board of Europe's tech companies and start-ups: title, company (size, year founded, sectors), offices, contract type, remote policy, salary range, years of experience, degree, benefits, publication date — and the full ad with the profile wanted, skills, tools and the apply link. Search by keywords, places and countries, or paste Welcome to the Jungle links.

**Why this one**

- 🔍 **Search the whole board.** welcometothejungle.com no longer shows a list of search results to visitors — it sends them into a sign-up flow. This Actor searches the same job index the site uses: keywords, places in English or the local language (Paris, München, Île-de-France, Hauts-de-Seine), countries, contract type, remote policy, language of the ad, minimum salary, years of experience and posting date. Search links you saved earlier and company pages work too.
- 📚 **Every job, not only the first 1,000.** The search behind the site stops at 1,000 results; this Actor goes past that, newest first. A live test run read all 17,690 jobs of a US search — no duplicates. The whole board listed 90,074 jobs that day.
- 📄 **The full ad.** Description, the profile wanted, skills, tools, start date and the apply link, for 2,302 of 2,302 jobs in a live run (four searches in 94 seconds).
- 💶 **Salaries and remote work as data.** Minimum and maximum, currency and period whenever the ad publishes a salary — 13,647 of the 17,690 US jobs did — and the remote policy: full remote, hybrid, occasional or on site.
- 🔒 **No recruiter names, no phone numbers.** The team, recruiter and recruitment-process parts of an ad are not read. Phone numbers and e-mail addresses written into ad texts are replaced with `[phone removed]` / `[e-mail removed]`; salary figures are kept.
- 💸 **You pay only for jobs delivered.** A link that is not Welcome to the Jungle, or a place with no jobs, comes back as a free record with the reason.

### What you get

For every job:

| Field | What it is |
|---|---|
| `title`, `jobId`, `url` | the job on Welcome to the Jungle |
| `company`, `companyUrl`, `companySize`, `companyFounded`, `companySummary`, `companyLabels`, `companyLogo` | who is hiring: employees, year founded, a one-line pitch, labels such as `great-place-to-work` or `bcorp` |
| `sectors`, `industries` | the company's sectors (Software, Big Data) and their groups (Tech) |
| `profession`, `professionCategory`, `professionSubCategory` | Welcome to the Jungle's job family (Back-end Developer · Software & Web Development · Tech & Engineering) |
| `city`, `country`, `countryCode`, `offices` | where: every office the job lists, with district and region |
| `contractType`, `contractMinMonths`, `contractMaxMonths` | `full_time` (permanent), `part_time`, `temporary`, `internship`, `apprenticeship`, `freelance`, `graduate_program`, `vie`, `volunteer`, `other` — and how long a fixed-term contract runs |
| `remote` | `fulltime` (full remote), `partial` (hybrid), `punctual` (occasional), `no` (on site), `unknown` (not stated) |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryYearlyMin` | the pay range when the ad publishes one, per year, month or day, and its yearly minimum |
| `experienceMinYears`, `educationLevel` | years of experience asked, and the degree asked (French levels: Bac +5 = master's) |
| `language`, `benefits`, `summary`, `keyMissions`, `publishedAt` | the language of the ad, the company's perks, a short summary and the key missions, and when the job was published |
| `input`, `place`, `position`, `scrapedAt`, `status`, `error` | which search it came from, and why a search gave nothing |

With **Full job ad** (on by default) also: `description`, `profile`, `skills`, `tools`, `experienceLevel`, `startDate`, `applyUrl`, `updatedAt` — and `detailsError` if a job could not be opened.

#### Example

A real record from a live run, 25 September 2026 — data jobs in France, permanent, hybrid (long texts cut with "…", logo and a few fields left out):

```json
{
  "jobId": "STRID_14991p5",
  "title": "SEO/GEO Team Leader F/H",
  "url": "https://www.welcometothejungle.com/fr/companies/stride-up/jobs/seo-geo-team-leader-f-h_paris",
  "company": "Stride-up",
  "companySize": 80,
  "companyFounded": 2019,
  "companySummary": "Agence digitale 360° intégrant IA pour optimiser la performance.",
  "sectors": ["Marketing / Communication", "Publicité", "Digital"],
  "profession": "Responsable de secteur",
  "city": "Paris",
  "country": "France",
  "contractType": "full_time",
  "remote": "partial",
  "salaryMin": 51000,
  "salaryMax": 59000,
  "salaryCurrency": "EUR",
  "salaryPeriod": "yearly",
  "educationLevel": "Bac +3 (bachelor's degree)",
  "experienceMinYears": 3,
  "language": "fr",
  "benefits": ["Entre 1-2 jours de télétravail", "RTT / Jour de repos", "Afterworks, Déjeuners d'équipe, etc.", "Solution de prévention santé mentale", "Remboursement au delà des 50%"],
  "summary": "Rejoins Stride-up, une agence en pleine croissance spécialisée dans le SEO et le GEO. En tant que Team Leader, tu seras responsable de la qualité de l'équipe, de la performance organique…",
  "publishedAt": "2026-09-21T08:34:41Z",
  "description": "Stride-up poursuit son développement et recherche un.e futur Team Leader pour piloter une partie de l’équipe SEO/GEO.\nEn tant que Team Leader, tu es le garant de la qualité au quotidien…",
  "skills": ["Communication", "Gestion de la qualité", "Stratégies SEO/SEM", "Gestion d'équipe"],
  "experienceLevel": "3_TO_4_YEARS",
  "startDate": "2026-11-15T23:00:00Z",
  "status": "OK"
}
```

### How to use it

1. Type **Keywords** (data analyst, python, product designer) and **Places** or **Countries**, and choose the filters — or paste **Search links** and company pages.
2. Set **Max jobs per search**. **Full job ad** is on; turn it off for a faster list.
3. Press **Start**, and download the results from the **Output** tab as JSON, CSV or Excel.

To follow new jobs, save your input as a task with **Posted within (days)** set to 1 and schedule it daily.

You can also call it from the Apify API, from Make, Zapier or n8n, or from an AI agent through the Apify MCP server.

### Pricing

You are charged **per job delivered** — see the price on this page. The full job ad costs nothing extra, only time. Links that are not Welcome to the Jungle and places with no jobs are free.

### FAQ

**Where do I get a search link?** The site no longer shows its search to visitors, so search here with **Keywords** and **Places**. Search links you saved earlier (`…/en/jobs?query=…&refinementList…`, any language) still work with all their filters, and a company page (`…/companies/doctolib`) gives all of that company's jobs. The place in an old link (`aroundQuery`) is read as a place name.

**How many jobs per search?** All of them, newest first. A live run read all 17,690 US jobs of one search in under 9 minutes without the full ad; with the full ad, a run of four searches delivered 2,302 jobs in 94 seconds.

**What does a place match?** Jobs with an office in that city, region or district — by the office's name, not a radius, because most jobs have no map point. A city's suburbs are places of their own: for Paris and La Défense, type Ile-de-France or add Courbevoie and Puteaux.

**Why do some jobs have no salary?** Many employers do not publish one. In live runs 13,647 of 17,690 US jobs had a salary, 355 of 1,412 data jobs in France and 158 of 794 software-engineer jobs in London. **Min yearly salary** compares in the ad's own currency, so pair it with a country.

**Why are some labels in French?** Sectors, professions and benefits come in the language of the link (`/fr/…`) or of **Language of the labels**. The ad itself is in the language the employer wrote it in (`language`).

**Are recruiters' names or phone numbers in the data?** The team, recruiter and recruitment-process parts of an ad are not read, and phone numbers and e-mail addresses in the ad texts are removed. Apply through the job's `url` or `applyUrl`.

**Is this affiliated with Welcome to the Jungle?** No. This is an independent tool that reads the job ads Welcome to the Jungle publishes.

**Like it?** A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.

# Actor input Schema

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

Welcome to the Jungle job search links (https://www.welcometothejungle.com/en/jobs?query=…\&refinementList…, any language) with all their filters, or company pages (https://www.welcometothejungle.com/fr/companies/doctolib) for all of a company's jobs. One per line.

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

Or search here without a link: job titles, skills or company names (data analyst, python, product designer). Each keyword is searched in each place below, or everywhere when there is no place. The filters below apply.

## `locations` (type: `array`):

Cities, regions, districts or countries, in English or the local language (Paris, München, Île-de-France, Hauts-de-Seine, Spain). A place without keywords gives all its jobs.

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

Optional: only jobs with an office in any of these countries.

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

Optional: only jobs of any of these kinds.

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

Optional: only jobs with any of these remote policies.

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

Optional: only ads written in any of these languages.

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

Optional: only jobs that publish a salary whose yearly minimum is at least this much, in the ad's own currency (EUR, USD, GBP…) — pair it with a country.

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

Optional: only jobs that ask for at most this many years of experience (0 = entry level). Jobs that do not say are left out.

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

Optional: only jobs published in the last this many days. 0: any date. Works for links too.

## `titleOnly` (type: `boolean`):

Match the keywords against the job title only, not the whole ad and company.

## `siteLanguage` (type: `string`):

For the keywords and places: the language of sectors, professions and benefits, and of the job links. Links use the language in their address.

## `maxListingsPerSearch` (type: `integer`):

Stops each search after this many jobs. Jobs come newest first.

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

Opens every job for the full ad text, the profile wanted, skills, tools, start date and the apply link. One more request per job.

## `maxConcurrency` (type: `integer`):

How many searches to work on at the same time.

## `proxyConfiguration` (type: `object`):

Used only when Welcome to the Jungle turns a request down: the first try goes out directly.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.welcometothejungle.com/en/jobs?query=python&refinementList%5Boffices.country_code%5D%5B%5D=FR"
  ],
  "postedWithinDays": 0,
  "titleOnly": false,
  "siteLanguage": "en",
  "maxListingsPerSearch": 30,
  "includeDetails": true,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every result as a JSON record, with a status for each input.

## `resultsCsv` (type: `string`):

The same records as CSV, for a spreadsheet.

# 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 = {
    "searchUrls": [
        "https://www.welcometothejungle.com/en/jobs?query=python&refinementList%5Boffices.country_code%5D%5B%5D=FR"
    ],
    "maxListingsPerSearch": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("highbrow_fame/welcome-to-the-jungle-jobs").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 = {
    "searchUrls": ["https://www.welcometothejungle.com/en/jobs?query=python&refinementList%5Boffices.country_code%5D%5B%5D=FR"],
    "maxListingsPerSearch": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("highbrow_fame/welcome-to-the-jungle-jobs").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 '{
  "searchUrls": [
    "https://www.welcometothejungle.com/en/jobs?query=python&refinementList%5Boffices.country_code%5D%5B%5D=FR"
  ],
  "maxListingsPerSearch": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call highbrow_fame/welcome-to-the-jungle-jobs --silent --output-dataset

```

## MCP server setup

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

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/VLHRG3tLm1jcttCkg/builds/xrzZ9NoGuZmkuZ2Nq/openapi.json
