
Global Sources Supplier Scraper
scrape.ly/store/cornerledger/globalsources-scraperLead generationE-commerce
2 monthly users

Scrape IT job offers from justjoin.it: title, company, salary per contract type, experience level, workplace type, skills with levels, locations, apply link and optional full description. Search by keyword, city, category or URL.
Scrape IT job offers from justjoin.it, the largest IT job board in Poland: job title, company, salary for every contract type (B2B, permanent, mandate), experience level, remote / hybrid / office, required skills with levels, locations, apply link and, if you want it, the full job description. Search by keyword, city, category and filters, or paste justjoin.it URLs. No login, no browser, a few seconds per hundred jobs.
python, react developer), or paste justjoin.it URLs (a search page with filters, or single job offers).| Field | What it does |
|---|---|
keywords | Search keywords; each runs as its own search. Empty lists every offer that matches the filters. |
startUrls | justjoin.it search pages (filters are read from the URL) or job offer URLs. |
maxItems | Maximum jobs in total (default 20, 0 = no limit). |
maxItemsPerSearch | Optional cap per keyword or URL. |
location | City, e.g. Warszawa, Kraków, Berlin, or remote. |
categories | Technology categories: python, java, javascript, data, devops, ai, ... |
experienceLevels | intern, junior, mid, senior, manager, c_level. |
employmentTypes | b2b, permanent, mandate_contract, contract, internship, freelance. |
workplaceTypes | remote, hybrid, office, mobile. |
workingTimes | full_time, part_time, internship, freelance, b2b_contract. |
withSalary / minSalary | Only offers with a salary / with at least this monthly PLN amount. |
publishedWithinDays | 1, 7, 14 or 30 days. |
languages | Required languages, e.g. en, pl, de. |
sortBy | published (default), newest or salary. |
extractFullDetails | Adds the full description and company details. |
{
"keywords": ["python"],
"location": "Warszawa",
"experienceLevels": ["senior"],
"employmentTypes": ["b2b"],
"withSalary": true,
"maxItems": 100,
"extractFullDetails": false
}
Or paste URLs:
{
"startUrls": [
"https://justjoin.it/job-offers/all-locations/python?experience-level=senior&with-salary=yes",
"https://justjoin.it/job-offers/warszawa/java"
],
"maxItems": 200
}
One row per job offer.
| Field | Description |
|---|---|
title, companyName, companyLogoUrl | Job title, company and logo |
city, street, latitude, longitude, locations | Main location and every other location of the offer |
category, experienceLevel, workplaceType, workingTime | Category, seniority, remote / hybrid / office and working time |
salary, salaryMin, salaryMax, salaryCurrency, salaryUnit, salaryType, salaryGross | First published salary, per the unit the employer used |
salaryMonthlyMin, salaryMonthlyMax | The same salary as a monthly amount (hourly rates converted by the site) |
salaryTexts, employmentTypes, allEmploymentTypes | Every salary per contract type, and its currency conversions |
requiredSkills, niceToHaveSkills (+ ...Detailed) | Skills, and skills with their 1–5 level |
languages, hybridOfficeDays, hybridRemoteDays, remoteInterview | Language requirements, hybrid schedule, remote recruitment |
isPromoted, isSuperOffer, openToHireUkrainians | Offer badges |
applyMethod, applyUrl, jobUrl | How to apply and the offer page |
publishedAt, lastPublishedAt, expiredAt, scrapedAt | Dates (ISO 8601) |
description, descriptionHtml, companyWebsite, companySize, countryCode, isActive | With Include full job description |
Example (trimmed, from a test run with full descriptions):
{
"guid": "ed141feb-1c3f-40e2-8a46-0ebc9d634b1b",
"title": "Inżynier ds. Wytwarzania i Modyfikacji Systemu",
"companyName": "Code and Pepper",
"city": "Warszawa",
"street": "Sienna",
"locations": [
{"city": "Warszawa", "street": "Sienna", "latitude": 52.230823, "longitude": 20.9964345, "jobUrl": "https://justjoin.it/job-offer/code-and-pepper-inzynier-ds-wytwarzania-i-modyfikacji-systemu-warszawa-java-23920c59"},
{"city": "Kraków", "street": "Wielicka", "latitude": 50.0646501, "longitude": 19.9449799, "jobUrl": "https://justjoin.it/job-offer/code-and-pepper-inzynier-ds-wytwarzania-i-modyfikacji-systemu-krakow-java-bfe73578"}
],
"category": "java",
"experienceLevel": "senior",
"workplaceType": "remote",
"workingTime": "full_time",
"salary": "18,000 - 24,000 PLN/month (net, b2b)",
"salaryMin": 18000,
"salaryMax": 24000,
"salaryCurrency": "PLN",
"salaryType": "b2b",
"salaryUnit": "month",
"salaryGross": false,
"salaryMonthlyMin": 18000,
"salaryMonthlyMax": 24000,
"salaryTexts": ["18,000 - 24,000 PLN/month (net, b2b)", "15,000 - 20,000 PLN/month (gross, permanent)"],
"employmentTypes": ["b2b", "permanent"],
"requiredSkills": ["Java", "Spring Boot", "REST API", "PostgreSQL", "Elasticsearch"],
"requiredSkillsDetailed": [{"name": "Java", "level": 4}, {"name": "Spring Boot", "level": 4}],
"languages": [{"code": "pl", "level": "C1"}, {"code": "en", "level": "C1"}],
"remoteInterview": false,
"isPromoted": false,
"applyMethod": "external",
"applyUrl": "https://careers.codeandpepper.com/o/inzynier-ds-wytwarzania-i-modyfikacji-systemu/c/new",
"publishedAt": "2026-10-21T15:05:03.3483726Z",
"expiredAt": "2026-10-27T22:59:59.999Z",
"jobUrl": "https://justjoin.it/job-offer/code-and-pepper-inzynier-ds-wytwarzania-i-modyfikacji-systemu-warszawa-java-23920c59",
"description": "Code & Pepper wspiera klientów w wymagających branżach, pomagając im w skalowaniu zespołów i budowaniu nowoczesnych produktów. ...",
"countryCode": "PL",
"isActive": true
}
You pay $0.70 per 1,000 jobs ($0.0007 per job saved), with or without full descriptions, plus a small platform usage charge (compute and proxy traffic). 1,000 jobs ≈ $0.70 in job fees plus well under a cent of platform usage for a listing run. Runs that find nothing cost only that usage. Set a maximum total charge on a run and the scraper stops cleanly when it is reached.
Is it legal to scrape justjoin.it? The scraper only reads public job offers that anyone can see without an account. Check the site's terms and your local rules (such as GDPR) for how you use the data.
Do I need a login or my own proxy? No. It works without an account, and the built-in datacenter proxy is enough; if the site starts refusing it, the scraper moves to Polish residential proxies by itself.
How many results can I get? As many as the site has: set Max results to 0 for no limit. justjoin.it serves at most 10,000 offers per search; a bigger search without a category is split by category automatically, and a narrower search that still hits 10,000 says so in the run status.
Why is a field empty? The employer did not publish it: many offers have no salary, no nice-to-have skills or no hybrid schedule. Description, company website and size come only with Include full job description.
Can I schedule it or use the API? Yes. Schedule runs in the console, or start them through the API and read the dataset as JSON, CSV or Excel.
I used a similar actor on another platform. Will my input work? Mostly yes: keyword, location, category, experienceLevel, employmentType, workplaceType, withSalary, sortBy, maxItems, extractFullDetails and startUrls are all read.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
keywordsarrayOptionalSearch keywords
Technologies, job titles or company names, as you would type them into the justjoin.it search box (for example python, react developer, data engineer). Each keyword runs as its own search with the filters below; offers found by several searches are saved once. Leave empty to list every offer that matches the location, category and filters.
startUrlsarrayOptionaljustjoin.it URLs
Paste justjoin.it search pages with filters already set (https://justjoin.it/job-offers/warszawa/java?experience-level=senior&with-salary=yes) or single job offers (https://justjoin.it/job-offer/...). Filters inside a search URL are used as they are.
maxItemsintegerOptionaldefault 20Max results
Maximum number of jobs to save in total. Use 0 for no limit. justjoin.it serves at most 10,000 offers per search; bigger unfiltered searches are split by category automatically.
maxItemsPerSearchintegerOptionalMax results per search
Optional cap for each keyword or URL, so one search cannot use up the whole limit. 0 or empty means no per-search cap.
All filters are optional and combine with AND; within one filter any value matches. They apply to keyword searches (and to a search without keywords), not to search URLs, which carry their own filters.
locationstringOptionalCity
A city, for example Warszawa, Kraków, Wrocław or Berlin. Use remote for fully remote offers. Empty means all locations.
categoriesarrayOptionalTechnology categories
Keep offers in these justjoin.it categories.
experienceLevelsarrayOptionalExperience levels
Seniority levels to keep.
employmentTypesarrayOptionalEmployment types
Keep offers that allow at least one of these contract types.
workplaceTypesarrayOptionalWorkplace types
Keep remote, hybrid, office or mobile offers.
workingTimesarrayOptionalWorking time
Keep offers with these working times.
withSalarybooleanOptionalOnly offers with a salary
Skip offers that do not publish a salary.
minSalaryintegerOptionalMinimum salary (PLN per month)
Keep offers whose published salary reaches this monthly amount in PLN.
publishedWithinDaysenumOptionalPublished within
Only offers published in this period.
languagesarrayOptionalRequired languages
Language codes the offer asks for, for example en, pl or de.
sortByenumOptionaldefault "published"Sort by
Order in which offers are read, which decides which ones are saved when the limit is reached.
extractFullDetailsbooleanOptionaldefault falseInclude full job description
Open each offer for the full description (text and HTML), company website and size, country code and whether the offer is still active. Slower; same price per job.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work for justjoin.it; the scraper moves to Polish residential proxies by itself if the site starts refusing them.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| guid | string | null | Offer id on justjoin.it |
| slug | string | null | Offer URL slug |
| title | string | null | Job title |
| companyName | string | null | Company name |
| companyLogoUrl | string | null | Company logo image URL |
| companyProfileSlug | string | null | Company profile slug on justjoin.it, when the company has one |
| city | string | null | Main city |
| street | string | null | Street of the main location |
| latitude | number | null | Latitude of the main location |
| longitude | number | null | Longitude of the main location |
| locations | array | Every location of the offer: city, street, coordinates and offer URL |
| category | string | null | justjoin.it category key (python, java, data, ...) |
| categoryName | string | null | Category name |
| experienceLevel | string | null | intern, junior, mid, senior, manager or c_level |
| workplaceType | string | null | remote, hybrid, office or mobile |
| workingTime | string | null | full_time, part_time, internship, freelance or b2b_contract |
| salary | string | null | First published salary as text, e.g. 18,000 - 24,000 PLN/month (net, b2b) |
| salaryMin | number | null | Lower salary bound, per salaryUnit |
| salaryMax | number | null | Upper salary bound, per salaryUnit |
| salaryCurrency | string | null | Salary currency as published (PLN, EUR, USD, ...) |
| salaryType | string | null | Contract type of that salary (b2b, permanent, mandate_contract, ...) |
| salaryUnit | string | null | month, hour, day or year |
| salaryGross | boolean | null | True for gross, false for net |
| salaryMonthlyMin | number | null | Lower bound converted to a monthly amount by the site |
| salaryMonthlyMax | number | null | Upper bound converted to a monthly amount by the site |
| salaryTexts | array | Every published salary (one per contract type) as text |
| employmentTypes | array | Contract types the offer allows |
| allEmploymentTypes | array | Every salary variant: type, from, to, currency, unit, gross, monthly amounts and whether it is the original or a currency conversion |
| requiredSkills | array | Required skills |
| niceToHaveSkills | array | Nice-to-have skills |
| requiredSkillsDetailed | array | Required skills with level (1-5) |
| niceToHaveSkillsDetailed | array | Nice-to-have skills with level (1-5) |
| languages | array | Required languages with level |
| hybridOfficeDays | number | null | Office days per week for hybrid offers |
| hybridRemoteDays | number | null | Remote days per week for hybrid offers |
| remoteInterview | boolean | null | Remote recruitment possible |
| openToHireUkrainians | boolean | null | Offer open to candidates from Ukraine |
| isPromoted | boolean | null | Promoted offer |
| isSuperOffer | boolean | null | Super offer badge |
| applyMethod | string | null | How to apply (external, form, ...) |
| applyUrl | string | null | External application URL |
| publishedAt | string | null | Publication date (ISO 8601) |
| lastPublishedAt | string | null | Last republication date (ISO 8601) |
| expiredAt | string | null | Expiry date (ISO 8601) |
| jobUrl | string | null | Offer page on justjoin.it |
| searchQuery | string | null | Keyword that found this offer |
| scrapedAt | string | null | When the offer was saved (ISO 8601) |
| description | string | null | Full job description as plain text (with Include full job description) |
| descriptionHtml | string | null | Full job description as HTML (with Include full job description) |
| companyWebsite | string | null | Company website (with Include full job description) |
| companySize | string | null | Company size (with Include full job description) |
| countryCode | string | null | Country code of the main location (with Include full job description) |
| isActive | boolean | null | Offer still active (with Include full job description) |
| companyShortDescription | string | null | Company's short description from its justjoin.it profile (with Include full job description) |
| videoUrl | string | null | Offer video, when published (with Include full job description) |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Job | One saved justjoin.it job offer, including the full description when enabled. | $0.0007 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('openrole/justjoinit-scraper').call({
"keywords": [
"python"
],
"startUrls": [],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run openrole/justjoinit-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=openrole/justjoinit-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Senior Java offers in Warszawa that publish a salary, 10 jobs.
Keyword search with the full job description, company website and size, 5 jobs.
Paste a filtered justjoin.it search URL, 10 jobs.
Fully remote Python offers on a B2B contract, 5 jobs.
Kraków offers requiring Polish, newest first, 10 jobs.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.