# Welcome to the Jungle Job Listings & Salary Scraper (`nimbryxo-studio/welcome-to-the-jungle-job-listings-and-salary`) Actor

Search Welcome to the Jungle job postings by keyword, location, contract type and remote policy. Returns company, salary when disclosed, sector, experience and education requirements for each listing.

- **URL**: https://apify.com/nimbryxo-studio/welcome-to-the-jungle-job-listings-and-salary.md
- **Developed by:** [Nimbryxo-studio](https://apify.com/nimbryxo-studio) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.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

## Welcome to the Jungle Jobs & Company Profiles Scraper

Welcome to the Jungle is one of Europe's largest job boards, with detailed postings from French and international employers. This actor searches live job listings, fetches complete job records from URLs, and builds company profiles with their open roles, sectors, benefits and tech stacks. No account, cookies or proxy setup is required.

### What this actor does

- **Three modes:** `search` for keyword and filtered job discovery, `byUrl` for specific job links, and `company` for company profiles with current openings.
- **Rich filters:** role family and specialism, city or country, remote policy, contract type, experience range, disclosed salary, posting date, education level, company size and posting language.
- **Complete job records:** salary bands, benefits, missions, profession taxonomy, offices, application links, skills and tools.
- **Company profiles:** description, offices, size, creation year, gender parity, labels, social links and a job list.
- **Empty fields are omitted:** a value the source does not publish is left out of that record instead of being sent as `null`.

### Output per job

- `recordType` — `job`
- `jobId`, `wkReference` — stable job identifiers
- `title`, `jobLanguage`
- `companyName`, `companySlug`, `companyReference`
- `companyLogoUrl`, `companyLogoThumbUrl`
- `companyCoverImageUrl`, `companyCoverImageSmallUrl`, `companyCoverImageMediumUrl`, `companyCoverImageLargeUrl`
- `companySummary`, `companyDescription`, `companyUrl`
- `companyEmployeeCount`, `companyCreationYear`, `companyEqualityIndex`
- `companyLabels`, `companyCommitments`, `companyProfileType`
- `companyWebsite`, `companyAverageAge`, `companyParityWomen`, `companyParityMen`, `companyTurnover`, `companyRevenue` — added when full details are enabled
- `professionCategory`, `professionSubCategory`, `jobTitle`
- `professionCategoryReference`, `professionSubCategoryReference`, `professionPivotReference`
- `sectors`, `sectorCategories`, `sectorReferences`, `sectorCategoryReferences`
- `location`, `cities`, `countries`, `countryCodes`, `states`, `districts`, `addresses`, `offices`
- `contractType`, `contractTypeRaw`, `contractDurationMinMonths`, `contractDurationMaxMonths`
- `remote`, `remoteRaw`
- `salary`, `salaryCurrency`, `salaryMin`, `salaryMax`, `salaryYearlyMinimum`, `salaryPeriod`, `isSalaryDisclosed`
- `description`, `candidateProfile`, `keyMissions`, `benefits`
- `publishedAt`, `publishedAtDate`, `publishedAtTimestamp`
- `experience`, `experienceMinimumYears`
- `experienceMaximumYears`, `experienceLevelRaw`, `experienceRange` — added when full details are enabled
- `educationLevel`, `educationLevelRaw`
- `applicationUrl`, `sourceUrl`
- `fullDescription`, `fullDescriptionHtml`, `lookingFor`, `recruitmentProcess`, `applyUrl`, `startDate` — added when full details are enabled
- `skills`, `tools` — added when full details are enabled
- `scrapedAt` — ISO 8601 timestamp

### Output per company

- `recordType` — `company`
- `companyName`, `companySlug`, `companyReference`
- `companyLogoUrl`, `companyLogoThumbUrl`
- `companyCoverImageUrl`, `companyCoverImageSmallUrl`, `companyCoverImageMediumUrl`, `companyCoverImageLargeUrl`
- `companySummary`, `companyDescription`, `companyWebsite`, `companyUrl`
- `companyEmployeeCount`, `companyCreationYear`, `companyAverageAge`
- `companyParityWomen`, `companyParityMen`, `companyTurnover`, `companyRevenue`
- `companyEqualityIndex`, `companyEqualityDetails`, `companyLabels`, `companyCommitments`, `companyProfileType`
- `companySize`, `companyTools`, `companyToolsByCategory`
- `companyHasTechPage`, `companyAcceptsSpontaneousApplication`, `companyAlternativeNames`
- `companyLanguages`, `companyProfilePublishedAt`
- `whatTheyLookFor`, `goodToKnow`, `profileSections`, `socialLinks`, `profileLanguage`
- `sectors`, `sectorCategories`, `sectorReferences`, `sectorCategoryReferences`
- `location`, `cities`, `countries`, `countryCodes`, `districts`, `addresses`, `offices`
- `jobCount` — total open jobs reported by the company
- `jobs` — current openings with title, location, contract, remote policy, salary, experience and links
- `scrapedAt` — ISO 8601 timestamp

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search`, `byUrl` or `company` |
| `searchQuery` | string | – | Job title, skills or keywords (mode=search). |
| `jobUrls` | array | – | Job URLs or job IDs to fetch (mode=byUrl). |
| `companies` | array | – | Company slugs or company URLs (mode=company). |
| `location` | string | – | City, region, district or country name/code. |
| `country` | string | any | Office country code from the dropdown. |
| `contractType` | string | any | Employment contract type. |
| `remote` | string | any | Remote work policy. |
| `language` | string | any | Language the posting is written in. |
| `professionCategory` | string | any | Broad role family. |
| `professionSubCategory` | string | any | Narrower role specialism. |
| `sector` | string | any | Hiring company's industry. |
| `company` | string | – | Only jobs from this company (name, slug or URL). |
| `educationLevel` | string | any | Minimum education level required. |
| `minExperienceYears` | integer | `0` | Minimum years of experience; `0` means no minimum. |
| `maxExperienceYears` | integer | `0` | Maximum years of experience; `0` means no maximum. |
| `minSalaryYearly` | integer | `0` | Minimum disclosed yearly salary. |
| `onlyWithSalary` | boolean | `false` | Keep only postings that publish a salary amount (yearly, monthly, daily or hourly). |
| `companySizeMin` | integer | `0` | Minimum company headcount; `0` means no minimum. |
| `companySizeMax` | integer | `0` | Maximum company headcount; `0` means no maximum. |
| `postedWithinDays` | integer | `0` | Only jobs published in the last N days; `0` means any date. |
| `postedAfter` | string | – | Only jobs published on or after this date. |
| `postedBefore` | string | – | Only jobs published on or before this date. |
| `sortBy` | string | `relevance` | `relevance` or `newest`. |
| `includeDetails` | boolean | `false` | Fetch the full posting, skills, tools and apply link for each job. |
| `includeCompanyJobs` | boolean | `true` | For mode=company, include current openings. |
| `maxItems` | integer | `50` | Maximum job records, or maximum jobs per company. |

### Examples

#### Example: software roles in Paris with salary and full details

```json
{
    "mode": "search",
    "searchQuery": "software engineer",
    "location": "Paris",
    "contractType": "full_time",
    "remote": "partial",
    "minExperienceYears": 3,
    "minSalaryYearly": 50000,
    "includeDetails": true,
    "maxItems": 50
}
```

#### Example: remote product roles posted this week

```json
{
    "mode": "search",
    "searchQuery": "product manager",
    "remote": "fulltime",
    "postedWithinDays": 7,
    "language": "en",
    "sortBy": "newest",
    "maxItems": 100
}
```

#### Example: fetch specific job links

```json
{
    "mode": "byUrl",
    "jobUrls": [
        "https://www.welcometothejungle.com/en/companies/manty/jobs/software-engineer-stage-de-fin-d-etudes_paris",
        "https://www.welcometothejungle.com/fr/companies/axa/jobs/software-engineer-fullstack-python-react_paris"
    ]
}
```

#### Example: company profiles with open roles

```json
{
    "mode": "company",
    "companies": ["axa", "manty"],
    "includeCompanyJobs": true,
    "includeDetails": false,
    "maxItems": 20
}
```

### Use cases

- **Recruitment sourcing** — build a fresh feed of open roles filtered by role, city, remote policy and seniority.
- **Salary benchmarking** — compare disclosed pay bands by role, country and company.
- **Hiring intelligence** — monitor which companies are hiring and how their open roles change.
- **Tech-stack research** — discover the tools and skills employers name in their postings.
- **Company research** — collect profiles, offices, size and social links for target employers.
- **Labour-market analysis** — analyse contract types, remote policies and experience requirements across markets.

### Limitations

- Salary, experience, education, benefits and external apply links are returned only when the employer publishes them. Missing values are omitted, never estimated. Salary currency and the normalized yearly minimum are also conditional: a record can disclose a monthly or yearly amount without either.
- `onlyWithSalary` matches any published salary amount, including monthly, daily and hourly pay that has no normalized yearly minimum. `minSalaryYearly` is stricter: it only matches records with a disclosed yearly minimum at or above the requested amount.
- Company statistics such as average age, gender parity, equality details, tech stack and company size are available for many but not all companies. Missing values are omitted.
- Company mode accepts a company slug or company URL. Internal company references are not supported by the public company endpoint.
- A single run returns at most 10,000 jobs. For larger result sets, narrow the query with filters or run several searches.
- Company search/crawl-all, geographic radius search, multi-query batches, incremental change tracking and email/RAG enrichment are not part of this actor.
- Welcome to the Jungle protects its HTML pages with a WAF; the actor reads the public JSON endpoints, so you do not need a browser, cookies or a proxy.

### FAQ

**Do I need a Welcome to the Jungle account?**
No. The actor reads public job listings and company profiles without logging in.

**Do I need to configure a proxy?**
No. The actor handles its connections automatically; just fill in the input and run it.

**How fresh is the data?**
Each run reads the current live listings. Use `postedWithinDays`, `postedAfter` or `postedBefore` to keep only recent postings.

**Why is salary missing from some records?**
Many employers do not publish a salary. When they do, the actor returns the range, period and currency when published, plus a normalized yearly minimum when the source provides one. The actor never estimates pay.

**Why are experience or education fields missing?**
Those values are omitted when the posting does not state them.

**Do salary and experience filters include postings that do not state those values?**
No. When you set a minimum or maximum experience, or a minimum salary, only postings that state a value in that range are kept. Leave the filter at `0` to include postings without that information. `onlyWithSalary` keeps any posting with a published amount, regardless of pay period.

**Does `minSalaryYearly` convert currencies?**
No. It compares the disclosed yearly minimum in the job's own currency. Use `salaryCurrency` to separate currencies when you analyse the results.

**How many results can one search return?**
Up to 10,000 jobs per run. The source's normal search page caps at 1,000 hits, so the actor switches to cursor-based browsing for larger runs. Add filters, narrow the query, or run several searches to cover more.

**Can I paste a company reference instead of a slug?**
Company mode accepts a company slug or company URL. Use the slug from the company page URL, for example `axa` from `https://www.welcometothejungle.com/en/companies/axa`.

**What is the difference between `salary` and `salaryYearlyMinimum`?**
`salary` is a readable range using the source's own period (yearly, monthly, daily or hourly). `salaryYearlyMinimum` normalizes the minimum to a yearly figure for comparison and is omitted when the source does not provide that normalized value; `salary`, `salaryMin`, `salaryMax` and `salaryPeriod` can still be present.

**What is the difference between `skills` and `tools`?**
`skills` are the abilities named in the posting (for example teamwork or technical specifications). `tools` are the named technologies and platforms (for example Python, React or PostgreSQL).

**Why does company mode return one record per company?**
Company mode returns a company profile with its open roles inside `jobs`. Use `byUrl` or `search` when you need one record per job.

**Is this actor affiliated with Welcome to the Jungle?**
No. This is an independent, third-party actor that reads publicly available data. It is not affiliated with or endorsed by Welcome to the Jungle.

# Actor input Schema

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

What to scrape: search live job postings, fetch specific job URLs, or build company profiles.

## `searchQuery` (type: `string`):

Job title, skills or keywords (mode=search), e.g. 'software engineer'. Required for mode=search unless you set at least one filter.

## `jobUrls` (type: `array`):

Welcome to the Jungle job URLs or job IDs to fetch (mode=byUrl).

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

Company slugs or company URLs to build profiles for (mode=company), e.g. 'axa' or https://www.welcometothejungle.com/en/companies/axa.

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

City, region, district or country name/code (e.g. Paris, London, France, FR). City and region matches are exact. Leave empty for all locations.

## `country` (type: `string`):

Office country. Use the dropdown or leave it on Any.

## `contractType` (type: `string`):

Employment contract type.

## `remote` (type: `string`):

How much remote work the job allows.

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

Language the job posting is written in.

## `professionCategory` (type: `string`):

Broad job family assigned by Welcome to the Jungle.

## `professionSubCategory` (type: `string`):

Narrower role specialism assigned by Welcome to the Jungle.

## `sector` (type: `string`):

Industry of the hiring company.

## `company` (type: `string`):

Only jobs from this company. Enter the exact company name, slug or company URL.

## `educationLevel` (type: `string`):

Minimum education level required by the posting.

## `minExperienceYears` (type: `integer`):

Only jobs requiring at least this many years of experience. Jobs without a stated experience level are excluded when this is set. 0 = no minimum.

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

Only jobs requiring at most this many years of experience. Jobs without a stated experience level are excluded when this is set. 0 = no maximum.

## `minSalaryYearly` (type: `integer`):

Only jobs whose disclosed yearly salary minimum is at least this amount, in the job's own currency. Jobs without a disclosed salary are excluded when this is set.

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

Keep only postings that publish a salary amount (yearly, monthly, daily or hourly).

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

Only jobs at companies with at least this many employees. 0 = no minimum.

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

Only jobs at companies with at most this many employees. 0 = no maximum.

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

Only jobs published in the last N days. 0 = any date.

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

Only jobs published on or after this date (YYYY-MM-DD or ISO datetime).

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

Only jobs published on or before this date (YYYY-MM-DD or ISO datetime).

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

Order of the results.

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

Fetch the full posting for each job: complete description, skills, tech stack, apply URL and company details. Adds one request per job.

## `includeCompanyJobs` (type: `boolean`):

For mode=company: include the company's current open jobs in the profile record.

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

Maximum job records for search/byUrl, or maximum jobs per company for mode=company (1–10000).

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "software engineer",
  "jobUrls": [],
  "companies": [],
  "country": "any",
  "contractType": "any",
  "remote": "any",
  "language": "any",
  "professionCategory": "any",
  "professionSubCategory": "any",
  "sector": "any",
  "educationLevel": "any",
  "minExperienceYears": 0,
  "maxExperienceYears": 0,
  "minSalaryYearly": 0,
  "onlyWithSalary": false,
  "companySizeMin": 0,
  "companySizeMax": 0,
  "postedWithinDays": 0,
  "sortBy": "relevance",
  "includeDetails": false,
  "includeCompanyJobs": false,
  "maxItems": 3
}
```

# Actor output Schema

## `records` (type: `string`):

Dataset containing scraped job postings and company profiles.

# 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 = {
    "mode": "search",
    "searchQuery": "software engineer",
    "jobUrls": [],
    "companies": [],
    "country": "any",
    "contractType": "any",
    "remote": "any",
    "language": "any",
    "professionCategory": "any",
    "professionSubCategory": "any",
    "sector": "any",
    "educationLevel": "any",
    "minExperienceYears": 0,
    "maxExperienceYears": 0,
    "minSalaryYearly": 0,
    "onlyWithSalary": false,
    "companySizeMin": 0,
    "companySizeMax": 0,
    "postedWithinDays": 0,
    "sortBy": "relevance",
    "includeDetails": false,
    "includeCompanyJobs": false,
    "maxItems": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("nimbryxo-studio/welcome-to-the-jungle-job-listings-and-salary").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 = {
    "mode": "search",
    "searchQuery": "software engineer",
    "jobUrls": [],
    "companies": [],
    "country": "any",
    "contractType": "any",
    "remote": "any",
    "language": "any",
    "professionCategory": "any",
    "professionSubCategory": "any",
    "sector": "any",
    "educationLevel": "any",
    "minExperienceYears": 0,
    "maxExperienceYears": 0,
    "minSalaryYearly": 0,
    "onlyWithSalary": False,
    "companySizeMin": 0,
    "companySizeMax": 0,
    "postedWithinDays": 0,
    "sortBy": "relevance",
    "includeDetails": False,
    "includeCompanyJobs": False,
    "maxItems": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("nimbryxo-studio/welcome-to-the-jungle-job-listings-and-salary").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 '{
  "mode": "search",
  "searchQuery": "software engineer",
  "jobUrls": [],
  "companies": [],
  "country": "any",
  "contractType": "any",
  "remote": "any",
  "language": "any",
  "professionCategory": "any",
  "professionSubCategory": "any",
  "sector": "any",
  "educationLevel": "any",
  "minExperienceYears": 0,
  "maxExperienceYears": 0,
  "minSalaryYearly": 0,
  "onlyWithSalary": false,
  "companySizeMin": 0,
  "companySizeMax": 0,
  "postedWithinDays": 0,
  "sortBy": "relevance",
  "includeDetails": false,
  "includeCompanyJobs": false,
  "maxItems": 3
}' |
apify call nimbryxo-studio/welcome-to-the-jungle-job-listings-and-salary --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nimbryxo-studio/welcome-to-the-jungle-job-listings-and-salary"
        }
    }
}
```

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/RvEKmp5tZp7gMDteQ/builds/BZFJYYfKF4ccTo5IE/openapi.json
