{
  "data": {
    "id": "CK5WU0UkfDmmrJ4AO",
    "actId": "JJdosa9DRCovihtJD",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-11-13T07:40:15.819Z",
    "finishedAt": "2026-11-13T07:41:28.753Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 72871,
      "runTimeSecs": 72.871,
      "computeUnits": 0.08096777777777778,
      "imageSizeBytes": 4084025856
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Hiring.cafe Jobs Scraper Input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"searchQueries\": {\n      \"title\": \"Search Queries\",\n      \"type\": \"array\",\n      \"description\": \"Keywords to search on hiring.cafe (e.g., 'software engineer', 'data scientist'). Empty array or empty string returns unfiltered results.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"software engineer\"\n      ]\n    },\n    \"workplaceTypes\": {\n      \"title\": \"Workplace Types\",\n      \"type\": \"array\",\n      \"description\": \"Filter by workplace type. Defaults to all three.\",\n      \"editor\": \"select\",\n      \"prefill\": [\n        \"Remote\",\n        \"Hybrid\",\n        \"Onsite\"\n      ],\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"Remote\",\n          \"Hybrid\",\n          \"Onsite\"\n        ]\n      },\n      \"default\": [\n        \"Remote\",\n        \"Hybrid\",\n        \"Onsite\"\n      ]\n    },\n    \"locations\": {\n      \"title\": \"Locations\",\n      \"type\": \"array\",\n      \"description\": \"Filter to jobs in these locations. Pass plain strings like [\\\"San Francisco\\\", \\\"London\\\", \\\"United States\\\"] OR objects with {label, value, countryCode, stateCode, city, lat, lng}. Empty list = global (all locations). Hiring.cafe matches both city names and country names.\",\n      \"editor\": \"stringList\",\n      \"nullable\": true,\n      \"prefill\": []\n    },\n    \"jobTitleQuery\": {\n      \"title\": \"Job title contains\",\n      \"type\": \"string\",\n      \"description\": \"Filter to jobs whose TITLE contains this phrase. More precise than the general search query.\",\n      \"editor\": \"textfield\",\n      \"nullable\": true\n    },\n    \"jobDescriptionQuery\": {\n      \"title\": \"Job description contains\",\n      \"type\": \"string\",\n      \"description\": \"Filter to jobs whose DESCRIPTION contains this phrase.\",\n      \"editor\": \"textfield\",\n      \"nullable\": true\n    },\n    \"technologyKeywordsQuery\": {\n      \"title\": \"Technology keywords\",\n      \"type\": \"string\",\n      \"description\": \"Match against the parsed tech-stack tags (e.g. python, react, kubernetes).\",\n      \"editor\": \"textfield\",\n      \"nullable\": true\n    },\n    \"requirementsKeywordsQuery\": {\n      \"title\": \"Requirements keywords\",\n      \"type\": \"string\",\n      \"description\": \"Match against parsed requirement bullets.\",\n      \"editor\": \"textfield\",\n      \"nullable\": true\n    },\n    \"companyNames\": {\n      \"title\": \"Companies (whitelist)\",\n      \"type\": \"array\",\n      \"description\": \"Only return jobs from these companies. Empty = all companies.\",\n      \"editor\": \"stringList\",\n      \"nullable\": true\n    },\n    \"excludedCompanyNames\": {\n      \"title\": \"Companies (blacklist)\",\n      \"type\": \"array\",\n      \"description\": \"Exclude jobs from these companies.\",\n      \"editor\": \"stringList\",\n      \"nullable\": true\n    },\n    \"companyKeywords\": {\n      \"title\": \"Company name keywords\",\n      \"type\": \"array\",\n      \"description\": \"Substring match on company name.\",\n      \"editor\": \"stringList\",\n      \"nullable\": true\n    },\n    \"excludedCompanyKeywords\": {\n      \"title\": \"Excluded company keywords\",\n      \"type\": \"array\",\n      \"description\": \"Substring match on company name; exclude these.\",\n      \"editor\": \"stringList\",\n      \"nullable\": true\n    },\n    \"industries\": {\n      \"title\": \"Industries\",\n      \"type\": \"array\",\n      \"description\": \"Filter to companies in these industries.\",\n      \"editor\": \"stringList\",\n      \"nullable\": true\n    },\n    \"excludedIndustries\": {\n      \"title\": \"Excluded industries\",\n      \"type\": \"array\",\n      \"description\": \"Exclude companies in these industries.\",\n      \"editor\": \"stringList\",\n      \"nullable\": true\n    },\n    \"salaryCurrency\": {\n      \"title\": \"Salary currency\",\n      \"type\": \"string\",\n      \"description\": \"Filter salary thresholds against this currency. Empty = any.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"USD\",\n        \"EUR\",\n        \"GBP\",\n        \"CAD\",\n        \"AUD\",\n        \"INR\",\n        \"JPY\",\n        \"CNY\",\n        \"MXN\",\n        \"BRL\"\n      ],\n      \"default\": \"\"\n    },\n    \"salaryFrequency\": {\n      \"title\": \"Salary frequency\",\n      \"type\": \"string\",\n      \"description\": \"Pay period for salary thresholds.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"Yearly\",\n        \"Monthly\",\n        \"Weekly\",\n        \"Daily\",\n        \"Hourly\"\n      ],\n      \"default\": \"\"\n    },\n    \"minSalary\": {\n      \"title\": \"Minimum salary\",\n      \"type\": \"integer\",\n      \"description\": \"Lower bound for compensation. Combined with currency + frequency.\",\n      \"editor\": \"number\",\n      \"minimum\": 0,\n      \"nullable\": true\n    },\n    \"maxSalary\": {\n      \"title\": \"Maximum salary\",\n      \"type\": \"integer\",\n      \"description\": \"Upper bound for compensation.\",\n      \"editor\": \"number\",\n      \"minimum\": 0,\n      \"nullable\": true\n    },\n    \"onlyTransparentSalaries\": {\n      \"title\": \"Only transparent salaries\",\n      \"type\": \"boolean\",\n      \"description\": \"Exclude jobs that dont publish a salary range.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"minYearsExperience\": {\n      \"title\": \"Minimum years of experience\",\n      \"type\": \"integer\",\n      \"description\": \"Filter to jobs requiring at least this many years experience.\",\n      \"editor\": \"number\",\n      \"minimum\": 0,\n      \"maximum\": 50,\n      \"default\": 0\n    },\n    \"maxYearsExperience\": {\n      \"title\": \"Maximum years of experience\",\n      \"type\": \"integer\",\n      \"description\": \"Filter to jobs requiring at most this many years experience.\",\n      \"editor\": \"number\",\n      \"minimum\": 0,\n      \"maximum\": 50,\n      \"default\": 20\n    },\n    \"securityClearances\": {\n      \"title\": \"Security clearances\",\n      \"type\": \"array\",\n      \"description\": \"Filter by clearance level. Empty = all jobs.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"None\",\n          \"Confidential\",\n          \"Secret\",\n          \"Top Secret\",\n          \"Top Secret/SCI\",\n          \"Public Trust\",\n          \"Interim Clearances\",\n          \"Other\"\n        ]\n      },\n      \"nullable\": true\n    },\n    \"sortBy\": {\n      \"title\": \"Sort order\",\n      \"type\": \"string\",\n      \"description\": \"Result ordering.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"default\",\n        \"newest\",\n        \"oldest\",\n        \"salary_high_to_low\",\n        \"salary_low_to_high\"\n      ],\n      \"enumTitles\": [\n        \"Relevance (default)\",\n        \"Newest first\",\n        \"Oldest first\",\n        \"Salary (high → low)\",\n        \"Salary (low → high)\"\n      ],\n      \"default\": \"default\"\n    },\n    \"seniorityLevels\": {\n      \"title\": \"Seniority Levels\",\n      \"type\": \"array\",\n      \"description\": \"Filter by seniority level.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"No Prior Experience Required\",\n          \"Entry Level\",\n          \"Mid Level\",\n          \"Senior Level\",\n          \"Director\",\n          \"Executive\"\n        ]\n      },\n      \"default\": [\n        \"No Prior Experience Required\",\n        \"Entry Level\",\n        \"Mid Level\",\n        \"Senior Level\",\n        \"Director\",\n        \"Executive\"\n      ]\n    },\n    \"commitmentTypes\": {\n      \"title\": \"Commitment Types\",\n      \"type\": \"array\",\n      \"description\": \"Filter by employment commitment.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"Full Time\",\n          \"Part Time\",\n          \"Contract\",\n          \"Internship\",\n          \"Temporary\",\n          \"Seasonal\",\n          \"Volunteer\"\n        ]\n      },\n      \"default\": [\n        \"Full Time\",\n        \"Part Time\",\n        \"Contract\",\n        \"Internship\",\n        \"Temporary\",\n        \"Seasonal\",\n        \"Volunteer\"\n      ]\n    },\n    \"dateFetchedPastNDays\": {\n      \"title\": \"Posted Within (days)\",\n      \"type\": \"integer\",\n      \"description\": \"Only include jobs fetched within the last N days.\",\n      \"minimum\": 1,\n      \"maximum\": 365,\n      \"default\": 30\n    },\n    \"maxItems\": {\n      \"title\": \"Max Items\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of jobs to return across all queries.\",\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"default\": 50,\n      \"prefill\": 3\n    }\n  },\n  \"required\": []\n}",
    "readme": "# Hiring.cafe Job Listings & Salary Filter Scraper\r\n\r\nHiring.cafe aggregates job postings pulled directly from Greenhouse, Lever, Workable, Workday, SuccessFactors, BambooHR, and thousands of other applicant-tracking systems and company career pages. This actor queries that aggregated index and returns structured job records, so you can filter on dimensions — salary band, security clearance, required tech stack — that most job boards don't expose in their own search UI.\r\n\r\n## What this actor does\r\n\r\n- Runs one or more keyword searches against hiring.cafe's job index and collects matching postings.\r\n- Narrows results by workplace type, seniority, commitment type, years of experience, security clearance, and salary range/currency/frequency.\r\n- Matches separately against job title text, job description text, parsed technology tags, and parsed requirement bullets, so you can target precise phrasing rather than a single blended search box.\r\n- Includes company-level filters (whitelist/blacklist by name or keyword, industry include/exclude) so you can scope a run to or away from specific employers.\r\n- Returns one record per job with company, compensation, and location detail; fields the source doesn't provide for a given job are left out of that record.\r\n\r\n## Output per job\r\n\r\n- `id` – unique hiring.cafe job ID.\r\n- `objectID` – search-index object ID for the posting.\r\n- `source` – originating ATS (e.g. greenhouse, lever, workable, successfactors).\r\n- `boardToken` – job board token used by the source ATS.\r\n- `applyUrl` – link back to the original listing on the source ATS.\r\n- `title` – job title as posted.\r\n- `coreJobTitle` – hiring.cafe's canonicalized version of the title.\r\n- `category` – job category, e.g. Engineering, Data, Marketing.\r\n- `seniorityLevel` – seniority classification, e.g. Entry Level, Senior Level, Director.\r\n- `roleType` – Individual Contributor or People Manager.\r\n- `commitment` – Full Time, Part Time, Contract, Internship, Temporary, Seasonal, or Volunteer.\r\n- `workplaceType` – Remote, Hybrid, or Onsite.\r\n- `workplaceCountries` – country codes where the role is based.\r\n- `workplaceStates` – state or region names where the role is based.\r\n- `workplaceCities` – city names where the role is based.\r\n- `latitude` / `longitude` — primary geolocation of the listed workplace, when hiring.cafe provides one.\r\n- `salaryMin` / `salaryMax` — disclosed compensation range, omitted when the posting does not publish a transparent salary.\r\n- `salaryCurrency` – currency code for the disclosed range.\r\n- `salaryFrequency` – pay period for the disclosed range (Yearly, Monthly, Weekly, Daily, Hourly).\r\n- `technicalTools` – technologies/tools mentioned in the posting.\r\n- `minYearsExperience` – minimum years of experience parsed from the posting.\r\n- `bachelorsDegreeRequirement` – degree requirement level, when stated.\r\n- `companyName` – hiring company name.\r\n- `companyWebsite` – company homepage URL.\r\n- `companyIndustries` – industry tags for the hiring company.\r\n- `companyEmployees` – employee-count bucket for the hiring company.\r\n- `companyHqCountry` – country code of the company's headquarters.\r\n- `isExpired` – whether hiring.cafe has marked the listing expired.\r\n- `scrapedAt` – ISO 8601 timestamp of when this actor fetched the record.\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `searchQueries` | Array of strings | – | Keywords searched against hiring.cafe (e.g. `\"software engineer\"`). Leave empty for unfiltered results. |\r\n| `workplaceTypes` | Array (select) | `[\"Remote\",\"Hybrid\",\"Onsite\"]` | Restrict to these workplace types. |\r\n| `locations` | Array | – | Location filter: plain strings (`\"San Francisco\"`, `\"United States\"`) or objects with `label`, `value`, `countryCode`, `stateCode`, `city`, `lat`, `lng`. Empty = global. |\r\n| `jobTitleQuery` | String | – | Only jobs whose title contains this phrase. |\r\n| `jobDescriptionQuery` | String | – | Only jobs whose description contains this phrase. |\r\n| `technologyKeywordsQuery` | String | – | Match against parsed technology tags (e.g. `python`, `kubernetes`). |\r\n| `requirementsKeywordsQuery` | String | – | Match against parsed requirement bullets. |\r\n| `companyNames` | Array of strings | – | Only return jobs from these companies. |\r\n| `excludedCompanyNames` | Array of strings | – | Exclude jobs from these companies. |\r\n| `companyKeywords` | Array of strings | – | Substring match against company name (include). |\r\n| `excludedCompanyKeywords` | Array of strings | – | Substring match against company name (exclude). |\r\n| `industries` | Array of strings | – | Only companies in these industries. |\r\n| `excludedIndustries` | Array of strings | – | Exclude companies in these industries. |\r\n| `salaryCurrency` | String (select) | `\"\"` (any) | Currency used to evaluate `minSalary`/`maxSalary`. |\r\n| `salaryFrequency` | String (select) | `\"\"` (any) | Pay period used to evaluate `minSalary`/`maxSalary`. |\r\n| `minSalary` | Integer | – | Lower compensation bound, combined with currency + frequency. |\r\n| `maxSalary` | Integer | – | Upper compensation bound. |\r\n| `onlyTransparentSalaries` | Boolean | `false` | Drop jobs that don't publish a salary range. |\r\n| `minYearsExperience` | Integer | `0` | Only jobs requiring at least this many years of experience. |\r\n| `maxYearsExperience` | Integer | `20` | Only jobs requiring at most this many years of experience. |\r\n| `securityClearances` | Array (select) | – | Only jobs requiring one of these clearance levels (e.g. `Secret`, `Top Secret`). |\r\n| `sortBy` | String (select) | `\"default\"` | Result order: `default` (relevance), `newest`, `oldest`, `salary_high_to_low`, `salary_low_to_high`. |\r\n| `seniorityLevels` | Array (select) | `[\"No Prior Experience Required\", \"Entry Level\", \"Mid Level\", \"Senior Level\", \"Director\", \"Executive\"]` | Restrict to these seniority levels. |\r\n| `commitmentTypes` | Array (select) | `[\"Full Time\", \"Part Time\", \"Contract\", \"Internship\", \"Temporary\", \"Seasonal\", \"Volunteer\"]` | Restrict to these commitment types. |\r\n| `dateFetchedPastNDays` | Integer | `30` | Only include jobs fetched within the last N days. |\r\n| `maxItems` | Integer | `50` | Maximum number of jobs to return across all queries. |\r\n\r\n### Example: remote senior engineering roles with disclosed pay\r\n\r\n```json\r\n{\r\n    \"searchQueries\": [\"software engineer\"],\r\n    \"workplaceTypes\": [\"Remote\"],\r\n    \"seniorityLevels\": [\"Senior Level\", \"Director\"],\r\n    \"onlyTransparentSalaries\": true,\r\n    \"salaryCurrency\": \"USD\",\r\n    \"salaryFrequency\": \"Yearly\",\r\n    \"minSalary\": 150000,\r\n    \"maxItems\": 100\r\n}\r\n```\r\n\r\n### Example: cleared roles near a specific company\r\n\r\n```json\r\n{\r\n    \"searchQueries\": [],\r\n    \"excludedCompanyNames\": [\"Acme Corp\"],\r\n    \"securityClearances\": [\"Secret\", \"Top Secret\"],\r\n    \"dateFetchedPastNDays\": 14,\r\n    \"maxItems\": 50\r\n}\r\n```\r\n\r\n### Example: contract/part-time roles mentioning a specific tech stack\r\n\r\n```json\r\n{\r\n    \"searchQueries\": [\"data engineer\"],\r\n    \"commitmentTypes\": [\"Contract\", \"Part Time\"],\r\n    \"technologyKeywordsQuery\": \"airflow\",\r\n    \"maxItems\": 30\r\n}\r\n```\r\n\r\n## Browser and network behavior\r\n\r\nHiringCafe is protected by Cloudflare. The actor uses a direct headful browser first and\r\nfalls back to a residential proxy only when the direct browser is blocked. No proxy is\r\nrequired for a successful local run.\r\n\r\n## Use cases\r\n\r\n- **Talent intelligence** – track hiring velocity for a role, company, or region over time.\r\n- **Compensation benchmarking** – aggregate disclosed salary ranges by role, seniority, and location.\r\n- **Remote-work research** – isolate `workplaceTypes: [\"Remote\"]` postings to study the remote-first job market.\r\n- **ATS/tooling market share** – group results by `source` to see which applicant-tracking systems dominate hiring.\r\n- **Skills-demand tracking** – aggregate `technicalTools` across postings to spot which technologies are rising in demand.\r\n- **Targeted job alerts** – run narrow filters (keyword + location + seniority) on a schedule to catch new matching postings.\r\n\r\n## FAQ\r\n\r\n**Does this cover jobs outside the US?**\r\nYes. hiring.cafe aggregates listings globally; use `locations`, `workplaceCountries` in the output, or leave `locations` empty for worldwide results.\r\n\r\n**Why are salary fields missing on some jobs?**\r\nMany postings do not disclose compensation. The actor omits salary fields for non-transparent postings instead of emitting `0`. Set `onlyTransparentSalaries` to `true` to keep only listings that publish a range.\r\n\r\n**What's the difference between `seniorityLevel` and `minYearsExperience`?**\r\n`seniorityLevel` is hiring.cafe's categorical tag (e.g. `Mid Level`, `Senior Level`). `minYearsExperience` is the numeric minimum years parsed from the job description text, and may be `0` when the posting doesn't state a number.\r\n\r\n**How do `searchQueries` and the other text filters interact?**\r\n`searchQueries` is the general keyword search hiring.cafe runs against the whole posting. `jobTitleQuery`, `jobDescriptionQuery`, `technologyKeywordsQuery`, and `requirementsKeywordsQuery` are additional, more targeted filters applied on top of that search.\r\n\r\n**Can I pull postings from one employer only?**\r\nYes, set `companyNames` to that employer's name (or use `companyKeywords` for a partial match). Use `excludedCompanyNames`/`excludedCompanyKeywords` to do the opposite.\r\n\r\n**Does `dateFetchedPastNDays` reflect the original posting date?**\r\nNo — it reflects when hiring.cafe's own index last fetched the listing, which is the freshness signal the source provides.\r\n\r\n**Are expired listings included?**\r\nhiring.cafe's active search only surfaces current postings, so `isExpired` is normally `false`; the field is kept in the output for completeness.\r\n\r\n**Is this affiliated with hiring.cafe?**\r\nNo. This actor is an independent tool that queries hiring.cafe's public job search and is not affiliated with or endorsed by hiring.cafe.\r\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "hiring-cafe-job-listings-and-salary-filter-scraper",
      "title": "Hiring.cafe Job Listings & Salary Filter Scraper",
      "description": "Pull job postings aggregated by hiring.cafe and narrow them by salary range, seniority, workplace type, security clearance, required tech stack, and company.",
      "version": "1.0",
      "buildTag": "latest",
      "meta": {
        "templateId": "python-empty"
      },
      "input": {
        "title": "Hiring.cafe Jobs Scraper Input",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "searchQueries": {
            "title": "Search Queries",
            "type": "array",
            "description": "Keywords to search on hiring.cafe (e.g., 'software engineer', 'data scientist'). Empty array or empty string returns unfiltered results.",
            "editor": "stringList",
            "prefill": [
              "software engineer"
            ]
          },
          "workplaceTypes": {
            "title": "Workplace Types",
            "type": "array",
            "description": "Filter by workplace type. Defaults to all three.",
            "editor": "select",
            "prefill": [
              "Remote",
              "Hybrid",
              "Onsite"
            ],
            "items": {
              "type": "string",
              "enum": [
                "Remote",
                "Hybrid",
                "Onsite"
              ]
            },
            "default": [
              "Remote",
              "Hybrid",
              "Onsite"
            ]
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Filter to jobs in these locations. Pass plain strings like [\"San Francisco\", \"London\", \"United States\"] OR objects with {label, value, countryCode, stateCode, city, lat, lng}. Empty list = global (all locations). Hiring.cafe matches both city names and country names.",
            "editor": "stringList",
            "nullable": true,
            "prefill": []
          },
          "jobTitleQuery": {
            "title": "Job title contains",
            "type": "string",
            "description": "Filter to jobs whose TITLE contains this phrase. More precise than the general search query.",
            "editor": "textfield",
            "nullable": true
          },
          "jobDescriptionQuery": {
            "title": "Job description contains",
            "type": "string",
            "description": "Filter to jobs whose DESCRIPTION contains this phrase.",
            "editor": "textfield",
            "nullable": true
          },
          "technologyKeywordsQuery": {
            "title": "Technology keywords",
            "type": "string",
            "description": "Match against the parsed tech-stack tags (e.g. python, react, kubernetes).",
            "editor": "textfield",
            "nullable": true
          },
          "requirementsKeywordsQuery": {
            "title": "Requirements keywords",
            "type": "string",
            "description": "Match against parsed requirement bullets.",
            "editor": "textfield",
            "nullable": true
          },
          "companyNames": {
            "title": "Companies (whitelist)",
            "type": "array",
            "description": "Only return jobs from these companies. Empty = all companies.",
            "editor": "stringList",
            "nullable": true
          },
          "excludedCompanyNames": {
            "title": "Companies (blacklist)",
            "type": "array",
            "description": "Exclude jobs from these companies.",
            "editor": "stringList",
            "nullable": true
          },
          "companyKeywords": {
            "title": "Company name keywords",
            "type": "array",
            "description": "Substring match on company name.",
            "editor": "stringList",
            "nullable": true
          },
          "excludedCompanyKeywords": {
            "title": "Excluded company keywords",
            "type": "array",
            "description": "Substring match on company name; exclude these.",
            "editor": "stringList",
            "nullable": true
          },
          "industries": {
            "title": "Industries",
            "type": "array",
            "description": "Filter to companies in these industries.",
            "editor": "stringList",
            "nullable": true
          },
          "excludedIndustries": {
            "title": "Excluded industries",
            "type": "array",
            "description": "Exclude companies in these industries.",
            "editor": "stringList",
            "nullable": true
          },
          "salaryCurrency": {
            "title": "Salary currency",
            "type": "string",
            "description": "Filter salary thresholds against this currency. Empty = any.",
            "editor": "select",
            "enum": [
              "",
              "USD",
              "EUR",
              "GBP",
              "CAD",
              "AUD",
              "INR",
              "JPY",
              "CNY",
              "MXN",
              "BRL"
            ],
            "default": ""
          },
          "salaryFrequency": {
            "title": "Salary frequency",
            "type": "string",
            "description": "Pay period for salary thresholds.",
            "editor": "select",
            "enum": [
              "",
              "Yearly",
              "Monthly",
              "Weekly",
              "Daily",
              "Hourly"
            ],
            "default": ""
          },
          "minSalary": {
            "title": "Minimum salary",
            "type": "integer",
            "description": "Lower bound for compensation. Combined with currency + frequency.",
            "editor": "number",
            "minimum": 0,
            "nullable": true
          },
          "maxSalary": {
            "title": "Maximum salary",
            "type": "integer",
            "description": "Upper bound for compensation.",
            "editor": "number",
            "minimum": 0,
            "nullable": true
          },
          "onlyTransparentSalaries": {
            "title": "Only transparent salaries",
            "type": "boolean",
            "description": "Exclude jobs that dont publish a salary range.",
            "default": false,
            "prefill": false
          },
          "minYearsExperience": {
            "title": "Minimum years of experience",
            "type": "integer",
            "description": "Filter to jobs requiring at least this many years experience.",
            "editor": "number",
            "minimum": 0,
            "maximum": 50,
            "default": 0
          },
          "maxYearsExperience": {
            "title": "Maximum years of experience",
            "type": "integer",
            "description": "Filter to jobs requiring at most this many years experience.",
            "editor": "number",
            "minimum": 0,
            "maximum": 50,
            "default": 20
          },
          "securityClearances": {
            "title": "Security clearances",
            "type": "array",
            "description": "Filter by clearance level. Empty = all jobs.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "None",
                "Confidential",
                "Secret",
                "Top Secret",
                "Top Secret/SCI",
                "Public Trust",
                "Interim Clearances",
                "Other"
              ]
            },
            "nullable": true
          },
          "sortBy": {
            "title": "Sort order",
            "type": "string",
            "description": "Result ordering.",
            "editor": "select",
            "enum": [
              "default",
              "newest",
              "oldest",
              "salary_high_to_low",
              "salary_low_to_high"
            ],
            "enumTitles": [
              "Relevance (default)",
              "Newest first",
              "Oldest first",
              "Salary (high → low)",
              "Salary (low → high)"
            ],
            "default": "default"
          },
          "seniorityLevels": {
            "title": "Seniority Levels",
            "type": "array",
            "description": "Filter by seniority level.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "No Prior Experience Required",
                "Entry Level",
                "Mid Level",
                "Senior Level",
                "Director",
                "Executive"
              ]
            },
            "default": [
              "No Prior Experience Required",
              "Entry Level",
              "Mid Level",
              "Senior Level",
              "Director",
              "Executive"
            ]
          },
          "commitmentTypes": {
            "title": "Commitment Types",
            "type": "array",
            "description": "Filter by employment commitment.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "Full Time",
                "Part Time",
                "Contract",
                "Internship",
                "Temporary",
                "Seasonal",
                "Volunteer"
              ]
            },
            "default": [
              "Full Time",
              "Part Time",
              "Contract",
              "Internship",
              "Temporary",
              "Seasonal",
              "Volunteer"
            ]
          },
          "dateFetchedPastNDays": {
            "title": "Posted Within (days)",
            "type": "integer",
            "description": "Only include jobs fetched within the last N days.",
            "minimum": 1,
            "maximum": 365,
            "default": 30
          },
          "maxItems": {
            "title": "Max Items",
            "type": "integer",
            "description": "Maximum number of jobs to return across all queries.",
            "minimum": 1,
            "maximum": 1000,
            "default": 50,
            "prefill": 3
          }
        },
        "required": []
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Hiring.cafe Job Listings & Salary Filter Scraper Output",
        "description": "Dataset of hiring.cafe job postings with title, company, workplace type, seniority, salary range, tech stack, and apply URL.",
        "type": "object",
        "properties": {
          "jobs": {
            "type": "string",
            "title": "Hiring Cafe Jobs",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "readme": "# Hiring.cafe Job Listings & Salary Filter Scraper\r\n\r\nHiring.cafe aggregates job postings pulled directly from Greenhouse, Lever, Workable, Workday, SuccessFactors, BambooHR, and thousands of other applicant-tracking systems and company career pages. This actor queries that aggregated index and returns structured job records, so you can filter on dimensions — salary band, security clearance, required tech stack — that most job boards don't expose in their own search UI.\r\n\r\n## What this actor does\r\n\r\n- Runs one or more keyword searches against hiring.cafe's job index and collects matching postings.\r\n- Narrows results by workplace type, seniority, commitment type, years of experience, security clearance, and salary range/currency/frequency.\r\n- Matches separately against job title text, job description text, parsed technology tags, and parsed requirement bullets, so you can target precise phrasing rather than a single blended search box.\r\n- Includes company-level filters (whitelist/blacklist by name or keyword, industry include/exclude) so you can scope a run to or away from specific employers.\r\n- Returns one record per job with company, compensation, and location detail; fields the source doesn't provide for a given job are left out of that record.\r\n\r\n## Output per job\r\n\r\n- `id` – unique hiring.cafe job ID.\r\n- `objectID` – search-index object ID for the posting.\r\n- `source` – originating ATS (e.g. greenhouse, lever, workable, successfactors).\r\n- `boardToken` – job board token used by the source ATS.\r\n- `applyUrl` – link back to the original listing on the source ATS.\r\n- `title` – job title as posted.\r\n- `coreJobTitle` – hiring.cafe's canonicalized version of the title.\r\n- `category` – job category, e.g. Engineering, Data, Marketing.\r\n- `seniorityLevel` – seniority classification, e.g. Entry Level, Senior Level, Director.\r\n- `roleType` – Individual Contributor or People Manager.\r\n- `commitment` – Full Time, Part Time, Contract, Internship, Temporary, Seasonal, or Volunteer.\r\n- `workplaceType` – Remote, Hybrid, or Onsite.\r\n- `workplaceCountries` – country codes where the role is based.\r\n- `workplaceStates` – state or region names where the role is based.\r\n- `workplaceCities` – city names where the role is based.\r\n- `latitude` / `longitude` — primary geolocation of the listed workplace, when hiring.cafe provides one.\r\n- `salaryMin` / `salaryMax` — disclosed compensation range, omitted when the posting does not publish a transparent salary.\r\n- `salaryCurrency` – currency code for the disclosed range.\r\n- `salaryFrequency` – pay period for the disclosed range (Yearly, Monthly, Weekly, Daily, Hourly).\r\n- `technicalTools` – technologies/tools mentioned in the posting.\r\n- `minYearsExperience` – minimum years of experience parsed from the posting.\r\n- `bachelorsDegreeRequirement` – degree requirement level, when stated.\r\n- `companyName` – hiring company name.\r\n- `companyWebsite` – company homepage URL.\r\n- `companyIndustries` – industry tags for the hiring company.\r\n- `companyEmployees` – employee-count bucket for the hiring company.\r\n- `companyHqCountry` – country code of the company's headquarters.\r\n- `isExpired` – whether hiring.cafe has marked the listing expired.\r\n- `scrapedAt` – ISO 8601 timestamp of when this actor fetched the record.\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `searchQueries` | Array of strings | – | Keywords searched against hiring.cafe (e.g. `\"software engineer\"`). Leave empty for unfiltered results. |\r\n| `workplaceTypes` | Array (select) | `[\"Remote\",\"Hybrid\",\"Onsite\"]` | Restrict to these workplace types. |\r\n| `locations` | Array | – | Location filter: plain strings (`\"San Francisco\"`, `\"United States\"`) or objects with `label`, `value`, `countryCode`, `stateCode`, `city`, `lat`, `lng`. Empty = global. |\r\n| `jobTitleQuery` | String | – | Only jobs whose title contains this phrase. |\r\n| `jobDescriptionQuery` | String | – | Only jobs whose description contains this phrase. |\r\n| `technologyKeywordsQuery` | String | – | Match against parsed technology tags (e.g. `python`, `kubernetes`). |\r\n| `requirementsKeywordsQuery` | String | – | Match against parsed requirement bullets. |\r\n| `companyNames` | Array of strings | – | Only return jobs from these companies. |\r\n| `excludedCompanyNames` | Array of strings | – | Exclude jobs from these companies. |\r\n| `companyKeywords` | Array of strings | – | Substring match against company name (include). |\r\n| `excludedCompanyKeywords` | Array of strings | – | Substring match against company name (exclude). |\r\n| `industries` | Array of strings | – | Only companies in these industries. |\r\n| `excludedIndustries` | Array of strings | – | Exclude companies in these industries. |\r\n| `salaryCurrency` | String (select) | `\"\"` (any) | Currency used to evaluate `minSalary`/`maxSalary`. |\r\n| `salaryFrequency` | String (select) | `\"\"` (any) | Pay period used to evaluate `minSalary`/`maxSalary`. |\r\n| `minSalary` | Integer | – | Lower compensation bound, combined with currency + frequency. |\r\n| `maxSalary` | Integer | – | Upper compensation bound. |\r\n| `onlyTransparentSalaries` | Boolean | `false` | Drop jobs that don't publish a salary range. |\r\n| `minYearsExperience` | Integer | `0` | Only jobs requiring at least this many years of experience. |\r\n| `maxYearsExperience` | Integer | `20` | Only jobs requiring at most this many years of experience. |\r\n| `securityClearances` | Array (select) | – | Only jobs requiring one of these clearance levels (e.g. `Secret`, `Top Secret`). |\r\n| `sortBy` | String (select) | `\"default\"` | Result order: `default` (relevance), `newest`, `oldest`, `salary_high_to_low`, `salary_low_to_high`. |\r\n| `seniorityLevels` | Array (select) | `[\"No Prior Experience Required\", \"Entry Level\", \"Mid Level\", \"Senior Level\", \"Director\", \"Executive\"]` | Restrict to these seniority levels. |\r\n| `commitmentTypes` | Array (select) | `[\"Full Time\", \"Part Time\", \"Contract\", \"Internship\", \"Temporary\", \"Seasonal\", \"Volunteer\"]` | Restrict to these commitment types. |\r\n| `dateFetchedPastNDays` | Integer | `30` | Only include jobs fetched within the last N days. |\r\n| `maxItems` | Integer | `50` | Maximum number of jobs to return across all queries. |\r\n\r\n### Example: remote senior engineering roles with disclosed pay\r\n\r\n```json\r\n{\r\n    \"searchQueries\": [\"software engineer\"],\r\n    \"workplaceTypes\": [\"Remote\"],\r\n    \"seniorityLevels\": [\"Senior Level\", \"Director\"],\r\n    \"onlyTransparentSalaries\": true,\r\n    \"salaryCurrency\": \"USD\",\r\n    \"salaryFrequency\": \"Yearly\",\r\n    \"minSalary\": 150000,\r\n    \"maxItems\": 100\r\n}\r\n```\r\n\r\n### Example: cleared roles near a specific company\r\n\r\n```json\r\n{\r\n    \"searchQueries\": [],\r\n    \"excludedCompanyNames\": [\"Acme Corp\"],\r\n    \"securityClearances\": [\"Secret\", \"Top Secret\"],\r\n    \"dateFetchedPastNDays\": 14,\r\n    \"maxItems\": 50\r\n}\r\n```\r\n\r\n### Example: contract/part-time roles mentioning a specific tech stack\r\n\r\n```json\r\n{\r\n    \"searchQueries\": [\"data engineer\"],\r\n    \"commitmentTypes\": [\"Contract\", \"Part Time\"],\r\n    \"technologyKeywordsQuery\": \"airflow\",\r\n    \"maxItems\": 30\r\n}\r\n```\r\n\r\n## Browser and network behavior\r\n\r\nHiringCafe is protected by Cloudflare. The actor uses a direct headful browser first and\r\nfalls back to a residential proxy only when the direct browser is blocked. No proxy is\r\nrequired for a successful local run.\r\n\r\n## Use cases\r\n\r\n- **Talent intelligence** – track hiring velocity for a role, company, or region over time.\r\n- **Compensation benchmarking** – aggregate disclosed salary ranges by role, seniority, and location.\r\n- **Remote-work research** – isolate `workplaceTypes: [\"Remote\"]` postings to study the remote-first job market.\r\n- **ATS/tooling market share** – group results by `source` to see which applicant-tracking systems dominate hiring.\r\n- **Skills-demand tracking** – aggregate `technicalTools` across postings to spot which technologies are rising in demand.\r\n- **Targeted job alerts** – run narrow filters (keyword + location + seniority) on a schedule to catch new matching postings.\r\n\r\n## FAQ\r\n\r\n**Does this cover jobs outside the US?**\r\nYes. hiring.cafe aggregates listings globally; use `locations`, `workplaceCountries` in the output, or leave `locations` empty for worldwide results.\r\n\r\n**Why are salary fields missing on some jobs?**\r\nMany postings do not disclose compensation. The actor omits salary fields for non-transparent postings instead of emitting `0`. Set `onlyTransparentSalaries` to `true` to keep only listings that publish a range.\r\n\r\n**What's the difference between `seniorityLevel` and `minYearsExperience`?**\r\n`seniorityLevel` is hiring.cafe's categorical tag (e.g. `Mid Level`, `Senior Level`). `minYearsExperience` is the numeric minimum years parsed from the job description text, and may be `0` when the posting doesn't state a number.\r\n\r\n**How do `searchQueries` and the other text filters interact?**\r\n`searchQueries` is the general keyword search hiring.cafe runs against the whole posting. `jobTitleQuery`, `jobDescriptionQuery`, `technologyKeywordsQuery`, and `requirementsKeywordsQuery` are additional, more targeted filters applied on top of that search.\r\n\r\n**Can I pull postings from one employer only?**\r\nYes, set `companyNames` to that employer's name (or use `companyKeywords` for a partial match). Use `excludedCompanyNames`/`excludedCompanyKeywords` to do the opposite.\r\n\r\n**Does `dateFetchedPastNDays` reflect the original posting date?**\r\nNo — it reflects when hiring.cafe's own index last fetched the listing, which is the freshness signal the source provides.\r\n\r\n**Are expired listings included?**\r\nhiring.cafe's active search only surfaces current postings, so `isExpired` is normally `false`; the field is kept in the output for completeness.\r\n\r\n**Is this affiliated with hiring.cafe?**\r\nNo. This actor is an independent tool that queries hiring.cafe's public job search and is not affiliated with or endorsed by hiring.cafe.\r\n",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Hiring Cafe Jobs",
          "fields": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Unique job ID"
              },
              "objectID": {
                "type": "string",
                "description": "Search index object ID"
              },
              "source": {
                "type": "string",
                "description": "Source ATS (greenhouse, lever, workable, successfactors, etc.)"
              },
              "boardToken": {
                "type": "string",
                "description": "Job board token"
              },
              "applyUrl": {
                "type": "string",
                "description": "Apply URL (redirects to original source)"
              },
              "title": {
                "type": "string",
                "description": "Job title"
              },
              "coreJobTitle": {
                "type": "string",
                "description": "Canonicalized core job title"
              },
              "category": {
                "type": "string",
                "description": "Job category (e.g., Engineering, Data, Marketing)"
              },
              "seniorityLevel": {
                "type": "string",
                "description": "Seniority (Entry, Mid, Senior, Director, Executive)"
              },
              "roleType": {
                "type": "string",
                "description": "Individual Contributor / People Manager"
              },
              "commitment": {
                "type": "string",
                "description": "Full Time / Part Time / Contract / etc."
              },
              "workplaceType": {
                "type": "string",
                "description": "Remote / Hybrid / Onsite"
              },
              "workplaceCountries": {
                "type": "array",
                "description": "Country codes"
              },
              "workplaceStates": {
                "type": "array",
                "description": "State / region names"
              },
              "workplaceCities": {
                "type": "array",
                "description": "City names"
              },
              "latitude": {
                "type": "number",
                "description": "Primary geolocation latitude"
              },
              "longitude": {
                "type": "number",
                "description": "Primary geolocation longitude"
              },
              "salaryMin": {
                "type": "number",
                "description": "Minimum salary (yearly, if disclosed)"
              },
              "salaryMax": {
                "type": "number",
                "description": "Maximum salary (yearly, if disclosed)"
              },
              "salaryCurrency": {
                "type": "string",
                "description": "Salary currency code"
              },
              "salaryFrequency": {
                "type": "string",
                "description": "Salary frequency (Yearly, Hourly, etc.)"
              },
              "technicalTools": {
                "type": "array",
                "description": "Technologies / tools mentioned"
              },
              "minYearsExperience": {
                "type": "integer",
                "description": "Minimum years of experience required (0 if not specified)"
              },
              "bachelorsDegreeRequirement": {
                "type": "string",
                "description": "Bachelor's degree requirement level"
              },
              "companyName": {
                "type": "string",
                "description": "Hiring company name"
              },
              "companyWebsite": {
                "type": "string",
                "description": "Company homepage URL"
              },
              "companyIndustries": {
                "type": "array",
                "description": "Company industry tags"
              },
              "companyEmployees": {
                "type": "string",
                "description": "Employee count (string since ranges used)"
              },
              "companyHqCountry": {
                "type": "string",
                "description": "Company HQ country code"
              },
              "isExpired": {
                "type": "boolean",
                "description": "Whether the listing is expired"
              },
              "scrapedAt": {
                "type": "string",
                "description": "ISO 8601 scrape timestamp"
              }
            }
          },
          "views": {
            "overview": {
              "title": "Overview",
              "transformation": {
                "fields": [
                  "title",
                  "companyName",
                  "workplaceType",
                  "seniorityLevel",
                  "commitment",
                  "salaryMin",
                  "salaryMax",
                  "applyUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "companyName": {
                    "label": "Company",
                    "format": "text"
                  },
                  "workplaceType": {
                    "label": "Workplace",
                    "format": "text"
                  },
                  "seniorityLevel": {
                    "label": "Seniority",
                    "format": "text"
                  },
                  "commitment": {
                    "label": "Commitment",
                    "format": "text"
                  },
                  "salaryMin": {
                    "label": "Min Salary",
                    "format": "number"
                  },
                  "salaryMax": {
                    "label": "Max Salary",
                    "format": "number"
                  },
                  "applyUrl": {
                    "label": "Apply",
                    "format": "link"
                  }
                }
              }
            },
            "detailed": {
              "title": "Detailed Results",
              "transformation": {
                "fields": [
                  "id",
                  "title",
                  "companyName",
                  "source",
                  "category",
                  "seniorityLevel",
                  "roleType",
                  "commitment",
                  "workplaceType",
                  "workplaceCountries",
                  "salaryMin",
                  "salaryMax",
                  "salaryCurrency",
                  "technicalTools",
                  "minYearsExperience",
                  "latitude",
                  "longitude",
                  "companyIndustries",
                  "companyHqCountry",
                  "applyUrl",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "id": {
                    "label": "ID",
                    "format": "text"
                  },
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "companyName": {
                    "label": "Company",
                    "format": "text"
                  },
                  "source": {
                    "label": "ATS",
                    "format": "text"
                  },
                  "category": {
                    "label": "Category",
                    "format": "text"
                  },
                  "seniorityLevel": {
                    "label": "Seniority",
                    "format": "text"
                  },
                  "roleType": {
                    "label": "Role Type",
                    "format": "text"
                  },
                  "commitment": {
                    "label": "Commitment",
                    "format": "text"
                  },
                  "workplaceType": {
                    "label": "Workplace",
                    "format": "text"
                  },
                  "workplaceCountries": {
                    "label": "Countries",
                    "format": "array"
                  },
                  "salaryMin": {
                    "label": "Min Salary",
                    "format": "number"
                  },
                  "salaryMax": {
                    "label": "Max Salary",
                    "format": "number"
                  },
                  "salaryCurrency": {
                    "label": "Currency",
                    "format": "text"
                  },
                  "technicalTools": {
                    "label": "Tools",
                    "format": "array"
                  },
                  "minYearsExperience": {
                    "label": "Min YoE",
                    "format": "number"
                  },
                  "latitude": {
                    "label": "Lat",
                    "format": "number"
                  },
                  "longitude": {
                    "label": "Lng",
                    "format": "number"
                  },
                  "companyIndustries": {
                    "label": "Industries",
                    "format": "array"
                  },
                  "companyHqCountry": {
                    "label": "HQ",
                    "format": "text"
                  },
                  "applyUrl": {
                    "label": "Apply",
                    "format": "link"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "1.0.2",
    "imageDigest": "ab1de8d1012fac1ee7c42c29eabdbc8e5627670889603b246a68319762f3eda6",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.08096777777777778
    }
  }
}