NoFluffJobs Scraper avatar

NoFluffJobs Scraper

Pricing

from $0.40 / 1,000 job scrapeds

Go to Apify Store
NoFluffJobs Scraper

NoFluffJobs Scraper

Scrapes job listings from NoFluffJobs.com (Poland, Czechia, Slovakia, Hungary, the Netherlands, Ukraine) via its public JSON search API.

Pricing

from $0.40 / 1,000 job scrapeds

Rating

0.0

(0)

Developer

DataWatcher

DataWatcher

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Extract job listings from NoFluffJobs.com as clean, structured data from any of its markets: Poland, Czechia, Slovakia, Hungary, the Netherlands and Ukraine.

Why this one

  • The lowest per-row price, no start fee. $0.40 per 1,000 jobs. You pay only for rows you get.
  • See when pay is revealed. Many listings no longer publish a number. Each row says whether the salary is published, and if not, at which interview stage it's revealed (salaryDisclosureStage), instead of a blank.
  • Every market, filtered by the site itself. Poland, Czechia, Slovakia, Hungary, the Netherlands and Ukraine.
  • Filters buyers ask for: city, category, seniority, technology, contract type, posting language, salary range, posted date, and exclusions. Paste any NoFluffJobs search URL, or job URLs.
  • Salaries you can compare: a monthly figure for every range, or every salary converted to one currency by NoFluffJobs.
  • Rich details when you want them: must-have and nice-to-have skills, all salary ranges, daily tasks, benefits, company size and website. The description comes as text, HTML and Markdown.
  • Honest runs: a run summary, a health status, and a daily health-check mode. Failed searches show up as unbilled diagnostic rows instead of silently returning nothing.
  • Fast and cheap: it uses NoFluffJobs' own JSON API, with no browser.
  • No personal data: no recruiter names, emails or phone numbers.

Use with AI agents (MCP)

AI assistants (Claude, ChatGPT, Cursor…) can run this actor through Apify's MCP server. Connect the server in your assistant, then ask, for example:

Use the NoFluffJobs Scraper to find senior Python jobs in Kraków or fully remote, published in the last 3 days, with salaries in EUR per month. Show the 10 best-paid, with company, salary and link.

For agents, set compact: true to get short rows: title, company, link, salary, cities, remote, seniority, tech stack, date.

Input

Example: senior Python jobs in Kraków, posted in the last 3 days, salaries in EUR per month, with details:

{
"searchQueries": ["python"],
"cities": ["Kraków"],
"seniority": ["senior"],
"postedWithin": "3d",
"salaryCurrency": "EUR",
"maxResults": 100,
"includeDetails": true
}

Or paste a search URL straight from the site:

{
"searchUrls": ["https://nofluffjobs.com/pl/praca-zdalna/python?criteria=seniority%3Dsenior"],
"maxResults": 50
}

Main fields:

FieldDefaultNotes
searchQueries–One search each; with no query and no URL, python developer is searched. react OR angular runs both and merges the results
searchUrls–Any NoFluffJobs search URL (path filters and ?criteria= both applied), or a job URL (…/job/<slug>) to get that job directly. A URL's own market (/pl/, /cz/…) overrides country, with a warning if they differ
countryallall, PL, CZ, SK, HU, NL, UA. Filtered by the site itself; all searches the Polish market, the widest
maxResults50Rows in total. 0 = no limit (the request budget and run timeout still apply)
includeDetailsfalseOne extra request per job for the detail fields below (extra event, see Pricing). The old name includeFullDescription still works

Filters:

FieldNotes
remoteOnlyOnly fully remote jobs
citiese.g. Warszawa, Kraków; Warsaw, Cracow, Krakow also work
categories, seniority, contractTypes, postingLanguagesPick from the site's own lists
technologiese.g. Python, React
postedWithin24h, 3d, 2w…
excludeTitles, excludeCompaniesSkip jobs whose title / company contains any of these

Salary:

FieldNotes
salaryCurrencyConvert every salary to PLN, EUR, USD, CHF, GBP, HUF, CZK, UAH or BYN per month; the site converts. original keeps each listing's own
minSalaryMonthlyPln, maxSalaryMonthlyPlnThe site's own salary filter, monthly PLN
withSalaryOnlySkip jobs without a published salary
onlyCurrenciesKeep jobs quoted in these currencies

Output:

FieldNotes
descriptionMaxLengthCut the text and Markdown descriptions. 0 = no limit
onlyUniqueJobstrue (default): one row per job. false: one row per office location, each billed
compactOnly title, company, URL, salary, cities, remote, seniority, tech stack, posted date
includeRawRecordAttach the raw search rows and detail response as raw

Limits & advanced:

FieldNotes
maxResultsPerQueryRow cap per search. 0 = none
maxPagesResult pages (20 jobs each) per search. 0 = no limit
maxRequestsHard ceiling on requests. 0 = automatic: derived from the input (search pages + one per job detail + 20% for retries), at most 1,000
proxyConfigurationOptional Apify proxy. Not needed for normal use today
healthCheckMonitoring mode: a 5-row search that fails the run if any row breaks a data rule. Schedule it daily

The run also stops at the platform's run timeout, keeping 30 seconds to save its records.

Output

A real row (a pasted job URL with includeDetails: true; long texts and lists shortened here):

{
"recordType": "job",
"jobId": "EQDYWOYL",
"title": "Guidewire Policy Center Developer",
"company": "Link Group",
"url": "https://nofluffjobs.com/pl/job/guidewire-policy-center-developer-link-group-warszawa-1",
"category": "backend",
"techStack": ["Object-oriented programming", "REST API", "SQL", "Relational database"],
"seniority": ["Mid"],
"companyLogoUrl": "https://static.nofluffjobs.com/companies/logos/original/link_group_240px_20240110_120451.png",
"salaryDisclosed": true,
"salaryMin": 150.0,
"salaryMax": 250.0,
"currency": "PLN",
"salaryPeriod": "Hour",
"salaryMonthlyMin": 25200.0,
"salaryMonthlyMax": 42000.0,
"salaryText": "150–250 PLN / hour (b2b)",
"contractType": "b2b",
"salaryDisclosureStage": null,
"cities": ["Warszawa"],
"locations": [
{"city": "Warszawa", "street": null, "postalCode": null, "province": null,
"countryCode": "POL", "latitude": 52.2296756, "longitude": 21.0122287}
],
"countries": ["POL"],
"locationCount": 17,
"remote": true,
"postedAt": "2026-09-23T13:48:14.868000+00:00",
"daysSincePosted": 0,
"fullDescription": "About the role\nWe are looking for an experienced Guidewire developer…",
"descriptionMarkdown": "### About the role\n\nWe are looking for an experienced Guidewire…",
"mustHaveSkills": ["Object-oriented programming", "REST API", "SQL", "Relational database"],
"niceToHaveSkills": ["integration technologies"],
"spokenLanguages": [{"code": "en", "level": "B2", "required": true}],
"dailyTasks": ["Develop and configure new functionality within Guidewire PolicyCenter…"],
"salaryRanges": [{"contractType": "b2b", "min": 150.0, "max": 250.0, "currency": "PLN", "period": "Hour", "disclosed": true}],
"companySize": "40+",
"companyWebsite": "http://linkgroup.pl/",
"companyProfileUrl": "https://nofluffjobs.com/company/link-group-ccywok00",
"status": "PUBLISHED",
"expiresAt": "2026-10-23T23:59:59",
"detailFetchStatus": "success",
"dataQualityWarnings": []
}

With compact: true a row has only jobId, title, company, url, salaryMin, salaryMax, currency, salaryPeriod, cities, remote, seniority, techStack, postedAt.

All fields (each dataset row is a job, recordType: "job"):

FieldDescription
jobId, postingIdStable job reference (jobId) and the raw per-listing id
title, company, urlurl is the job page in the searched market, https://nofluffjobs.com/<market>/job/<slug>; the same on every run
allOfferUrlsEvery per-office URL the site has for this job
category, technology, techStack, seniorityThe site's category, main technology, required skills and levels
companyLogoUrlFull logo image URL
salaryDisclosed, salaryMin, salaryMax, currency, salaryPeriodNumbers only when the listing publishes a range; never guessed
salaryMonthlyMin, salaryMonthlyMaxThe range as a monthly figure (Hour ×168, Day ×21, Year ÷12)
salaryTexte.g. 150–180 PLN / hour (b2b) or revealed at first interview (permanent)
contractType, salaryFlexibleUpperBounde.g. b2b; whether the top of the range is negotiable
salaryCheckOnly, salaryDisclosureStageWhen no range is published: the interview stage where pay is revealed
citiesCity names, one spelling per city (Warsaw → Warszawa)
locationsOne object per office or province: city, street, postalCode, province, countryCode, latitude, longitude
countries, locationCount, provincesOffice country codes, number of locations, province-only entries
remote, hybridDescriptionThe site's "remote" badge; the hybrid note, if any
onlineInterviewAvailable, highlighted, topInSearch, searchBoost, help4UaThe listing's flags
regionsThe site's own regions list (currently always ["pl"], so not a market marker)
postedAt, renewedAt, daysSincePosted, scrapedAtDates; compare renewedAt with postedAt to spot a repost
searchQueryThe query or URL that found this row

With includeDetails:

FieldDescription
fullDescription, descriptionHtml, descriptionMarkdown, descriptionSnippetThe description as text, cleaned HTML, Markdown, and the first 300 characters
requirementsDescription, mustHaveSkills, niceToHaveSkills, spokenLanguagesRequirements
dailyTasks, benefits, officePerks, equipment, recruitmentStepsThe job itself
salaryRangesEvery contract type's range: contractType, min, max, currency, period, disclosed
companySize, companyWebsite, companyProfileUrlCompany basics
status, expiresAtListing status and expiry
detailFetchStatus, dataQualityWarningssuccess / failed / skipped; notes such as salary not disclosed
  • Every field is present on every row, as null / [] when the source has no value.
  • No recruiter names or contact emails are ever included.
  • A search that fails completely writes one recordType: "diagnostic" row with searchQuery and errorMessage. It is never billed.

Run records. Each run also writes two records to its default key-value store:

  • RUN_SUMMARY: rows, requests, the request budget, retries, failed requests, why it stopped early, warnings, billing events, data-rule problems.
  • RUN_HEALTH: {status, reason}, one of:
    • ok
    • degraded: no rows, a broken rule, a failed request, an early stop, or a warning
    • failed: health-check mode only

The data rules:

  • no more rows than maxResults
  • no duplicate URLs
  • URLs in the searched market
  • remote rows when remoteOnly is on
  • salary fields set exactly when disclosed
  • the requested salaryCurrency
  • descriptions are plain text. A listing the employer left blank gets the warning the listing has no description.

Pricing (Pay-Per-Event)

EventPriceTrigger
Result row$0.0004 (= $0.40 / 1,000)Per job returned
Job-details row (job-details-scraped)+$0.0015Only when includeDetails is on and the job's details were fetched

No start fee: a run costs only the rows it returns. Diagnostic rows are never billed.

Example use cases

  • Track new openings for a role/stack across five markets in one run
  • Feed a job board aggregator or a personal job-search dashboard
  • Monitor salary transparency trends by market or company