NoFluffJobs Scraper — Poland & CEE IT Jobs with Salaries
Pricing
from $1.20 / 1,000 job results
NoFluffJobs Scraper — Poland & CEE IT Jobs with Salaries
Scrape IT & tech jobs from NoFluffJobs, the Poland/CEE board with mandatory salary transparency. Each record has title, company, salary min/max, seniority, tech stack, remote flag and apply URL. Incremental delta mode with repost detection; filter by category, currency, remote. JSON, CSV, Excel.
Pricing
from $1.20 / 1,000 job results
Rating
0.0
(0)
Developer
Nomad.Dev
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
3
Monthly active users
10 hours ago
Last modified
Categories
Share
Scrape IT and business openings with mandatory salary transparency from NoFluffJobs — a single unified CEE/EU search index that already includes postings located in Poland, Czechia, Hungary, Slovakia, Ukraine, Netherlands and more (see the region field below for why there's nothing to select there).
Claude / Codex skill to describe and setup this actor: SKILL.md
Why this scraper:
- The only closed, verified 37-category enum — every category slug was probed live against the NoFluffJobs search API, so you get honest coverage instead of a free-text box that silently returns nothing.
- Salary transparency by design — NoFluffJobs mandates a salary range on every posting, and you get it structured (
salaryMin/salaryMax/salaryCurrency) in 8 currencies (EUR/PLN/USD/GBP/CHF/CZK/HUF/UAH). - Incremental delta mode + repost detection — re-run on a schedule and get only what's new or freshly re-listed, with an
isRepostflag on every record. - Rich filters most competitors lack —
postedSince,titleExclude/companyExclude,remoteOnly,withSalaryOnly. - Opt-in delivery — POST new postings to a webhook or a Telegram chat straight from the run.
What NoFluffJobs data does this scraper extract?
Each result is one flat JSON record per job posting:
| Field | Meaning |
|---|---|
id | Stable source-side identifier (alias of externalId) |
externalId | Stable source-side identifier |
source | Always "nofluffjobs" — which scraper produced this record |
title | Job title as posted |
company | Hiring company / organisation |
location | Location / duty station (may include remote hints) |
remote | true when NoFluffJobs flags the posting as fully remote |
url | Direct link to the posting |
category | NoFluffJobs category slug the posting was fetched under |
seniority | Seniority levels listed on the posting |
skills | Must-have skills/tech stack |
postedAt | Posting date where the source provides it (ISO 8601) |
isRepost | true when a prior run already saw this job (same company+title) and it has been re-listed/renewed. Populated only in incremental/repost mode |
salary | Salary text where the source provides it, e.g. "B2B 25000–32000 PLN" |
salaryMin | Structured minimum salary (number, or null) |
salaryMax | Structured maximum salary (number, or null) |
salaryCurrency | Currency of salaryMin/salaryMax (or null) |
salaryPeriod | Always "month" when salary numbers are present (NoFluffJobs is always queried with a monthly period), else null |
snippet | Short description excerpt |
How to scrape NoFluffJobs 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/nofluffjobs-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~nofluffjobs-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 (select, multi) | all 37 (see list) | NoFluffJobs categories to fetch. Defaults to the full set for broad coverage. Closed list verified live against the search API: backend, frontend, fullstack, mobile, embedded, testing, devops, architecture, security, game-dev, artificial-intelligence, data, sys-administrator, pm, agile, product-management, project-manager, business-intelligence, business-analyst, ux, support, erp, electronics, telecommunication, electrical-eng, automation, mechanics, sales, marketing, office-administration, hr, finance, consulting, customer-service, law, logistics, other, plus legacy alias ai-data (not in the default set — already covered by artificial-intelligence + data). |
maxItems | integer | 100 | Maximum total number of postings to return across all categories. Set 0 for no limit. |
maxPages | integer | 5 | Maximum number of result pages to fetch per category (each page contains up to 50 postings). |
salaryCurrency | string (select) | "EUR" | Currency in which salary ranges are returned. NoFluffJobs converts all salaries to this currency. One of EUR, PLN, USD, GBP, CHF, CZK, HUF, UAH. |
postedSince | integer (days) | 0 | Drop postings older than N days (based on postedAt). 0 disables the filter. Postings with a missing/unparseable postedAt always pass through. |
titleExclude | array | [] | Drop postings whose title contains any of these strings (case-insensitive substring match). |
companyExclude | array | [] | Drop postings whose company name contains any of these strings (case-insensitive substring match). |
remoteOnly | boolean | false | Keep only postings flagged fully remote. |
withSalaryOnly | boolean | false | Keep only postings that publish a salary range. |
onlyNewSinceLastRun (Incremental) | boolean | false | Delta mode: emit only postings that are brand-new or reposted/renewed since the previous run for the same search. Skips already-seen unchanged postings. State is persisted in the key-value store. |
skipReposts (Incremental) | boolean | false | Drop postings flagged isRepost (same job re-listed under a new slug or bumped with a newer date). Enabling this (or onlyNewSinceLastRun, or a stateName) turns on cross-run state tracking and the isRepost output field. |
stateName (Incremental) | string | "" | Custom key-value-store record name for delta/repost state. Empty derives one from categories/currency/region. (Legacy input name stateKey still accepted.) |
webhookUrl (Notifications) | string | "" | If set, POST this run's postings as JSON ({source, count, truncated, items}, items capped at 200) to this URL. Fail-open. |
telegramBotToken (Notifications, secret) | string | "" | Bot token for a short Telegram summary of the run (with telegramChatId). Stored as a secret. Fail-open. |
telegramChatId (Notifications) | string | "" | Target chat/channel ID for the Telegram summary. |
cacheTtlSeconds (Advanced) | integer | 1800 | Cache the upstream fetch in the key-value store for this many seconds; re-runs within the window skip the network call. Set 0 to disable. |
region (Advanced, deprecated — ignored) | string (select) | "pl" | Kept for backward compatibility only. NoFluffJobs' public search API currently ignores this query parameter — verified by comparing result counts across pl/hu/cz/sk/ua/nl and an invalid value, all identical. All CEE/EU postings already come from one unified index regardless of this setting; "pl" is the only enum value today. |
Incremental / delta mode & repost detection
Schedule this Actor and set onlyNewSinceLastRun: true to fetch only what changed since the previous run for the same search — brand-new postings plus jobs that were re-listed or renewed. Everything you already saw and that hasn't changed is skipped, so a job-alert bot or ingest pipeline never re-processes stale rows.
Every record carries an isRepost flag: true when the same job (matched on a stable company + title identity) was seen in a prior run and has since been re-listed under a new URL slug or bumped with a newer posted/renewed date. Set skipReposts: true to drop those entirely; combine both toggles for strictly brand-new postings only.
State is persisted in the run's key-value store, keyed automatically by categories/currency/region — or set your own stateName to share or isolate state across searches. State handling is fail-open: a storage hiccup degrades to a normal (non-incremental) run rather than failing.
Notifications
Push results straight out of the run without an extra integration:
webhookUrl— POSTs a JSON payload ({source, count, truncated, items}, items capped at 200) to any endpoint (Make, Zapier, n8n, your own service).telegramBotToken+telegramChatId— sends a short summary (count + first postings, with a[repost]tag) to a Telegram chat.
Both are opt-in and fail-open: a delivery error is logged but never fails the run or affects the dataset. Combine with incremental mode to get a clean "new jobs" feed delivered on every scheduled run.
Output example
{"id": "rust-developer-ocado","externalId": "rust-developer-ocado","source": "nofluffjobs","title": "Rust Developer","company": "Ocado Technology","location": "Kraków","remote": false,"url": "https://nofluffjobs.com/job/rust-developer-ocado","category": "backend","seniority": "Mid, Senior","skills": "Rust, Kubernetes, AWS","salary": "B2B 25000–32000 PLN","salaryMin": 25000,"salaryMax": 32000,"salaryCurrency": "PLN","salaryPeriod": "month","postedAt": "2026-06-29T10:15:17+00:00","isRepost": false,"snippet": "level=Mid, Senior; skills=Rust, Kubernetes, AWS; salary=B2B 25000–32000 PLN"}
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.
Pricing
Pay per event: $0.005 per Actor start and $0.0015 per job returned. 100 jobs ≈ $0.155. No subscription, no rental — you pay only for what you fetch.
Use cases
- Salary-transparency analytics for CEE
- Tech job boards and alert bots
- Compensation benchmarking by stack and seniority
- Sourcing in Poland and CEE
FAQ
Is it legal to scrape NoFluffJobs? 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 quick ⭐ review on the Actor's Reviews tab helps other Poland/CEE job-data users find it — and tells us what to build next.
Related Actors
- Web Developer Jobs Scraper — 10 Boards in One
- JustJoin.it Jobs Scraper — Polish Tech & IT Jobs
- LinkedIn Jobs Scraper — No Login, No Cookies
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.