# No Fluff Jobs Search Scraper (`jobsapi/nofluffjobs-jobs-search-scraper`) Actor

Extract rich No Fluff Jobs postings from hydrated and structured data, including exact salaries and contracts, skills, requirements, tasks, benefits, locations, company metadata, recruitment details, dates, and source records.

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

## Pricing

from $2.99 / 1,000 job details

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## No Fluff Jobs Search Scraper

This Apify Actor collects publicly available No Fluff Jobs postings from the official `nofluffjobs.com` site. It uses the official HTTPS posting JSON endpoint and the official search page's structured SSR state. It does not use browser automation, residential proxies, third-party mirrors, or access-control bypasses.

### What it returns

Each dataset item is a source-verified job record. When published by No Fluff, the record includes:

- stable posting reference and canonical detail URL;
- title, company, company URL/logo/size, category, seniority, and technology;
- every published location, city, province, address, country, coordinates, remote level, and workplace type;
- all published salary options, currencies, periods, contract types, holiday information, and disclosure status;
- description HTML and text, section headings, bullets, daily tasks, requirements, skills, methodology, benefits, equipment, and recruitment details;
- source record, field coverage, request receipts, and verification flags.

Missing source values are omitted. The Actor never writes `null`, blank, or placeholder fields and does not put diagnostics in the dataset. Structured diagnostics and run health are written to `RUN_DIAGNOSTICS`, `RUN_SUMMARY`, `RUN_METADATA`, and `RUN_HEALTH` in the default key-value store.

### Modes

`search` is the default and accepts `query`, optional `location`, and `language`. Simple technology queries use the corresponding official category route; other searches use the official keyword search route.

`single` accepts one exact detail URL in `url`. `multiple` accepts exact detail URLs in `urls`. `searchMultiple` accepts an array such as `{ "query": "javascript", "location": "Warszawa" }` in `searches`. `startUrls` accepts a mixture of official listing and detail URLs in `startUrls`.

All modes share `maxItems`, `maxPages`, `maxCandidates`, `maxRequests`, `timeoutMs`, and `deadlineMs` bounds. The default input is deliberately small so local QA completes quickly:

```json
{
  "mode": "search",
  "query": "javascript",
  "language": "pl",
  "maxItems": 3,
  "maxPages": 1,
  "maxCandidates": 30,
  "maxRequests": 12,
  "timeoutMs": 15000,
  "deadlineMs": 150000,
  "retries": 0
}
```

### Local development

```text
npm ci
npm run check
npm test
npx apify-cli validate-schema .actor/input_schema.json
npx apify-cli run --purge --input-file INPUT.json
npm run validate
```

Local and Apify Cloud runs use the same bounded official-source workflow and expose truthful localOnly provenance.

### Source boundary and responsible use

Only official HTTPS URLs on `nofluffjobs.com` are accepted. Search pages provide candidate slugs; each saved record is then verified against the official posting API. If the target blocks or removes a source, the Actor records the reason in KVS and skips the unverifiable item. Use the data lawfully, respect the site's terms and robots directives, and do not use this Actor to collect candidate or recruiter personal data.

# Actor input Schema

## `mode` (type: `string`):

Search, fetch one or many exact details, run several searches, or process official start URLs.

## `query` (type: `string`):

Technology, job title, or keyword. Used by search mode.

## `location` (type: `string`):

Optional city filter used by search mode, for example Warszawa or Kraków.

## `language` (type: `string`):

Two-letter official No Fluff Jobs language route.

## `url` (type: `string`):

Exact HTTPS nofluffjobs.com detail URL used by single mode.

## `urls` (type: `array`):

Exact HTTPS nofluffjobs.com detail URLs used by multiple mode.

## `searches` (type: `array`):

Search objects used by searchMultiple mode.

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

Official nofluffjobs.com listing or detail URLs. Detail URLs are fetched directly; listing URLs use their structured SSR state.

## `maxItems` (type: `integer`):

Maximum complete job records written to the dataset.

## `maxPages` (type: `integer`):

Maximum official SSR search pages per search. Kept low for predictable local runtime.

## `maxCandidates` (type: `integer`):

Maximum listing candidates considered before detail verification.

## `maxRequests` (type: `integer`):

Hard upper bound on official HTTPS attempts, including API-to-SSR fallback attempts.

## `timeoutMs` (type: `integer`):

Maximum wait for each official HTTPS request.

## `deadlineMs` (type: `integer`):

Hard wall-clock limit for the complete actor run.

## `retries` (type: `integer`):

Reserved for compatibility; the current bounded implementation does not retry.

## Actor input object example

```json
{
  "mode": "search",
  "query": "javascript",
  "location": "",
  "language": "pl",
  "maxItems": 3,
  "maxPages": 1,
  "maxCandidates": 30,
  "maxRequests": 12,
  "timeoutMs": 15000,
  "deadlineMs": 150000,
  "retries": 0
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `runDiagnostics` (type: `string`):

No description

# 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 = {
    "query": "javascript"
};

// Run the Actor and wait for it to finish
const run = await client.actor("jobsapi/nofluffjobs-jobs-search-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 = { "query": "javascript" }

# Run the Actor and wait for it to finish
run = client.actor("jobsapi/nofluffjobs-jobs-search-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 '{
  "query": "javascript"
}' |
apify call jobsapi/nofluffjobs-jobs-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jobsapi/nofluffjobs-jobs-search-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/1gtYbKVWbQRigRW3m/builds/uepSMlLzjRNtYGZSR/openapi.json
