{
  "openapi": "3.0.1",
  "info": {
    "title": "Nofluffjobs $1💰 URL Search | Keyword Filtering | Rich Output",
    "description": "From $1/1K. Extract IT jobs from NoFluffJobs.com across Poland, Czechia, Slovakia, Hungary, and the Netherlands. Search by filters or use NoFluffJobs URLs. Returns salary ranges, skills, full descriptions, tasks, benefits, hiring steps, company size, GPS coordinates, and merged office locations.",
    "version": "1.0",
    "x-build-id": "mBOxM00eLgtaHjUBE"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~nofluffjobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-nofluffjobs-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/abotapi~nofluffjobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-nofluffjobs-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/abotapi~nofluffjobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-nofluffjobs-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "How to find jobs. 'search' builds a query from the filters below. 'url' fetches the NoFluffJobs URLs you paste (search pages or individual job pages).",
            "default": "search"
          },
          "region": {
            "title": "Region",
            "enum": [
              "pl",
              "cz",
              "sk",
              "hu",
              "nl",
              "all"
            ],
            "type": "string",
            "description": "Which NoFluffJobs market to search. 'All regions' scrapes every market.",
            "default": "pl"
          },
          "keyword": {
            "title": "Keyword",
            "type": "string",
            "description": "Free-text search, e.g. a role, technology or company name. Leave empty to list everything in the region."
          },
          "category": {
            "title": "Category",
            "enum": [
              "",
              "backend",
              "frontend",
              "fullstack",
              "mobile",
              "embedded",
              "testing",
              "devops",
              "sys-administrator",
              "agile",
              "ux",
              "project-manager",
              "business-analyst",
              "security",
              "data",
              "ai",
              "support",
              "architecture",
              "marketing",
              "sales",
              "hr",
              "finance"
            ],
            "type": "string",
            "description": "Job category. Leave empty for all categories.",
            "default": ""
          },
          "seniority": {
            "title": "Seniority",
            "enum": [
              "",
              "trainee",
              "junior",
              "mid",
              "senior",
              "expert"
            ],
            "type": "string",
            "description": "Experience level. Leave empty for any.",
            "default": ""
          },
          "employmentType": {
            "title": "Employment type",
            "enum": [
              "",
              "b2b",
              "permanent",
              "mandate-contract",
              "internship"
            ],
            "type": "string",
            "description": "Contract type. Leave empty for any.",
            "default": ""
          },
          "jobLanguage": {
            "title": "Job posting language",
            "enum": [
              "",
              "en",
              "pl",
              "cs",
              "sk",
              "hu",
              "uk"
            ],
            "type": "string",
            "description": "Language the posting is written in. Leave empty for any.",
            "default": ""
          },
          "city": {
            "title": "City",
            "type": "string",
            "description": "Filter to a single city (e.g. warszawa, krakow, praha). Leave empty for all cities."
          },
          "technology": {
            "title": "Technology / skill",
            "type": "string",
            "description": "Require a specific skill or technology (e.g. java, react, kubernetes)."
          },
          "urls": {
            "title": "NoFluffJobs URLs",
            "type": "array",
            "description": "Paste NoFluffJobs URLs (one per line). Search/listing pages are walked with pagination; individual job pages are fetched directly. The search-mode fields are ignored in URL mode. The fields in the Filters and sort section still apply.",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote only",
            "type": "boolean",
            "description": "Only return jobs that offer remote work. The detail fields remotePercent and fullyRemote tell you whether a job is fully remote or hybrid. Applies in BOTH search mode and URL mode.",
            "default": false
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "",
              "newest",
              "salary-desc",
              "salary-asc"
            ],
            "type": "string",
            "description": "Result ordering. Default is the site's relevance ranking. Salary sorts use the disclosed range; newest sorts by publish date. Applied server-side, so it orders the whole result set, not just the page. Applies in BOTH search mode and URL mode.",
            "default": ""
          },
          "minSalary": {
            "title": "Minimum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Only jobs whose disclosed salary range reaches at least this amount (monthly gross, in the region currency). Jobs with no disclosed salary are excluded when a salary filter is set. Applies in BOTH search mode and URL mode."
          },
          "maxSalary": {
            "title": "Maximum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Only jobs whose disclosed salary range starts at or below this amount (monthly gross, in the region currency). Applies in BOTH search mode and URL mode."
          },
          "fetchDetails": {
            "title": "Fetch full job details",
            "type": "boolean",
            "description": "Open each job's detail page to add full description, required/nice-to-have skills, daily tasks, benefits, equipment, recruitment steps, company size, salary breakdown and GPS. Turn off for a faster, lighter run with list-level fields only.",
            "default": true
          },
          "maxListings": {
            "title": "Max jobs",
            "minimum": 0,
            "type": "integer",
            "description": "The main limit: maximum number of jobs to return. 0 means unlimited (then Max pages becomes the cap).",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per query",
            "minimum": 0,
            "type": "integer",
            "description": "Safety bound on how many search-result pages to walk per query/region (about 20 jobs per page). 0 means unlimited (walk until the storefront reports no more pages). Leave at the default; Max jobs is the primary limit. Only lower this if you set Max jobs to 0 (unlimited) and want pages to be the cap.",
            "default": 0
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run (delta)",
            "type": "string",
            "description": "Continue ONE interrupted crawl. ID of a previous run of this actor (or a dataset ID) -- jobs already in that dataset are skipped, so this run returns only NEW jobs (a delta). Combine both runs' datasets for the full set. Max jobs then counts only the new jobs. For recurring monitoring of the SAME search across scheduled runs instead, use Incremental mode below."
          },
          "incrementalMode": {
            "title": "Incremental mode (recurring monitoring)",
            "type": "boolean",
            "description": "Recurring monitoring of the SAME search: schedule this actor and get only what changed (NEW/UPDATED/REAPPEARED/EXPIRED) each run -- the actor remembers its own baseline in a key-value store, no run ID to paste. Off by default so existing runs are unaffected. For continuing ONE interrupted crawl instead, use Resume above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (incremental mode, optional)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign so you can run several different filter setups without them sharing a baseline. Leave empty to auto-derive a key from the mode and every filter (region, keyword, category, seniority, employment type, job language, city, technology, remote only, sort, salary range, URLs, fetch details) -- two different filter setups then never collide."
          },
          "emitUnchanged": {
            "title": "Emit unchanged jobs (incremental mode)",
            "type": "boolean",
            "description": "Incremental mode only. When off (default), a job identical to the last run is skipped -- not returned, not billed. Turn on to also return (and pay for) every UNCHANGED job alongside NEW/UPDATED/REAPPEARED.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired jobs (incremental mode)",
            "type": "boolean",
            "description": "Incremental mode only. When on, a job that was tracked before but is no longer found after a COMPLETE scan of this search is returned once with changeType EXPIRED (and billed like any other row). Only fires on a complete, uncapped, non-resumed scan -- a partial run never marks jobs expired. Off by default.",
            "default": false
          },
          "proxy": {
            "title": "Connection (proxy)",
            "type": "object",
            "description": "NoFluffJobs works on the cheap Apify Datacenter connection (the default, free-tier friendly). Residential is optional and used only if you need geo-diverse IPs.",
            "default": {
              "useApifyProxy": true
            }
          },
          "residentialRequestCap": {
            "title": "Residential request cap",
            "minimum": 0,
            "type": "integer",
            "description": "Cost guard. If you chose a Residential connection, switch to the cheaper Datacenter connection after this many residential requests. 0 means no cap.",
            "default": 0
          },
          "residentialBudgetMb": {
            "title": "Residential traffic budget (MB)",
            "minimum": 0,
            "type": "integer",
            "description": "Cost guard. If you chose a Residential connection, switch to the cheaper Datacenter connection after pulling this many MB over residential. 0 means no budget limit.",
            "default": 0
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}