# Welcome to the Jungle Jobs Scraper | Every Job, ATS & Companies (`corvuslab/welcome-to-the-jungle-jobs-scraper`) Actor

Export every Welcome to the Jungle (WTTJ) job, past the site's 1,000-result search limit: up to the whole ~90,000-job board in one run. 105 fields: salary, remote, contract, skills, apply link with ATS vendor, and company website, LinkedIn, headcount, revenue. Incremental alerts.

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

## Pricing

from $0.40 / 1,000 results

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 listings from **Welcome to the Jungle (WTTJ)** as clean structured data with **103 fields per job**: salary, remote policy, contract type, skills, the **apply link with its applicant-tracking system**, and **company data** (website, LinkedIn, headcount, revenue, HQ). The site's own search stops at 1,000 results per query; this Actor goes past that, so one run can export every matching job, up to the whole board of about 90,000 jobs.

Give it search terms, locations, countries, companies, filters or Welcome to the Jungle URLs, or press Start with an empty input for the newest 100 jobs. No code, no login, no proxy. Export as JSON, CSV, Excel, via API or as an MCP tool for AI agents.

> New to Apify? Sign up free and use the included monthly platform credit to try this Actor — no credit card needed.

**Why this scraper**

- 🚫 **No 1,000-result ceiling** — tested on all 5,476 UK jobs in one run: 5,476 unique jobs, exactly the site's count.
- ⚡ **Fast & low-cost** — about 400 fully detailed jobs in 16 seconds.
- 🏷️ **ATS vendor and apply domain** on every detailed job.
- ♻️ **Cheap to monitor** — incremental mode skips unchanged jobs before their details are fetched.

***

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

| Group | What you get |
|---|---|
| **Job** | Title, reference, URL, contract type and duration, remote policy, minimum experience, education level, category, profession, sectors, benefits, key missions, summary, posting language, dates |
| **Salary** | Minimum and maximum, currency, period, yearly-normalised minimum, `hasSalary` flag |
| **Location** | City, district, region, country, coordinates, street address, postal code, and every office of multi-site jobs |
| **Apply & ATS** | Apply URL, apply domain, ATS vendor, whether you apply on WTTJ itself, required documents, number of application questions |
| **Company** | Name, logo, description, headcount, founded year, revenue, average age, share of women, equality index, labels, HQ, open jobs, website, LinkedIn, Facebook, Instagram, X and YouTube |
| **Long texts** | Job description, candidate profile and recruitment process as plain text, HTML and/or Markdown |

***

### Key features

- 🚫 **Every job, not the first 1,000** — "all jobs in the UK" really means all of them, and a whole-board export is one run.
- 🏷️ **Where you apply** — `applyDomain` on every detailed job, the ATS vendor (`atsProvider`) on roughly 40% of them, plus the required documents. Most job exports stop at the apply link.
- 🏢 **Company data on every row** — website, socials, headcount, founded year, revenue, HQ, gender split and open-job count travel with each job, so you need no second company lookup.
- 💶 **Full details in one price** — description, apply link, skills and company data come with the per-job charge, with no details add-on.
- 🎚️ **Every site filter** — keywords (optionally title-only), locations with a km radius, 58 countries, companies, contract, remote, posted within, experience, education, salary, company size, sector, job category and posting language. Filtered-out jobs are never billed.
- 🔗 **Paste any WTTJ URL** — a search page keeps its filters, a company page returns all its open jobs, a job page returns that job.
- 🔔 **Monitoring and alerts** — incremental mode plus Telegram, Slack, Discord or webhook notifications.
- 🤖 **AI-ready output** — compact mode, drop-empty mode and text truncation keep payloads small.

***

### 🚀 How to scrape Welcome to the Jungle

1. Enter **search terms** (e.g. `data analyst`), pick locations, countries and filters, or paste a Welcome to the Jungle URL.
2. Set **Max results** (0 = no limit).
3. Click **Start**. Jobs stream into the Output tab.
4. Download as **JSON, CSV or Excel**, or pull them from the **API**.

#### Quick-start example input

```json
{
  "searchTerms": ["data analyst"],
  "locations": ["Paris"],
  "radiusKm": 20,
  "remote": ["fulltime", "partial"],
  "postedWithin": "7",
  "maxResults": 200
}
```

This returns up to 200 data-analyst jobs posted in the last week within 20 km of Paris that allow full or partial remote work, newest first.

***

### Input

All **39 inputs** are optional and grouped as in the editor.

#### 🔎 Search

| Field | Type | What it does |
|---|---|---|
| `searchTerms` | array | Job titles, skills or keywords. Each term runs as its own search; results are merged and de-duplicated. |
| `searchInTitleOnly` | boolean | Match search terms in the job title only. |
| `locations` | array | City, region or district names, e.g. `Paris`, `London`, `New York`. A job matches when any of its offices is there. |
| `radiusKm` | integer | Widen each location to everything within 1–500 km. |
| `countries` | array | Only jobs with an office in these countries (58 to choose from). |
| `startUrls` | array | WTTJ search, company or job page URLs. |
| `companies` | array | Company names as in their WTTJ URL (`doctolib`, `l-oreal`) or full company URLs. |
| `maxResults` | integer | Maximum jobs for the whole run, across all searches (default 100, 0 = no limit). |
| `sortBy` | enum | `date` (newest first) or `relevance`. |

#### 🎚️ Filters

Several values inside one filter widen the search (OR); different filters narrow it (AND).

| Field | Type | What it does |
|---|---|---|
| `contractTypes` | array | `full_time`, `part_time`, `temporary`, `internship`, `apprenticeship`, `freelance`, `vie`, `graduate_program`, `volunteer`, `other` |
| `remote` | array | `fulltime`, `partial`, `punctual`, `no`, `unknown` |
| `postedWithin` | enum | Last `1`, `3`, `7`, `14` or `30` days |
| `experienceLevels` | array | Minimum years asked: `0-1`, `1-3`, `3-5`, `5-10`, `10+` |
| `educationLevels` | array | Minimum diploma on the French scale, `no_diploma` to `phd` (`bac_5` = master's) |
| `salaryMin` | integer | Minimum published yearly salary, in the job's own currency |
| `onlyWithSalary` | boolean | Skip jobs without a published salary |
| `companySizes` | array | `0-15`, `15-50`, `50-250`, `250-2000`, `2000+` employees |
| `sectors` | array | 20 company sectors (tech, finance, consulting, retail, health, media…) |
| `jobCategories` | array | 20 job families (tech & engineering, sales, product, HR, marketing…) |
| `jobLanguages` | array | Language the ad is written in: `fr`, `en`, `de`, `es`, `it`, `pt`, `nl`, `cs`, `pl` |

#### 📄 Output

| Field | Type | What it does |
|---|---|---|
| `includeDetails` | boolean | On by default. Adds the long texts, apply link and ATS, skills, tools and the company's website, socials, revenue and HQ. Off = fastest run, search-card fields only. |
| `siteLanguage` | enum | Label language for benefits, sectors, categories, skills and links: `en`, `fr`, `es`, `cs`, `sk`. |
| `descriptionFormat` | enum | `all`, `text`, `html` or `markdown`. |
| `descriptionMaxLength` | integer | Cut each long text at this many characters. |
| `compact` | boolean | Core fields only. |
| `excludeEmptyFields` | boolean | Drop empty fields from each job. |

#### ♻️ Incremental monitoring

| Field | Type | What it does |
|---|---|---|
| `incrementalMode` | boolean | Output only jobs that are new, changed or back since the last run. |
| `stateKey` | string | Name for the tracked search (derived from your settings if blank). |
| `emitUnchanged` / `emitExpired` | boolean | Also output unchanged jobs / jobs that were taken down. |

#### 🔔 Notifications

Telegram (`telegramToken` + `telegramChatId`), `slackWebhookUrl`, `discordWebhookUrl`, `webhookUrl` + `webhookHeaders`, and `notificationLimit` (jobs per message, 1–20). Setup is under alerts below.

#### ⚙️ Advanced

`proxyConfiguration` (not needed) and `maxRequestRetries` (0–10, default 4).

#### More example inputs

Every job in the United Kingdom, past the 1,000-result limit:

```json
{ "countries": ["GB"], "maxResults": 0 }
```

All open jobs at two companies, plus a saved search URL with its filters:

```json
{
  "companies": ["doctolib", "l-oreal"],
  "startUrls": [{ "url": "https://www.welcometothejungle.com/en/jobs?query=product%20manager&refinementList%5Bremote%5D%5B%5D=fulltime" }],
  "maxResults": 0
}
```

***

### Output

Each dataset item is one job. A real record, shortened:

```json
{
  "id": "1271a75e-a64a-432d-8510-66ba196133bc",
  "title": "SAP FI Functional Expert - F/H",
  "url": "https://www.welcometothejungle.com/en/companies/atos/jobs/sap-fi-functional-expert-f-h_bezons_ATOS_egNQeeZ",
  "companyName": "Atos",
  "companyEmployees": 51000,
  "location": "Bezons, Ile-de-France, France",
  "countryCode": "FR",
  "contractType": "full_time",
  "remote": "partial",
  "experienceMinYears": 7.0,
  "salaryMin": 85000.0,
  "salaryMax": 90000.0,
  "salaryCurrency": "EUR",
  "salaryPeriod": "yearly",
  "jobCategory": "Consulting & Strategy",
  "sectors": ["IT / Digital"],
  "publishedAt": "2026-10-24T09:20:49Z",
  "description": "Votre mission : allier expertise métier en comptabilité, maîtrise technique de SAP FI…",
  "applyUrl": "https://atos.contactrh.com/jobs/10425/44530676",
  "applyDomain": "atos.contactrh.com",
  "atsProvider": "ContactRH",
  "applicationRequired": ["resume"],
  "skills": ["Regulatory compliance"],
  "tools": ["Vim", "SAP"],
  "companyWebsite": "https://atos.net/fr/",
  "companyRevenue": "8 milliards €",
  "companyWomenPercent": 30.0,
  "companyHeadquartersCity": "Bezons"
}
```

#### Data fields

- **Core** — `id`, `jobReference`, `title`, `url`, `slug`, `companyName`, `location`, `contractType`, `contractDurationMinMonths` / `MaxMonths`, `remote`, `isRemote`, `experienceMinYears`, `educationLevel`, `jobCategory`, `jobSubCategory`, `profession`, `sectors`, `sectorParents`, `benefits`, `keyMissions`, `summary`, `language`, `publishedAt`, `updatedAt`, `startDate`, `isPromoted`, `searchKeyword`.
- **Salary** — `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryYearlyMin`, `hasSalary`.
- **Location** — `city`, `district`, `region`, `country`, `countryCode`, `latitude`, `longitude`, `offices`, `officeCount`, `address`, `postalCode`.
- **Long texts** — `description`, `candidateProfile`, `recruitmentProcess`, `companyDescription`, each also as `…Html` and `…Markdown`.
- **Apply & ATS** — `applyUrl`, `applyDomain`, `applyOnSite`, `atsProvider`, `applicationRequired`, `applicationQuestionCount`, `skills`, `tools`.
- **Company** — `companySlug`, `companyUrl`, `companyLogoUrl`, `companySummary`, `companyWebsite`, `companyLinkedinUrl`, `companyFacebookUrl`, `companyInstagramUrl`, `companyTwitterUrl`, `companyYoutubeUrl`, `companyEmployees`, `companyFoundedYear`, `companyRevenue`, `companyAverageAge`, `companyWomenPercent`, `companyEqualityIndex`, `companyLabels`, `companyCommitments`, `companyOpenJobs`, `companyHeadquartersAddress` / `City` / `CountryCode`, `companyUsesExternalAts`.
- **Contacts found in the text** — `extractedEmails`, `extractedPhones`, `extractedUrls` (rarely filled; most employers don't post them).
- **Run & monitoring** — `source`, `scrapedAt`, `detailFetched`, `contentHash`, plus in incremental mode `changeType` (NEW / UPDATED / REAPPEARED / UNCHANGED / EXPIRED), `firstSeenAt`, `lastSeenAt`, `previousSeenAt`, `expiredAt`, `isRepost`, `repostOfId`, `repostDetectedAt`.

**Compact mode** returns 20 core fields, including the apply link, ATS and company website. The Output tab has three views: **Overview**, **Apply & ATS** and **Company intelligence**.

***

### ♻️ How to monitor Welcome to the Jungle with incremental mode

Turn on **incremental mode** and schedule the Actor. Each run compares against the last one and outputs only **NEW / UPDATED / REAPPEARED** jobs (and EXPIRED ones if you ask). Unchanged jobs are recognised *before* their details are fetched, and a job that is taken down and reposted is flagged as a repost.

After the first run, your cost follows how much the board changes, not how much you watch:

| Daily churn | of 1,000 tracked | billable records | you save |
|---|---|---|---|
| 5 % | 1,000 | 50 | **95 %** |
| 15 % | 1,000 | 150 | **85 %** |
| 30 % | 1,000 | 300 | **70 %** |

To set it up: configure your search, turn on **Incremental mode**, run it once to record the starting set, then add a recurring run in the **Schedules** tab.

***

### 🔔 How to set up Welcome to the Jungle alerts

Fill in only the channels you want:

| Channel | What to configure |
|---|---|
| ✈️ **Telegram** | `telegramToken` (from @BotFather) + `telegramChatId` |
| 💬 **Slack** | `slackWebhookUrl` |
| 🎮 **Discord** | `discordWebhookUrl` |
| 🪝 **Webhook** | `webhookUrl` (+ optional `webhookHeaders`) receives JSON, ready for n8n, Make or Zapier |

Each message lists up to `notificationLimit` jobs with title, company, location, link and change type. A failing channel never stops the run or the other channels. With incremental mode on, you hear only about new jobs.

***

### 💡 What can you do with Welcome to the Jungle data?

#### Find companies that are hiring

Build a list of employers hiring in a sector or city, with website, LinkedIn, headcount and open-job count, while the hiring need is live.

#### Map the applicant-tracking market

`atsProvider` and `applyDomain` show which recruiting software each employer runs, or that it recruits through its own career site.

#### Benchmark salaries

Salary bands with currency, period and a yearly-normalised minimum. Combine `onlyWithSalary` with a category filter for a clean set.

#### Power a job board or alert feed

Export a niche slice once, then let incremental mode feed only new and changed jobs into your site, newsletter or Slack.

#### Research the labour market

Track hiring volume, remote policy, contract mix and benefits by sector, country or company over time.

***

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

The Actor uses **pay-per-event** pricing: a small fee per run plus a fee per job returned. The **Pricing** tab shows the current numbers. Full details are included in the per-job fee. Two things cut your bill:

- **Filters** — jobs you filter out are never fetched or billed.
- **Incremental mode** — after the first run you pay only for what changed.

***

### 🔌 Integrations & export

Export to **JSON, CSV, Excel** or HTML, or use the **REST API** and the **JavaScript / Python** clients. Schedule runs, connect **Google Sheets, Slack, Make, Zapier or n8n**, or call it as an **MCP tool** from AI agents.

Also covering the French job market: **HelloWork Jobs Scraper** (`corvuslab/hellowork-scraper`) and **APEC Jobs Scraper** (`corvuslab/apec-jobs-scraper`) for executive roles.

***

### 🔗 Using the API

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("corvuslab/welcome-to-the-jungle-jobs-scraper").call(run_input={
    "searchTerms": ["product manager"],
    "countries": ["FR", "GB"],
    "maxResults": 500,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["companyName"], item["applyDomain"])
```

***

### ❓ FAQ

**Can I really get more than 1,000 jobs from one search?** Yes. Set `maxResults` to 0 for no limit. Runs that ask for more than 1,000 jobs come back newest first, whatever `sortBy` says.

**Why is `atsProvider` empty on many jobs?** It names a vendor only when the employer uses a recognisable applicant-tracking system (SmartRecruiters, Teamtailor, Workday, Lever and others). Many employers recruit through their own career site; `applyDomain` names that site. When `applyOnSite` is true, you apply on Welcome to the Jungle itself.

**Why are salary fields empty on some jobs?** Many employers don't publish pay. `hasSalary` tells you at a glance, and `onlyWithSalary` or `salaryMin` keep only jobs that show one.

**Which fields need full details on?** The long texts, apply link, ATS, required documents, skills, tools, street address and the company's website, socials, revenue, average age, gender split and HQ. With `includeDetails` off you get the search-card fields only, and each job is still billed.

**Why are some company fields empty?** Revenue, average age, gender split, equality index and socials appear only when the company's WTTJ profile publishes them. Missing values are `null`, never guessed.

**Which countries and languages are covered?** 58 countries, from France, the UK and the US to Morocco and Singapore. Labels come in English, French, Spanish, Czech or Slovak; the job text stays in the language the employer wrote it in, often French.

**How do location and radius work?** A job matches when any of its offices is in the place, so multi-site jobs are not missed. Add `radiusKm` to include the surroundings.

**How do companies and start URLs combine?** Each start URL is read with its own filters. Search terms, companies and locations run as a separate search, and the results are merged without duplicates. The dropdown filters (country, contract, remote…) apply to everything.

***

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

This Actor collects only **publicly available** job and company data that anyone can see on welcometothejungle.com without logging in. You're responsible for how you use it, in particular any personal information, and for complying with the site's terms and applicable law, including the GDPR where it applies. Not affiliated with, endorsed by or sponsored by Welcome to the Jungle.

***

**Keywords:** welcome to the jungle scraper · wttj scraper · welcome to the jungle api · welcometothejungle.com scraper · welcome to the jungle jobs · wttj jobs export · scrape welcome to the jungle jobs · france jobs scraper · job listings scraper · salary data · ats data · company hiring data · recruitment lead generation · job monitoring · job alerts · export to CSV · export to Excel · MCP tool for AI agents

# Changelog

This Actor's version history is a separate document: https://apify.com/corvuslab/welcome-to-the-jungle-jobs-scraper/changelog.md

# Actor input Schema

## `searchTerms` (type: `array`):

Job titles, skills or keywords, e.g. "data analyst" or "react". Each term runs as its own search; results are merged and de-duplicated. Leave empty to browse every job.

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

Only return jobs whose title contains the search term — far more precise than searching the full posting.

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

City, region or district names as they appear on the site, e.g. "Paris", "Lyon", "London", "New York". A job matches when any of its offices is there.

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

Widen each location to everything within this distance, e.g. 20 to include the suburbs. Leave empty to match the place by name only.

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

Only jobs with an office in these countries.

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

Paste Welcome to the Jungle URLs: a job search page (filters in the URL are kept), a company page (returns all its open jobs) or a single job page.

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

Jobs from these companies — the name as it appears in their Welcome to the Jungle URL (e.g. "doctolib", "l-oreal") or the full company URL. On its own it returns all their open jobs; with search terms, only the matching ones.

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

Maximum number of jobs to return in total, across all search terms and URLs (searches run in order). 0 = no limit — a single run can export the whole board (about 90,000 jobs).

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

Newest first, or the site's relevance ranking for your search terms. Runs that ask for more than 1,000 jobs are delivered newest first.

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

Leave empty for all.

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

Leave empty for all.

## `postedWithin` (type: `string`):

Only jobs published in this window.

## `experienceLevels` (type: `array`):

Minimum years of experience the job asks for.

## `educationLevels` (type: `array`):

Minimum diploma the job asks for (French scale: Bac+5 = master's).

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

Only jobs that publish a yearly salary of at least this amount, in the job's own currency.

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

Skip jobs without a published salary.

## `companySizes` (type: `array`):

Headcount of the hiring company.

## `sectors` (type: `array`):

Industry of the hiring company.

## `jobCategories` (type: `array`):

The job family the site files the role under.

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

Language the job ad is written in.

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

Adds the full description, candidate profile, recruitment process, apply link and applicant-tracking system, skills and tools, and the company's website, LinkedIn, socials, revenue and headquarters. Turn off for the fastest run with search-card fields only.

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

Language for translated labels (benefits, sectors, categories, skills) and job links. The job text itself stays in the language it was written in.

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

Which versions of the long texts (description, candidate profile, recruitment process) to include.

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

Truncate each long text to this many characters. Empty = keep the full text.

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

Return only the core fields — ideal for AI agents, spreadsheets and alerts.

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

Remove fields that have no value from each job.

## `incrementalMode` (type: `boolean`):

Remember what earlier runs returned and only output jobs that are new, changed or back since last time — unchanged jobs are skipped and cost nothing. Run it on a schedule to build a job alert feed.

## `stateKey` (type: `string`):

Stable name for the tracked search. Leave empty to derive one automatically from your search settings.

## `emitUnchanged` (type: `boolean`):

Also output jobs that have not changed since the previous run. Each one counts as a result.

## `emitExpired` (type: `boolean`):

Also output jobs that were in the previous run but are no longer published (changeType EXPIRED). Each one counts as a result.

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

Bot token from @BotFather.

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

Chat or channel ID, e.g. "-100123456789" or "@yourchannel".

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

Slack incoming-webhook URL.

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

Discord incoming-webhook URL.

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

Any HTTPS endpoint. Receives a JSON POST with the matched records — works with n8n, Make and Zapier.

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

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

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

How many jobs to list in each notification message.

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

Not needed — the actor runs fine without a proxy. Only set one if your runs report connection problems.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed request before giving up on it.

## Actor input object example

```json
{
  "searchTerms": [
    "software engineer"
  ],
  "searchInTitleOnly": false,
  "maxResults": 100,
  "sortBy": "date",
  "onlyWithSalary": false,
  "includeDetails": true,
  "siteLanguage": "en",
  "descriptionFormat": "all",
  "compact": false,
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "notificationLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxRequestRetries": 4
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `allItems` (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 = {
    "searchTerms": [
        "software engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("corvuslab/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 = { "searchTerms": ["software engineer"] }

# Run the Actor and wait for it to finish
run = client.actor("corvuslab/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 '{
  "searchTerms": [
    "software engineer"
  ]
}' |
apify call corvuslab/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,corvuslab/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/qbuKGDIjm0hEXpajL/builds/aa3ANR6LLSy38TghF/openapi.json
