JustJoin.it Scraper — Polish Tech & IT Jobs + B2B/UoP Salary avatar

JustJoin.it Scraper — Polish Tech & IT Jobs + B2B/UoP Salary

Pricing

from $0.60 / 1,000 job results

Go to Apify Store
JustJoin.it Scraper — Polish Tech & IT Jobs + B2B/UoP Salary

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

Nomad Dev

Maintained by Community

Actor stats

0

Bookmarked

28

Total users

6

Monthly active users

2 days ago

Last modified

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

  1. Click Try for free / Run — no login to the target site, no cookies, no proxies to configure.
  2. Adjust the input (keyword, filters, maxItems) or keep the defaults.
  3. 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 ApifyClient
client = 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

FieldTypeDefaultNotes
categoriesarray of ids[] = all 23 categoriesTech 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.
keywordsarray of strings[]Keep only postings whose title or skills contain at least one of these keywords (case-insensitive). Leave empty for all postings.
citystring""Keep only postings whose city or listed locations contain this text (case-insensitive), e.g. Warszawa. Leave empty for all locations.
experienceLevelsarray (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.
workplaceTypesarray (select)[]Filter by workplace arrangement (remote / hybrid / office). Leave empty for all types.
contractTypesarray (select)[]Keep only postings offering at least one of these contract types (b2b / permanent / mandate_contract / internship / any). Leave empty for all.
withSalaryOnlybooleanfalseKeep only postings that disclose a salary range.
salaryMininteger0Drop postings whose top disclosed salary is below this (PLN-normalised). Postings with no salary are dropped when set. 0 disables.
postedWithinstringanyKeep 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.
titleExcludearray of strings[]Drop postings whose title contains any of these substrings (case-insensitive).
companyExcludearray of strings[]Drop postings whose company name contains any of these substrings (case-insensitive).
maxItemsinteger100Maximum number of job postings to return across all requested categories. Set 0 for no limit.
maxPagesinteger5Maximum number of result pages to fetch for each category (50 results per page). Increase to get older postings.
extractFullDetailsbooleanfalseAdvanced. Fetch each offer's page to add description, skillLevels, languages and companySize. One extra request per posting; fails open per posting.
cacheTtlSecondsinteger1800Reuse 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": "…"
}
}
}
FieldMeaning
schemaVersionAlways "nomad-agent-job-row-v1".
recordType"posting" for a job, "diagnostic" for a row reporting something about the run itself.
sourceWhich job source the posting came from, from the collector registry's vocabulary — not the Actor name.
idStable identifier for the posting within source.
urlCanonical public URL of the posting on the source site.
titleJob title exactly as the source publishes it, untruncated.
companyEmployer name as published.
locationsPlaces the role is based, most specific first — e.g. ["Bilbao", "Spain"].
postedAtWhen the source published the posting, ISO-8601 UTC (YYYY-MM-DDTHH:MM:SSZ).
deadlineClosing date for applications as an ISO-8601 calendar date (YYYY-MM-DD).
descriptionThe complete posting body as plain text — never truncated, never summarised.
descriptionHtmlThe posting body as the source's own markup, preserving lists, headings and links.
workTypeWorking arrangement: "remote", "hybrid" or "onsite".
customFacts 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.


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.