NoFluffJobs Scraper · Polish Tech Jobs, Salaries & Skills avatar

NoFluffJobs Scraper · Polish Tech Jobs, Salaries & Skills

Pricing

from $1.32 / 1,000 job listing returneds

Go to Apify Store
NoFluffJobs Scraper · Polish Tech Jobs, Salaries & Skills

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

Tarek Etman

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 hours ago

Last modified

Share

reapX — public sources in, addressable records out

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:

FieldExample
title / companyNameSenior Java Developer / Upvanta
salaryFrom / salaryTo / salaryCurrency23100 / 25200 / PLN
salaryType / salaryDisclosedb2b / true
category / senioritybackend / ["Senior"]
requiredSkills["Java", "REST API", "Jira"]
city / cities / isFullyRemoteKraków / ["Warszawa","Kraków","Remote"] / true
postedAt / renewedAt2026-07-31T09:21:11Z / 2026-08-02T09:21:11Z
jobUrldirect 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.

FieldTypeAcceptsWhat it does
keywordslistone value per lineFree-text terms matched across the listing, one per line. A job is kept if it matches at least one. Examples: kubernetes, fintech, machine learning.
categorieslistone value per lineNoFluffJobs job categories. Leave empty for every category. Prefilled with ["backend"].
technologieslistone value per lineTechnology the job requires, one per line, matched against the listing's own skill tags. Examples: java, python, react, kubernetes, aws.
senioritylistone value per lineExperience 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.

FieldTypeAcceptsWhat it does
citieslistone value per linePolish city names, one per line, without diacritics. Examples: warszawa, krakow, wroclaw, gdansk, poznan, katowice, lodz.
remoteOnlytrue/falsecheckboxKeep only listings that can be done fully remotely. Prefilled with false.
employmentTypeslistone value per lineHow 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.

FieldTypeAcceptsWhat it does
salaryCurrencystringone of 5: PLN, EUR, USD, GBP, ...Currency every salary range is converted to before it is returned. Prefilled with "PLN".
salaryPeriodstringmonth, hourWhether salary ranges are expressed per month or per hour. Prefilled with "month".
minSalaryinteger0 to 1000000Keep only listings whose upper salary bound is at least this much, in the currency and period chosen above. Leave empty for no minimum.
onlyDisclosedSalarytrue/falsecheckboxDrop 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.

FieldTypeAcceptsWhat it does
maxJobsinteger1 to 30000Hard 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.
requestDelaySecsinteger1 to 60Seconds 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

FieldTypeWhat it is
jobIdstringStable NoFluffJobs identifier for this listing. Unique per posting and safe to use as a primary key.
jobUrlstringPublic NoFluffJobs page for this listing.
titlestringJob title exactly as the employer published it.
companyNamestringName of the hiring company.
categorystringNoFluffJobs 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.
senioritylistEvery experience level the listing is open to. Many listings accept more than one.
seniorityTopstringThe first seniority level on the listing, for simple grouping and charts.
technologystringThe headline technology NoFluffJobs assigns to the listing, when it assigns one.
requiredSkillslistSkill tags the employer marked as requirements. This is the field to aggregate for skill-demand analysis.
otherTagslistRemaining listing tags that are not hard requirements, such as nice-to-have skills.
salaryFromnumberLower bound of the advertised salary range, in the currency and period requested.
salaryTonumberUpper bound of the advertised salary range, in the currency and period requested.
salaryCurrencystringCurrency the salary range is expressed in.
salaryPeriodstringWhether the salary range is per month or per hour.
salaryTypestringContract the salary range applies to. B2B rates and permanent salaries are not directly comparable.
salaryDisclosedtrue/falseTrue when the employer publishes the range up front rather than hiding it until application.
isFullyRemotetrue/falseTrue when the listing can be done fully remotely.
citystringFirst city named on the listing, for simple grouping.
citieslistEvery location named on the listing. Polish listings are commonly offered in several cities at once.
countrieslistCountries the listing names.
regionslistNoFluffJobs region codes the listing is published under.
postedAtstringWhen the listing was first published, ISO 8601.
postedDatestringPublication date only, YYYY-MM-DD, for grouping and filtering.
renewedAtstringWhen the employer last renewed the listing, ISO 8601. Renewals are how stale postings stay at the top.
referencestringThe employer's own reference code for the vacancy, when published.
onlineInterviewAvailabletrue/falseTrue when the employer offers a fully online interview process.
sourceQuerystringThe resolved query that produced this row, so a merged dataset stays traceable.
scrapedAtstringWhen 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

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

  1. You set the filters below, or none at all.
  2. The Actor calls the source's own public endpoint and pages through the results.
  3. 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.
  4. 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.