CEE Tech Jobs Scraper — justjoin.it + pracuj.pl + NoFluffJobs
Pricing
from $1.50 / 1,000 job scrapeds
CEE Tech Jobs Scraper — justjoin.it + pracuj.pl + NoFluffJobs
One actor, three Polish tech-job boards, one normalized schema with salary normalization and cross-board dedup. Pay-per-event.
Pricing
from $1.50 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
Atlas Dataworks
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
CEE Tech Jobs Scraper — justjoin.it, pracuj.pl, NoFluffJobs in one actor
Scrape Polish tech job offers from the three boards that matter — justjoin.it, it.pracuj.pl, and nofluffjobs.com — in a single run, with one normalized schema, normalized salaries, and cross-board deduplication. Built for job-market analytics, salary benchmarking, recruiting intelligence, and AI agents.
Why this actor
- 3 boards, 1 schema. Every existing scraper covers a single board with its own field names. This one returns identical records regardless of source, so your pipeline has exactly one shape to handle.
- Salary normalization.
"13 000–15 000 zł / mies. (zal. od umowy)", NoFluffJobs salary objects, and schema.orgbaseSalaryblocks all become{min, max, currency, period, gross}. Currency is recorded as published — no FX guessing. - Cross-board dedup. The same job posted on two or three boards becomes one record with a
sources[]array listing every board and URL it appeared on. - Freshness. Runs read the boards live;
postedAt/expiresAtcome from the boards themselves.
Output schema
One record per job, pushed to the default dataset:
| Field | Type | Notes |
|---|---|---|
source | justjoin | pracuj | nofluffjobs | Board the record came from (first board, if merged) |
sourceUrl | string | Canonical offer URL |
externalId | string | Board-native id / slug |
title | string | Job title |
company | string | Employer name |
locations | {city?, country?}[] | All named workplaces; country normalized to ISO alpha-2 (best effort — unrecognized values pass through as published) |
remote | remote | hybrid | onsite | unknown | Normalized work mode |
seniority | string? | junior / mid / senior / expert / manager / intern when derivable |
contractTypes | string[]? | e.g. b2b, permanent, mandate |
salary | {min?, max?, currency, period, gross?}? | Only when the board discloses it; one-sided offers ("od 8 000 zł") keep only the disclosed bound |
techStack | string[]? | Technologies named by the board |
postedAt / expiresAt | ISO date? | As published |
description | string? | Full description — only with Fetch full details |
scrapedAt | ISO date | Run timestamp |
sources | {source, sourceUrl}[]? | Present when boards were merged by dedup |
Input
{"boards": ["justjoin", "pracuj", "nofluffjobs"],"keyword": "python","maxJobsPerBoard": 100,"fetchDetails": false}
keyword— server-side search on NoFluffJobs; title/company/tech-stack match on justjoin.it and pracuj.pl.maxJobsPerBoard— strict per-board cap.fetchDetails— adds full descriptions (justjoin.it JSON-LD, NoFluffJobs detail API) and fires the premiumjob-detailevent.proxyConfiguration— used only for pracuj.pl; the default (Apify datacenter groupBUYPROXIES94952) is the cheapest tier that passes.
Pricing (pay-per-event)
| Event | Fires | Price |
|---|---|---|
job-scraped | per normalized job record delivered | $0.0015 ($1.50 / 1,000 jobs) |
job-detail | per record enriched with a full description | $0.005 ($5.00 / 1,000 details) |
Actor Start | once per run, charged by the platform | $0.00005 ($0.05 / 1,000 runs) |
Result | per record stored, charged by the platform | $0.00005 ($0.05 / 1,000 records) |
job-detail is charged in addition to job-scraped, not instead of it — a job delivered
with its full description costs $0.0065. Details are charged after deduplication, over records
actually delivered.
The last two rows are Apify platform events rather than ours. They are small (a 10,000-job run pays about $0.50 across both) and they are listed here so this table matches the pricing shown on the Store page exactly. Platform usage — compute and proxies — is bundled: there is no separate usage line on your bill.
You pay for delivered records, not runtime. Runs respect your budget cap
(maxTotalChargeUsd): when the cap is reached the actor stops delivering,
reports how much of the result set was delivered, and never charges past it.
Using it from an AI agent (MCP)
The actor is callable as an MCP tool via Apify's MCP server. Example agent prompt:
Call
cee-tech-jobs-scraperwith{"keyword": "data engineer", "maxJobsPerBoard": 50}and summarize median salary by seniority.
Or via the API:
curl -X POST "https://api.apify.com/v2/acts/<user>~cee-tech-jobs-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"keyword": "python", "maxJobsPerBoard": 100}'
Honest limits
- justjoin.it depth: one listing page yields ~100 offers per run (the listing is an infinite-scroll app). Enough for fresh-offers monitoring; not a full-board dump.
- pracuj.pl descriptions: listing-level data only in this version — full pracuj descriptions are on the roadmap.
- Dedup key is normalized company+title, matched across boards. Two consequences to know about: (a) false negatives — the same employer often spells its name differently per board ("Acme" vs "Acme Sp. z o.o."), and those records will NOT merge; (b) over-merges — distinct openings sharing both company and title (e.g. the same role posted separately per city) merge into one record, with every posting's URL kept in
sources[]and all locations unioned.sources[]can therefore also list the same board twice. - Keyword runs on pracuj.pl and justjoin.it filter client-side (title/company/tech match) after fetching listing pages, so a keyword run can return fewer than
maxJobsPerBoardrecords from those boards even when more matches exist deeper in the listing. NoFluffJobs applies the keyword server-side and does not have this limit. - Salary
grossis only set when the board says brutto/netto explicitly; B2B rates carry no gross/net flag by nature. - No FX conversion by design — currency is reported as published (almost always PLN).
- Boards change their markup; the pracuj extractor has a built-in DOM fallback, but a board redesign can still degrade a run. Scheduled test runs guard freshness.