# NoFluffJobs.com EU Scraper - Engineering Jobs & Salaries (`santamaria-automations/nofluffjobs-eu-scraper`) Actor

Scrape IT/tech job listings from NoFluffJobs with mandatory salary ranges on every row (PL/CZ/SK/DE/AT/CH). Returns salary\_min, salary\_max, currency, seniority, tech stack, contract type, work mode, and full description. Pay-per-result.

- **URL**: https://apify.com/santamaria-automations/nofluffjobs-eu-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 serp results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## NoFluffJobs Scraper: EU Tech Jobs with Mandatory Salary Disclosure

Extract IT/tech job listings from [NoFluffJobs](https://nofluffjobs.com), the EU job board that **legally requires salary disclosure on every posting**. Every row returned by this actor includes `salary_min` and `salary_max` -- no guessing, no "competitive salary", no nulls.

### Why NoFluffJobs

NoFluffJobs is a Polish-founded EU-wide IT/tech job board with one defining policy: **every job listing must disclose a salary range**. This makes it unique in the EU market. Hiring companies that refuse to disclose pay cannot post. The result is a clean, structured salary dataset across the full spectrum of IT roles in Poland, Czech Republic, Slovakia, Hungary, Ukraine, and the Netherlands.

Coverage at a glance:

- 20,000+ active IT listings at any time
- Poland (main market), CZ, SK, HU, UA, NL
- Roles: Backend, Frontend, Fullstack, DevOps, Mobile, QA, Data, Product, Design, Management
- Every single row: `salary_min`, `salary_max`, `salary_currency`, `salary_period`, contract type (B2B vs Employment)

### What it does

Three enrichment modes:

- **Minimal** (default): SERP-level data including mandatory salary range, seniority, tech stack tags, work type, country, city, and posting date. No extra HTTP hops.
- **With job details** (`includeJobDetails=true`): Adds full HTML description, must-have and nice-to-have requirements list, company website, company size (authoritative), company founded year, company about (short), company office city list, and contact extraction (emails, phones, external URLs).
- **With company details** (`includeCompanyDetails=true`, requires `includeJobDetails=true`): Full company profile enrichment -- social links (Facebook, Instagram, Twitter, LinkedIn), industries served, full about text (plain + HTML), YouTube video ID, tech stack the company uses, perks and benefits, gallery photos, awards, office locations with GPS coordinates, team members (name, role, photo), and client references (logo + derived name).

#### Sample output row (with `includeJobDetails=true`)

```json
{
  "_type": "job",
  "id": "senior-python-developer-acme-warszawa",
  "title": "Senior Python Developer",
  "job_url": "https://nofluffjobs.com/job/senior-python-developer-acme-warszawa",
  "company_name": "Acme Corp",
  "company_website": "https://acme.com",
  "company_logo_url": "https://static.nofluffjobs.com/companies/logos/jobs_details/acme_240px.png",
  "company_size": "51 - 200",
  "company_profile_url": "https://nofluffjobs.com/company/acme-corp-abc12345",
  "company_founded_in": 2015,
  "company_about_short": "We build enterprise SaaS tools for the logistics sector...",
  "company_locations": ["Warsaw", "Krakow"],
  "location": "Warsaw, PL",
  "country": "PL",
  "city": "Warsaw",
  "posted_at_text": "2026-08-20",
  "posted_at_datetime": "2026-08-20T08:00:00Z",
  "salary_min": 15000,
  "salary_max": 22000,
  "salary_currency": "PLN",
  "salary_period": "month",
  "salary_text": "15000 – 22000 PLN/month (b2b)",
  "salary_type": "b2b",
  "seniority": ["Senior"],
  "tech_stack": ["Python", "AWS", "PostgreSQL", "Docker"],
  "contract_types": ["B2B"],
  "work_type": "remote",
  "remote_percentage": 100,
  "category": "backend",
  "posting_tags": ["Online recruitment", "Start ASAP", "Fully remote", "Hire type: B2B"],
  "offer_expiration_date": "2026-09-30",
  "remote_voivodeship_list": ["masovian", "lesser-poland", "lodz"],
  "requirements_must": ["Python", "REST API", "PostgreSQL"],
  "requirements_nice": ["Kubernetes", "GraphQL"],
  "company_social": null,
  "company_industries_served": null,
  "company_about": null,
  "company_about_html": null,
  "company_video_youtube_id": null,
  "company_technologies_used": null,
  "company_perks_benefits": null,
  "company_gallery_images": null,
  "company_awards": null,
  "company_office_locations": null,
  "company_team_members": null,
  "company_clients": null,
  "search_query": "backend developer",
  "scraped_at": "2026-08-22T10:00:00Z"
}
```

#### Sample output row (with `includeCompanyDetails=true`)

```json
{
  "_type": "job",
  "id": "senior-python-developer-link-group-warszawa",
  "title": "Senior Python Developer",
  "job_url": "https://nofluffjobs.com/job/senior-python-developer-link-group-warszawa",
  "company_name": "Link Group",
  "company_website": "https://linkgroup.co",
  "company_logo_url": "https://static.nofluffjobs.com/companies/logos/jobs_details/link_group_414px.png",
  "company_size": "500 - 999",
  "company_profile_url": "https://nofluffjobs.com/company/link-group-ccywok00",
  "company_founded_in": 2016,
  "company_about_short": "We're a bunch of super-dedicated and passionate people who truly believe in making a difference...",
  "company_locations": ["Warszawa", "Krakow", "Gdynia", "Austin", "Riyadh", "Birmingham"],
  "company_social": {
    "facebook": "https://www.facebook.com/Link.Group.Polska/",
    "instagram": "https://www.instagram.com/linkgroup.co/",
    "twitter": "https://twitter.com/LinkGroup_co",
    "linkedin": "https://www.linkedin.com/company/link-group-sp.-z-o.o./",
    "youtube": null
  },
  "company_industries_served": ["Banking", "Design", "Energy", "Financial", "Marketing", "Logistics", "Media", "Outsourcing", "Telecommunications", "Information technology & services"],
  "company_about": "We're a bunch of super-dedicated and passionate people who truly believe in making a difference and delivering amazing results on a huge scale...",
  "company_about_html": "<p>We're a bunch of super-dedicated and passionate people...</p>",
  "company_video_youtube_id": "np8ghdOX-8Q",
  "company_technologies_used": ["Javascript", "Java", "Angular", ".NET", "React", "SQL", "Python", "REST", "Spring", "PHP"],
  "company_perks_benefits": ["Sport subscription", "Team Events", "Private health care", "Training budget", "Free coffee", "Bike parking", "Free snacks", "Gym"],
  "company_gallery_images": [
    "https://static.nofluffjobs.com/companies/gallery/big/screenshot_20230905_at_174131_20230905_235615.png",
    "https://static.nofluffjobs.com/companies/gallery/big/dsc00492_1min_20230905_235248.jpg"
  ],
  "company_awards": ["Great Place To Work", "Outsourcing Stars", "Business Gazele"],
  "company_office_locations": [
    { "address": "Aleje Jerozolimskie 142A, Warszawa", "city": "Warszawa", "country": "PL", "lat": 52.218995, "lng": 20.966843 },
    { "address": "ul. Zablocie 23/11, Krakow", "city": "Krakow", "country": "PL", "lat": 50.050247, "lng": 19.961162 }
  ],
  "company_team_members": [
    { "name": "PAWEL KLEJMONT", "role": "Head of IT Outsourcing", "photo_url": "https://static.nofluffjobs.com/companies/team/cropped_original/link_group_ii_0005_min_20230313_170247.jpg", "bio": null },
    { "name": "URSZULA MIKULSKA", "role": "Head of Recruitment", "photo_url": "https://static.nofluffjobs.com/companies/team/cropped_original/link_group_ii_2233_min_20230313_170148.jpg", "bio": null }
  ],
  "company_clients": [
    { "name": "airhelp logo positive 20201105 203228", "logo_url": "https://static.nofluffjobs.com/companies/clients/original/airhelp_logo_positive_20201105_203228.jpg" },
    { "name": "apollogic 20201105 203251", "logo_url": "https://static.nofluffjobs.com/companies/clients/original/apollogic_20201105_203251.png" }
  ],
  "location": "Warsaw, PL",
  "country": "PL",
  "city": "Warsaw",
  "salary_min": 20000,
  "salary_max": 30000,
  "salary_currency": "PLN",
  "salary_period": "month",
  "salary_text": "20000 - 30000 PLN/month (b2b)",
  "salary_type": "b2b",
  "seniority": ["Senior"],
  "tech_stack": ["Python", "AWS", "PostgreSQL"],
  "contract_types": ["B2B"],
  "work_type": "hybrid",
  "category": "backend",
  "search_query": "backend developer",
  "scraped_at": "2026-09-10T10:00:00Z"
}
```

### Pricing

**$0.001 per actor start + $0.003 per SERP row + $0.005 per detail row + $0.002 per unique company profile (when `includeCompanyDetails=true`). About $3 to $8 per 1,000 IT roles depending on enrichment mode.**

You only pay for rows that successfully return data. Failed fetches are not charged.

**New to Apify?** Every account gets a $5 free monthly platform credit -- enough for around 1,500 SERP rows or 800 detail rows before you commit to paying anything.

| Event | Price | Trigger |
|-------|-------|---------|
| Actor start | $0.001 | Once per run |
| SERP row | $0.003 | Per job from search results |
| Job detail row | $0.005 | Per job when `includeJobDetails=true` |
| Company profile | $0.002 | Per unique company when `includeCompanyDetails=true` |

### Input

| Field | Type | Description |
|-------|------|-------------|
| `searchQueries` | array of strings | Job title or tech keywords. Each runs a separate search (e.g. `['backend developer', 'Python', 'DevOps']`). |
| `searchUrls` | array of strings | Direct NoFluffJobs search URLs with `?criteria=` param. |
| `startUrls` | array | Alternative URL input supporting Apify's requestListSources format. |
| `country` | select | Filter by country market: all, PL, CZ, SK, HU, UA, NL. Default: all. Applied client-side -- only postings with at least one location in the selected country are returned. |
| `city` | string | Filter by city name (e.g. Warsaw, Prague, Berlin). |
| `seniority` | select | Trainee, Junior, Mid, Senior, Expert, or blank for all. |
| `techStack` | array of strings | Technology tags to filter by (e.g. `['Python', 'AWS']`). |
| `contractType` | select | Any, B2B (freelance invoice), or UoP (employment contract). |
| `remoteOnly` | boolean | Return only fully remote positions. |
| `sortBy` | select | Result ordering. Only `newest` is supported (the NoFluffJobs public API returns its native platform ordering; the site's front-end applies the "Newest" toggle client-side). Default `newest`. |
| `includeJobDetails` | boolean | Fetch each job's detail page for full description, requirements, company size, founded year, about text, office cities, and contact extraction. Default false. |
| `includeCompanyDetails` | boolean | Fetch extended company profile: social links, industries served, full about text, YouTube video, tech stack, perks, gallery, awards, and office locations with GPS. Requires `includeJobDetails=true`. Adds $0.002 per unique company. Default false. |
| `maxResults` | integer | Total job cap. Default 5. |
| `maxResultsPerQuery` | integer | Per-keyword cap. Default 5. |
| `maxConcurrency` | integer | Concurrent detail fetches (1-20). Default 5. |

#### Example input

```json
{
  "searchQueries": ["backend developer", "Python"],
  "country": "PL",
  "seniority": "Senior",
  "techStack": ["Python"],
  "remoteOnly": true,
  "includeJobDetails": true,
  "maxResults": 100
}
```

### Output fields

**Identity**

- `id`: NoFluffJobs internal posting slug
- `title`: Role title
- `company_name`, `company_logo_url`, `company_website` (with details), `company_size` (with details)
- `company_profile_url`: Link to the company's NoFluffJobs profile page (with details)
- `job_url`, `source_url`: Canonical NoFluffJobs listing URL
- `apply_url`: Direct apply link (with details)

**Mandatory salary (NoFluffJobs unique differentiator)**

- `salary_min`, `salary_max`: Lower and upper salary bounds -- always populated on NoFluffJobs
- `salary_currency`: PLN (Poland, dominant), HUF (Hungary), USD (Ukraine-based roles), EUR (Slovakia, Netherlands, international remote), CZK (Czech Republic)
- `salary_period`: month, hour, day, year
- `salary_text`: Human-readable summary (e.g. "15000 - 22000 PLN/month (b2b)")
- `salary_type`: Contract basis quoted: b2b, employment, mandate, any

**Tech classification**

- `seniority[]`: Platform-tagged seniority levels (Trainee/Junior/Mid/Senior/Expert)
- `tech_stack[]`: Technology requirement tags extracted from SERP tiles (e.g. Python, AWS, React, Docker, Kubernetes)
- `contract_types[]`: Available contract forms (B2B, Employment, Contract)
- `category`: NoFluffJobs job category (backend, frontend, devops, mobile, data, etc.)
- `work_type`: remote, hybrid, office
- `remote_percentage`: 100 for fully remote, 50 for hybrid, null for office
- `posting_tags[]`: Tag row from the job detail page (e.g. "Online recruitment", "Start ASAP", "Fully remote", "Hire type: B2B") -- with details
- `offer_expiration_date`: ISO date when the posting expires (with details)
- `remote_voivodeship_list[]`: For PL postings, the voivodeships where remote work is allowed (with details)

**Location**

- `location`: City, CountryCode (e.g. Warsaw, PL)
- `country`: ISO 2-letter code (PL, HU, UA, CZ, SK, NL, and others)
- `city`: Primary city name

**Timing**

- `posted_at_text`: YYYY-MM-DD
- `posted_at_datetime`: ISO 8601
- `scraped_at`: When the row was fetched

**Company profile (with `includeJobDetails=true`)**

- `company_size`: Authoritative headcount range from the company profile (e.g. "500 - 999"). More accurate than the posting-level field, which can be stale.
- `company_founded_in`: Integer year the company was founded (e.g. 2016)
- `company_about_short`: Plain-text company description (first 500 chars)
- `company_locations[]`: Cities where the company has registered offices

**Extended company profile (with `includeCompanyDetails=true`)**

- `company_social`: Object with social media URLs: `facebook`, `instagram`, `twitter`, `linkedin`, `youtube`. Null keys omitted.
- `company_industries_served[]`: Industries the company works in (from the "Industries" section on the company profile).
- `company_about`: Full plain-text company description (no length cap; use `company_about_short` for a 500-char preview).
- `company_about_html`: Full company description in HTML (script/style stripped).
- `company_video_youtube_id`: YouTube video ID embedded on the company profile (e.g. `"np8ghdOX-8Q"`). Use as `https://www.youtube.com/watch?v={id}`.
- `company_technologies_used[]`: Technology stack the company works with at an org level (distinct from job-level `tech_stack`).
- `company_perks_benefits[]`: All perks and benefits from the company profile (merges "Benefits" and "Office Perks" sections).
- `company_gallery_images[]`: Full-size CDN URLs of office/team/event gallery photos.
- `company_awards[]`: Award names from the company profile awards section (e.g. "Great Place To Work").
- `company_office_locations[]`: Physical office locations. Each object: `address` (street + postal + city), `city`, `country` (ISO-2), `lat`, `lng`.
- `company_team_members[]`: Employees listed in the company team section, flattened across all sub-groups. Each object: `name`, `role` (API title field), `photo_url` (CDN URL or null), `bio` (text or null).
- `company_clients[]`: Client references listed on the company profile. Each object: `name` (derived from logo filename, underscores replaced with spaces), `logo_url` (CDN URL or null).

**Content (with `includeJobDetails=true`)**

- `description_snippet`: 300-char plain-text summary
- `description_full`: Full plain text
- `description_html`: HTML with script/style stripped
- `description_md`: Markdown-converted description
- `requirements_must[]`: Must-have tech/skills from the requirements section
- `requirements_nice[]`: Nice-to-have skills

**Contact extraction (with `includeJobDetails=true`)**

- `contact_emails[]`: Email addresses found in description
- `contact_phones[]`: Phone numbers from description
- `contact_urls[]`: External HTTP(S) links (nofluffjobs.com self-refs excluded)

### Use with AI Agents (MCP)

Connect to any MCP-compatible AI client: Claude Desktop, Claude.ai, Cursor, VS Code, or custom agents.

**Apify MCP server URL:**

`https://mcp.apify.com?tools=nanoscrape/nofluffjobs-eu-scraper`

**Example prompt:**

> "Use nofluffjobs-eu-scraper to find Senior Python remote jobs in Poland. Return a table with title, company, salary range in PLN, and tech stack."

### Why this scraper

- **100% salary fill rate.** NoFluffJobs legally mandates salary disclosure. Every row has salary\_min and salary\_max -- no nulls, no "competitive salary" placeholders.
- **EU tech market depth.** 20,000+ active IT listings. The dominant platform for Poland (the EU's largest tech talent market after Germany) plus strong CZ/SK/HU/UA/NL coverage.
- **Structured tech tags from SERP.** Tech stack requirements come from the SERP JSON, no description parsing needed -- 100% fill rate on tech\_stack for every listing.
- **B2B vs employment transparency.** NoFluffJobs shows which contract types the salary applies to. B2B (freelance) and Employment salaries are disclosed separately.
- **Zero bot risk.** NoFluffJobs API returns 200 with no bot challenge. HTTP-only, no browser tier.
- **Pay-per-row.** No hourly rental.

### Common use cases

- **Salary benchmarking for EU IT roles.** Get structured salary min/max across seniority levels and countries. Ideal for compensation planning, pay equity audits, or competitive analysis.
- **Recruiter sourcing.** Track open backend, DevOps, or mobile roles across Poland, Hungary, Ukraine, and the Netherlands with tech stack, seniority, and remote status already structured.
- **Job aggregators.** Ingest the full NoFluffJobs feed into a jobs platform. Every row is schema-complete with salary -- no post-processing to guess pay bands.
- **Freelance rate research.** Filter by B2B contract type to get the current hourly/monthly B2B rates for specific tech stacks in Poland, Czech Republic, and Hungary.
- **AI job-search agents.** Give agents structured access to EU tech salary data with mandatory salary transparency.

### Notes and limits

- **Salary is always populated** on NoFluffJobs (platform policy). If salary\_min or salary\_max is null on a row, that is a bug -- please open an issue.
- **Multi-currency.** PLN dominates (Poland), HUF appears for Hungary, USD for many Ukraine-based roles, EUR for Slovakia/Netherlands/international remote positions, CZK for Czech Republic. No FX conversion is performed -- currency is preserved as returned by the platform.
- **Salary period varies.** Most Polish listings quote monthly (PLN/month). Some roles quote hourly rates. Check salary\_period before comparing across countries.
- **Country filter is client-side.** The `country` input filters returned jobs against each posting's `location.places[].country.code` data. The NoFluffJobs API does not honor the `region=` parameter server-side (all values return the same full catalogue), so filtering is applied locally after the API responds. Queries with a country filter will return fewer results than an unfiltered `country: "all"` query -- this is correct behavior. Jobs with no location data are excluded when a country filter is active.
- **Tech stack from SERP tiles only.** The SERP response includes requirement tiles (Python, AWS, etc.) for every posting. The full requirements list (requirements\_must, requirements\_nice) requires includeJobDetails=true.
- **Duplicate postings.** A single job opening that appears for multiple cities or provinces in the same region is deduped by posting ID within a run.
- **Rate limits.** NoFluffJobs serves the API without authentication for standard read requests. maxConcurrency of 5 is safe. Higher concurrency may trigger throttling on large runs.

### Related Actors

Working across the Polish and EU tech job market? These complement NoFluffJobs:

Poland peers:

- [Pracuj.pl Scraper](https://apify.com/santamaria-automations/pracuj-pl-scraper): Poland's largest private-sector generalist board (all industries, 80,000+ listings).
- [praca.gov.pl Scraper](https://apify.com/santamaria-automations/praca-gov-pl-scraper): Poland's official government portal (Central Job Offers Database / CBOP) for public-sector and PUP office listings.

Other EU tech boards:

- [Profesia.sk Scraper](https://apify.com/santamaria-automations/profesia-sk-scraper): Slovakia's leading job board with 40,000+ listings across all industries.
- [Profession.hu Scraper](https://apify.com/santamaria-automations/profession-hu-scraper): Hungary's largest job board, covers IT and non-tech roles.
- [Kariera.gr Scraper](https://apify.com/santamaria-automations/kariera-gr-scraper): Greece's leading job board.
- [Net - Empregos PT Scraper](https://apify.com/santamaria-automations/net-empregos-pt-scraper): Portugal's largest job board.
- [VDAB.be Scraper](https://apify.com/santamaria-automations/vdab-be-scraper): Belgium's official public employment service.
- [SEPE.es Scraper](https://apify.com/santamaria-automations/sepe-es-scraper): Spain's official employment service.
- [Subito.it Jobs Scraper](https://apify.com/santamaria-automations/subito-it-jobs-scraper): Italy's major classifieds platform with a large jobs section.

Broader coverage:

- [Career Site Jobs Scraper](https://apify.com/santamaria-automations/career-site-jobs-scraper): Scrape jobs directly from company career pages (Greenhouse, Lever, Workday, etc.).
- [Website Job Extractor](https://apify.com/santamaria-automations/website-job-extractor): Extract job listings from any website via HTML pattern detection.
- [LinkedIn Scraper](https://apify.com/santamaria-automations/linkedin-scraper): Broader EU + global coverage for tech and non-tech roles.
- [Indeed Scraper](https://apify.com/santamaria-automations/indeed-scraper): The generalist jobs board with global coverage.
- [Levels.fyi Scraper](https://apify.com/santamaria-automations/levels-fyi-scraper): US tech compensation data with verified salary ranges at FAANG-tier companies.
- [Wellfound (AngelList) Jobs Scraper](https://apify.com/santamaria-automations/wellfound-jobs-scraper): Startup roles with equity ranges.

### Support

For issues, feature requests, or fields not yet extracted, open an issue on the [Issues tab](https://console.apify.com/actors/640X1wwqi11pqpA4w/issues). We respond within 24 hours.

Contact: contact@nanoscrape.com

# Actor input Schema

## `searchQueries` (type: `array`):

One or more job-title or tech keywords to search on NoFluffJobs (e.g. 'backend developer', 'Python', 'React', 'DevOps'). Each keyword runs a separate search. Leave empty to browse all jobs with the filters below.

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

Direct NoFluffJobs search URLs to crawl. Copy the URL from the search results page (includes ?criteria= param). Use instead of or alongside searchQueries.

## `startUrls` (type: `array`):

Alternative URL input. Supports both plain strings and Apify requestListSources objects.

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

Filter to a specific country. 'all' returns every posting. Focus markets: Poland (core, founded here), Czech Republic, Slovakia (core CEE), Hungary, Ukraine, Netherlands. Filtering is applied client-side against each job's location data -- only postings with at least one location in the selected country are returned.

## `city` (type: `string`):

Filter by city name (e.g. 'Warsaw', 'Prague', 'Berlin'). Leave blank for all cities.

## `seniority` (type: `string`):

Filter by seniority. NoFluffJobs labels: Trainee, Junior, Mid, Senior, Expert. Leave blank for all levels.

## `techStack` (type: `array`):

Filter by required technology tags (e.g. \['Python', 'AWS', 'React']). Jobs must match all listed techs.

## `contractType` (type: `string`):

Filter by contract type. B2B = freelance invoice, UoP = Polish employment contract (umowa o prace).

## `remoteOnly` (type: `boolean`):

When enabled, only returns fully remote positions. NoFluffJobs has a large share of remote-friendly EU IT jobs.

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

How to order results. NoFluffJobs' public catalogue API (/api/posting) returns postings in the platform's native order (relevance-weighted with recent renewals bubbled up) and does not honor a server-side sort query parameter -- the site's Angular front-end applies the 'Newest' toggle client-side. This field is present for fleet consistency; the sole supported value is 'newest'.

## `includeJobDetails` (type: `boolean`):

Fetch each job's detail page for the full HTML description, must-have / nice-to-have requirements list, company website, and contact extraction. Adds $0.005 per row.

## `includeCompanyDetails` (type: `boolean`):

Fetch the full company profile from the NoFluffJobs company API and populate Phase B fields: company\_social (Facebook/Instagram/Twitter/LinkedIn), company\_industries\_served, company\_about (full plain text), company\_about\_html, company\_video\_youtube\_id, company\_technologies\_used, company\_perks\_benefits, company\_gallery\_images, company\_awards, and company\_office\_locations (with lat/lng). Requires includeJobDetails=true. Adds $0.002 per unique company fetched.

## `maxResults` (type: `integer`):

Total job cap across all queries. NoFluffJobs has 20,000+ active IT listings at any time.

## `maxResultsPerQuery` (type: `integer`):

Maximum results per keyword or URL. Useful to balance coverage across multiple keywords.

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

Maximum concurrent detail-page requests (only used when includeJobDetails is true). Higher values speed up detail fetching but increase memory and may trigger rate limiting.

## Actor input object example

```json
{
  "searchQueries": [
    "backend developer"
  ],
  "country": "all",
  "city": "Warsaw",
  "seniority": "",
  "contractType": "Any",
  "remoteOnly": false,
  "sortBy": "newest",
  "includeJobDetails": false,
  "includeCompanyDetails": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset containing scraped NoFluffJobs IT/tech job listings. Each row includes title, company, salary (min/max/currency/period/type/text), seniority\[], tech\_stack\[], contract\_types\[], work\_type, location, country, city, posted dates, category, and optional enriched fields when includeJobDetails=true: full description (4 formats), requirements, company\_size (authoritative from company profile), company\_profile\_url, company\_founded\_in, company\_about\_short, company\_locations\[], posting\_tags\[], offer\_expiration\_date, remote\_voivodeship\_list\[], and contact extraction. Phase B fields (when includeCompanyDetails=true): company\_social (Facebook/Instagram/Twitter/LinkedIn), company\_industries\_served\[], company\_about (full plain text), company\_about\_html, company\_video\_youtube\_id, company\_technologies\_used\[], company\_perks\_benefits\[], company\_gallery\_images\[], company\_awards\[], company\_office\_locations\[] (with lat/lng). Phase C fields (when includeCompanyDetails=true): company\_team\_members\[] (name, role, photo\_url, bio -- flattened across all team groups), company\_clients\[] (name derived from logo filename, logo\_url).

# 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 = {
    "searchQueries": [
        "backend developer"
    ],
    "sortBy": "newest",
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/nofluffjobs-eu-scraper").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 = {
    "searchQueries": ["backend developer"],
    "sortBy": "newest",
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/nofluffjobs-eu-scraper").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 '{
  "searchQueries": [
    "backend developer"
  ],
  "sortBy": "newest",
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 5
}' |
apify call santamaria-automations/nofluffjobs-eu-scraper --silent --output-dataset

```

## MCP server setup

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

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/640X1wwqi11pqpA4w/builds/7mFD8qhaSaaaCbHtM/openapi.json
