Just Join IT Scraper
Pricing
$1.00 / 1,000 jobs
Just Join IT Scraper
Fast IT job scraper for JustJoin.it. Extract salaries, tech stacks, experience levels, remote options. Supports keyword, location, category filters. Up to 100 offers per request.
Pricing
$1.00 / 1,000 jobs
Rating
0.0
(0)
Developer
Paweł
Actor stats
0
Bookmarked
3
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
Fast and efficient Apify Actor for scraping IT job listings from JustJoin.it -- Poland's and Central Europe's leading IT job board.
Features
- Extracts up to 100 job offers per listing page from server-rendered data (no browser needed)
- Comprehensive job data: title, company, salary (min/max/currency/type), location, experience level, required skills, workplace type, and more
- All salary information broken down into structured fields (min, max, currency, contract type, gross/net)
- Multiple employment type salary variants per offer (B2B, permanent, converted currencies)
- Filter by: keyword, location, technology category, experience level, employment type, workplace type, salary availability
- Optional full detail extraction: visits each job page for description, skill levels, languages, company size
- Built-in deduplication, session rotation, and proxy support
- Three dataset views: Overview, Detailed, and Salaries
How It Works
JustJoin.it is built with Next.js App Router. Job listing data is embedded in React Server Components (RSC) flight payloads within <script> tags. The scraper:
- Fetches listing pages via HTTP (CheerioCrawler -- no browser overhead)
- Parses RSC payloads to extract structured offer objects (up to 100 per page)
- Optionally visits individual job pages for full descriptions and skill levels
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
startUrls | Array | [] | Direct JustJoin.it URLs to scrape (overrides filters) |
keyword | String | - | Search keyword (e.g., "React", "DevOps") |
location | String | all-locations | City name (e.g., "warszawa", "krakow") |
category | String | - | Technology category (javascript, python, devops, etc.) |
experienceLevel | Array | [] | Filter: junior, mid, senior, lead |
employmentType | Array | [] | Filter: b2b, permanent, mandate_contract |
workplaceType | Array | [] | Filter: remote, hybrid, office |
withSalary | Boolean | false | Only return offers with salary disclosed |
sortBy | String | published | Sort by: published, salary |
maxItems | Integer | 100 | Max offers to scrape (0 = unlimited) |
extractFullDetails | Boolean | false | Visit each job page for full description |
maxConcurrency | Integer | 10 | Max parallel requests |
maxRequestsPerMinute | Integer | 120 | Rate limiting |
proxyConfiguration | Object | - | Proxy settings (recommended for extractFullDetails) |
Input Example
{"keyword": "React","location": "warszawa","category": "javascript","experienceLevel": ["senior", "mid"],"employmentType": ["b2b"],"workplaceType": ["remote", "hybrid"],"withSalary": true,"maxItems": 50,"extractFullDetails": false}
Using Start URLs
You can also provide pre-built URLs directly:
{"startUrls": ["https://justjoin.it/job-offers/all-locations/python?experience-level=senior&with-salary=yes","https://justjoin.it/job-offers/warszawa/javascript?workplace-type=remote"],"maxItems": 200}
Output
Default Mode (extractFullDetails: false)
Each record contains:
| Field | Type | Description |
|---|---|---|
title | String | Job title |
companyName | String | Company name |
companyLogoUrl | String | Company logo image URL |
city | String | Primary city |
street | String | Street address |
locations | Array | All locations [{city, street}] |
salary | String | Human-readable salary (e.g., "24,000 - 33,000 PLN/month (net, b2b)") |
salaryMin | Number | Minimum salary (original currency) |
salaryMax | Number | Maximum salary (original currency) |
salaryCurrency | String | Salary currency (PLN, USD, EUR, etc.) |
salaryType | String | Contract type for this salary (b2b, permanent, etc.) |
salaryUnit | String | Pay unit (month, hour) |
salaryGross | Boolean | Whether salary is gross (true) or net (false) |
allEmploymentTypes | Array | All salary variants [{from, to, currency, type, unit, gross}] |
experienceLevel | String | Experience level (junior, mid, senior, lead) |
workplaceType | String | Workplace type (remote, hybrid, office) |
workingTime | String | Working time (full_time, part_time) |
requiredSkills | Array | Required technology skills |
niceToHaveSkills | Array | Nice-to-have skills |
remoteInterview | Boolean | Remote interview available |
isPromoted | Boolean | Promoted/featured listing |
isSuperOffer | Boolean | Super offer badge |
publishedAt | String | ISO 8601 publish date |
lastPublishedAt | String | ISO 8601 last republish date |
expiredAt | String | ISO 8601 expiration date |
slug | String | URL slug identifier |
jobUrl | String | Direct URL to job offer |
guid | String | Unique offer identifier |
scrapedAt | String | ISO 8601 scrape timestamp |
Full Details Mode (extractFullDetails: true)
Additional fields when visiting each job page:
| Field | Type | Description |
|---|---|---|
description | String | Full job description text |
companyWebsite | String | Company website URL |
country | String | Country code (e.g., "PL") |
region | String | Region/state |
validThrough | String | Offer validity date |
requiredSkillsDetailed | Array | Skills with proficiency levels [{name, level}] |
niceToHaveSkillsDetailed | Array | Nice-to-have skills with levels |
languages | Array | Required languages [{code, level}] |
companySize | String | Company size category |
countryCode | String | ISO country code |
Example Output (Default Mode)
{"title": "Fullstack Developer (Angular + Python)","companyName": "Code and Pepper","companyLogoUrl": "https://imgproxy.justjoinit.tech/.../logo.png","city": "Gdansk","street": "Aleja Grunwaldzka","locations": [{ "city": "Gdansk", "street": "Aleja Grunwaldzka" },{ "city": "Suwalki", "street": null }],"salary": "24,000 - 33,000 PLN/month (net, b2b)","salaryMin": 24000,"salaryMax": 33000,"salaryCurrency": "PLN","salaryType": "b2b","salaryUnit": "month","salaryGross": false,"allEmploymentTypes": [{"from": 24000,"to": 33000,"currency": "PLN","type": "b2b","unit": "month","gross": false,"currencySource": "original"},{"from": 18000,"to": 27000,"currency": "PLN","type": "permanent","unit": "month","gross": true,"currencySource": "original"},{"from": 6402,"to": 8803,"currency": "USD","type": "b2b","unit": "month","gross": false,"currencySource": "conversion"}],"experienceLevel": "senior","workplaceType": "hybrid","workingTime": "full_time","requiredSkills": ["Angular", "Python", "TypeScript", "REST API"],"niceToHaveSkills": [],"remoteInterview": true,"isPromoted": false,"isSuperOffer": false,"publishedAt": "2026-03-15T08:00:00.000Z","lastPublishedAt": "2026-03-15T08:00:00.000Z","expiredAt": "2026-04-15T21:59:59.999Z","slug": "code-and-pepper-fullstack-developer-angular-python--gdansk-javascript","jobUrl": "https://justjoin.it/job-offer/code-and-pepper-fullstack-developer-angular-python--gdansk-javascript","guid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890","scrapedAt": "2026-03-16T12:00:00.000Z"}
Example Output (Full Details Mode)
Includes all fields above plus:
{"description": "We are looking for a Senior Fullstack Developer with strong Angular and Python skills to join our product team...","companyWebsite": "https://codeandpepper.com","country": "PL","region": "Pomorskie","validThrough": "2026-04-15T21:59:59.999Z","requiredSkillsDetailed": [{ "name": "Angular", "level": 4 },{ "name": "Python", "level": 4 },{ "name": "TypeScript", "level": 3 },{ "name": "REST API", "level": 3 }],"languages": [{ "code": "en", "level": "B2" }],"countryCode": "PL"}
Available Technology Categories
| Slug | Name |
|---|---|
javascript | JavaScript |
html | HTML |
php | PHP |
ruby | Ruby |
python | Python |
java | Java |
net | .NET |
scala | Scala |
c | C |
mobile | Mobile |
testing | Testing/QA |
devops | DevOps |
admin | Admin/IT |
ux | UX/UI |
pm | Project Management |
game | Game Dev |
analytics | Analytics |
security | Security |
data | Data |
go | Go |
support | Support |
erp | ERP |
architecture | Architecture |
ai | AI/ML |
Performance and Cost
Default Mode (extractFullDetails: false)
- Speed: ~100 offers per request (single HTTP call per listing page)
- Cost: Minimal -- one HTTP request per 100 offers
- Proxy: Optional, works without proxies in most cases
- Recommended for: Most use cases, salary analysis, market research
Full Details Mode (extractFullDetails: true)
- Speed: 1 HTTP request per offer (for full descriptions)
- Cost: Higher -- one request per offer plus listing page requests
- Proxy: Recommended to avoid rate limiting
- Recommended for: When you need full job descriptions, skill proficiency levels, or language requirements
URL Filter Reference
JustJoin.it URL structure:
https://justjoin.it/job-offers/{location}/{category}?{filters}
Query Parameters
| Parameter | Values | Example |
|---|---|---|
experience-level | junior, mid, senior, lead | ?experience-level=senior,mid |
employment-type | b2b, permanent, mandate_contract | ?employment-type=b2b |
workplace-type | remote, hybrid, office | ?workplace-type=remote,hybrid |
with-salary | yes | ?with-salary=yes |
keyword | any string | ?keyword=React |
orderBy | DESC | ?orderBy=DESC |
sortBy | published, salary | ?sortBy=published |
Example URLs
# All remote senior Python jobs with salaryhttps://justjoin.it/job-offers/all-locations/python?experience-level=senior&workplace-type=remote&with-salary=yes# B2B JavaScript jobs in Warsawhttps://justjoin.it/job-offers/warszawa/javascript?employment-type=b2b# All DevOps jobs sorted by salaryhttps://justjoin.it/job-offers/all-locations/devops?with-salary=yes&sortBy=salary&orderBy=DESC