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

Welcome to the Jungle Jobs Scraper SD - Welcome to the Jungle Jobs Scraper is a job data tool that extracts WTTJ job listings by keyword, company or URL: title, company, salary, remote policy, contract, offices, skills, apply link and full description. No login.

- **URL**: https://apify.com/neuro-scraper/welcome-to-the-jungle-jobs-scraper.md
- **Developed by:** [Neuro Scraper](https://apify.com/neuro-scraper) (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 $2.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

./README.md

# Actor input Schema

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

Keyword searched across Welcome to the Jungle's whole job board (title, company, missions, profile), e.g. "data engineer", "product manager", "marketing". Leave empty and set filters (contract type, country ...) to list every job that matches them.

## `searches` (type: `array`):

Extra keywords, one per line, each searched separately with the same filters, e.g. "devops", "UX designer". Jobs found by several searches are output once.

## `startUrls` (type: `array`):

Job search URLs (the query and refinementList\[...] filters in the URL are kept, e.g. https://www.welcometothejungle.com/en/jobs?query=python\&refinementList%5Bcontract_type%5D%5B%5D=full_time), company URLs (https://www.welcometothejungle.com/en/companies/anthropic - all its open jobs) or single job URLs (https://www.welcometothejungle.com/en/companies/<company>/jobs/<job>).

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

Company slugs or company page URLs, one per line, e.g. "anthropic", "doctolib", https://www.welcometothejungle.com/en/companies/qonto. Lists every open job of each company (the filters below still apply).

## `websiteCountry` (type: `string`):

Which language version of the site to read: the language of category, sector and benefit names and of the job URLs. Every version holds the same jobs.

## `language` (type: `array`):

Keep only jobs written in these languages (Welcome to the Jungle's language facet). Empty = all languages.

## `contractType` (type: `array`):

Keep only these contract types (several = any of them). Empty = all.

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

Keep only these remote-work policies (several = any of them). Empty = all.

## `experienceLevel` (type: `string`):

Keeps jobs whose minimum required experience falls in this band (Welcome to the Jungle's experience_level_minimum, in years).

## `educationLevel` (type: `array`):

Keep only jobs asking for these education levels (French levels, as on the site). Most jobs state none, so this filter shrinks results a lot.

## `salaryMin` (type: `integer`):

Keeps jobs whose published yearly minimum salary is at least this amount (in the job's own currency), e.g. 60000. Jobs without a salary are left out when this is set. 0 = off.

## `onlyWithSalary` (type: `boolean`):

Keeps only jobs that disclose a salary range.

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

Keeps jobs published in the last N days, e.g. 1 (last 24 hours), 7 or 30. 0 = any time.

## `countryCode` (type: `array`):

Two-letter office country codes, e.g. "FR", "US", "GB", "DE" (any of them). Empty = worldwide.

## `city` (type: `array`):

Office city names as the site writes them, e.g. "Paris", "New York", "London", "Lyon" (any of them). For a radius search use Location instead.

## `location` (type: `string`):

Place name resolved with the site's own location search, e.g. "Paris", "Berlin", "San Francisco", "France". A city searches around it (Radius); a country keeps offices in that country. "Worldwide" or empty = no location filter.

## `radiusKm` (type: `integer`):

Search radius around Location or Latitude/Longitude, in kilometres, e.g. 25.

## `latitude` (type: `string`):

Centre of a radius search, e.g. "48.8566" (with Longitude). Overrides Location.

## `longitude` (type: `string`):

Centre of a radius search, e.g. "2.3522" (with Latitude).

## `sector` (type: `array`):

Company sectors by name or Welcome to the Jungle reference, e.g. "Tech", "Software", "Banking / Insurance / Finance", "artificial-intelligence-machine-learning". Matched against the site's own sector filter at run time (any of them).

## `profession` (type: `array`):

Job categories or sub-categories by name or reference, e.g. "Tech & Engineering", "Data / Business Intelligence", "Sales", "product-management". Matched against the site's own category filter at run time (any of them).

## `companySize` (type: `string`):

Keeps jobs at companies of this size (number of employees published on the company profile).

## `onlyPromoted` (type: `boolean`):

Keeps only jobs the employer boosts (sponsored listings).

## `searchInTitleOnly` (type: `boolean`):

Searches the keyword in job titles only (e.g. "data" 9,454 jobs anywhere vs 2,749 in titles, measured 2026-10-09).

## `sortBy` (type: `string`):

Order of the results (beyond the first 1,000 jobs of a search the rest follow in the board's own order).

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

Opens each job's detail data for the full description (text + HTML), recruitment process, skills, tools, apply link, ATS, start date and company facts (average age, gender parity, revenue, website). One extra request per job; off = search data only (faster).

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

How many job details are fetched at the same time, each through its own proxy session.

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

Stop after this many jobs in total (all searches together). The scraper follows the result pages (30 jobs each) and, past 1,000 jobs of one search, the board's browse cursor until this number or the end.

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

Welcome to the Jungle answered every logged-out request without a challenge in tests; residential proxies are the default for steady runs on the Apify platform.

## Actor input object example

```json
{
  "query": "data engineer",
  "websiteCountry": "en",
  "language": [],
  "contractType": [],
  "remote": [],
  "experienceLevel": "any",
  "educationLevel": [],
  "salaryMin": 0,
  "onlyWithSalary": false,
  "postedWithinDays": 0,
  "radiusKm": 25,
  "companySize": "any",
  "onlyPromoted": false,
  "searchInTitleOnly": false,
  "sortBy": "relevance",
  "includeDetails": true,
  "maxConcurrency": 3,
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("neuro-scraper/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",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("neuro-scraper/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",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call neuro-scraper/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,neuro-scraper/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/LbLlqHeJZFcMTXFiL/builds/WFGvGmMtawb2m4p9K/openapi.json
