# Welcome to the Jungle Scraper - Job Offers (`studio-amba/welcometothejungle-scraper`) Actor

Scrape job offers from Welcome to the Jungle (welcometothejungle.com), a leading European tech and startup job board. Search by keyword, location, and contract type. Extract titles, companies, locations, salaries, sectors and links. No login or cookies required.

- **URL**: https://apify.com/studio-amba/welcometothejungle-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 result scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Welcome to the Jungle Scraper — Job Offers

Scrape job offers from [Welcome to the Jungle](https://www.welcometothejungle.com) (welcometothejungle.com), one of Europe's most popular tech, startup, and scale-up job boards. Search by keyword, location, and contract type, then export clean structured data with companies, locations, contracts, salaries, sectors, and direct offer links. No login, no cookies.

### Why use this actor?

Welcome to the Jungle is where thousands of tech companies, startups, and larger employers publish their open roles — engineering, data, product, design, sales, marketing, and operations. If you build a jobs aggregator, run hiring-demand analytics, benchmark salaries, source companies, or feed a recruitment CRM, this actor turns the Welcome to the Jungle search into a structured feed you can query on a schedule.

It reads the site's own public search index directly, so results are fast and complete. Every offer already carries its title, hiring company, location, contract type, sector, and publication date, plus a salary range and remote policy when the employer published them. No page-by-page HTML crawling, no browser automation, no session cookies.

### How to scrape Welcome to the Jungle data

1. Open the actor and set a **Search Query** — for example `developpeur`, `data scientist`, `product manager`, or `commercial`.
2. Optionally set a **Location** (city, department, region, or country such as `Paris`, `Lyon`, or `France`) and a **Contract Type** (CDI, CDD, Internship, Apprenticeship, Freelance).
3. Set **Max Results** to the number of offers you want.
4. Keep the proxy prefill and click **Start**.
5. When the run finishes, export the dataset as JSON, CSV, or Excel, or pull it from the Apify API.

The actor paginates through the search results automatically until it reaches your Max Results or runs out of matching offers.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | Job search keyword (e.g. `developpeur`, `data scientist`). Defaults to `developpeur` if empty. |
| `location` | String | No | Filter by city, department, region, or country (e.g. `Paris`, `Lyon`, `France`). Leave empty for all locations. |
| `contractType` | String | No | `all`, `CDI`, `CDD`, `INTERNSHIP`, `APPRENTICESHIP`, or `FREELANCE`. |
| `maxResults` | Integer | No | Maximum number of offers to scrape (default: 100). |
| `proxyConfiguration` | Object | No | Proxy settings. Apify Proxy recommended. |

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `jobTitle` | String | `"Analyste développeur (H/F)"` |
| `company` | String | `"Crédit Mutuel Alliance Fédérale"` |
| `companySlug` | String | `"credit-mutuel-alliance-federale"` |
| `location` | String | `"Nancy, Meurthe-et-Moselle, France"` |
| `city` | String | `"Nancy"` |
| `department` | String | `"Meurthe-et-Moselle"` |
| `region` | String | `"Grand Est"` |
| `country` | String | `"France"` |
| `countryCode` | String | `"FR"` |
| `contractType` | String | `"CDI"` |
| `contractTypeRaw` | String | `"FULL_TIME"` |
| `salaryMin` | Number | `40000` |
| `salaryMax` | Number | `55000` |
| `salaryPeriod` | String | `"yearly"` |
| `salaryCurrency` | String | `"EUR"` |
| `remote` | String | `"partial"` |
| `experienceLevel` | String | Minimum years of experience when published |
| `educationLevel` | String | Required education level when published |
| `sector` | String | `"Banking"` |
| `sectorParent` | String | `"Banking / Insurance / Finance"` |
| `language` | String | `"fr"` |
| `publishedDate` | String | `"2026-07-09T23:00:00.000+02:00"` |
| `reference` | String | `"CMAF_orr58GO"` |
| `offerId` | String | `"3434567"` |
| `slug` | String | `"ingenieur-d-etudes-et-developpement-h-f_nancy"` |
| `url` | String | Full URL to the offer on welcometothejungle.com |
| `scrapedAt` | String | ISO timestamp of when the row was scraped |

### Example output

```json
{
    "jobTitle": "Analyste développeur (H/F)",
    "company": "Crédit Mutuel Alliance Fédérale",
    "companySlug": "credit-mutuel-alliance-federale",
    "location": "Nancy, Meurthe-et-Moselle, France",
    "city": "Nancy",
    "department": "Meurthe-et-Moselle",
    "region": "Grand Est",
    "country": "France",
    "countryCode": "FR",
    "contractType": "CDI",
    "contractTypeRaw": "FULL_TIME",
    "salaryMin": null,
    "salaryMax": null,
    "salaryPeriod": "",
    "salaryCurrency": "",
    "remote": "partial",
    "experienceLevel": "",
    "educationLevel": "",
    "sector": "Banking",
    "sectorParent": "Banking / Insurance / Finance",
    "language": "fr",
    "publishedDate": "2026-07-09T23:00:00.000+02:00",
    "reference": "CMAF_orr58GO",
    "offerId": "3434567",
    "slug": "ingenieur-d-etudes-et-developpement-h-f_nancy",
    "url": "https://www.welcometothejungle.com/fr/companies/credit-mutuel-alliance-federale/jobs/ingenieur-d-etudes-et-developpement-h-f_nancy?o=CMAF_orr58GO",
    "scrapedAt": "2026-07-09T21:33:47.454Z"
}
````

### Contract types

Welcome to the Jungle stores contract types as codes. The actor maps them to readable labels: `FULL_TIME` becomes `CDI`, `TEMPORARY` becomes `CDD`, `INTERNSHIP` becomes `Stage`, `APPRENTICESHIP` becomes `Alternance`, and `FREELANCE` stays `Freelance`. The original code is always kept in `contractTypeRaw` so you can filter on it precisely.

### Cost estimate

Welcome to the Jungle exposes a clean search index, so runs are cheap. The actor fetches one page per 100 offers with no per-offer detail requests, which means a typical run of a few hundred offers costs a small fraction of a dollar in Apify compute plus the pay-per-result fee. There is no browser to spin up and no session to maintain.

### Limitations / known issues

- **Per-query result cap.** The search backend caps a single query at about 1000 results. To pull more, narrow your search by keyword, location, or contract type and run several focused searches instead of one broad one.
- **Location filter is text-based.** The `location` input matches against each offer's city, department, region, and country. It is not a radius search, so `Paris` will not automatically include the wider Île-de-France region.
- **Salary and remote fields are employer-supplied.** Many employers do not publish a salary range or an explicit remote policy, so `salaryMin`, `salaryMax`, and `remote` are populated only when the offer carries them. Core fields (title, company, location, contract, sector, URL) are always present.
- **Multi-country board.** Welcome to the Jungle lists roles across several countries and languages. Use the `location` filter to scope results to a single country or city, and note the `language` field on each row.

### Related scrapers

- [APEC Scraper](https://apify.com/studio-amba/apec-scraper) — France's executive (cadre) job board.
- [France Travail Scraper](https://apify.com/studio-amba/france-travail-scraper) — France's national employment agency, full job market.
- [Jobat Scraper](https://apify.com/studio-amba/jobat-scraper) — Belgian job board.
- [Pracuj Scraper](https://apify.com/studio-amba/pracuj-scraper) — Poland's largest job board.
- [InfoJobs Scraper](https://apify.com/studio-amba/infojobs-scraper) — Spain's largest job board.

### Disclaimer

This actor collects only publicly available job-offer data from welcometothejungle.com for legitimate use such as market research and job aggregation. Respect Welcome to the Jungle's terms of service and applicable data-protection law when using the output.

# Actor input Schema

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

Job search keyword (e.g. 'developpeur', 'data scientist', 'product manager', 'commercial'). Leave empty to browse the most recent offers.

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

Filter by city, department, region or country (e.g. 'Paris', 'Lyon', 'France'). Matches the offer location. Leave empty for all locations.

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

Filter by contract type.

## `maxResults` (type: `integer`):

Maximum number of job offers to scrape. The search backend caps a single query at ~1000 results; narrow by keyword or contract type to reach more.

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

Proxy settings. Apify Proxy (auto) works well; French residential can be selected for locale consistency.

## Actor input object example

```json
{
  "searchQuery": "developpeur",
  "contractType": "all",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FR"
  }
}
```

# 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 = {
    "searchQuery": "developpeur",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "FR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/welcometothejungle-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 = {
    "searchQuery": "developpeur",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "FR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/welcometothejungle-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "developpeur",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FR"
  }
}' |
apify call studio-amba/welcometothejungle-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/welcometothejungle-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Welcome to the Jungle Scraper - Job Offers",
        "description": "Scrape job offers from Welcome to the Jungle (welcometothejungle.com), a leading European tech and startup job board. Search by keyword, location, and contract type. Extract titles, companies, locations, salaries, sectors and links. No login or cookies required.",
        "version": "0.1",
        "x-build-id": "nnYfu7sg7AaYPpuMx"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/studio-amba~welcometothejungle-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-studio-amba-welcometothejungle-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/studio-amba~welcometothejungle-scraper/runs": {
            "post": {
                "operationId": "runs-sync-studio-amba-welcometothejungle-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/studio-amba~welcometothejungle-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-studio-amba-welcometothejungle-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Job search keyword (e.g. 'developpeur', 'data scientist', 'product manager', 'commercial'). Leave empty to browse the most recent offers."
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Filter by city, department, region or country (e.g. 'Paris', 'Lyon', 'France'). Matches the offer location. Leave empty for all locations."
                    },
                    "contractType": {
                        "title": "Contract Type",
                        "enum": [
                            "all",
                            "CDI",
                            "CDD",
                            "INTERNSHIP",
                            "APPRENTICESHIP",
                            "FREELANCE"
                        ],
                        "type": "string",
                        "description": "Filter by contract type.",
                        "default": "all"
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of job offers to scrape. The search backend caps a single query at ~1000 results; narrow by keyword or contract type to reach more.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings. Apify Proxy (auto) works well; French residential can be selected for locale consistency."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
