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

Scrape Welcome to the Jungle (WTTJ) jobs by keyword, location, contract, remote, salary, sector or company: full description, salary, apply link, skills and the employer's profile. No 1,000-result cap, monitor mode for new jobs, company profiles. $0.09 per 1,000 jobs. No login.

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

## Pricing

from $0.06 / 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

### What does Welcome to the Jungle Jobs Scraper do?

**Welcome to the Jungle Jobs Scraper** exports job postings from [welcometothejungle.com](https://www.welcometothejungle.com) (WTTJ), the job board of France's start-ups, scale-ups and large employers, also live in the US, UK, Spain and Czechia. Each row is one job: title, salary, contract, remote policy, office address, full description, apply link and ATS, skills, tools, and the employer's profile (headcount, revenue, gender parity, socials). It is built for recruiters, staffing agencies, HR-tech and sales teams who need WTTJ jobs in a spreadsheet, CRM or pipeline.

WTTJ scraper · Welcome to the Jungle API · WTTJ jobs export · welcometothejungle.com job data

<a href="https://console.apify.com/actors/LRMykTKf5jR0T9rnn"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/welcome-to-the-jungle-jobs-scraper-source.png" alt="Welcome to the Jungle job page that Welcome to the Jungle Jobs Scraper turns into one row" style="width:70%"></a>

- **Every field of the job page:** description (HTML, text and Markdown), candidate profile, recruitment process, key missions, salary range, contract length, experience and education, benefits by category, skills, tools, screening questions and the application form's fields.
- **No 1,000-result cap:** the site's own search stops at 1,000 jobs per search; this actor reads past it, up to the whole board (about 90,000 jobs on 2026-10-21) in one run.
- **The employer in the same row:** headcount, founding year, revenue, staff turnover, average age, women/men split, gender equality index, labels (B Corp, Great Place to Work…), head office, website, LinkedIn, X, Facebook, Instagram.
- **Company profiles and articles too:** switch the mode to export about 7,800 employer profiles or WTTJ's 8,600 career articles.
- **Monitor mode:** schedule it daily and get only jobs you have not received before; alerts to Slack, Discord, Telegram, WhatsApp or your webhook.
- **Optional add-ons:** the French company register record (SIREN, SIRET, NAF code, headcount band) and the employer's public email from its own website.
- **No login, cookies or WTTJ account:** you give search terms, filters or links.
- **Export anywhere:** JSON, CSV, Excel, XML; API, schedules, webhooks, Make, Zapier, n8n, Google Sheets, MCP.

### What data can you get from Welcome to the Jungle?

<table>
<tr>
<td>💼 Job title (<code>name</code>)</td>
<td>🏢 Company (<code>organizationName</code>)</td>
<td>📍 City, region, country, address, zip, GPS</td>
</tr>
<tr>
<td>💶 Salary from / to, currency, period</td>
<td>📄 Contract type and length</td>
<td>🏠 Remote policy</td>
</tr>
<tr>
<td>🎓 Experience (years) and education</td>
<td>📝 Description, profile, recruitment process</td>
<td>🎯 Key missions and WTTJ summary</td>
</tr>
<tr>
<td>🛠️ Skills and tools</td>
<td>🔗 Apply link + ATS (<code>applyUrl</code>, <code>ats</code>)</td>
<td>❓ Screening questions</td>
</tr>
<tr>
<td>🎁 Benefits by category</td>
<td>🏷️ Category, sub-category, profession, sectors</td>
<td>📅 Published, updated, start date</td>
</tr>
<tr>
<td>👥 Headcount, founding year, revenue</td>
<td>⚖️ Women/men split, equality index, turnover, average age</td>
<td>🌐 Website, LinkedIn, X, Facebook, Instagram</td>
</tr>
</table>

On a 1,000-job platform run (search `commercial`, run `XYP8cGJjkQlybqKm2`): description 100.0%, external apply link 96.8%, skills 90.8%, office address 98.8%, employer website 99.3%, LinkedIn 99.8%, average age 71.6%, revenue 25.7%, salary 15.0%. Fields WTTJ does not publish for a job are `null`, never a placeholder.

### How to scrape Welcome to the Jungle with Welcome to the Jungle Jobs Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up): $5 of monthly credit, no card needed.
2. Open [Welcome to the Jungle Jobs Scraper](https://apify.com/topapi/welcome-to-the-jungle-jobs-scraper) and click **Try for free**.
3. Type one or more **Search terms** (e.g. `data engineer`), pick a **Country** or **Location**, and add filters if you want them.
4. Set **Maximum results** and click **Start**. Rows stream into the dataset as they are read.
5. Open the **Storage** tab and **Export** as JSON, CSV or Excel, or let a schedule run it for you.

### ⬇️ Input

All filters are optional. Every filter applies to every search term, link and company in the run.

| Parameter | Type | Description |
|---|---|---|
| **🔍 What to scrape** | | |
| `mode` | Select | `jobs` (default), `companies`, `articles`, or `jobsAndCompanies` (each job plus one row per employer) |
| `searchQueries` | List | Search terms, one per line, matched like the site's search box. Empty = the newest jobs |
| `query` | String | One search term (same as one line above) |
| `startUrls` | List | WTTJ links: jobs, companies, searches (filters in the link are kept) or articles; or a file of links |
| `companies` | List | Company slugs or links, e.g. `doctolib`; jobs mode returns their open jobs |
| **🎯 Filters** (applied by WTTJ's search) | | |
| `websiteCountry` | Select | Site edition `en` / `fr` / `es` / `cs` / `sk`: translates labels and links. Default `en` |
| `location`, `locationRadius`, `radiusKm` | String / Select / Integer | A place resolved by WTTJ's own location search + radius (default 20 miles) |
| `latitude`, `longitude` | String | Search around exact coordinates |
| `countryCode` | String | One or more ISO codes (`FR`, `FR,BE`); overrides location |
| `cities`, `regions` | List | Exact office cities / regions or départements |
| `sortBy`, `datePosted`, `postedAfter`, `postedBefore` | Select / Date | Relevance or newest first; last 24 h to 30 days; fixed dates |
| `contractType`, `remote` | Multi-select | Permanent, fixed-term, internship, work-study, freelance, VIE…; fully / partial / occasional / no remote |
| `experienceLevel`, `experienceMin`, `experienceMax` | Select / Integer | Years of experience asked |
| `educationLevel` | Multi-select | No diploma to PhD |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `onlyWithSalary` | Integer / Multi-select / Boolean | Yearly salary range, currency, only jobs that publish a salary |
| `companySize`, `companySizeMin`, `companySizeMax` | Select / Integer | Employer headcount |
| `language`, `sector`, `occupation`, `jobSubCategory` | Select / Multi-select | Job language, 20 sectors + 99 sub-sectors, 20 job categories + 179 sub-categories |
| `companyLabels`, `companyCommitments`, `benefits` | Multi-select / List | Employer labels and commitments; benefits every job must offer |
| `onlyPromoted`, `searchOnlyInJobTitle`, `onlyHiring` | Boolean | Promoted jobs; match the title only; companies with open jobs |
| **✂️ Refine results** (applied before any charge) | | |
| `excludeKeywords`, `excludeCompanies` | List | Drop jobs by words in the title/company, or by company |
| `onlyWithApplyUrl`, `onlyWithApplicationQuestions`, `skipReposts` | Boolean | External apply link only; screening questions only; drop reposts |
| **➕ Extra data** | | |
| `includeDetails` | Boolean | The full job page. Default `true`, charged as `job-details` |
| `enrichCompanyRegistry` | Boolean | French register record per employer, charged as `company-registry` when matched |
| `enrichEmails` | Boolean | The employer's public email from its own website, charged as `email-found` when found |
| `includeArticleBody` | Boolean | Articles mode: the full article text. Default `true` |
| **🔁 Monitoring** | | |
| `monitorMode`, `monitorStoreName`, `monitorIncludeUpdated`, `resetMonitor` | Boolean / String | Only jobs not delivered by earlier runs; memory name; also edited jobs; start over |
| **🔔 Alerts** | | |
| `webhookUrl`, `webhookHeaders`, `slackWebhookUrl`, `discordWebhookUrl`, `telegramToken` + `telegramChatId`, `whatsappPhoneNumberId` + `whatsappAccessToken` + `whatsappTo`, `notificationLimit`, `notifyOnlyChanges` | String / Object / Integer / Boolean | Send the new rows after each run |
| **📦 Output** | | |
| `maxItems` | Integer | Default `100`; `0` = everything that matches (no 1,000 cap) |
| `maxItemsPerQuery`, `maxCompanies` | Integer | Per search / company cap; company rows in jobs + companies mode |
| `descriptionFormat`, `descriptionMaxLength` | Select / Integer | HTML + text + Markdown (default), HTML, text or Markdown; cut long texts |
| `compact`, `excludeEmptyFields` | Boolean | Core fields only (for AI agents and MCP); drop empty fields |
| `outputMode`, `chunkSize`, `chunkOverlap` | Select / Integer | `rag` adds `ragChunks` (overlapping word chunks) for vector databases |
| **⚙️ Advanced** | | |
| `proxyConfiguration`, `maxConcurrency` | Proxy / Integer | Not needed (direct connection, datacenter fallback); job pages read in parallel (default 20) |

#### Input JSON

```json
{
  "searchQueries": ["data engineer", "product manager"],
  "countryCode": "FR",
  "contractType": ["full_time"],
  "remote": ["fulltime", "partial"],
  "datePosted": "7",
  "maxItems": 200
}
```

#### Paste a search link to reuse filters you set on the site

A link such as `https://www.welcometothejungle.com/fr/jobs?query=python&refinementList[contract_type][]=internship&aroundLatLng=48.85,2.35&aroundRadius=20` keeps its query, its filters, its location and its sort. Company links (`…/companies/doctolib`) return that company's open jobs; job links return that one job.

#### Leave the search empty for the newest jobs

With no search term the actor returns the newest jobs that match your filters, newest first. `{"countryCode": "DE", "maxItems": 0}` exports every job with an office in Germany.

#### Monitor mode wants a fixed search

The memory is kept per search and per set of filters. Change a filter and the actor treats it as a new search. A relative window such as **Last 7 days** keeps the same memory from day to day.

### ⬆️ Output

<a href="https://console.apify.com/actors/LRMykTKf5jR0T9rnn"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/welcome-to-the-jungle-jobs-scraper-output.png" alt="Welcome to the Jungle Jobs Scraper output table with title, company, city, contract, remote policy, salary, skills and ATS" style="width:70%"></a>

Every job becomes one dataset item. A row from a real run (long texts shortened):

```json
{
  "id": "ef041186-2f0e-4448-bfaa-8b2e3963e47a",
  "reference": "GRF_5bkYMMM",
  "name": "Consultant commercial en recrutement -Alternance",
  "url": "https://www.welcometothejungle.com/en/companies/groupe-randstad/jobs/consultant-commercial-en-recrutement-alternance_metz_GRF_5bkYMMM",
  "contractType": "apprenticeship",
  "remote": "partial",
  "salaryMin": 10149,
  "salaryMax": 23604,
  "salaryCurrency": "EUR",
  "publishedAt": "2026-10-20T22:01:45Z",
  "category": "HR / People",
  "city": "Metz",
  "zipCode": "57000",
  "skills": [
    "Accessibility"
  ],
  "applyUrl": "http://ris.my.salesforce-sites.com/RecrutmentRIR/RIR_NouveauCandidatur…",
  "ats": "external",
  "descriptionText": "Dépasser nos objectifs en faisant le bonheur de nos clients,\n\nÇa nous booste, et vous ?\n\nS…",
  "organizationName": "Groupe Randstad France",
  "organizationEmployees": 4500,
  "organizationRevenue": "3,6 M€",
  "organizationParityWomen": 78
}
```

#### Fields

Fill measured on the 1,000 rows of platform run `XYP8cGJjkQlybqKm2`.

| Field | Type | What it is | Fill |
|---|---|---|---:|
| `name` | string | Job title (also as `title`) | 100.0% |
| `url` | string | Job page on welcometothejungle.com, in the chosen site language | 100.0% |
| `contractType` | string | `full_time`, `temporary`, `internship`, `apprenticeship`, `freelance`, `vie`… | 100.0% |
| `remote` | string | `fulltime`, `partial`, `punctual`, `no`, `unknown` | 100.0% |
| `salaryMin` / `salaryMax` / `salaryCurrency` | number / string | Published salary range (currency and period only when an amount is published) | 15.0% |
| `experienceLevel` | number | Minimum years of experience asked | 86.6% |
| `educationLevel` | string | French diploma scale (`bac_5` = master) | 72.5% |
| `publishedAt` | string (ISO 8601) | Publication date | 100.0% |
| `category` / `subcategory` | string | WTTJ job category and sub-category | 100.0% |
| `sectors` | array | Employer sectors | 99.9% |
| `summary` / `keyMissions` | string / array | WTTJ's summary and key missions of the job | 100.0% |
| `city` / `address` / `zipCode` | string | Office of the job | 98.8% |
| `latitude` / `longitude` | number | Office coordinates | 97.0% |
| `description` | string | Full description (HTML; `descriptionText` and `descriptionMarkdown` too) | 100.0% |
| `profile` | string | Candidate profile | 82.1% |
| `recruitmentProcess` | string | Recruitment process | 4.1% |
| `skills` | array | Skills, in the site language | 90.8% |
| `tools` | array | Tools / tech stack of the job | 9.2% |
| `applyUrl` | string | The employer's own application page (`applyMethod`: `external`; `wttj` = apply on WTTJ) | 96.8% |
| `ats` | string | Applicant tracking system behind the job | 100.0% |
| `applicationFields` | array | Application form fields and whether each is mandatory | 96.7% |
| `atsQuestions` | array | Screening questions | 1.8% |
| `benefits` / `benefitCategories` | array | Benefits, flat and by category | 31.8% |
| `startDate` | string | Start date | 11.1% |
| `organizationName` | string | Company | 100.0% |
| `organizationEmployees` | number | Headcount | 100.0% |
| `organizationCreationYear` | number | Founded | 96.8% |
| `organizationIndustry` | string | Industry | 99.9% |
| `organizationRevenue` | string | Revenue as the company states it | 25.7% |
| `organizationAverageAge` | number | Average employee age | 71.6% |
| `organizationParityWomen` / `organizationParityMen` | number | Share of women / men (%) | 20.8% |
| `organizationTurnover` | number | Staff turnover (%) | 1.7% |
| `organizationEqualityIndex` | number | French gender equality index (+ breakdown) | 27.6% |
| `organizationLabels` | array | Labels (B Corp, Great Place to Work, EcoVadis…) | 66.3% |
| `organizationWebsite` | string | Company website | 99.3% |
| `organizationLinkedin` / `organizationTwitter` | string | Social profiles (also Facebook, Instagram, YouTube) | 99.8% |
| `organizationHeadquarter` | object | Head office address and coordinates | 100.0% |
| `searchRanking` | object | WTTJ's own ranking signals for the job (profile ranking, organization score, rank groups) | every search row |
| `socialImage` | string | The job's share image | every job page |
| `companyRegistry` | object | French register record (add-on): SIREN, SIRET, legal name and form, NAF code, headcount band, PME/ETI/GE, creation date, head office, register link | add-on |
| `contactEmail` / `contactEmails` / `contactWebsite` | string / array | Public email(s) on the employer's own website (add-on) and the page it was on | add-on |
| `contentHash` / `isRepost` / `repostOfId` / `changeType` | string / boolean | Repost detection and monitor state (`new`, `updated`) | every row |

Company rows (`mode: companies`) carry `name`, `url`, `description`, `size`, `employees`, `sectors`, `techStack` (tools by category), `jobsCount`, `website`, `offices`, `headquarterCity`, `labels`, `equalityIndex`, the dossier fields above when the company has an open job, and the add-ons. Article rows carry `name`, `url`, `language`, `kind`, `lead`, `body`, `bodyText`, `wordCount`, `categories`, `authors`, `organizations` and `publishedAt`.

### How can I use Welcome to the Jungle jobs data?

- 🎯 **Recruitment and staffing agencies:** find employers hiring for the roles you place, with the hiring company's size, sector and website.
- 💼 **B2B sales and account-based marketing:** hiring is a buying signal; a company opening five data roles needs data tools. Pair it with the register and email add-ons.
- 📊 **HR, compensation and labour-market analysts:** salary ranges by role, city, contract and experience across France, the US and Europe.
- 🧑‍💻 **Job boards and aggregators:** a structured feed with descriptions, apply links and ATS, refreshed by a daily monitor.
- 🏢 **Employer-branding and HR-tech vendors:** spot employers without an external ATS, with low parity scores or with screening questions.
- 🤖 **AI and research teams:** RAG chunks and compact rows for vector databases and agents.

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

Welcome to the Jungle Jobs Scraper is pay-per-result: **$0.06 per 1,000 jobs** plus **$0.03 per 1,000 jobs that carry the full job page** (on by default, so **$0.09 per 1,000 jobs** with the job page), no start fee. Company profiles and articles are $0.36 per 1,000. A run is charged only for the rows written to the dataset after your filters.

| Jobs | With the job page (default) | Listing only |
|---:|---:|---:|
| 100 | $0.009 | $0.006 |
| 1,000 | $0.09 | $0.06 |
| 10,000 | $0.90 | $0.60 |
| 90,000 (the whole board) | $8.10 | $5.40 |

| Add-on | Price |
|---|---|
| French company register match (`company-registry`) | $0.0018 per employer matched, once per run |
| Employer email found (`email-found`) | $0.045 per employer with an email on its website, once per run; no email, no charge |

There is nothing else to pay: Apify platform usage (compute, proxy) is included in these prices. On the test runs, 1,000 jobs with their job pages took 11.6 seconds on 256 MB, 100 jobs 4 seconds.

### Integrations, API, scheduling & MCP

- **Schedules:** run it hourly, daily or weekly from the **Schedules** tab; with **Only new jobs** each run returns only jobs you have not received.
- **Alerts:** Slack, Discord, Telegram, WhatsApp or any webhook, straight from the input.
- **No-code:** Make, Zapier, n8n, Google Sheets, Airtable via [Apify integrations](https://docs.apify.com/integrations).
- **API:** call it from Node.js or Python with `apify-client`; code on the [API tab](https://apify.com/topapi/welcome-to-the-jungle-jobs-scraper/api/python) and the [Apify API reference](https://docs.apify.com/api/v2).
- **MCP / AI agents:** connect Claude, Cursor or any MCP client through the [MCP tab](https://apify.com/topapi/welcome-to-the-jungle-jobs-scraper/api/mcp) and ask for WTTJ jobs in plain language; **Compact rows** keeps the answers small.

### More TopApi scrapers

<table>
<tr>
<td>💼 <a href="https://apify.com/topapi/indeed-jobs-scraper">Indeed Jobs Scraper</a>: the same job rows from Indeed's 62 country sites</td>
<td>🧰 <a href="https://apify.com/topapi/website-technology-scraper">Website Technology Scraper</a>: the tech stack behind an employer's website</td>
<td>📈 <a href="https://apify.com/topapi/similarweb-scraper">Similarweb Scraper</a>: traffic and audience of the employers you find</td>
</tr>
<tr>
<td>🌐 <a href="https://apify.com/topapi/website-content-crawler">Website Content Crawler</a>: crawl an employer's own site to text</td>
<td>⭐ <a href="https://apify.com/topapi/trustpilot-reviews-scraper">Trustpilot Reviews Scraper</a>: what customers say about them</td>
<td>🧭 <a href="https://apify.com/topapi">All TopApi actors</a></td>
</tr>
</table>

### Limits & empty runs

- **Results per search:** no 1,000-job cap. WTTJ's search pages stop at 1,000 results, so runs above 1,000 read WTTJ's index in its own order (newest first when sorted by date); runs up to 1,000 keep the relevance order.
- **Speed:** about 1,000 jobs with job pages in 12 seconds on 256 MB (run `XYP8cGJjkQlybqKm2`); listing-only rows are faster (30 jobs in 1.5 seconds).
- **Salary:** WTTJ shows a salary on part of its jobs (15.0% on the 1,000-job sales run above); `salaryMin`/`salaryMax` are `null` on the rest, never zero.
- **Employer figures:** revenue, turnover, parity and the equality index are filled only when the employer publishes them on its WTTJ page.
- **`team`:** a rival lists it, but it was empty on every job page we read, so it is not a field.
- **Company profiles:** companies mode covers the about 7,800 employers with a profile on welcometothejungle.com; partner job-board copies of the same company are merged.
- **Empty dataset:** no job matches the search and filters (the run status gives the number of matches for each search), or, in monitor mode, nothing is new since the last run. Nothing is charged for an empty run.
- **Register add-on:** French employers only, and only when the register gives exactly one company for the employer's name with the same head-office city or creation year (11 of 25 French employers in our test sample).

### FAQ

#### How many jobs can Welcome to the Jungle Jobs Scraper collect in one run?

As many as match. WTTJ's search pages stop at 1,000 results per search, but this actor reads WTTJ's index past that point: set **Maximum results** to `0` for every match, up to the whole board (about 90,000 jobs on 2026-10-21).

#### Can I run Welcome to the Jungle Jobs Scraper on a schedule to get new jobs automatically?

Yes. Save your input as a task, turn on **Only new jobs (monitor)**, and add a daily schedule. Each run returns jobs that earlier runs did not deliver; a run that finds nothing new returns nothing and charges nothing. About 2,800 jobs are published on WTTJ every day.

#### Does Welcome to the Jungle Jobs Scraper return the full job description?

Yes, with **Include the full job page** on (the default): description, candidate profile, recruitment process, apply link, ATS, skills, tools, screening questions and the employer's profile, plus WTTJ's own summary and key missions.

#### Can Welcome to the Jungle Jobs Scraper export company profiles?

Yes. Set **What to collect** to **Companies** and search by name, sector, size or country, or paste company links. **Jobs + one company row per employer** returns both in one run.

#### Can I integrate Welcome to the Jungle Jobs Scraper with other apps?

Yes: Make, Zapier, n8n, Google Sheets, Slack and more via [Apify integrations](https://docs.apify.com/integrations), or [webhooks](https://docs.apify.com/integrations/webhooks) when a run finishes. The built-in alerts post new jobs to Slack, Discord, Telegram, WhatsApp or your webhook.

#### Can I use Welcome to the Jungle Jobs Scraper with the Apify API?

Yes. Start runs, fetch datasets and manage schedules with `apify-client` for [Node.js](https://apify.com/topapi/welcome-to-the-jungle-jobs-scraper/api/javascript) or [Python](https://apify.com/topapi/welcome-to-the-jungle-jobs-scraper/api/python). Input names match the most-used WTTJ actor (`query`, `websiteCountry`, `location`, `countryCode`, `contractType`, `remote`, `salaryMin`, `maxItems`…).

#### Can I use Welcome to the Jungle Jobs Scraper through an MCP server?

Yes. Open the [MCP tab](https://apify.com/topapi/welcome-to-the-jungle-jobs-scraper/api/mcp), connect Claude Desktop, Cursor or another MCP client, and ask for jobs in plain language. Turn on **Compact rows** to keep answers short.

#### Do I need a Welcome to the Jungle account, cookies or an API key?

No. The actor reads what WTTJ shows to every visitor; you pass search terms, filters or links and nothing else.

#### Why did my Welcome to the Jungle Jobs Scraper run return no results?

Usually the filters: several filters together (a city, a sector and a salary floor) can match nothing. A location also applies to company links. The run's status line and the `RUN_SUMMARY` record give the number of matches for each search and what each filter removed. In monitor mode, an empty run means nothing new since the last run.

#### How is Welcome to the Jungle Jobs Scraper different from other WTTJ scrapers?

It reads WTTJ's own search index and job API instead of rendering pages, so it needs no browser and 256 MB, and it goes past the 1,000-result cap of the site's search. Each row joins the search record (WTTJ's summary and key missions) with the full job page and the employer's profile, and the input takes the same names as the most-used WTTJ actor. On top: company and article modes, repost detection, a monitor mode that only returns new jobs, alerts, RAG chunks, the French register and employer-email add-ons, at $0.09 per 1,000 jobs with the job page.

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

Welcome to the Jungle Jobs Scraper extracts only publicly available job postings and company profiles; it does not log in or collect private data. Job pages can still name people, and personal data is regulated (for example by GDPR). Make sure you have a legitimate purpose before you use it.

#### Your feedback

We keep improving Welcome to the Jungle Jobs Scraper. Found a bug or missing a field? Open an issue on the [Issues tab](https://apify.com/topapi/welcome-to-the-jungle-jobs-scraper/issues/open).

# Actor input Schema

## `mode` (type: `string`):

Jobs is the usual choice. Companies returns employer profiles (search them by name or paste company links); Articles returns WTTJ's career articles.

## `searchQueries` (type: `array`):

One search per line, matched like the site's search box: job title, skill or keyword. E.g. "data engineer", "product manager", "commercial". Links pasted here also work.

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

The same as one line of Search terms (kept for API callers who send a single string).

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

Job links (…/companies/<company>/jobs/<job>), company links (…/companies/<company>), search links (…/jobs?query=…\&refinementList…) or article links. You can also link a text file of URLs.

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

Company slugs or links, e.g. "doctolib", "back-market" or https://www.welcometothejungle.com/en/companies/qonto. Jobs mode returns their open jobs; Companies mode their profiles.

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

The site edition. It translates category, sector and benefit labels and sets the language of the links. Job titles and descriptions stay in the language the employer wrote them.

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

City, region or country, resolved by WTTJ's own location search, e.g. "Paris", "Lyon", "London", "New York". City searches use the radius below. Ignored when Country is set.

## `locationRadius` (type: `string`):

Search radius around a city location.

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

Radius in kilometres; overrides the miles setting above.

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

Search around exact coordinates instead of a place name, e.g. "48.8566" (with Longitude).

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

E.g. "2.3522" (with Latitude).

## `countryCode` (type: `string`):

Jobs with an office in this country (ISO code). Pick one or type several separated by commas, e.g. "FR,BE". Overrides Location.

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

Exact office city names as WTTJ writes them, e.g. "Paris", "Lyon", "Saint-Ouen-sur-Seine".

## `regions` (type: `array`):

Region or département, e.g. "Ile-de-France", "Hauts-de-Seine", "Bavaria".

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

Newest first is also what monitoring uses.

## `datePosted` (type: `string`):

Only jobs published in this window (about 2,800 new jobs a day across the site).

## `postedAfter` (type: `string`):

A fixed start date (YYYY-MM-DD).

## `postedBefore` (type: `string`):

A fixed end date (YYYY-MM-DD).

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

Any of these contract types.

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

Any of these remote policies.

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

Minimum years of experience the job asks for.

## `experienceMin` (type: `integer`):

Jobs asking for at least this many years.

## `experienceMax` (type: `integer`):

Jobs asking for at most this many years, e.g. 2 for junior roles.

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

Any of these diploma levels (French scale).

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

Jobs whose published yearly salary starts at or above this, e.g. 50000. Jobs without a salary are left out.

## `salaryMax` (type: `integer`):

Jobs whose published yearly salary starts at or below this.

## `salaryCurrency` (type: `array`):

Jobs paid in these currencies.

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

Keep only jobs that publish a salary (about a third of them do).

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

Employer headcount band.

## `companySizeMin` (type: `integer`):

Employers with at least this many employees.

## `companySizeMax` (type: `integer`):

Employers with at most this many employees.

## `language` (type: `string`):

The language the job is written in (about 64% French, 35% English).

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

Employer sectors: a whole sector ("Tech (all)") or a sub-sector ("Software").

## `occupation` (type: `array`):

WTTJ job categories, e.g. Tech & Engineering, Sales & Customer Service.

## `jobSubCategory` (type: `array`):

Finer job families, e.g. Software & Web Development, Data / Business Intelligence.

## `companyLabels` (type: `array`):

Employers holding any of these labels (Great Place to Work, B Corp, EcoVadis, Happy Trainees…).

## `companyCommitments` (type: `array`):

Employers declaring any of these commitments.

## `benefits` (type: `array`):

Benefits every job must offer, written as the site shows them in the chosen website language, e.g. "Parking", "Between 1-2 days at home".

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

Jobs the employer is boosting on WTTJ.

## `searchOnlyInJobTitle` (type: `boolean`):

Match the search terms against the job title only, not the whole posting.

## `onlyHiring` (type: `boolean`):

Companies mode: skip employers that have no open job.

## `excludeKeywords` (type: `array`):

Drop jobs whose title or company name contains any of these words, e.g. "stage", "alternance", "senior".

## `excludeCompanies` (type: `array`):

Company names or slugs to leave out, e.g. "randstad".

## `onlyWithApplyUrl` (type: `boolean`):

Keep jobs that send you to the employer's own application site (reads the job page).

## `onlyWithApplicationQuestions` (type: `boolean`):

Keep jobs whose application form asks screening questions (reads the job page).

## `skipReposts` (type: `boolean`):

Drop a job that repeats one already returned (same employer, same title and text, new ID).

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

Description, profile, recruitment process, apply link + ATS, skills, tools, screening questions, office address and the employer profile. Charged as job-details ($0.03 per 1,000).

## `enrichCompanyRegistry` (type: `boolean`):

For French employers: SIREN, SIRET, legal name and form, NAF code, headcount band, PME/ETI/GE category, creation date and head-office address from the official register. $0.0018 per employer matched.

## `enrichEmails` (type: `boolean`):

Reads the employer's own website (home + contact pages) for a public email address. $0.045 per employer with an email found; no email, no charge.

## `includeArticleBody` (type: `boolean`):

Articles mode: the full article body (HTML and text).

## `monitorMode` (type: `boolean`):

Return only jobs not delivered by earlier runs of the same search. Pairs with a daily schedule: a run that finds nothing new charges nothing.

## `monitorStoreName` (type: `string`):

Named key-value store holding what was already delivered. Use different names to keep separate alert histories.

## `monitorIncludeUpdated` (type: `boolean`):

Re-deliver a job seen before when its text changed (marked changeType "updated").

## `resetMonitor` (type: `boolean`):

Start the monitor memory over for these searches.

## `webhookUrl` (type: `string`):

POST a JSON message with the new rows to this URL after the run.

## `webhookHeaders` (type: `object`):

Extra headers for the webhook, e.g. {"Authorization": "Bearer …"}.

## `slackWebhookUrl` (type: `string`):

A Slack incoming-webhook URL.

## `discordWebhookUrl` (type: `string`):

A Discord channel webhook URL.

## `telegramToken` (type: `string`):

Your bot's token (with Telegram chat ID).

## `telegramChatId` (type: `string`):

The chat or channel ID the bot posts to.

## `whatsappPhoneNumberId` (type: `string`):

WhatsApp Cloud API sender phone number ID.

## `whatsappAccessToken` (type: `string`):

WhatsApp Cloud API access token.

## `whatsappTo` (type: `string`):

Recipient phone number in international format.

## `notificationLimit` (type: `integer`):

How many rows to list in each alert.

## `notifyOnlyChanges` (type: `boolean`):

Skip the alert when a run delivers nothing.

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

Total jobs (or companies / articles) per run. 0 = everything that matches: there is no 1,000-result cap (the whole site is about 90,000 jobs).

## `maxItemsPerQuery` (type: `integer`):

Cap per search term, link or company. 0 = no per-search cap.

## `maxCompanies` (type: `integer`):

Jobs + companies mode: cap on the company rows. 0 = one per employer found.

## `descriptionFormat` (type: `string`):

Format of the description and other long texts.

## `descriptionMaxLength` (type: `integer`):

Characters per long text field. 0 = full text.

## `compact` (type: `boolean`):

Core fields only (title, company, place, contract, remote, salary, date, links, summary), sized for AI agents and MCP.

## `excludeEmptyFields` (type: `boolean`):

Leave out fields that are empty for a row.

## `outputMode` (type: `string`):

RAG adds ragChunks: the job text split into overlapping chunks for vector databases.

## `chunkSize` (type: `integer`):

Words per chunk.

## `chunkOverlap` (type: `integer`):

Words shared by consecutive chunks.

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

Not needed: Welcome to the Jungle answers direct connections, with the Apify datacenter proxy as the automatic fallback.

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

Job pages read at the same time (40 reads 1,000 job pages in about 20 seconds).

## Actor input object example

```json
{
  "mode": "jobs",
  "searchQueries": [
    "data engineer"
  ],
  "websiteCountry": "en",
  "locationRadius": "20",
  "countryCode": "FR",
  "sortBy": "relevance",
  "datePosted": "any",
  "onlyWithSalary": false,
  "onlyPromoted": false,
  "searchOnlyInJobTitle": false,
  "onlyHiring": false,
  "onlyWithApplyUrl": false,
  "onlyWithApplicationQuestions": false,
  "skipReposts": false,
  "includeDetails": true,
  "enrichCompanyRegistry": false,
  "enrichEmails": false,
  "includeArticleBody": true,
  "monitorMode": false,
  "monitorStoreName": "wttj-jobs-monitor",
  "monitorIncludeUpdated": false,
  "resetMonitor": false,
  "notificationLimit": 10,
  "notifyOnlyChanges": true,
  "maxItems": 50,
  "maxItemsPerQuery": 0,
  "maxCompanies": 0,
  "descriptionFormat": "all",
  "descriptionMaxLength": 0,
  "compact": false,
  "excludeEmptyFields": false,
  "outputMode": "raw",
  "chunkSize": 512,
  "chunkOverlap": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxConcurrency": 40
}
```

# Actor output Schema

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

No description

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

No description

## `runSummary` (type: `string`):

No description

# 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 = {
    "searchQueries": [
        "data engineer"
    ],
    "countryCode": "FR",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/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 = {
    "searchQueries": ["data engineer"],
    "countryCode": "FR",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("topapi/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 '{
  "searchQueries": [
    "data engineer"
  ],
  "countryCode": "FR",
  "maxItems": 50
}' |
apify call topapi/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,topapi/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/LRMykTKf5jR0T9rnn/builds/egSUIOSagCLJIqBbk/openapi.json
