NoFluffJobs Scraper · Polish Tech Jobs, Salaries & Skills
Pricing
from $1.32 / 1,000 job listing returneds
NoFluffJobs Scraper · Polish Tech Jobs, Salaries & Skills
NoFluffJobs scraper to extract Polish and European tech job listings, IT jobs and salary ranges from NoFluffJobs.com. Extract job titles, companies, salaries, tech stacks, required skills, seniority, location and remote options. Ideal for IT recruitment, salary benchmarking and job market research.
Pricing
from $1.32 / 1,000 job listing returneds
Rating
0.0
(0)
Developer
Tarek Etman
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share

NoFluffJobs Scraper · Polish Tech Jobs, Salaries & Skills
A NoFluffJobs scraper and NoFluffJobs search scraper to extract Polish and European tech job listings with the published salary range on every single row. NoFluffJobs requires employers to publish pay, making it the top European job board for tech salary benchmarking and IT recruitment. Filter by category, technology, seniority, city, contract type and salary floor. Extract job titles, companies, salaries, tech stacks, required skills, and remote work flags. No login, no API key, no browser.
Maintained by reapX. Every row cites the Apify run that produced it — nothing is inferred, modelled or filled in, and a field absent from the source is absent from the row. The extracted archive for this source is browsable at reapx.dev/data/nofluffjobs-scraper/ and mirrored as an open dataset on Hugging Face and Kaggle. Questions: reapxdev@proton.me
Why use this NoFluffJobs job search scraper?
What you get
One row per listing, with a stable jobId you can use as a primary key:
| Field | Example |
|---|---|
title / companyName | Senior Java Developer / Upvanta |
salaryFrom / salaryTo / salaryCurrency | 23100 / 25200 / PLN |
salaryType / salaryDisclosed | b2b / true |
category / seniority | backend / ["Senior"] |
requiredSkills | ["Java", "REST API", "Jira"] |
city / cities / isFullyRemote | Kraków / ["Warszawa","Kraków","Remote"] / true |
postedAt / renewedAt | 2026-07-31T09:21:11Z / 2026-08-02T09:21:11Z |
jobUrl | direct link to the listing |
Four named views ship with the dataset: Jobs overview, Salary benchmark, Skill demand and Remote roles.
Salary data that is actually there
Set Show salaries in to PLN, EUR, USD, GBP or CHF and the source converts every range for you. Set Minimum salary to keep only listings above a threshold, and Only listings with a visible salary to drop the few that hide it. Filtered rows are never charged.
Filter the way the board does
- Job categories - backend, frontend, fullstack, devops, data, AI, security, testing and 15 more
- Required technologies - matched against the listing's own skill tags: java, python, react, kubernetes, aws
- Seniority - trainee, junior, mid, senior, expert
- Cities - warszawa, krakow, wroclaw, gdansk, poznan, katowice, lodz
- Contract type - B2B, permanent, mandate, internship
- Fully remote only - one checkbox
Input configuration
Every field is optional. The prefilled values below are what runs if you press Start without changing anything.
What kind of job
Combine any of these filters. Everything you fill in narrows the search, so more filters means fewer, sharper results.
| Field | Type | Accepts | What it does |
|---|---|---|---|
keywords | list | one value per line | Free-text terms matched across the listing, one per line. A job is kept if it matches at least one. Examples: kubernetes, fintech, machine learning. |
categories | list | one value per line | NoFluffJobs job categories. Leave empty for every category. Prefilled with ["backend"]. |
technologies | list | one value per line | Technology the job requires, one per line, matched against the listing's own skill tags. Examples: java, python, react, kubernetes, aws. |
seniority | list | one value per line | Experience level. Leave empty for all levels. |
Where and on what contract
NoFluffJobs is a Polish board. Most listings name one or more Polish cities, and many are also offered fully remote.
| Field | Type | Accepts | What it does |
|---|---|---|---|
cities | list | one value per line | Polish city names, one per line, without diacritics. Examples: warszawa, krakow, wroclaw, gdansk, poznan, katowice, lodz. |
remoteOnly | true/false | checkbox | Keep only listings that can be done fully remotely. Prefilled with false. |
employmentTypes | list | one value per line | How the role is contracted. B2B is the most common arrangement on this board. |
Salary
NoFluffJobs requires employers to publish a salary range, which is why every row here carries one.
| Field | Type | Accepts | What it does |
|---|---|---|---|
salaryCurrency | string | one of 5: PLN, EUR, USD, GBP, ... | Currency every salary range is converted to before it is returned. Prefilled with "PLN". |
salaryPeriod | string | month, hour | Whether salary ranges are expressed per month or per hour. Prefilled with "month". |
minSalary | integer | 0 to 1000000 | Keep only listings whose upper salary bound is at least this much, in the currency and period chosen above. Leave empty for no minimum. |
onlyDisclosedSalary | true/false | checkbox | Drop the small number of listings whose salary range is hidden until you apply. Prefilled with false. |
Size and pacing
How many rows to return and how gently to read the source.
| Field | Type | Accepts | What it does |
|---|---|---|---|
maxJobs | integer | 1 to 30000 | Hard stop on how many jobs are returned and charged. Each job returned costs $0.002. 100 jobs finishes in well under a minute. Prefilled with 100. |
requestDelaySecs | integer | 1 to 60 | Seconds to wait between requests to NoFluffJobs. 1 is the minimum this Actor allows; raise it if you are running several jobs at once. Prefilled with 2. |
Pricing
Pay per event. The primary event is Job listing returned (job-listing), charged at $0.002 per event on the free plan, falling to $0.00084 on the highest tier.
Charged once for each NoFluffJobs listing delivered as a complete row: title, company, category, seniority, published salary range, required skills, city and remote flag. Listings removed by your salary filters, queries that match nothing and blocked requests are never charged.
Other charged events: apify-actor-start (Actor Start).
Minimum charge cap per run: $0.005.
Tiered discounts apply automatically on every paid Apify plan. Platform usage is absorbed by the Actor, so the per-event price is the whole price.
Usage examples
The prefilled run, which is what Start does with nothing changed
{"categories": ["backend"],"remoteOnly": false,"salaryCurrency": "PLN","salaryPeriod": "month","onlyDisclosedSalary": false,"maxJobs": 100,"requestDelaySecs": 2}
Filter by keywords
{"categories": ["backend"],"remoteOnly": false,"salaryCurrency": "PLN","salaryPeriod": "month","onlyDisclosedSalary": false,"maxJobs": 100,"requestDelaySecs": 2,"keywords": ["kubernetes","terraform"]}
Filter by job categories
{"categories": ["devops","security"],"remoteOnly": false,"salaryCurrency": "PLN","salaryPeriod": "month","onlyDisclosedSalary": false,"maxJobs": 100,"requestDelaySecs": 2}
Filter by required technologies
{"categories": ["backend"],"remoteOnly": false,"salaryCurrency": "PLN","salaryPeriod": "month","onlyDisclosedSalary": false,"maxJobs": 100,"requestDelaySecs": 2,"technologies": ["java","spring"]}
Filter by seniority
{"categories": ["backend"],"remoteOnly": false,"salaryCurrency": "PLN","salaryPeriod": "month","onlyDisclosedSalary": false,"maxJobs": 100,"requestDelaySecs": 2,"seniority": ["senior","expert"]}
Output example
One row, exactly as the actor wrote it to the dataset:
{"jobId": "pega-lead-system-architect-dcg-Gdynia","jobUrl": "https://nofluffjobs.com/job/pega-lead-system-architect-dcg-gdynia","title": "Pega Lead System Architect","companyName": "DCG","category": "architecture","seniority": ["Expert"],"seniorityTop": "Expert","technology": "PEGA","requiredSkills": ["Pega","PEGA PRPC","Pega Infinity"],"otherTags": ["architecture"],"salaryFrom": 28560,"salaryTo": 30240,"salaryCurrency": "PLN","salaryPeriod": "month","salaryType": "b2b","salaryDisclosed": true,"isFullyRemote": false,"cities": ["Gdynia","Gdańsk","Warszawa"]}
That row carries 28 fields in total; 18 are shown.
Fields on every row
| Field | Type | What it is |
|---|---|---|
jobId | string | Stable NoFluffJobs identifier for this listing. Unique per posting and safe to use as a primary key. |
jobUrl | string | Public NoFluffJobs page for this listing. |
title | string | Job title exactly as the employer published it. |
companyName | string | Name of the hiring company. |
category | string | NoFluffJobs job category the listing is filed under, in the source's own camelCase vocabulary (backend, productManagement, artificialIntelligence, ...). The source adds categories over time, so this is not a closed set. |
seniority | list | Every experience level the listing is open to. Many listings accept more than one. |
seniorityTop | string | The first seniority level on the listing, for simple grouping and charts. |
technology | string | The headline technology NoFluffJobs assigns to the listing, when it assigns one. |
requiredSkills | list | Skill tags the employer marked as requirements. This is the field to aggregate for skill-demand analysis. |
otherTags | list | Remaining listing tags that are not hard requirements, such as nice-to-have skills. |
salaryFrom | number | Lower bound of the advertised salary range, in the currency and period requested. |
salaryTo | number | Upper bound of the advertised salary range, in the currency and period requested. |
salaryCurrency | string | Currency the salary range is expressed in. |
salaryPeriod | string | Whether the salary range is per month or per hour. |
salaryType | string | Contract the salary range applies to. B2B rates and permanent salaries are not directly comparable. |
salaryDisclosed | true/false | True when the employer publishes the range up front rather than hiding it until application. |
isFullyRemote | true/false | True when the listing can be done fully remotely. |
city | string | First city named on the listing, for simple grouping. |
cities | list | Every location named on the listing. Polish listings are commonly offered in several cities at once. |
countries | list | Countries the listing names. |
regions | list | NoFluffJobs region codes the listing is published under. |
postedAt | string | When the listing was first published, ISO 8601. |
postedDate | string | Publication date only, YYYY-MM-DD, for grouping and filtering. |
renewedAt | string | When the employer last renewed the listing, ISO 8601. Renewals are how stale postings stay at the top. |
reference | string | The employer's own reference code for the vacancy, when published. |
onlineInterviewAvailable | true/false | True when the employer offers a fully online interview process. |
sourceQuery | string | The resolved query that produced this row, so a merged dataset stays traceable. |
scrapedAt | string | When this Actor read the row from NoFluffJobs, ISO 8601. |
4 named dataset views ship with it: Jobs overview, Salary benchmark, Skill demand, Remote roles. They drive the Output tab in Console and the Output block on the Actor's .md page.
FAQ
Does every row really have a salary?
Almost every one. NoFluffJobs requires a published range, and salaryDisclosed tells you when an employer has hidden it. Turn on Only listings with a visible salary to exclude those entirely.
Can I compare B2B and permanent pay?
Use salaryType. B2B rates are gross contractor rates and permanent salaries are employment salaries, so they are not directly comparable - the field is there so you can separate them.
How do I find which technologies are in demand?
Run a category-wide search and aggregate the requiredSkills array. The Skill demand view is built for exactly this.
How do I write Polish city names?
Without diacritics: warszawa, krakow, wroclaw, gdansk, poznan. The city returned on the row keeps its proper spelling.
How fresh is the data?
Read live on every run. postedAt is first publication and renewedAt is the last employer renewal, so you can tell a genuinely new listing from a refreshed one.
Can I use this from an AI agent?
Yes. The dataset schema types and documents every field, so the output chains directly into agent workflows through the Apify MCP server.
Unofficial - not affiliated with NoFluffJobs. Collects public data only. reapx. Contact reapxdev@proton.me.
The full published archive
- nofluffjobs scraper archive — every entity this Actor has observed
- All reapx datasets — 20 sources, tens of thousands of pages
- llms.txt · feed.json · feed.xml — the machine-readable index, for agents
Each archive page carries Dataset JSON-LD, a canonical URL and the identifiers used, so an agent can resolve an entity without running anything. Nothing on those pages is estimated or modelled.
🧪 Example input
A real, runnable configuration — this is an actual input this Actor has run with.
{"salaryCurrency": "PLN","salaryPeriod": "month","requestDelaySecs": 2,"seniority": ["expert"],"maxJobs": 250}
📄 Sample output
One real row from a real run of this Actor, unedited.
{"jobId": "pega-lead-system-architect-dcg-Gdynia","jobUrl": "https://nofluffjobs.com/job/pega-lead-system-architect-dcg-gdynia","title": "Pega Lead System Architect","companyName": "DCG","category": "architecture","seniority": ["Expert"],"seniorityTop": "Expert","technology": "PEGA","requiredSkills": ["Pega","PEGA PRPC","Pega Infinity"],"otherTags": ["architecture"],"salaryFrom": 28560,"salaryTo": 30240,"salaryCurrency": "PLN","salaryPeriod": "month","salaryType": "b2b","salaryDisclosed": true,"isFullyRemote": false,"cities": ["Gdynia","Gdańsk","Warszawa"],"city": "Gdynia","countries": ["Polish","Poland"],"regions": ["pl"],"postedAt": "2026-07-31T22:00:54Z","postedDate": "2026-07-31","renewedAt": "2026-08-02T22:00:54Z","reference": "BBUZ6UHV","onlineInterviewAvailable": false,"sourceQuery": "seniority=expert","scrapedAt": "2026-08-03T00:30:08Z"}
How it works
- You set the filters below, or none at all.
- The Actor calls the source's own public endpoint and pages through the results.
- Every row is pushed to the dataset as it is built, not buffered to the end — so a run that hits its time limit still returns everything it collected up to that point.
- You are charged per row returned, so the maximum-results field is also your cost cap.
💬 Your feedback
Found a bug, or need a field this does not return yet? Open an issue on the Actor's Issues tab, or write to reapxdev@proton.me. Bugs get fixed and reasonable field requests get added.