# No Fluff Jobs Scraper — CEE IT Jobs & Salaries per Contract (`highbrow_fame/nofluffjobs-jobs`) Actor

IT jobs from nofluffjobs.com (Poland, Czechia, Slovakia, Hungary, Ukraine): title, company, cities, remote, seniority, salary per contract type (B2B net / UoP gross), skills, dates, full ad.

- **URL**: https://apify.com/highbrow_fame/nofluffjobs-jobs.md
- **Developed by:** [yestrue](https://apify.com/highbrow_fame) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 job delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## No Fluff Jobs Scraper — CEE IT Jobs & Salaries per Contract

Get job ads from nofluffjobs.com, the IT job board where every ad states its pay — from the Polish, English, Czech, Slovak, Hungarian and Ukrainian sites: title, company, cities, remote or hybrid, seniority, category, the salary for every contract type (B2B net, employment contract gross) with the site's conversion to PLN, EUR or any other currency, must-have and nice-to-have skills, languages, benefits, dates and the full ad text. Paste your No Fluff Jobs search links, or type keywords and pick filters.

**Why this one**

- 🔗 **Your search, as you set it up.** Set up a search on nofluffjobs.com and paste the link — category, technology, city, remote, seniority, contract, salary and sort are kept. Or type **Keywords** as into the site's search box (react developer, C#, devops) and pick **Cities**, **Remote / hybrid**, **Category**, **Seniority**, **Contract**, **Must-have skills** and **Min salary** below.
- 🧾 **Every salary, per contract.** An ad that pays 13,000–17,000 PLN gross on an employment contract and 19,000–26,000 PLN net on B2B comes with both, each marked gross or net, per hour, day, month or year as the employer wrote it — and converted by the site to PLN a month (or EUR a year, or whatever you pick).
- 🧮 **One ad, one row.** No Fluff Jobs lists an ad once for every city it is posted for (its "3,604 backend offers" were 571 ads on 25 September 2026). You get each ad once, with all its places. A live run delivered all 571, no ad twice.
- 🌍 **Six sites.** Links from nofluffjobs.com/pl, /cz, /sk, /hu, /ua and the English site work as they are; for keywords pick the **Country site**.
- ⚡ **Fast.** No browser. A live run read five searches — every backend job in Poland, senior B2B Java in Warsaw, DevOps in Czechia, remote in Hungary and "python" in Kraków or remote — 1,370 jobs with the full ads in 47 seconds. The whole Polish site, 3,703 ads, took 131 seconds without the full ads.
- 🔒 **No contact persons, no phones.** The ads carry the apply e-mail address, quotes from named employees with their photos, and recruiters' e-mails and phone numbers in the text. None of that is kept: e-mail addresses and phone numbers are taken out of every text (6 e-mails and 1 WhatsApp number in 1,370 ads of a live run). Companies are named; people are not.
- 💸 **You pay only for jobs delivered.** A link that is not a No Fluff Jobs search, a city the site does not know, or a search with no jobs comes back as a free record with the reason.

### What you get

For every job:

| Field | What it is |
|---|---|
| `title`, `jobId`, `url` | the job on nofluffjobs.com (`jobId` is the site's reference, the same for all cities of an ad) |
| `company`, `companyLogo` | who is hiring |
| `category`, `technology`, `seniority` | the site's category (`backend`, `devops`, `data` …), main technology, and levels (`junior`, `mid`, `senior`, `expert`, `lead` …) |
| `remote`, `cities`, `locations` | whether it can be done fully remotely, the office cities, and every place with its province, street and postal code as the employer gives them |
| `salaryFrom`, `salaryTo`, `salaryCurrency`, `salaryPeriod`, `salaryContractType`, `salaryGross` | the salary shown on the search card — as the employer wrote it (`hour`, `day`, `month`, `year`); `salaryGross` is false for B2B (net, + VAT) and true for employment and civil-law contracts |
| `salaryVisible`, `salaryDisclosedAt` | false for "Salary Match" ads, whose salary the employer reveals only in the process (`at_first_interview` …) |
| `salaryUpperBoundFlexible` | true for "from X" salaries with no upper limit |
| `mustHaveSkills` | the skills the job requires |
| `postedAt`, `renewedAt` | when it was first published and last refreshed |
| `countrySites`, `onlineInterview`, `openToUkrainians`, `isPromoted` | which country sites show it, remote recruitment, the site's #Help4Ua mark, paid highlighting |
| `input`, `country`, `search`, `position`, `scrapedAt` | which search it came from, the site searched, the search as the site reads it, its place in the results, when it was read |
| `status`, `error` | `OK`, or why a search gave nothing |

With **Add the full job ad** (on by default) also:

| Field | What it is |
|---|---|
| `salaries` | every contract type with `from`, `to`, `currency`, `period`, `gross`, `paidHoliday`, and the site's conversion: `convertedFrom`, `convertedTo`, `convertedCurrency`, `convertedPeriod` |
| `mustHaveSkills`, `niceToHaveSkills`, `languages` | all required and optional skills, and the languages with their level |
| `workMode`, `remoteDaysPerWeek`, `hybridNote` | `remote`, `hybrid`, `office` or `fieldwork`, and the days a week from home |
| `description`, `requirementsText`, `dailyTasks`, `recruitmentSteps` | the ad's text, without e-mail addresses and phone numbers |
| `benefits`, `equipment` | benefits and office perks; computer, monitors, operating systems |
| `contractStart`, `contractDuration`, `applyMethod`, `expiresAt` | when it starts, for how long, how to apply (`url`, `email`, the site's form), when the ad ends |
| `companySize`, `companyWebsite`, `companyProfileUrl` | the company's size, website and No Fluff Jobs page |

#### Example

A real record from a live run — backend jobs in Kraków on B2B or an employment contract, 25 September 2026 (texts and lists shortened, the logo and empty fields left out):

```json
{
  "input": "https://nofluffjobs.com/pl/krakow/backend?criteria=employment%3Db2b,permanent",
  "country": "pl",
  "search": "krakow backend employment=b2b,permanent",
  "position": 13,
  "jobId": "1KE7LHCL",
  "url": "https://nofluffjobs.com/pl/job/senior-net-developer-with-azure-banking-industry-f-m-x-sii-polska-krakow",
  "title": "Senior .NET Developer with Azure - banking industry (f/m/x)",
  "company": "Sii Polska",
  "category": "backend",
  "technology": ".NET",
  "seniority": ["senior"],
  "remote": false,
  "cities": ["Kraków"],
  "locations": [{ "city": "Kraków", "province": null, "street": "ul. Wadowicka 12", "postalCode": "30-415", "countryCode": "POL" }],
  "salaryFrom": 19000,
  "salaryTo": 26000,
  "salaryCurrency": "PLN",
  "salaryPeriod": "month",
  "salaryContractType": "b2b",
  "salaryGross": false,
  "salaryVisible": true,
  "salaryDisclosedAt": null,
  "salaryUpperBoundFlexible": false,
  "mustHaveSkills": [".NET", "C#", "TypeScript", "AzureDevOps", "CI/CD", "Microsoft Azure", "Power BI", "React.js", "…"],
  "postedAt": "2026-09-01T12:17:21.838Z",
  "renewedAt": "2026-09-25T12:17:21.838Z",
  "countrySites": ["pl"],
  "onlineInterview": true,
  "openToUkrainians": false,
  "isPromoted": false,
  "salaries": [
    { "contractType": "permanent", "from": 13000, "to": 17000, "currency": "PLN", "period": "month", "gross": true, "paidHoliday": true, "convertedFrom": 13000, "convertedTo": 17000, "convertedCurrency": "PLN", "convertedPeriod": "month" },
    { "contractType": "b2b", "from": 19000, "to": 26000, "currency": "PLN", "period": "month", "gross": false, "paidHoliday": false, "convertedFrom": 19000, "convertedTo": 26000, "convertedCurrency": "PLN", "convertedPeriod": "month" }
  ],
  "niceToHaveSkills": ["Automated testing", "Observability"],
  "languages": [{ "code": "en", "level": "C2", "required": true }],
  "workMode": "hybrid",
  "remoteDaysPerWeek": 2,
  "description": "We are looking for a versatile Senior .NET Developer to join the modernization program, migrating a portfolio of legacy applications to a cloud-native Azure arc…",
  "dailyTasks": ["Designing and implementing backend services and REST APIs in .NET 9 using Clean Architecture", "Building and maintaining React + TypeScript microfrontends", "…"],
  "benefits": ["Medical care", "Insurance", "Sport cards", "Language courses", "…"],
  "contractStart": "ASAP",
  "applyMethod": "url",
  "expiresAt": "2026-10-01T23:59:59",
  "companySize": "8000+",
  "companyProfileUrl": "https://nofluffjobs.com/company/sii-poland-vgeohtgy",
  "status": "OK"
}
```

### How to use it

1. Paste **Search links** from nofluffjobs.com, one per line — or type **Keywords**, one search per line. With no keywords, the filters alone are one search ("every junior backend job in Wrocław").
2. For keywords, pick the **Country site** and any filters: **Cities** and **Remote / hybrid** (any of them), **Category**, **Seniority** and **Contract** (any of them), **Must-have skills** (all of them), **Min salary** with its currency and period, **Sort**.
3. Set **Max jobs per search**. Turn off **Add the full job ad** if the search-card fields are enough; pick the currency and period for **Also convert salaries to**.
4. Press **Start**, and download the results from the **Output** tab as JSON, CSV or Excel.

For a daily feed of new jobs, save a search sorted **Newest first** as a task and schedule it every morning.

You can also call it from the Apify API, from Make, Zapier or n8n, or from an AI agent through the Apify MCP server.

### Pricing

You are charged **per job delivered** — see the price on this page. The full ad costs nothing extra, only time. Links that are not No Fluff Jobs searches, cities the site does not know and searches without jobs are free.

### FAQ

**How many jobs per search?** All of them — the site has no page limit. A live run read the whole Polish site, 3,703 ads, in one search.

**Why do I get fewer jobs than the site's count?** The site counts an ad once for every city and region it is posted for: its 3,604 backend "offers" were 571 ads, and the whole Polish site's 22,677 were 3,703. You get each ad once, with all its places in `locations`.

**Why do some jobs have no salary?** No Fluff Jobs publishes a salary in every ad, but with "Salary Match" the employer shows it only during the recruitment process; the site lists those ads too (229 of 1,370 jobs in a live run; 1,202 of the 3,703 on the Polish site). They have `salaryVisible: false` and say when the salary is disclosed. Turn on **Only jobs with a visible salary** to leave them out. A search with **Min salary** also returns them, as on the site, and "from X" salaries with no upper limit (`salaryUpperBoundFlexible`) — in a live run 348 of 349 visible salaries reached 20,000 PLN a month; the other was "from 70 PLN an hour".

**Are the salaries gross or net?** As the site labels them: B2B rates are net (+ VAT), employment contract (UoP), mandate (zlecenie) and specific-task (UoD) rates are gross — see `gross` in each salary. The conversion is the site's own (an hour is 1/168 of a month).

**Why are two-word skills handled apart?** The site finds nothing when a two-word skill ("Spring Boot", "React native") is combined with another skill, even though each alone has hundreds of jobs. So when that happens, the actor searches without it and keeps the jobs whose skills list it — a live run of "java" in Kraków or Wrocław with Spring Boot and Kafka gave 17 jobs, all asking for Spring Boot.

**Why are contact persons missing?** They are personal data. Every job has its `url`; candidates apply on nofluffjobs.com or with the employer. When an employer trades under a person's name, that company name is kept as the site publishes it.

**Is this affiliated with No Fluff Jobs?** No. This is an independent tool that reads the job ads nofluffjobs.com publishes on its website.

**Like it?** A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.

# Actor input Schema

## `searchUrls` (type: `array`):

Set up a search on nofluffjobs.com with all the filters you want and paste the address of the results page — from the Polish, English, Czech, Slovak, Hungarian or Ukrainian site. One per line.

## `keywords` (type: `array`):

Or search here without a link: one search per line, typed as into the site's own search box — a technology, a job title or both (react, python developer, C#, devops). The filters below apply. Leave it empty to run the filters alone as one search.

## `country` (type: `string`):

For the keywords and filters: which No Fluff Jobs site to search.

## `cities` (type: `array`):

Optional: cities as the site writes them — Warszawa, Kraków, Wrocław, Trójmiasto, Śląsk, Praha, Budapest. Several cities = any of them. Empty = the whole country and remote.

## `workModes` (type: `array`):

Optional: like the site, these add to the cities (Warszawa + Remote = jobs in Warszawa or remote).

## `category` (type: `string`):

Optional: the site's job category.

## `seniorities` (type: `array`):

Optional: any of these levels.

## `contracts` (type: `array`):

Optional: any of these contract types.

## `skills` (type: `array`):

Optional: technologies the job must ask for (Java, Spring Boot, AWS). Several = all of them, as on the site.

## `minSalary` (type: `integer`):

Optional: the site's salary filter — jobs whose salary reaches this amount, in the currency and period below.

## `salaryCurrency` (type: `string`):

For the min salary.

## `salaryPeriod` (type: `string`):

For the min salary.

## `onlyVisibleSalary` (type: `boolean`):

Leave out "Salary Match" ads, whose salary the employer shows only at an interview (the site lists them too).

## `sortBy` (type: `string`):

For the keywords and filters.

## `maxJobsPerSearch` (type: `integer`):

Stops each search after this many jobs. An ad posted for several cities is one job.

## `includeDetails` (type: `boolean`):

Opens every job for the salary of every contract type, all must-have and nice-to-have skills, languages, remote days, benefits and the full text. One more small request per job.

## `convertCurrency` (type: `string`):

With the full job ad: every salary also in this currency, as the site converts it. The employer's own figures are always kept.

## `convertPeriod` (type: `string`):

With a conversion: per month, day or year.

## `maxConcurrency` (type: `integer`):

How many searches to work on at the same time.

## `proxyConfiguration` (type: `object`):

Used only to try again after a network error: the first try goes out directly.

## Actor input object example

```json
{
  "searchUrls": [
    "https://nofluffjobs.com/pl/praca-zdalna/backend"
  ],
  "country": "pl",
  "category": "any",
  "salaryCurrency": "PLN",
  "salaryPeriod": "month",
  "onlyVisibleSalary": false,
  "sortBy": "default",
  "maxJobsPerSearch": 30,
  "includeDetails": true,
  "convertCurrency": "PLN",
  "convertPeriod": "month",
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every result as a JSON record, with a status for each input.

## `resultsCsv` (type: `string`):

The same records as CSV, for a spreadsheet.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchUrls": [
        "https://nofluffjobs.com/pl/praca-zdalna/backend"
    ],
    "maxJobsPerSearch": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("highbrow_fame/nofluffjobs-jobs").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchUrls": ["https://nofluffjobs.com/pl/praca-zdalna/backend"],
    "maxJobsPerSearch": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("highbrow_fame/nofluffjobs-jobs").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchUrls": [
    "https://nofluffjobs.com/pl/praca-zdalna/backend"
  ],
  "maxJobsPerSearch": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call highbrow_fame/nofluffjobs-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,highbrow_fame/nofluffjobs-jobs"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/c2e3Vn3tUQO7IUP3e/builds/XEsBiOs3BUksMOpCf/openapi.json
