# hiring.cafe Job Scraper (`boncross/hiring-cafe-jobs`) Actor

Scrape every job hiring.cafe lists for your filters. Paste a filter URL and get title, company, location, pay range, seniority, required degrees and tools, visa sponsorship and company size. Export to CSV, JSON or Excel, or schedule it.

- **URL**: https://apify.com/boncross/hiring-cafe-jobs.md
- **Developed by:** [BonCross API](https://apify.com/boncross) (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 $0.70 / 1,000 job-details

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## hiring.cafe Job Scraper

### What is hiring.cafe Job Scraper?

hiring.cafe gathers jobs from thousands of company career pages and reads each advert into structured fields: seniority, pay range, benefits, degree requirements, shifts, travel, the employer's size and funding. hiring.cafe Job Scraper hands you all of that, 92 fields a job, and lets you search with every filter the site has.

That last part is the reason to use it. The form has 87 filter fields, covering each control on hiring.cafe, so you can ask for "senior engineers at UK-headquartered companies of 51 to 200 people that sponsor visas" and get exactly those rows. If you'd rather set the search up on the site, paste its URL.

What backs that up:

- **Each filter was checked against the rows it returned.** On 5 October 2026, 40 of 40 rows matched for each choice tried, wherever the row has a column to check. Where it doesn't, the result was compared with the site's own count.
- **You read requirements and benefits as fields, not prose.** Four-day week, visa sponsorship, security clearance and years of experience are columns you can filter and count.
- **Pay is marked as published or not.** Pay figures appear only where the employer stated them: 127 of 196 rows in one measured run, and `isPayTransparent` tells you which.
- **Listings are quick.** Six searches of up to four pages returned 2,240 jobs in 34 seconds.

**BonCross Verified** means we tested this actor against the live site before release and kept the record:

- 103 of 103 live checks on its inputs and filters passed on 7 October 2026
- 1 search run the same day: 60 jobs, each with its advert text
- Charges matched the rows: 1 start, 1 search, 60 jobs

### How to scrape hiring.cafe jobs

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open [hiring.cafe Job Scraper](https://apify.com/boncross/hiring-cafe-jobs).
3. Enter a keyword or a job title, and a location if you want one. Or paste a search URL copied from hiring.cafe.
4. Add filters from any group: role, pay, benefits, qualifications, schedule, company.
5. Set how many pages you want from each search and press Start.
6. Download the results as Excel, CSV or JSON. The rows are wide, so choose your columns before a CSV export.

### What data can you extract from hiring.cafe?

| Field | Field |
|---|---|
| 💼 Job title, raw and normalised | 🏢 Employer |
| 📍 Location, cities, states, countries | Latitude and longitude |
| 🏠 Workplace type | Open to anywhere |
| 💷 Yearly pay from and to | Hourly pay from and to |
| Pay currency and frequency | Pay published by the employer |
| Seniority | Role type and commitment |
| Job category | Requirements summary |
| 🎓 Education requirements by level | Fields of study |
| 🧰 Technical tools | Language requirements |
| Licences and certifications | Minimum years of experience |
| Employer industries and activities | Employer size and founding year |
| 💰 Employer funding and parent | Employer website |
| Four-day week | Generous paid time off |
| Generous parental leave | Retirement plan |
| Tuition reimbursement | Relocation assistance |
| 🛂 Visa sponsorship | Military veterans welcome |
| Fair chance employer | 🔒 Security clearance |
| Driving licence required | Overnight work |
| Weekend or holiday availability | ✈️ Air and land travel |
| Physical demands and environment | 📅 Posted date |
| 🔗 Listing and apply links | 📄 Full advert text (optional) |
| The hiring organisation the site matched | 401(k) matching |
| Morning and evening shifts | Mostly sitting or standing |

### ⬇️ Input

Start with one of three things: a "Keyword", a "Job title query", or a search URL from the site. Keyword matches the whole listing (title, company and advert). Job title query matches titles only, so it finds fewer: for "nurse", 151,900 matching jobs against 319,400 for the keyword.

"Location" takes a city, state, region or country. A city covers 50 miles around it. A state or a country also includes roles open to anywhere in its country, as the site does.

Depth is in pages. "Max pages per search" defaults to 5 and goes to 50, and a page holds roughly 60 to 140 jobs. "Max rows in total" caps the run, with 0 for no ceiling.

**Paralegal roles**

```json
{
  "jobTitleQuery": "paralegal",
  "maxPagesPerSearch": 3
}
```

**Roles paying at least $80,000 where the employer published the pay**

```json
{
  "jobTitleQuery": "software engineer",
  "onlyPayTransparent": true,
  "minYearlyPay": 80000,
  "maxItems": 500
}
```

**Remote, full-time senior nursing roles in Texas**

```json
{
  "jobTitleQuery": "nurse",
  "location": "Texas",
  "workplaceTypes": ["Remote"],
  "commitmentTypes": ["Full Time"],
  "seniorityLevels": ["Senior Level"]
}
```

**Recently posted roles whose advert mentions a specialism, with the full advert**

```json
{
  "jobTitleQuery": "analyst",
  "jobDescriptionQuery": "litigation",
  "postedWithinDays": 7,
  "sortBy": "date",
  "fetchDetails": true
}
```

**Senior engineers at UK-headquartered companies of 51-200 people that sponsor visas**

```json
{
  "jobTitleQuery": "software engineer",
  "seniorityLevels": ["Senior Level"],
  "companyHqCountries": ["gb"],
  "companySizes": ["51-200"],
  "benefits": ["visa_sponsorship"]
}
```

**Night-shift nursing roles needing no licence, paying at least $40 an hour**

```json
{
  "jobTitleQuery": "nurse",
  "overnightShiftWork": ["Required"],
  "noLicenseRequired": true,
  "payPeriod": "Hourly",
  "minPay": 40
}
```

**A search copied from hiring.cafe**

```json
{
  "searchUrls": ["https://hiring.cafe/?searchState=%7B%22locations%22%3A%5B%5D%2C%22sortBy%22%3A%22date%22%2C%22jobTitleQuery%22%3A%22paralegal%22%7D"],
  "maxPagesPerSearch": 2
}
```

#### Pasted URLs and fields together

You can combine them. A filter field you set is applied on top of each pasted URL and replaces that filter in the URL. A field you leave empty keeps the URL's own setting. Keyword, Job title query, Location and Sort by come from the URL when you give one. "Posted within days", "Minimum yearly pay" and "Exclude expired listings" are checked on every row, pasted or not.

#### How the company filters match

Company filters match the organisation the site attributes the job to, which is on each row as `hiringOrganization`. It can differ from the `company` columns: a DeepMind role sits under Google. "Companies" also returns the companies the site relates to a name (Google brings Waymo and Verily). "Company keywords", "Requirements keywords" and the fields of study match related terms, as they do on the site.

#### All the filters, grouped as in the form

Leave a list empty and you keep everything. Leave a range bound empty and no limit applies. You won't need most of these on any one run.

**Filters and sorting**

| Input | Field | What it does |
|---|---|---|
| `postedWithinDays` | Posted within days | Keep only jobs posted within this many days, measured against the posting date on each row. 0 means any age. |
| `sortBy` | Sort by | `date` (newest first) or `relevance`. Used only when no Search URL is given. Default `date`. |
| `workplaceTypes` | Workplace type | Keep only these workplace types. |
| `commitmentTypes` | Commitment | Keep only these commitment types. |
| `seniorityLevels` | Seniority | Keep only these seniority levels. |
| `roleTypes` | Role type | Keep individual-contributor roles, people-manager roles, or both. |
| `departments` | Department | Keep jobs in these departments (the site's own job categories). |
| `minYearsExperience` | Years of experience: from | Keep jobs asking for at least this many years of experience (0-20). |
| `maxYearsExperience` | Years of experience: to | Keep jobs asking for at most this many years (0-20; 20 means 20 or more). |
| `requireYearsExperience` | Experience must be stated | Drop jobs that do not state the years of experience they need. |
| `minManagementYears` | Management experience: from | Keep jobs asking for at least this many years of management or leadership experience (0-20). |
| `maxManagementYears` | Management experience: to | Keep jobs asking for at most this many years of management experience (0-20; 20 means 20 or more). |
| `requireManagementYears` | Management experience must be stated | Drop jobs that do not state the management experience they need. |
| `applicationFormEase` | Application process | Keep jobs with an easy application, a lengthy one, or both. |
| `onlyHiddenJobs` | Only jobs the site hides | Return only the listings the site hides by default: suspected scams, offshore consulting shops, external recruiting agencies, staff augmentation, test postings and others. |
| `hiddenJobCategories` | Hidden kinds | With "Only jobs the site hides" on, return only these hidden kinds. |
| `excludeExpired` | Exclude expired listings | Drop listings the site has marked expired. Default on. |

**Title, company and description filters**

| Input | Field | What it does |
|---|---|---|
| `jobDescriptionQuery` | Job description query | Same query syntax as the job title query, matched against the advert text. |
| `technologyKeywordsQuery` | Technology keywords | Keep jobs that list these tools or technologies, e.g. python OR kubernetes. Related tools count, as on the site. |
| `requirementsKeywordsQuery` | Requirements keywords | Keep jobs whose requirements mention these words, e.g. phd. |
| `companyNames` | Companies | Keep only jobs at these employers, by name. |
| `excludedCompanyNames` | Exclude companies | Drop jobs at these employers. |

**Pay and benefits**

| Input | Field | What it does |
|---|---|---|
| `onlyPayTransparent` | Only listings that state pay | Keep only listings where the employer published a pay figure. |
| `minYearlyPay` | Minimum yearly pay | Drop listings whose stated yearly pay is below this. 0 keeps everything. |
| `payPeriod` | Pay per | The unit of the four pay bounds below: `Hourly`, `Daily`, `Weekly`, `Bi-Weekly`, `Monthly` or `Yearly`. |
| `minPay` | Pay at least | Keep jobs whose pay range reaches at least this (the top of the range), in the "Pay per" unit and the currency the listing states. |
| `minPayRangeStart` | Pay range starts at or above | Keep jobs whose lowest stated pay is at least this. |
| `maxPayRangeStart` | Pay range starts at or below | Keep jobs whose lowest stated pay is at most this. |
| `maxPayRangeEnd` | Pay range ends at or below | Keep jobs whose highest stated pay is at most this. |
| `payCurrency` | Listed currency | Keep jobs whose pay is stated in this currency. |
| `payFrequency` | Listed pay period | Keep jobs whose pay is stated per this period (as the advert states it, not converted). |
| `benefits` | Benefits and perks | Keep jobs whose advert mentions every one of these. |

**Qualifications**

| Input | Field | What it does |
|---|---|---|
| `associatesDegreeRequirements` | Associate's degree | Keep jobs whose associate's degree is stated as one of these. |
| `associatesDegreeFieldsOfStudy` | Associate's degree: fields of study | Keep jobs asking for an associate's degree in one of these fields, e.g. computer science or nursing. Related fields count. |
| `excludedAssociatesDegreeFieldsOfStudy` | Associate's degree: exclude fields of study | Drop jobs asking for an associate's degree in any of these fields. |
| `bachelorsDegreeRequirements` | Bachelor's degree | Keep jobs whose bachelor's degree is stated as one of these. |
| `bachelorsDegreeFieldsOfStudy` | Bachelor's degree: fields of study | Keep jobs asking for a bachelor's degree in one of these fields, e.g. computer science or nursing. Related fields count. |
| `excludedBachelorsDegreeFieldsOfStudy` | Bachelor's degree: exclude fields of study | Drop jobs asking for a bachelor's degree in any of these fields. |
| `mastersDegreeRequirements` | Master's degree | Keep jobs whose master's degree is stated as one of these. |
| `mastersDegreeFieldsOfStudy` | Master's degree: fields of study | Keep jobs asking for a master's degree in one of these fields, e.g. computer science or nursing. Related fields count. |
| `excludedMastersDegreeFieldsOfStudy` | Master's degree: exclude fields of study | Drop jobs asking for a master's degree in any of these fields. |
| `doctorateDegreeRequirements` | Doctorate degree | Keep jobs whose doctorate degree is stated as one of these. |
| `doctorateDegreeFieldsOfStudy` | Doctorate degree: fields of study | Keep jobs asking for a doctorate degree in one of these fields, e.g. computer science or nursing. Related fields count. |
| `excludedDoctorateDegreeFieldsOfStudy` | Doctorate degree: exclude fields of study | Drop jobs asking for a doctorate degree in any of these fields. |
| `licensesAndCertifications` | Licences and certifications | Keep jobs asking for one of these, e.g. CISSP or RN. Related credentials count. |
| `excludedLicensesAndCertifications` | Exclude licences and certifications | Drop jobs asking for any of these, written exactly as the site lists them (lower case, e.g. registered nurse (rn)). |
| `noLicenseRequired` | No licence or certification required | Keep only jobs that ask for no licence or certification. |
| `securityClearances` | Security clearance | Keep jobs needing one of these clearances. |
| `languageRequirements` | Languages | Keep jobs that ask for these languages. |
| `languageRequirementsOperator` | Languages: match | With several languages chosen: any of them, or all of them. |
| `excludeJobsWithAdditionalLanguages` | No other languages | With languages chosen, drop jobs that also ask for a language not chosen. |
| `excludedLanguageRequirements` | Exclude languages | Drop jobs that ask for any of these languages. |
| `encouragedToApply` | Encouraged to apply | Keep jobs that explicitly welcome these applicants. |

**Shifts, travel and working conditions**

| Input | Field | What it does |
|---|---|---|
| `morningShiftWork` | Morning / day shift | Keep jobs whose morning shift is stated as one of these. |
| `eveningShiftWork` | Evening / second shift | Keep jobs whose evening shift is stated as one of these. |
| `overnightShiftWork` | Overnight / third shift | Keep jobs whose overnight shift is stated as one of these. |
| `weekendAvailability` | Weekend availability | Keep jobs that require weekend work, or that do not mention it. |
| `holidayAvailability` | Holiday availability | Keep jobs that require holiday work, or that do not mention it. |
| `overtime` | Overtime | Keep jobs that require overtime, or that do not mention it. |
| `onCallRequirements` | On call | Keep jobs with one of these on-call requirements. |
| `airTravelRequirement` | Air travel | Keep jobs with one of these amounts of air travel. |
| `landTravelRequirement` | Land travel | Keep jobs with one of these amounts of driving or other land travel. |
| `physicalEnvironments` | Work environment | Keep jobs in one of these environments. |
| `physicalLaborIntensity` | Physical labour | Keep jobs with one of these levels of physical labour. |
| `physicalPositions` | Mostly sitting or standing | Keep jobs done mostly in one of these positions. |
| `oralCommunicationLevels` | Speaking with people | Keep jobs with one of these levels of spoken communication. |
| `computerUsageLevels` | Computer use | Keep jobs with one of these levels of computer use. |
| `cognitiveDemandLevels` | Mental demand | Keep jobs with one of these levels of cognitive demand. |

**Company**

| Input | Field | What it does |
|---|---|---|
| `companyHqCountries` | Company headquarters | Keep jobs at companies headquartered in these countries. |
| `excludedCompanyHqCountries` | Exclude company headquarters | Drop jobs at companies headquartered in these countries. |
| `industries` | Industries | Keep jobs at companies in these industries, as the site names them, e.g. Software & SaaS. |
| `excludedIndustries` | Exclude industries | Drop jobs at companies in these industries. |
| `companyKeywords` | Company keywords | Keep jobs at companies whose description matches these words, e.g. fintech or robotics. |
| `companyKeywordsOperator` | Company keywords: match | With several company keywords: any of them, or all of them. |
| `excludedCompanyKeywords` | Exclude company keywords | Drop jobs at companies whose description matches any of these. |
| `organizationTypes` | Organisation type | Keep jobs at these kinds of organisation. |
| `excludedOrganizationTypes` | Exclude organisation types | Drop jobs at these kinds of organisation. |
| `usaGovJobs` | US federal jobs | Listings from USAJobs.gov: only those (`exclusive`) or none of them (`exclude`). Empty includes them with the rest. |
| `companySizes` | Company size | Keep jobs at companies with this many employees. |
| `minYearFounded` | Founded in or after | Keep jobs at companies founded in or after this year. |
| `maxYearFounded` | Founded in or before | Keep jobs at companies founded in or before this year. |
| `latestInvestmentSeries` | Latest funding round | Keep jobs at companies whose latest funding round is one of these. |
| `excludedLatestInvestmentSeries` | Exclude latest funding rounds | Drop jobs at companies whose latest funding round is one of these. |
| `minLatestFundingYear` | Last raised in or after | Keep jobs at companies whose latest funding round was in or after this year. |
| `maxLatestFundingYear` | Last raised in or before | Keep jobs at companies whose latest funding round was in or before this year. |
| `minLatestFundingAmount` | Funding raised at least | Keep jobs at companies whose recorded funding raised is at least this amount (US dollars). |
| `investors` | Investors | Keep jobs at companies backed by these investors, e.g. Sequoia Capital. |
| `excludedInvestors` | Exclude investors | Drop jobs at companies backed by any of these investors. |

**What each row includes**

| Input | Field | What it does |
|---|---|---|
| `fetchDetails` | Fetch full job adverts | Open each job for its full advert text; the search alone returns only a short requirements summary. |
| `includeDescription` | Include advert text | Include the advert as plain text. Needs `fetchDetails`. Default on. |
| `includeDescriptionHtml` | Include advert HTML | Also include the advert's original HTML. Makes rows considerably larger. |

#### For developers

- The other input keys are `searchUrls`, `searchQuery` (Keyword), `jobTitleQuery`, `location`, `maxPagesPerSearch` and `maxItems`.
- When your filters keep nothing (a pay floor no advert reaches, for example), a search stops early: after 5 pages in a row with no job kept, or after about three times the pages the remaining row limit needs.
- `postedWithinDays` is measured against `postedAt` on each row. Asking for one day returns jobs posted in the last 24 hours. Jobs with no posting date are kept.
- A page that can't be read writes one row with `search`, `page` and `error`, and that search stops there.
- Past roughly 40 result pages in a run, hiring.cafe stops answering for a few minutes. Full adverts don't count toward that.
- A job filtered out before its advert is fetched isn't charged. A job fetched with its advert and then dropped as expired is billed `job-detail`.

### ⬆️ Output

You get one row per job, with 92 fields (94 with the advert text and HTML). The Overview view shows title, employer, location, pay and dates.

```json
{
  "id": "ashby___ramp___314d4881-e8f2-4e61-a102-3469f9566759",
  "title": "Senior Corporate Paralegal",
  "company": "Ramp",
  "url": "https://hiring.cafe/job/3sbeohz23zn2il74",
  "requisitionId": "3sbeohz23zn2il74",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/314d4881-e8f2-4e61-a102-3469f9566759",
  "location": "New York City or San Francisco",
  "workplaceType": "Hybrid",
  "seniority": "Senior Level",
  "commitment": ["Full Time"],
  "yearlyMinPay": 185000,
  "yearlyMaxPay": 250000,
  "payCurrency": "USD",
  "payFrequency": "Yearly",
  "isPayTransparent": true,
  "companyIndustries": ["Software & SaaS", "Payments & Fintech"],
  "companyEmployees": 2555,
  "requirementsSummary": "6+ years corporate paralegal experience at a major law firm or in-house…",
  "technicalTools": ["Shareworks"],
  "visaSponsorship": false,
  "retirementPlan": true,
  "securityClearance": "None",
  "postedAt": "2026-09-26T12:16:55.392Z",
  "search": "paralegal",
  "scrapedAt": "2026-09-26T17:16:43.438Z"
}
```

Here's every column by name. The requirement, benefit and work-pattern columns are hiring.cafe's own reading of the advert, returned as the site gives them.

| Group | Columns |
|---|---|
| The job | `titleRaw` (as the employer wrote it), `coreTitle`, `jobCategory`, `roleType`, `roleActivities`, `requisitionId`, `isExpired` |
| Where | `cities`, `states`, `countries`, `lat`, `lng`, `isWorldwideOk` |
| Pay | `hourlyMinPay`, `hourlyMaxPay` (beside the yearly figures) |
| Education | `associatesRequirement`, `associatesFields`, `bachelorsRequirement`, `bachelorsFields`, `mastersRequirement`, `mastersFields`, `doctorateRequirement`, `doctorateFields`, `isHighSchoolRequired` |
| Experience and skills | `minYearsExperience`, `minManagementYears`, `languageRequirements`, `licencesOrCertifications` |
| Conditions | `securityClearance`, `isDriverLicenceRequired`, `airTravelRequirement`, `landTravelRequirement`, `onCallRequirement`, `morningShiftWork`, `eveningShiftWork`, `overnightWork`, `overtimeRequired`, `weekendAvailabilityRequired`, `holidayAvailabilityRequired` |
| The work itself | `physicalEnvironment`, `physicalLabourIntensity`, `physicalPosition`, `oralCommunication`, `cognitiveDemand`, `computerUsage` |
| Benefits | `matching401k`, `fourDayWorkWeek`, `generousPaidTimeOff`, `generousParentalLeave`, `tuitionReimbursement`, `relocationAssistance`, `visaSponsorship`, `militaryVeterans`, `fairChance` |
| The employer | `companyTagline`, `companyActivities`, `companyType`, `companyCountry`, `companyFounded`, `companyWebsite`, `companyParent`, `companyStockSymbol`, `companyLatestFundingAmount`, `companyLatestFundingType`, `companyLatestFundingYear`, `companyInvestors`, `employerType` |
| The hiring organisation | `hiringOrganization`: the organisation the site attributes the job to and that its company filters match: `name`, `website`, `hqCountry`, `organizationType`, `employees`, `yearFounded`, `industries`, `activities`, `parentCompany`, `latestFundingType`, `latestFundingYear`, `totalFundingRaised`, `leadInvestors`, `stockSymbol` |
| Where it came from | `source` (the careers platform the job was published on), `boardToken`, `search` |
| The advert (optional) | `description`, `descriptionHtml`, and `detailError` when an advert could not be fetched |

### How much does it cost to scrape hiring.cafe?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.002 | $0.002 | $0.002 | $0.002 |
| `search-run`, per search the run starts | $0 | $0 | $0 | $0 |
| `job-detail`, per job written with its full advert, or fetched with its advert and then dropped as expired | $0.001 | $0.0009 | $0.0008 | $0.0007 |
| `job-listed`, per job row written without the advert (adverts off, or an advert that could not be fetched) | $0.0005 | $0.00045 | $0.0004 | $0.00035 |

Enterprise plans pay the Business price.

**$1.00 per 1,000 jobs with the full advert** on the Free plan, $0.70 on Business. Listing-only rows are $0.50 per 1,000 on the Free plan and $0.35 on Business. A job is billed as one or the other, never both, and proxy usage and platform usage are included.

- Two pages with full adverts for 80 jobs: $0.002 + 80 × $0.001 = **$0.082** ($0.058 on Business).
- Four searches of up to three pages, listings only, 1,064 jobs: $0.002 + 1,064 × $0.0005 = **$0.534** ($0.374 on Business).

Error rows are never charged.

The structured fields are already in the listing row. Unless you need the advert's wording, we'd leave "Fetch full job adverts" off: it's half the price and far faster.

Apify's Free plan includes $5 of credits each month. That's about 9,900 listing-only jobs, or about 4,900 with the full advert.

### How deep can a run go, and how fast?

Whole runs on Apify, 2 to 7 October 2026:

| Run | Jobs returned | Time |
|---|---|---|
| 1 page | 65 to 139 | 2 to 5 seconds |
| 4 searches × up to 3 pages | 474 | 9 seconds |
| 1 page, full adverts for 60 jobs | 60 | 35 seconds |
| 2 pages, full adverts for 80 jobs | 80 | 46 seconds |
| 4 searches × up to 3 pages, listings only | 1,064 | 17 seconds |
| 6 searches × up to 4 pages, listings only | 2,240 | 34 seconds |
| 10 searches × up to 5 pages, listings only | 4,142 (43 of 50 pages) | 3 minutes 24 seconds |

One of our searches reported 3,890 matching jobs, so what limits you is the page count you set. Rows average 3.3 KB without the advert, and adverts ran from 1,298 to 20,673 characters.

On a 196-row run, 63 fields were filled on every row, including title, employer, location, workplace type, seniority, pay currency, all the benefit flags and the requirements summary. Pay figures were on 127 of 196, exactly the rows whose employer published pay. Coordinates were on 188 and the employer's founding year on 183. The thinnest fields are the employer funding details (28 to 40), the stock symbol (18) and minimum management years (2).

### Limits worth planning around

- **About 40 result pages a run.** Beyond that hiring.cafe stops answering for a few minutes. A search it refused ends with a row that has `error`, and the rows you already have are kept. Measured: 10 searches × 5 pages returned 43 of 50 pages (4,142 jobs). For more, split your searches across runs a few minutes apart.
- **Full adverts add about half a second per job**, or roughly 120 adverts a minute (80 adverts took 46 seconds).
- **A search with no location isn't limited to a place.** A place that can't be found ends that search with an `error` row. It doesn't fall back to a worldwide search.
- **Search URLs must be copied from hiring.cafe.** One written by hand, especially with a location in it, may return unfiltered results.
- **An advert that can't be read still returns the job**, without its description and billed at the listing price. The row keeps its listing fields and has `detailError`.
- **Thin fields.** Employer funding, parent company, stock symbol and fields of study are present on a minority of rows, and minimum management years is almost always empty. Most employers leave them blank.
- **Some adverts end in an ellipsis** because the employer's own feed shortened them.
- **No applications.** The actor can't submit one.

### FAQ

#### What's the difference between the three search boxes?

"Keyword" matches the whole listing. "Job title query" matches the title. "Job description query" matches what the advert says, which is how you find roles with a generic title and a specialism in the text.

#### Why does a company filter return a job whose company is different?

The filter matches `hiringOrganization`, the organisation the site attributes the job to. On about one job in seven that differs from the `company` columns, for example a DeepMind role listed under Google.

#### Does "Only jobs the site hides" add them to my results?

It returns only those. hiring.cafe leaves out suspected scams, offshore consulting shops, recruiting agencies, staff augmentation and test postings by default. This option gives you just that set, so you can review it separately.

#### Why do some yes-or-no fields contain words?

That's how the source records them. A degree field may say "Not Mentioned", and a security clearance "None". "Not Mentioned" isn't the same as the employer saying no degree is needed, so the wording is kept.

#### Why is the pay empty on some jobs?

Those employers didn't publish it. Turn on "Only listings that state pay" to drop them.

#### Can I paste a search I built on the site?

Copy the URL from your browser's address bar into "Search URLs". All the site's filters travel with it, and any filter fields you set here are applied on top.

#### Do I need a proxy or a hiring.cafe account?

Nothing to configure and nothing to log in to. Any proxy usage is included in the price.

#### Is scraping hiring.cafe legal?

The listings are published openly and the actor reads them without an account. Reading openly published data is generally lawful in the UK and the EU. You're responsible for what you do with it, including under UK GDPR where a record identifies a person.

### Using it from your own tools

With this many columns, most people send the rows to a database or a warehouse: Airbyte and webhooks handle that, and Google Sheets works if you pick your columns first. Schedule the run in Apify Console to keep a board or a pay benchmark current.

From code, Apify's run-sync-get-dataset-items endpoint runs the actor and returns the rows in one request. `apify-client` exists for Python and JavaScript, and the API tab on the actor page shows the calls with your token in place.

AI agents get it as a tool through the Apify MCP server (`https://mcp.apify.com`). The structured fields suit them: an agent can ask for remote roles with a four-day week and compare the published pay without reading a single advert.

### More from BonCross

- [Indeed Job Scraper](https://apify.com/boncross/indeed-jobs): Indeed job listings for a role and location.
- [Lever Jobs Scraper](https://apify.com/boncross/lever-jobs): A Lever careers board for every open job.
- [LinkedIn Jobs Scraper](https://apify.com/boncross/linkedin-jobs-scraper): LinkedIn jobs from keywords and locations or search URLs, no login needed.
- [NHS Jobs Scraper](https://apify.com/boncross/nhs-jobs): NHS Jobs vacancies by keyword and location.
- [Reed.co.uk Jobs Scraper](https://apify.com/boncross/reed-jobs-scraper): Reed.co.uk jobs by keyword and location with Reed's own filters: salary, contract,…
- [UK Government & NHS Jobs Scraper](https://apify.com/boncross/uk-public-sector-jobs): NHS Jobs, Civil Service Jobs (every department) and Ministry of Justice vacancies in…

### Your feedback

If a filter returns a row that shouldn't be there, that's the report we most want. Send the input and the row's `id` through the Issues tab in Apify Console. BonCross reads every issue.

# Changelog

This Actor's version history is a separate document: https://apify.com/boncross/hiring-cafe-jobs/changelog.md

# Actor input Schema

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

Paste the URL from the hiring.cafe filter page, with all its filters applied. Every filter the site offers is carried over exactly. Any filter field you also set below is applied on top, replacing that filter in the URL; Keyword, Job title query, Location and Sort by are taken from the URL.

## `searchQuery` (type: `string`):

Used only when no Search URL is given. Matched against the whole listing (title, company and advert), so it finds more than a title search. Combine with a job title query to narrow it.

## `jobTitleQuery` (type: `string`):

Used only when no Search URL is given. Matched against job titles. Supports the site's own query syntax, e.g. paralegal OR "legal assistant" NOT intern.

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

Used only when no Search URL is given. A city, state, region or country, e.g. Austin, TX or Texas or London. The best-matching place is used and named in the run log. A city covers 50 miles around it; a state or country also includes roles open anywhere in its country, as the site does. Leave empty for every location.

## `maxPagesPerSearch` (type: `integer`):

Each page returns roughly 60 to 140 listings.

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

A ceiling for the whole run. 0 means no ceiling.

## `postedWithinDays` (type: `integer`):

Keep only jobs posted within this many days, measured against the posting date on each row. 0 means any age. Applies to pasted Search URLs as well as title searches.

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

Used only when no Search URL is given.

## `workplaceTypes` (type: `array`):

Keep only these workplace types. Empty means all.

## `commitmentTypes` (type: `array`):

Keep only these commitment types. Empty means all.

## `seniorityLevels` (type: `array`):

Keep only these seniority levels. Empty means all.

## `roleTypes` (type: `array`):

Keep individual-contributor roles, people-manager roles, or both. Empty means all.

## `departments` (type: `array`):

Keep jobs in these departments (the site's own job categories). Empty means all.

## `minYearsExperience` (type: `integer`):

Keep jobs asking for at least this many years of experience (0-20). Jobs that do not state a figure are kept unless "Experience must be stated" is on.

## `maxYearsExperience` (type: `integer`):

Keep jobs asking for at most this many years (0-20; 20 means 20 or more).

## `requireYearsExperience` (type: `boolean`):

Drop jobs that do not state the years of experience they need. Applies when a years range is set.

## `minManagementYears` (type: `integer`):

Keep jobs asking for at least this many years of management or leadership experience (0-20). Jobs that do not state it are kept unless "Management experience must be stated" is on.

## `maxManagementYears` (type: `integer`):

Keep jobs asking for at most this many years of management experience (0-20; 20 means 20 or more).

## `requireManagementYears` (type: `boolean`):

Drop jobs that do not state the management experience they need. Applies when a management range is set.

## `applicationFormEase` (type: `array`):

Keep jobs with an easy application, a lengthy one, or both. Empty means all.

## `onlyHiddenJobs` (type: `boolean`):

Return only the listings the site hides by default: suspected scams, offshore consulting shops, external recruiting agencies, staff augmentation, test postings and others. Off returns the normal results, which leave them out.

## `hiddenJobCategories` (type: `array`):

With "Only jobs the site hides" on, return only these hidden kinds. Empty means every kind.

## `excludeExpired` (type: `boolean`):

Drop listings the site has marked expired.

## `jobDescriptionQuery` (type: `string`):

Same syntax, matched against the description.

## `technologyKeywordsQuery` (type: `string`):

Keep jobs that list these tools or technologies, e.g. python OR kubernetes. Same query syntax as the title query. Related tools count, as on the site (excel also finds spreadsheets).

## `requirementsKeywordsQuery` (type: `string`):

Keep jobs whose requirements mention these words, e.g. phd. Same query syntax.

## `companyNames` (type: `array`):

Keep only jobs at these employers, by name. The site includes the companies it relates to each one: Google also returns Waymo, Verily and Wiz.

## `excludedCompanyNames` (type: `array`):

Drop jobs at these employers.

## `companyHqCountries` (type: `array`):

Keep jobs at companies headquartered in these countries.

## `excludedCompanyHqCountries` (type: `array`):

Drop jobs at companies headquartered in these countries.

## `industries` (type: `array`):

Keep jobs at companies in these industries, as the site names them, e.g. Software & SaaS or Hospitals & Health Systems.

## `excludedIndustries` (type: `array`):

Drop jobs at companies in these industries.

## `companyKeywords` (type: `array`):

Keep jobs at companies whose description matches these words, e.g. fintech or robotics.

## `companyKeywordsOperator` (type: `string`):

With several company keywords: any of them, or all of them.

## `excludedCompanyKeywords` (type: `array`):

Drop jobs at companies whose description matches any of these.

## `organizationTypes` (type: `array`):

Keep jobs at these kinds of organisation.

## `excludedOrganizationTypes` (type: `array`):

Drop jobs at these kinds of organisation.

## `usaGovJobs` (type: `string`):

Listings from USAJobs.gov: only those, or none of them. Empty includes them with the rest.

## `companySizes` (type: `array`):

Keep jobs at companies with this many employees.

## `minYearFounded` (type: `integer`):

Keep jobs at companies founded in or after this year.

## `maxYearFounded` (type: `integer`):

Keep jobs at companies founded in or before this year.

## `latestInvestmentSeries` (type: `array`):

Keep jobs at companies whose latest funding round is one of these.

## `excludedLatestInvestmentSeries` (type: `array`):

Drop jobs at companies whose latest funding round is one of these.

## `minLatestFundingYear` (type: `integer`):

Keep jobs at companies whose latest funding round was in or after this year.

## `maxLatestFundingYear` (type: `integer`):

Keep jobs at companies whose latest funding round was in or before this year.

## `minLatestFundingAmount` (type: `integer`):

Keep jobs at companies whose recorded funding raised is at least this amount (US dollars).

## `investors` (type: `array`):

Keep jobs at companies backed by these investors, e.g. Sequoia Capital.

## `excludedInvestors` (type: `array`):

Drop jobs at companies backed by any of these investors.

## `onlyPayTransparent` (type: `boolean`):

Keep only listings where the employer published a pay figure.

## `minYearlyPay` (type: `integer`):

Drop listings whose stated yearly pay is below this. 0 keeps everything, including listings with no pay stated.

## `payPeriod` (type: `string`):

The unit of the four pay bounds below. The site converts every listing to it.

## `minPay` (type: `integer`):

Keep jobs whose pay range reaches at least this (the top of the range), in the "Pay per" unit and the currency the listing states.

## `minPayRangeStart` (type: `integer`):

Keep jobs whose lowest stated pay is at least this.

## `maxPayRangeStart` (type: `integer`):

Keep jobs whose lowest stated pay is at most this.

## `maxPayRangeEnd` (type: `integer`):

Keep jobs whose highest stated pay is at most this.

## `payCurrency` (type: `string`):

Keep jobs whose pay is stated in this currency.

## `payFrequency` (type: `string`):

Keep jobs whose pay is stated per this period (as the advert states it, not converted).

## `benefits` (type: `array`):

Keep jobs whose advert mentions every one of these.

## `associatesDegreeRequirements` (type: `array`):

Keep jobs whose associate's degree is stated as one of these. "Not mentioned" means the advert does not ask for one.

## `associatesDegreeFieldsOfStudy` (type: `array`):

Keep jobs asking for a associate's degree in one of these fields, e.g. computer science or nursing. Related fields count, as on the site.

## `excludedAssociatesDegreeFieldsOfStudy` (type: `array`):

Drop jobs asking for a associate's degree in any of these fields.

## `bachelorsDegreeRequirements` (type: `array`):

Keep jobs whose bachelor's degree is stated as one of these. "Not mentioned" means the advert does not ask for one.

## `bachelorsDegreeFieldsOfStudy` (type: `array`):

Keep jobs asking for a bachelor's degree in one of these fields, e.g. computer science or nursing. Related fields count, as on the site.

## `excludedBachelorsDegreeFieldsOfStudy` (type: `array`):

Drop jobs asking for a bachelor's degree in any of these fields.

## `mastersDegreeRequirements` (type: `array`):

Keep jobs whose master's degree is stated as one of these. "Not mentioned" means the advert does not ask for one.

## `mastersDegreeFieldsOfStudy` (type: `array`):

Keep jobs asking for a master's degree in one of these fields, e.g. computer science or nursing. Related fields count, as on the site.

## `excludedMastersDegreeFieldsOfStudy` (type: `array`):

Drop jobs asking for a master's degree in any of these fields.

## `doctorateDegreeRequirements` (type: `array`):

Keep jobs whose doctorate degree is stated as one of these. "Not mentioned" means the advert does not ask for one.

## `doctorateDegreeFieldsOfStudy` (type: `array`):

Keep jobs asking for a doctorate degree in one of these fields, e.g. computer science or nursing. Related fields count, as on the site.

## `excludedDoctorateDegreeFieldsOfStudy` (type: `array`):

Drop jobs asking for a doctorate degree in any of these fields.

## `licensesAndCertifications` (type: `array`):

Keep jobs asking for one of these, e.g. CISSP or RN. Related credentials count, as on the site.

## `excludedLicensesAndCertifications` (type: `array`):

Drop jobs asking for any of these, written exactly as the site lists them (lower case, e.g. registered nurse (rn)).

## `noLicenseRequired` (type: `boolean`):

Keep only jobs that ask for no licence or certification. Overrides the two licence fields above.

## `securityClearances` (type: `array`):

Keep jobs needing one of these clearances. Empty means all.

## `languageRequirements` (type: `array`):

Keep jobs that ask for these languages.

## `languageRequirementsOperator` (type: `string`):

With several languages chosen: any of them, or all of them.

## `excludeJobsWithAdditionalLanguages` (type: `boolean`):

With languages chosen, drop jobs that also ask for a language not chosen.

## `excludedLanguageRequirements` (type: `array`):

Drop jobs that ask for any of these languages.

## `encouragedToApply` (type: `array`):

Keep jobs that explicitly welcome these applicants.

## `morningShiftWork` (type: `array`):

Keep jobs whose morning shift is stated as one of these.

## `eveningShiftWork` (type: `array`):

Keep jobs whose evening shift is stated as one of these.

## `overnightShiftWork` (type: `array`):

Keep jobs whose overnight shift is stated as one of these.

## `weekendAvailability` (type: `string`):

Keep jobs that require weekend work, or that do not mention it. Empty means either.

## `holidayAvailability` (type: `string`):

Keep jobs that require holiday work, or that do not mention it. Empty means either.

## `overtime` (type: `string`):

Keep jobs that require overtime, or that do not mention it. Empty means either.

## `onCallRequirements` (type: `array`):

Keep jobs with one of these on-call requirements.

## `airTravelRequirement` (type: `array`):

Keep jobs with one of these amounts of air travel.

## `landTravelRequirement` (type: `array`):

Keep jobs with one of these amounts of driving or other land travel.

## `physicalEnvironments` (type: `array`):

Keep jobs in one of these environments.

## `physicalLaborIntensity` (type: `array`):

Keep jobs with one of these levels of physical labour.

## `physicalPositions` (type: `array`):

Keep jobs done mostly in one of these positions.

## `oralCommunicationLevels` (type: `array`):

Keep jobs with one of these levels of spoken communication.

## `computerUsageLevels` (type: `array`):

Keep jobs with one of these levels of computer use.

## `cognitiveDemandLevels` (type: `array`):

Keep jobs with one of these levels of cognitive demand.

## `fetchDetails` (type: `boolean`):

Open each job for its full advert text. The search itself returns only a short requirements summary, so this is how you get the whole description. One extra request per job, about 120 adverts a minute. An advert that cannot be read is still returned, without its text and billed as a listing.

## `includeDescription` (type: `boolean`):

Include the advert as plain text. Needs "Fetch full job adverts".

## `includeDescriptionHtml` (type: `boolean`):

Also include the advert's original HTML. Makes rows considerably larger.

## Actor input object example

```json
{
  "searchUrls": [],
  "searchQuery": "nurse",
  "jobTitleQuery": "paralegal",
  "location": "Austin, TX",
  "maxPagesPerSearch": 5,
  "maxItems": 0,
  "postedWithinDays": 0,
  "sortBy": "date",
  "workplaceTypes": [],
  "commitmentTypes": [],
  "seniorityLevels": [],
  "roleTypes": [],
  "departments": [],
  "requireYearsExperience": false,
  "requireManagementYears": false,
  "applicationFormEase": [],
  "onlyHiddenJobs": false,
  "hiddenJobCategories": [],
  "excludeExpired": true,
  "jobDescriptionQuery": "",
  "technologyKeywordsQuery": "kubernetes",
  "requirementsKeywordsQuery": "phd",
  "companyNames": [
    "Google"
  ],
  "excludedCompanyNames": [],
  "companyHqCountries": [],
  "excludedCompanyHqCountries": [],
  "industries": [
    "Software & SaaS"
  ],
  "excludedIndustries": [],
  "companyKeywords": [],
  "excludedCompanyKeywords": [],
  "organizationTypes": [],
  "excludedOrganizationTypes": [],
  "companySizes": [],
  "latestInvestmentSeries": [],
  "excludedLatestInvestmentSeries": [],
  "investors": [],
  "excludedInvestors": [],
  "onlyPayTransparent": false,
  "minYearlyPay": 0,
  "benefits": [],
  "associatesDegreeRequirements": [],
  "associatesDegreeFieldsOfStudy": [],
  "excludedAssociatesDegreeFieldsOfStudy": [],
  "bachelorsDegreeRequirements": [],
  "bachelorsDegreeFieldsOfStudy": [],
  "excludedBachelorsDegreeFieldsOfStudy": [],
  "mastersDegreeRequirements": [],
  "mastersDegreeFieldsOfStudy": [],
  "excludedMastersDegreeFieldsOfStudy": [],
  "doctorateDegreeRequirements": [],
  "doctorateDegreeFieldsOfStudy": [],
  "excludedDoctorateDegreeFieldsOfStudy": [],
  "licensesAndCertifications": [],
  "excludedLicensesAndCertifications": [],
  "noLicenseRequired": false,
  "securityClearances": [],
  "languageRequirements": [],
  "excludeJobsWithAdditionalLanguages": false,
  "excludedLanguageRequirements": [],
  "encouragedToApply": [],
  "morningShiftWork": [],
  "eveningShiftWork": [],
  "overnightShiftWork": [],
  "onCallRequirements": [],
  "airTravelRequirement": [],
  "landTravelRequirement": [],
  "physicalEnvironments": [],
  "physicalLaborIntensity": [],
  "physicalPositions": [],
  "oralCommunicationLevels": [],
  "computerUsageLevels": [],
  "cognitiveDemandLevels": [],
  "fetchDetails": false,
  "includeDescription": true,
  "includeDescriptionHtml": false
}
```

# Actor output Schema

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

hiring.cafe jobs — every row the run returned.

## `stats` (type: `string`):

Counts for the run: what was searched, fetched, filtered and returned.

# 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 = {
    "searchQuery": "nurse"
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/hiring-cafe-jobs").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 = { "searchQuery": "nurse" }

# Run the Actor and wait for it to finish
run = client.actor("boncross/hiring-cafe-jobs").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 '{
  "searchQuery": "nurse"
}' |
apify call boncross/hiring-cafe-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,boncross/hiring-cafe-jobs"
        }
    }
}
```

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/TbdPJTArJoTWnetxT/builds/dt87jQUZHwkI7n7VG/openapi.json
