# HiringCafe Jobs Scraper (`brii3343/hiringcafe-jobs-scraper`) Actor

Scrape HiringCafe jobs by keyword, city, country, company or pay (min and max), or from a search link: title, company, location, pay range, seniority, apply link. Pay per result: $0.70 per 1,000 jobs, no login.

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

## Pricing

from $0.60 / 1,000 jobs

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

### HiringCafe Jobs Scraper — Jobs by keyword, city, country or pay (2026)

Get HiringCafe jobs as data from **search queries or hiringcafe search urls**: id, title, company, location, workplace, countries, states, cities, other locations, commitment. No browser, no login and no HiringCafe account needed. You pay only for the jobs you get, **$0.70 per 1,000 jobs** (less on higher Apify plans).

HiringCafe (hiring.cafe) is a job search site that collects openings from company career pages and adds its own summary, pay and requirements data. Recruiters, job-market analysts and job-board builders use it to get fresh openings in one clean table.

### Why use this HiringCafe scraper

- **Reliable, measured on the cloud**: 36 runs out of 36 succeeded in our tests of October 20, 2026 (12 inputs, each run 3 times, 1,563 jobs, no duplicates).
- **Complete rows**: id, title, company, location, workplace, countries filled on 100% of the jobs in those runs.
- **Fast**: the example input gives 100 jobs in about 2.5-3.5 seconds.
- **All the jobs of a company**: write `Google`, `Stripe` or `google.com` in `companyNames` and the scraper reads that company's own page on HiringCafe, page after page (HiringCafe's normal search shows about 7 Google jobs for it, because it returns one page of mixed companies). In our runs of October 20, 2026 one run returned 100 Google jobs and 60 Stripe jobs in 2-5 seconds, all from that company and in the chosen country.
- **Search by place in plain words**: write `Austin, TX`, `Bangalore`, `UK` or `Remote` in `location` (and a radius in miles for a city). In our runs of October 20, 2026 this gave only jobs in the place asked on every run (Austin 40 of 40, Bengaluru 20 of 20, remote 30 of 30, Rome 20 of 20, 3 runs each). A place HiringCafe does not know gives one free status row that says so, never a silent empty run.
- **You pay only for jobs.** Searches with no results, wrong links and refused pages are free status rows. Duplicates are removed and not charged.

### How to use HiringCafe Jobs Scraper

1. Fill in **Search queries** (`searchQueries`) or **HiringCafe search URLs** (`startUrls`).
2. Set **Max jobs per search or URL** (`maxItemsPerSource`, default 100) and **Max jobs in total** (`maxItems`, default 0).
3. Click **Start**. The example input takes about 2.5-3.5 seconds.
4. Download the results as JSON, CSV, Excel or HTML, or read them through the Apify API.
5. To follow it over time, save the input as a task and **schedule** it. There is no "new jobs only" switch yet: keep the `id` of the jobs you already have and skip them when you merge the new dataset.

### Input

| Field | Description |
|---|---|
| Search queries (`searchQueries`) | Job titles or keywords as you would type them on HiringCafe, one per line, for example `python developer`, `registered nurse` or `data analyst`. Each query is one search in the chosen country, read page by page. |
| HiringCafe search URLs (`startUrls`) | HiringCafe search links with every filter you set on the site (city, radius, salary, company, industry...): set the filters on hiring.cafe, then copy the address bar, for example `https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22nurse%22%7D`. The country and filters below do not change these links. |
| Country (`country`) | Country of the site to read: it decides prices, currency and which results appear. Default `"US"`. |
| City, state or country (`location`) | Optional place to search, for search queries. A city (`Austin`, `Austin, TX`, `Bangalore`, `London, UK`), a state or a country name or code (`UK`, `Germany`). `Remote` keeps only remote jobs. A place HiringCafe does not know gives one free error row. Empty = the country above. |
| City radius (miles) (`radiusMiles`) | Only with a city in the field above: include jobs within this many miles of the city. 0 or empty = only jobs in the city itself. |
| Minimum yearly pay (`minSalary`) | Only jobs that publish a pay of at least this much per year, (for search queries), compared with the yearly pay HiringCafe shows in `yearlySalaryMin`. Jobs that do not publish a pay are left out. Empty = no limit. |
| Maximum yearly pay (`maxSalary`) | Only jobs that publish a pay whose top end is at most this much per year (for search queries), compared with `yearlySalaryMax`. Jobs that do not publish a pay are left out. Empty = no limit. In our runs of October 20, 2026 every returned job had `yearlySalaryMax` at or below the limit (210 of 210 jobs in 3 searches, 3 runs each). |
| Company names (`companyNames`) | Only jobs from these companies (for search queries), for example `Stripe` or `Google`, or the company website such as `google.com`. HiringCafe's own search shows only one page of mixed companies for a company filter (about 7 Google jobs), so the scraper reads the company's page on HiringCafe instead, 25 jobs per page, and applies your search words, workplace, commitment, seniority and pay filters to those jobs. The country (set `country` for a country outside the United States) and the city (matched on the city name, so `New York` finds both "New York City" and "New York" jobs) apply to these jobs too. The Actor reads the company page to its end, so a small country or city takes longer: Google in Japan (59 jobs) took about 10 seconds. Subsidiaries listed on that page come too (Google DeepMind for Google). With several companies the maximum per search is shared equally among the companies HiringCafe knows. A company HiringCafe does not know gives one free `no_results` row that names it, also when you ask for it together with a known one. In our runs of October 20, 2026 the search `engineer` for Google returned 100 jobs per run (97 Google, 3 Google DeepMind, all in the chosen country), Stripe 60 per run, and `Meta` plus `Google` (written in capitals, case does not matter) 15 jobs each; every job came from the company asked. In the same runs Google in New York gave 60 jobs, Google in Japan 59 of the 59 on the site, in Switzerland 38 of 39, in Canada 29. Empty = all companies. |
| Workplace (`workplaceTypes`) | Only jobs with these workplace types (for search queries). Empty = all. |
| Commitment (`commitmentTypes`) | Only jobs with these commitments (for search queries). Empty = all. |
| Seniority (`seniorityLevel`) | Only jobs at these levels (for search queries). Empty = all. |
| Only jobs with a published salary (`onlyWithSalary`) | Only jobs whose employer published the pay range (for search queries). Default `false`. |
| Max jobs per search or URL (`maxItemsPerSource`) | Jobs to save for each search query and each URL. 0 = everything the search shows (HiringCafe shows up to 250 pages per search). Default `100`. |
| Max jobs in total (`maxItems`) | Stop after this many jobs in the whole run. 0 = no limit. Default `0`. |
| Proxy (`proxyConfiguration`) | Not needed: the scraper connects directly and switches to Apify Proxy by itself only when HiringCafe blocks it. Set a proxy here only to force one. Default `{"useApifyProxy":false}`. |

Example input (100 jobs in 2.5-3.5 seconds in our runs of October 20, 2026):

```json
{
  "searchQueries": [
    "python developer"
  ],
  "startUrls": [
    {
      "url": "https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22nurse%22%2C%22workplaceTypes%22%3A%5B%22Remote%22%5D%7D"
    }
  ],
  "maxItemsPerSource": 50
}
```

### Output example

One row per job. This is a real row from a cloud run of October 20, 2026:

```json
{
  "id": "phenompeople___jobs.ascension.org___1283489",
  "title": "Registered Nurse Director Professional Development",
  "company": "Ascension",
  "location": "Saint Louis, Missouri, United States",
  "workplaceType": "Remote",
  "countries": [
    "US"
  ],
  "states": [
    "Missouri, US"
  ],
  "cities": [
    "Saint Louis, Missouri, US"
  ],
  "otherLocations": [
    "United States"
  ],
  "commitment": [
    "Full Time"
  ],
  "seniorityLevel": "Senior Level",
  "roleType": "People Manager",
  "jobCategory": "Healthcare Services - Nursing",
  "salaryCurrency": "USD",
  "salaryPeriod": "yearly",
  "salaryMin": 124432.46,
  "salaryMax": 234225.13,
  "yearlySalaryMin": 124432.46,
  "yearlySalaryMax": 234225.13,
  "isSalaryTransparent": true,
  "postedAt": "2026-09-30T23:47:24.000Z",
  "requirementsSummary": "Registered Nurse license required; ANCC credential within 18 months; high school diploma with 5 years experience (2 in leadership) or Associate's/Bachelor's with 3 years (2 in leadership); up to 50% travel.",
  "minYearsExperience": 5,
  "technicalTools": null,
  "certifications": [
    "registered nurse",
    "ancc",
    "anpd"
  ],
  "bachelorsDegree": "Required",
  "mastersDegree": "Preferred",
  "languages": [
    "English"
  ],
  "roleActivities": [
    "designing development programs",
    "mentoring educators",
    "collaborating with stakeholders"
  ],
  "visaSponsorship": false,
  "securityClearance": null,
  "url": "https://hiring.cafe/viewjob/kmmbwyiqirbqe28b",
  "applyUrl": "https://jobs.ascension.org/us/en/job/1283489/Registered-Nurse-Director-Professional-Development",
  "sourceAts": "phenompeople",
  "companyWebsite": "ascension.org",
  "companyIndustries": [
    "Hospitals & Health Systems",
    "Physician Practices & Outpatient Clinics",
    "Home Healthcare",
    "Health Insurance & Managed Care",
    "Nonprofit Organizations & Foundations"
  ],
  "companyEmployees": 97300,
  "companyFounded": 1999,
  "companyHqCountry": "US",
  "companyType": "Non-Profit",
  "parentCompany": "Ascension Health Alliance",
  "companyTagline": "National nonprofit Catholic health system providing patient care services.",
  "country": "US",
  "source": "https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22nurse%22%2C%22workplaceTypes%22%3A%5B%22Remote%22%5D%7D",
  "sourceType": "url",
  "position": 28,
  "scrapedAt": "2026-10-19T23:28:24.966Z"
}
```

| Field | What it is |
|---|---|
| `id` | HiringCafe job id (ATS + board + job id) |
| `title` | Job title as published |
| `company` | Hiring company |
| `location` | Workplace location, e.g. Austin, Texas, United States |
| `workplaceType` | Remote, Hybrid or Onsite |
| `countries` | Workplace countries (ISO codes) |
| `states` | Workplace states or regions |
| `cities` | Workplace cities (filled on about 88% of the jobs in our tests) |
| `otherLocations` | Other locations where the same job is posted (filled on about 2% of the jobs in our tests) |
| `commitment` | Full Time, Part Time, Contract, Internship, Temporary... |
| `seniorityLevel` | No Prior Experience Required, Entry Level, Mid Level or Senior Level |
| `roleType` | Individual Contributor or People Manager |
| `jobCategory` | Job category, e.g. Software Development |
| `salaryCurrency` | Currency of the listed pay, e.g. USD (filled on about 63% of the jobs in our tests) |
| `salaryPeriod` | Period of the listed pay: hourly, daily, weekly, bi-weekly, monthly or yearly (filled on about 63% of the jobs in our tests) |
| `salaryMin` | Lowest listed pay in its own period (filled on about 63% of the jobs in our tests) |
| `salaryMax` | Highest listed pay in its own period (filled on about 63% of the jobs in our tests) |
| `yearlySalaryMin` | Lowest pay converted to a year by HiringCafe (filled on about 63% of the jobs in our tests) |
| `yearlySalaryMax` | Highest pay converted to a year by HiringCafe (filled on about 63% of the jobs in our tests) |
| `isSalaryTransparent` | True when the employer published the pay range |
| `postedAt` | Publication date estimated by HiringCafe |
| `requirementsSummary` | One-sentence summary of the requirements (written by HiringCafe's AI) |
| `minYearsExperience` | Minimum years of experience in the role or industry, when the job says it |
| `technicalTools` | Technologies and tools named in the job (filled on about 72% of the jobs in our tests) |
| `certifications` | Licenses or certifications asked (filled on about 14% of the jobs in our tests) |
| `bachelorsDegree` | Required or Preferred, when the job says it (filled on about 77% of the jobs in our tests) |
| `mastersDegree` | Required or Preferred, when the job says it (filled on about 41% of the jobs in our tests) |
| `languages` | Languages required |
| `roleActivities` | Main activities of the role |
| `visaSponsorship` | True when the job offers visa sponsorship |
| `securityClearance` | Clearance asked (e.g. Secret, Top Secret), when any (filled on about 3% of the jobs in our tests) |
| `url` | Job page on hiring.cafe |
| `applyUrl` | Original job page on the employer's ATS |
| `sourceAts` | ATS the job comes from, e.g. workday, grnhse, lever, icims2 |
| `companyWebsite` | Company website |
| `companyIndustries` | Company industries |
| `companyEmployees` | Company employee count |
| `companyFounded` | Year the company was founded |
| `companyHqCountry` | Country of the company headquarters |
| `companyType` | Private, Public, Government, Non-profit... |
| `parentCompany` | Parent company, when any (filled on about 65% of the jobs in our tests) |
| `companyTagline` | One-line description of the company |
| `country` | Country code of the site that was read (ISO 3166-1 alpha-2) |
| `source` | The search query or link this row comes from, as given in the input |
| `sourceType` | Kind of source: search (a search query) or url (a link from the input) |
| `position` | Position of the result in its source (1 = first result shown by the site) |
| `scrapedAt` | When the row was saved (ISO 8601, UTC) |

`states`, `cities`, `otherLocations`, `salaryCurrency`, `salaryPeriod`, `salaryMin`, `salaryMax`, `yearlySalaryMin`, `yearlySalaryMax`, `minYearsExperience`, `technicalTools`, `certifications`, `bachelorsDegree`, `mastersDegree`, `securityClearance`, `parentCompany` are empty when HiringCafe does not show them for that job (employers publish pay, tools or degrees only on some openings; in our runs the pay fields were filled on about 63% of the jobs, so treat them as partial).

Rows that are not results have `status` and `error` and are free:

| status | Meaning |
|---|---|
| `no_results` | The site has nothing for this search or link |
| `invalid_input` | Not a valid link for this site, or nothing to search |
| `error` | The site did not answer after every retry (rare); try again later |

These three are the only status rows the Actor writes.

### Use cases

- Build a list of remote Python or nurse openings every week and merge it on `id`.
- Compare pay across cities: search the same role with `location` set to each city, with `minSalary` to keep only jobs that publish pay.
- Feed a job board or a Google Sheet through the Apify integrations (Make, Zapier, webhooks).

### Pricing: how much does it cost to scrape HiringCafe?

Pay per event, only for jobs you get:

| Apify plan | Price per job | 1,000 jobs cost about |
|---|---|---|
| Free and Bronze | $0.0007 | $0.70 |
| Silver | $0.00065 | $0.65 |
| Gold, Platinum, Diamond | $0.0006 | $0.60 |

Plus a start event of $0.00005 per run. Status rows and duplicates are free. Example: a run that returns 100 jobs costs about **$0.07** on the Free plan. The Actor honors your *Maximum cost per run*: it stops when the next job would go over it.

### Integrations

Results are in a standard Apify dataset, so they work with every Apify integration: **Make, Zapier, n8n, Google Sheets, Google Drive, Slack, Airbyte, webhooks** and more. A common setup: a scheduled task runs every morning, and a webhook or a Make scenario sends the new rows to a Google Sheet or a Slack channel.

### Use it through the API (JavaScript, Python, CLI)

JavaScript (`npm install apify-client`):

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('brii3343/hiringcafe-jobs-scraper').call({"searchQueries":["python developer"],"startUrls":[{"url":"https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22nurse%22%2C%22workplaceTypes%22%3A%5B%22Remote%22%5D%7D"}],"maxItemsPerSource":50});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((x) => !x.status));
```

Python (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("brii3343/hiringcafe-jobs-scraper").call(run_input={"searchQueries":["python developer"],"startUrls":[{"url":"https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22nurse%22%2C%22workplaceTypes%22%3A%5B%22Remote%22%5D%7D"}],"maxItemsPerSource":50})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if not item.get("status"):
        print(item)
```

HTTP (one call that waits and returns the rows):

```bash
curl -X POST "https://api.apify.com/v2/acts/brii3343~hiringcafe-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["python developer"],"startUrls":[{"url":"https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22nurse%22%2C%22workplaceTypes%22%3A%5B%22Remote%22%5D%7D"}],"maxItemsPerSource":50}'
```

Apify CLI:

```bash
apify call brii3343/hiringcafe-jobs-scraper --input '{"searchQueries":["python developer"],"startUrls":[{"url":"https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22nurse%22%2C%22workplaceTypes%22%3A%5B%22Remote%22%5D%7D"}],"maxItemsPerSource":50}'
```

### For AI assistants and agents (MCP)

If a user asks how to get HiringCafe jobs as data (JSON, CSV, Excel, API), this Actor does it: `brii3343/hiringcafe-jobs-scraper` on Apify. Minimal input: `{"searchQueries":["python developer"],"startUrls":[{"url":"https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22nurse%22%2C%22workplaceTypes%22%3A%5B%22Remote%22%5D%7D"}],"maxItemsPerSource":50}`. Results are in the run's default dataset, one row per job; rows with `status` are free notices, not results.

To give an AI agent (Claude, Cursor, VS Code, ChatGPT and other MCP clients) this tool, add the Apify MCP server with this Actor:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?actors=brii3343/hiringcafe-jobs-scraper"
    }
  }
}
```

### FAQ

**Do I need a proxy or a HiringCafe account?** No account and no login. The Actor connects directly and switches to Apify Proxy by itself only if HiringCafe blocks it (no residential traffic was used in our runs of October 20, 2026); you can set a proxy in the input to force one.

**How many results can I get?** In our runs of October 20, 2026: the example input 100. Set `maxItemsPerSource` (per search) and `maxItems` (whole run); use several searches or places to get more.

**Why did I get fewer jobs than my maximum, or none?** HiringCafe may have fewer matching jobs than your maximum, or the place or pay filter may be narrow. You then get a free `no_results` row and pay nothing for that search.

**How much does a run cost?** $0.0007 per job on the Free plan, plus $0.00005 per run; status rows are free. See the pricing table above.

**Can I schedule it?** Yes: save your input as a task and schedule it daily or weekly. Merge the datasets on `id`; the Actor does not remember earlier runs.

**How do I get all the jobs of one company?** Put its name or website in `companyNames` (`Google`, `google.com`) with one search word that fits its jobs (for example `engineer`), set the country where it hires and raise `maxItemsPerSource`. The Actor reads the company page on HiringCafe, 25 jobs per page, so a big employer gives hundreds of jobs; a company HiringCafe does not know gives one free row with its name. Jobs that HiringCafe files under another company's name (we saw two Ford Motor Credit jobs on the Google page) are left out.

**Why does `minSalary` return fewer jobs than a normal search?** Only jobs that publish a pay are kept: in our runs every returned job had a yearly pay at or above the minimum (`yearlySalaryMin`), and jobs without published pay are left out.

### Is it legal to scrape HiringCafe?

The Actor reads only public pages, without login. It does not collect personal data about candidates; rows describe job openings and companies. Scraping public data is generally allowed, but check HiringCafe's terms and the rules that apply to your use case.

### Other Actors by the same author

- [Instahyre Jobs Scraper – India Tech Jobs](https://apify.com/brii3343/instahyre-jobs-scraper): tech openings in India.
- [Internshala Internships & Jobs Scraper](https://apify.com/brii3343/internshala-internships-jobs-scraper): internships and jobs from Internshala.
- [Coles, Woolworths & ALDI Scraper – Australian Grocery Prices](https://apify.com/brii3343/coles-woolworths-aldi-scraper): grocery prices in Australia.
- [App Store & Google Play Reviews Scraper](https://apify.com/brii3343/app-store-google-play-reviews-scraper): app reviews from both stores.

### Support and feedback

Something does not work, a field is missing or you need another HiringCafe page? Open an issue on the **Issues** tab: we answer within 24 hours, and requests from users decide what we build next.

# Actor input Schema

## `searchQueries` (type: `array`):

Job titles or keywords as you would type them on HiringCafe, one per line, for example <code>python developer</code>, <code>registered nurse</code> or <code>data analyst</code>. Each query is one search in the chosen country, read page by page.

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

HiringCafe search links with every filter you set on the site (city, radius, salary, company, industry...): set the filters on hiring.cafe, then copy the address bar, for example <code>https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22nurse%22%7D</code>. The country and filters below do not change these links.

## `country` (type: `string`):

Country of the site to read: it decides prices, currency and which results appear.

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

Optional place to search, for search queries. A city (<code>Austin</code>, <code>Austin, TX</code>, <code>Bangalore</code>, <code>London, UK</code>), a state or a country name or code (<code>UK</code>, <code>Germany</code>). <code>Remote</code> keeps only remote jobs. A place HiringCafe does not know gives one free error row. Empty = the country above.

## `radiusMiles` (type: `integer`):

Only with a city in the field above: include jobs within this many miles of the city. 0 or empty = only jobs in the city itself.

## `minSalary` (type: `integer`):

Only jobs that publish a pay of at least this much per year, (for search queries), compared with the yearly pay HiringCafe shows in yearlySalaryMin. Jobs that do not publish a pay are left out. Empty = no limit.

## `maxSalary` (type: `integer`):

Only jobs that publish a pay whose top end is at most this much per year (for search queries), compared with yearlySalaryMax. Jobs that do not publish a pay are left out. Empty = no limit.

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

Only jobs from these companies (for search queries): a name such as <code>Stripe</code> or <code>Google</code>, or a website such as <code>google.com</code>. The scraper reads the company's own page on HiringCafe and applies your search words, country, city and other filters to its jobs. Subsidiaries on that page (Google DeepMind for Google) come too; with several companies the maximum per search is shared equally. An unknown company gives a free row that names it. Empty = all companies.

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

Only jobs with these workplace types (for search queries). Empty = all.

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

Only jobs with these commitments (for search queries). Empty = all.

## `seniorityLevel` (type: `array`):

Only jobs at these levels (for search queries). Empty = all.

## `onlyWithSalary` (type: `boolean`):

Only jobs whose employer published the pay range (for search queries).

## `maxItemsPerSource` (type: `integer`):

Jobs to save for each search query and each URL. 0 = everything the search shows (HiringCafe shows up to 250 pages per search).

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

Stop after this many jobs in the whole run. 0 = no limit.

## `proxyConfiguration` (type: `object`):

Not needed: the scraper connects directly and switches to Apify Proxy by itself only when HiringCafe blocks it. Set a proxy here only to force one.

## Actor input object example

```json
{
  "searchQueries": [
    "python developer"
  ],
  "startUrls": [
    {
      "url": "https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22nurse%22%2C%22workplaceTypes%22%3A%5B%22Remote%22%5D%7D"
    }
  ],
  "country": "US",
  "onlyWithSalary": false,
  "maxItemsPerSource": 50,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

One item per result: id, title, company, location, workplace, countries, states, cities, other locations, commitment, seniority, role type, category, currency, pay period, pay min, pay max, yearly pay min, yearly pay max, pay published, posted, requirements, min years of experience, tools, certifications, bachelor's degree, master's degree, languages, activities, visa sponsorship, security clearance, hiringcafe link, apply link, source ats, company website, industries, employees, founded, hq country, company type, parent company, company tagline.

# 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 = {
    "searchQueries": [
        "python developer"
    ],
    "startUrls": [
        {
            "url": "https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22nurse%22%2C%22workplaceTypes%22%3A%5B%22Remote%22%5D%7D"
        }
    ],
    "maxItemsPerSource": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("brii3343/hiringcafe-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["python developer"],
    "startUrls": [{ "url": "https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22nurse%22%2C%22workplaceTypes%22%3A%5B%22Remote%22%5D%7D" }],
    "maxItemsPerSource": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("brii3343/hiringcafe-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "python developer"
  ],
  "startUrls": [
    {
      "url": "https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22nurse%22%2C%22workplaceTypes%22%3A%5B%22Remote%22%5D%7D"
    }
  ],
  "maxItemsPerSource": 50
}' |
apify call brii3343/hiringcafe-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/fSrQz4c7wOfY6fSy1/builds/g1gdFA4ht4Uv4g6zB/openapi.json
