Welcome to the Jungle Scraper avatar

Welcome to the Jungle Scraper

Pricing

$0.30 / 1,000 results

Go to Apify Store
Welcome to the Jungle Scraper

Welcome to the Jungle Scraper

Find public job listings by keywords and filters; export titles, salaries, locations, descriptions, application links and employer data.

Pricing

$0.30 / 1,000 results

Rating

0.0

(0)

Developer

MLG Data

MLG Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 hours ago

Last modified

Categories

Share

Scrape Welcome to the Jungle jobs by role keywords, location, country, contract, remote policy, salary, and other published attributes. Export Welcome to the Jungle job data as JSON, CSV, or spreadsheet files, with titles, pay ranges, offices, descriptions, application links, and employer context. This actor provides a repeatable way to collect public job listings when you need more than a manual search page.

The actor discovers listings from the site's public job sitemaps and reads structured data embedded in each job page. A listing can have several offices, and salary and employer fields depend on what was published. Each result carries a source URL and a stable job ID so later exports can be compared without relying on title alone.

What data can you extract from Welcome to the Jungle?

The default full-detail result has 65 fields. The table describes each output key; examples show the expected shape, while empty values remain null, [], or {} according to the field. Text descriptions retain source HTML so lists and paragraphs are not flattened away.

FieldDescriptionExample
idStable identifier for a listingfff60753-...
referenceEmployer-supplied job referenceENG-42
namePublished job titleSoftware Engineer (Senior)
urlDirect source pagehttps://www.welcometothejungle.com/...
contractTypeContract classificationfull_time
remoteRemote-work policypartial
languageJob language codeen
salaryMinPublished minimum pay195000
salaryMaxPublished maximum pay250000
salaryCurrencyCurrency of pay valuesUSD
salaryPeriodPay periodyearly
experienceLevelPublished experience band5_TO_7_YEARS
educationLevelEducation level, when givennull
contractDurationMinMinimum contract durationnull
contractDurationMaxMaximum contract durationnull
publishedAtPublication timestamp2026-08-29T00:05:33Z
updatedAtLast update timestamp2026-08-29T00:19:58Z
categoryLocalized occupation categoryTech & Engineering
subcategoryLocalized occupation subcategorySoftware & Web Development
categoryReferenceStable occupation category referencetech-engineering-3NjUy
subcategoryReferenceStable occupation subcategory referencesoftware-web-development-iMzA4
sectorsEmployer sector labels["Software"]
summaryBrief listing summary, if provided""
officesAll published office objects[{"city":"New York"}]
cityPrimary office cityNew York
countryCodePrimary office countryUS
organizationNameEmployer's published name[employer]
organizationSlugEmployer's site URL segment[employer-slug]
organizationLogoEmployer logo URLhttps://cdn-images...
organizationEmployeesPublished employee count165
organizationCreationYearPublished founding yearnull
organizationLabelsEmployer labels[]
organizationCommitmentsPublished commitments[]
organizationIndustryPublished industry labelSoftware
organizationJobsCountEmployer's published job count33
descriptionFull job description in HTML<ul><li>...</li></ul>
profileCandidate profile in HTML<ul><li>...</li></ul>
recruitmentProcessHiring steps, if publishednull
applyUrlDirect application destinationhttps://...
skillsPublished skills["Communication skills"]
toolsPublished technical tools[technology]
benefitsLocalized benefit names[]
benefitDetailsComplete benefit groups{}
keyMissionsStructured mission list[]
companySummaryShort employer summary[summary]
teamTeam descriptionnull
startDatePlanned start datenull
atsQuestionsApplication questions[]
applicationFieldsApplication form requirements[]
organizationDescriptionEmployer description in HTML<p>...</p>
organizationCoverImageEmployer cover image URLnull
organizationRevenuePublished revenuenull
organizationTurnoverPublished turnovernull
organizationGdprSettingApplication privacy settingsnull
organizationHasExternalAtsExternal application system flagtrue
organizationAutomaticEmailAutomatic email flagtrue
organizationWebsiteEmployer website URLhttps://...
organizationLinkedinPublished social profile[profile]
organizationTwitterPublished social profilenull
organizationFacebookPublished social profilenull
organizationInstagramPublished social profilenull
organizationAverageAgePublished workforce average agenull
organizationParityMenPublished share of mennull
organizationParityWomenPublished share of womennull
organizationHeadquarterHeadquarters address object{"city":"San Francisco"}

The office array preserves every location in the source record. Use it when a job is open in several cities: city and countryCode represent only the primary office. Salary values are the numbers published with that job, so compare them only after checking salaryCurrency and salaryPeriod. When the source short summary is empty, the actor derives one from the first 500 characters of the published description.

How to scrape Welcome to the Jungle

  1. Enter role words in query, such as software engineer, or leave it blank to discover general listings.
  2. Add a city or country and any contract, remote, experience, salary, or occupation filters that matter to the search.
  3. Set maxItems to bound the number of saved jobs. Keep includeDetails on if descriptions, application destinations, and employer context are needed.
  4. Run the actor and inspect the first few dataset items. Export JSON for nested office and application fields, or CSV for a flat report.

Jobs are saved as they are found. If a run stops before completing its candidate list, items already written to the dataset remain available. For a recurring workflow, save the input alongside each export and compare records by id or url.

Input

NameTypeDefaultDescription
maxItemsinteger100Stop after this many matching jobs; 0 has no result cap.
includeDetailsbooleantrueAdd descriptions, application fields, and extended employer data.
websiteCountrystringenSelect language for localized category and skill labels.
querystringemptyMatch role words in the job URL and page content.
searchOnlyInJobTitlebooleanfalseRestrict the final keyword check to the title.
locationstringemptyMatch city, region, or address across published offices.
countryCodestringemptyMatch an office's two-letter country code.
sortBystringrelevanceUse sitemap order or recently modified candidate pages.
datePostedstringanyKeep jobs posted in the last 1, 3, 7, 14, or 30 days.
contractTypearrayemptyKeep any selected contract type.
remotearrayemptyKeep any selected remote policy.
experienceLevelstringemptyMinimum experience based on the published band's lower bound.
salaryMinintegeremptyKeep jobs whose published maximum pay reaches this number.
companySizestringemptyFilter by published employee-count band.
languagestringemptyKeep jobs written in the supplied language code.
sectorarrayemptyMatch keywords against published employer sector labels.
occupationarrayemptyMatch occupation category references.
proxyConfigurationobjectenabledConnection settings for public pages.

A realistic input for an initial export:

{
"query": "software engineer",
"countryCode": "US",
"remote": ["partial", "fulltime"],
"includeDetails": true,
"maxItems": 50
}

This example is narrower than a title-only search because it checks both office country and remote policy. Start without optional filters if you are exploring which terms appear in the source. Add one filter at a time when a narrow combination returns too few results. For a job title that appears in several languages, a local-language query can expose listings that an English phrase does not.

Output example

The following values come from one job in the successful 30-item validation run. The employer name, employer links, and long HTML text are redacted here; the dataset retains the complete public values.

{
"id": "fff60753-080e-430d-b9c1-e40217c4fbd6",
"reference": null,
"name": "Software Engineer (Senior)",
"url": "[source job URL]",
"contractType": "full_time",
"remote": "unknown",
"language": "en",
"salaryMin": 195000,
"salaryMax": 250000,
"salaryCurrency": "USD",
"salaryPeriod": "yearly",
"experienceLevel": "5_TO_7_YEARS",
"publishedAt": "2026-08-29T00:05:33Z",
"category": "Tech & Engineering",
"subcategory": "Software & Web Development",
"city": "New York",
"countryCode": "US",
"organizationName": "[redacted]",
"organizationEmployees": 165,
"organizationJobsCount": 33,
"description": "[HTML description redacted]",
"applyUrl": "[application URL redacted]",
"skills": ["Communication skills", "Collaboration and teamwork"],
"organizationHasExternalAts": true
}

The validation run returned 30 of 30 requested jobs. Every record had an ID, title, source URL, employer name, publication date, description, and country code. In that sample, published pay bounds appeared in about 73% of records, a primary city in about 77%, and the source short summary was empty throughout, so the actor derived it from the description. Those percentages describe the sample, not a promise for another role or country.

Use cases

  • Recruitment analysts can compare published salary ranges and remote policies across roles without opening each listing individually.
  • Job seekers can build a focused list of openings and keep the direct application link with the original job page.
  • Labor-market researchers can track the mix of contract types, office countries, and occupations in repeated snapshots.
  • Employer researchers can connect job demand with published employee counts, sectors, headquarters, and job totals.
  • Operations teams can monitor a recurring keyword search and reconcile new or removed IDs between exports.
  • Regional researchers can inspect multilingual listings while retaining each job's original language and salary currency.

The data is a snapshot of public pages at run time. A job can be edited, archived, or removed after collection. Keep the publication and update timestamps when comparing snapshots; use the source URL to verify details that affect a decision.

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

The current result price is $0.30 per 1,000 saved jobs, with platform usage included in the listed result price. At that rate, 100 jobs cost $0.03, 500 cost $0.15, and 1,000 cost $0.30. These are result-charge examples, not guarantees that the source exposes a requested number of matching jobs. A smaller maxItems makes a first run easier to inspect and limits the number of job pages fetched.

Job pages require residential proxy traffic in the tested environment. The actor obtains one page per candidate to evaluate filters, even when includeDetails is false. Narrow filters can require more page requests than the final result count suggests. If a large export is planned, first run a small sample with the same filters to estimate speed and coverage. The pay-per-result price can change; check the current run price before scheduling a large export.

Tips for best results

Use role words that occur in public job URLs. The actor first checks the URL slug for every word in query, then checks the fetched page content; a role described only inside body text will not be discovered by that search. For more coverage, try a shorter query such as engineer and filter the resulting dataset downstream. A blank query considers all sitemap entries, but broad searches can take much longer because every candidate page must be checked.

Location checks all published office objects, so a multi-office job can match a city other than its primary city value. countryCode offers an exact country test. The location field matches text and does not apply a geographic radius. If a city name is ambiguous, add the country code. websiteCountry changes localized labels where available; it does not restrict jobs to a country. Use language for a job-language filter.

Contract and remote arrays use an any-of match within each field. Across different fields, all supplied conditions must hold. Published remote values include no, partial, punctual, fulltime, and unknown. Salary is checked against the listing's published maximum, with no currency conversion. For pay comparisons across countries, first filter or group by salaryCurrency and salaryPeriod in the exported data.

Use sortBy: "date" when recently modified candidate pages are preferred. That option reads all listed sitemap partitions before fetching jobs and sorts by sitemap modification time. Modification time can differ from publishedAt; datePosted checks the actual publication timestamp after the page is fetched. For routine monitoring, keep the query and filters stable between runs, then compare IDs and update timestamps.

Limits

The public search endpoint returned 403 in probing, including a residential session. This actor uses public sitemap entries and page-embedded job data instead. The site supplied nine job sitemap partitions in the tested index, each with up to 10,000 URLs; that is the discoverable pool at run time, not a complete historical archive. Jobs absent from those sitemaps cannot be found by this actor. Sitemap URLs and page content can change independently, so a listed job may later be unavailable or archived.

The URL prefilter requires every query word to appear in a job slug. This keeps searches practical, but it can miss a relevant listing whose title or description contains a keyword that its URL omits. The relevance option follows sitemap order; it is not ranked search relevance. The date option uses sitemap modification time for candidate order, then reads the publication date for the record. Neither order guarantees all matching records are returned before maxItems is reached.

Detail pages were blocked on datacenter traffic during research and worked on residential traffic. Page availability may vary by region, session, or time. The actor skips a page when its structured job data is unavailable and continues with the next candidate. It does not infer a missing salary, benefit, social profile, or application field. Empty arrays and nulls should be treated as unpublished or unavailable values, not as negative answers.

includeDetails: false removes the extended columns from output but still fetches the job page to apply filters and create the core record. It should be selected for smaller exports, not as a speed or network-cost setting. Large broad searches, narrow filters, and runs with maxItems: 0 can be slow because many candidate pages need to be read.

Use with automated workflows

The actor accepts the same JSON input from a scheduled run or an integration. Give the workflow a bounded result limit and specify the fields needed for the next step. Two example requests are: “Collect up to 50 software engineer jobs in the US and group them by remote policy and salary currency,” and “Find recently posted design jobs in Paris and return source links, publication dates, and direct application destinations.” Review source links before acting on individual jobs.

For recurring monitoring, save the exact input with each dataset and record when it ran. Compare id values across snapshots to find newly observed jobs; compare updatedAt to spot edited records. A missing job in one short, capped run does not establish that it was removed from the site, because candidate order and reachability can vary.

FAQ

Is it legal to collect these listings? The actor reads public job pages. Follow the source site's terms and applicable data-protection rules, and do not misuse personal data. Verify reuse rights before republishing job descriptions or employer media.

Do I need to configure proxies? No extra input is required for the tested setup. The actor uses a datacenter connection for public sitemaps and residential traffic for job pages. The source may change its blocking behavior, so a previously working connection is not a guarantee for future runs.

How fast is a run? Speed depends on the number of candidate pages, filters, and source response times. The 30-item validation run completed successfully, but a country or salary filter may require many more page reads to produce the same number of saved jobs. Test a small, representative input before increasing maxItems.

Can I schedule and monitor collection? Yes. Keep a fixed input and schedule repeated runs. Monitor each run's status and resulting dataset, then compare IDs and timestamps. A failed or partial run should not be used as evidence that a job disappeared.

Can I export to a spreadsheet? Yes. CSV and spreadsheet exports work for the scalar columns. JSON preserves nested offices, headquarters, benefits, and application fields. When importing CSV, keep IDs as text so they are not reformatted.

What does an empty field mean? The public page did not provide that value in the structured record. For example, many employers omit salary or benefits. The actor does not guess, convert currencies, or extract hidden application questions.

Does the location setting support distance search? No. It checks published office text; it does not calculate a radius. Enter a city with a country code to narrow an ambiguous location, or examine the office array after export.

Integrations

Start a run through the platform API, read its default dataset, and send completed results to a database, spreadsheet, or internal report. Webhooks can notify a workflow when a run finishes, and schedules can produce regular snapshots. Store id, url, publishedAt, and updatedAt with downstream records to reconcile later exports. Use JSON when the downstream system needs all office locations or nested application data.

Support

Open an issue on the Issues tab; we reply within 24h and add fields on request.