JustJoin.it Scraper — Polish Tech & IT Jobs + B2B/UoP Salary
Pricing
from $0.60 / 1,000 job results
JustJoin.it Scraper — Polish Tech & IT Jobs + B2B/UoP Salary
[$0.90/1K] Scrape live IT jobs from JustJoin.it, Poland's top tech board — all 23 categories. Title, company, city, per-contract B2B/UoP/mandate salary, tech stack, required + nice-to-have skills, remote status, geo-coords. For CEE developer sourcing, salary analytics and job boards.
Pricing
from $0.60 / 1,000 job results
Rating
0.0
(0)
Developer
Nomad Dev
Maintained by CommunityActor stats
0
Bookmarked
28
Total users
6
Monthly active users
2 days ago
Last modified
Categories
Share
JustJoin.it Jobs Scraper — Polish Tech & IT Jobs
Claude / Codex skill to describe and setup this actor: SKILL.md
Scrape current IT openings from JustJoin.it — Poland's biggest tech board — with salary-aware filters and mapped tech-stack facts in custom.data.
- $0.90 per 1,000 jobs, no start fee — the cheapest JustJoin.it Actor on the Apify Store
- All 23 tech categories by default — full-board coverage, not a single search query
- Salary-aware filtering using source pay ranges; the shared flat dataset does not publish a per-contract salary breakdown
- Keyword, city, salary, recency and exclusion filters built in
What JustJoin.it data does this scraper extract?
Published postings follow nomad-agent-job-row-v1. The shared fields carry
source identity, title and company, parsed locations, dates, the complete
plain-text body when available, source markup when usable, and work type.
Unavailable scalar facts are null; no parsed location is []. Source-only
facts appear in versioned custom.data only when mapped there. See the
Output example section for the exact dataset fields and diagnostic rows.
How to scrape JustJoin.it with this Actor
- Click Try for free / Run — no login to the target site, no cookies, no proxies to configure.
- Adjust the input (keyword, filters,
maxItems) or keep the defaults. - Run it and export the dataset as JSON, CSV or Excel, or read it over the API.
Run it from your own code:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("nomad-agent/justjoinit-scraper").call(run_input={"maxItems": 50})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], "—", item["company"], item["url"])
Or a single HTTP call that runs the Actor and returns items in one response:
curl -X POST \"https://api.apify.com/v2/acts/nomad-agent~justjoinit-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"maxItems": 50}'
Input
| Field | Type | Default | Notes |
|---|---|---|---|
categories | array of ids | [] = all 23 categories | Tech category ids to fetch: 1 JavaScript, 2 HTML/CSS, 3 PHP, 4 Ruby, 5 Python, 6 .NET, 7 Scala, 8 C, 9 Mobile, 10 Testing, 11 DevOps, 12 Admin, 13 UX/UI, 14 PM, 15 Game, 16 Analytics, 17 Security, 18 Data, 19 Go, 20 Support, 21 ERP, 22 Architecture, 23 Other. Empty means every category — the source has no "all categories" query, so broad coverage means one request per category id; maxItems still caps the total returned. Narrow it to specific categories if you only want e.g. frontend roles. Ids may be numbers or strings — [1, 5] and ["1", "5"] both work. |
keywords | array of strings | [] | Keep only postings whose title or skills contain at least one of these keywords (case-insensitive). Leave empty for all postings. |
city | string | "" | Keep only postings whose city or listed locations contain this text (case-insensitive), e.g. Warszawa. Leave empty for all locations. |
experienceLevels | array (select) | [] | Filter by experience level (junior / mid / senior / c_level / manager, plus anything else the board uses, e.g. intern). The legacy c-level spelling is accepted and folded to c_level. Leave empty for all levels. |
workplaceTypes | array (select) | [] | Filter by workplace arrangement (remote / hybrid / office). Leave empty for all types. |
contractTypes | array (select) | [] | Keep only postings offering at least one of these contract types (b2b / permanent / mandate_contract / internship / any). Leave empty for all. |
withSalaryOnly | boolean | false | Keep only postings that disclose a salary range. |
salaryMin | integer | 0 | Drop postings whose top disclosed salary is below this (PLN-normalised). Postings with no salary are dropped when set. 0 disables. |
postedWithin | string | any | Keep only jobs published inside this window. Use any for no date filter, or a duration — 1h, 24h, 3d, 2w, 6m. Jobs the source published no date for are kept rather than dropped. Replaces postedSince, still accepted for existing integrations. |
titleExclude | array of strings | [] | Drop postings whose title contains any of these substrings (case-insensitive). |
companyExclude | array of strings | [] | Drop postings whose company name contains any of these substrings (case-insensitive). |
maxItems | integer | 100 | Maximum number of job postings to return across all requested categories. Set 0 for no limit. |
maxPages | integer | 5 | Maximum number of result pages to fetch for each category (50 results per page). Increase to get older postings. |
extractFullDetails | boolean | false | Advanced. Fetch each offer's page to add description, skillLevels, languages and companySize. One extra request per posting; fails open per posting. |
cacheTtlSeconds | integer | 1800 | Reuse a recent fetch instead of hitting JustJoin.it again within this many seconds; set 0 to always fetch fresh data. |
Output example
Every row follows nomad-agent-job-row-v1, the one shape shared by all of
this fleet's job Actors. A row carries every field; null means the
source did not publish that fact, and locations: [] means no
usable location was parsed from the posting. Nothing is guessed.
{"schemaVersion": "nomad-agent-job-row-v1","recordType": "posting","source": "justjoinit","id": "a1b2c3","url": "https://example.com/justjoinit/jobs/a1b2c3","title": "Senior Backend Engineer","company": "Example Company","locations": ["Bilbao","Spain"],"postedAt": "2026-09-02T00:00:00Z","deadline": null,"description": "The complete posting body as plain text, exactly as the source published it — never truncated.","descriptionHtml": "<p>The complete posting body as the source's own markup.</p>","workType": "remote","custom": {"schemaId": "nomad-agent-job-custom-justjoinit-v1","data": {"latitude": "…","longitude": "…","skills": "…"}}}
| Field | Meaning |
|---|---|
schemaVersion | Always "nomad-agent-job-row-v1". |
recordType | "posting" for a job, "diagnostic" for a row reporting something about the run itself. |
source | Which job source the posting came from, from the collector registry's vocabulary — not the Actor name. |
id | Stable identifier for the posting within source. |
url | Canonical public URL of the posting on the source site. |
title | Job title exactly as the source publishes it, untruncated. |
company | Employer name as published. |
locations | Places the role is based, most specific first — e.g. ["Bilbao", "Spain"]. |
postedAt | When the source published the posting, ISO-8601 UTC (YYYY-MM-DDTHH:MM:SSZ). |
deadline | Closing date for applications as an ISO-8601 calendar date (YYYY-MM-DD). |
description | The complete posting body as plain text — never truncated, never summarised. |
descriptionHtml | The posting body as the source's own markup, preserving lists, headings and links. |
workType | Working arrangement: "remote", "hybrid" or "onsite". |
custom | Facts only this source publishes, as {"schemaId", "data"}. |
A run also emits diagnostic rows — recordType: "diagnostic" with a
warnings array — when it has something to report, such as a source
returning nothing. They are never billed and are easy to filter out on
recordType.
Pricing
Pay per event: $0.0009 per job returned — 1,000 jobs ≈ $0.90, the cheapest JustJoin.it scraper on the Apify Store. No start fee, no subscription, no rental — you pay only for what you fetch.
Integrations
Export results as JSON, CSV or Excel; connect via Make, Zapier or n8n; call directly with run-sync-get-dataset-items; or plug into AI agents through the Apify MCP server.
Use cases
- CEE tech job boards and alert bots
- Salary analytics for the Polish market (B2B vs UoP)
- Tech-stack demand tracking
- Sourcing developers in Poland
FAQ
Is it legal to scrape JustJoin.it? This Actor reads only publicly available job postings — data any visitor can see without logging in. No personal data behind authentication is touched. Review the target site's terms and your local regulations for your specific use case.
Do I need an account on the target site? No. Postings are fetched from public pages/APIs — no login, cookies or session tokens.
How fresh is the data?
Every run fetches live listings. Results are cached for cacheTtlSeconds (default 30 min, set 0 to always hit the source live).
How many jobs can I get?
maxItems caps the run (set 0 where supported for no cap). Most sources paginate from newest to oldest.
Something broken or missing? Open an issue on the Actor's Issues tab — it is monitored and reliability fixes ship fast.
Is this Actor useful to you? A short review on the Actor's Reviews tab helps other users find it — it takes a minute and is genuinely appreciated.
Related Actors
- Web Developer Jobs Scraper — 10 Boards in One
- NoFluffJobs Scraper — IT Jobs with Salaries
- Tecnoempleo Scraper — Spain IT & Tech Jobs
From the maker of Oink — an open-source, AI-powered job-search bot for Telegram that runs on these Actors. Try the free bot, get a managed instance at oinkjobsearch.com, or browse the full catalog of 50+ Actors.