---
name: hiring-cafe-job-listings-and-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. Output fields: title, companyName, seniorityLevel, salaryMin, salaryMax and more, as JSON rows. Use it for requests like \"Hiring.cafe job listings scraper\", or a CSV/JSON export of public Hiring.cafe data."
---

# Hiring.cafe Job Listings & Salary Filter Scraper

Pull job postings aggregated by hiring.cafe and narrow them by salary range, seniority, workplace type, security clearance, required tech stack, and company.

- Actor: https://apify.com/nimbryxo-studio/hiring-cafe-job-listings-and-salary-filter-scraper (ID `nimbryxo-studio~hiring-cafe-job-listings-and-salary-filter-scraper`)
- n8n workflow for the same Actor: https://scraperfinder.com/n8n/hiring-cafe-job-listings-and-salary-filter-scraper/
- Example input: `references/example-input.json`
- Input schema: `references/input-schema.json`
- Output fields: `references/output-fields.json`

## When to use

Use this skill when the user wants:

- Hiring.cafe job listings scraper
- a repeatable export of public Hiring.cafe data as CSV or JSON

Do not use it for private, login-protected or paywalled data.

## What it returns

One JSON row per result. Columns from the Actor's dataset schema:

- `title`: Title
- `companyName`: Company
- `workplaceType`: Workplace
- `seniorityLevel`: Seniority
- `commitment`: Commitment
- `salaryMin`: Min Salary
- `salaryMax`: Max Salary
- `applyUrl`: Apply

All 31 declared fields: `references/output-fields.json`.

## Inputs

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `searchQueries` | array | no |  | Keywords to search on hiring.cafe (e.g., 'software engineer', 'data scientist'). Empty array or empty string returns unfiltered results. |
| `workplaceTypes` | array | no | ["Remote","Hybrid","Onsite"] | Filter by workplace type. Defaults to all three. |
| `locations` | array | no |  | 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}. |
| `jobTitleQuery` | string | no |  | Filter to jobs whose TITLE contains this phrase. More precise than the general search query. |
| `jobDescriptionQuery` | string | no |  | Filter to jobs whose DESCRIPTION contains this phrase. |
| `technologyKeywordsQuery` | string | no |  | Match against the parsed tech-stack tags (e.g. python, react, kubernetes). |
| `requirementsKeywordsQuery` | string | no |  | Match against parsed requirement bullets. |
| `companyNames` | array | no |  | Only return jobs from these companies. Empty = all companies. |
| `excludedCompanyNames` | array | no |  | Exclude jobs from these companies. |
| `companyKeywords` | array | no |  | Substring match on company name. |
| `excludedCompanyKeywords` | array | no |  | Substring match on company name; exclude these. |
| `industries` | array | no |  | Filter to companies in these industries. |
| `excludedIndustries` | array | no |  | Exclude companies in these industries. |
| `salaryCurrency` | string | no |  | Filter salary thresholds against this currency. Empty = any. |

12 more optional fields on the Actor's Input tab.

Example (`references/example-input.json`):

```json
{
  "searchQueries": [
    "software engineer"
  ],
  "maxItems": 25
}
```

The input passes the Actor's input schema (checked at every publish). First run: `maxItems` = 25, small enough for the 300-second sync wait; raise it once the rows look right.

## Run it

Set `APIFY_TOKEN`, then call the synchronous endpoint for small and medium runs (it waits up to 300 seconds):

```bash
curl -s -X POST "https://api.apify.com/v2/acts/nimbryxo-studio~hiring-cafe-job-listings-and-salary-filter-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d @references/example-input.json > output.json
```

Or with Node 18+: `node scripts/run.mjs [input.json]`.

For large runs, start an async run and read its dataset when it finishes:

```bash
RUN=$(curl -s -X POST "https://api.apify.com/v2/acts/nimbryxo-studio~hiring-cafe-job-listings-and-salary-filter-scraper/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d @references/example-input.json)
RUN_ID=$(echo "$RUN" | jq -r '.data.id'); DATASET=$(echo "$RUN" | jq -r '.data.defaultDatasetId')
curl -s "https://api.apify.com/v2/actor-runs/$RUN_ID?waitForFinish=60" -H "Authorization: Bearer $APIFY_TOKEN" | jq -r '.data.status'
curl -s "https://api.apify.com/v2/datasets/$DATASET/items?format=json" -H "Authorization: Bearer $APIFY_TOKEN" > output.json
```

## Cost and limits

- Apify bills the Actor's usage on your account; the Actor's Pricing tab shows the current price.
- Keep the limit in the input small for a first run.

## Guardrails

- Public data only. Do not pass cookies, sessions or private account data.
- Do not use the output for spam, harassment or unlawful discrimination.
- Check the target site's terms and local law before running at scale.
