# Hiring Cafe Scraper - Jobs, Salaries, Remote & Apply Links (`scrapewise/hiring-cafe-scraper`) Actor

Scrape hiring.cafe jobs by keyword, location, remote, seniority, contract and salary: title, company profile, salary, skills, experience, benefits, posted date, full description and the direct ATS apply link. Schedule it with onlyNew for daily alerts. Error rows are free.

- **URL**: https://apify.com/scrapewise/hiring-cafe-scraper.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (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.93 / 1,000 job delivereds

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 Scraper: jobs with salary, company profile, skills and the direct apply link

Hiring Cafe Scraper collects **jobs from hiring.cafe**, the job search engine that reads company career pages
directly (Greenhouse, Lever, Workday, Ashby, iCIMS, Oracle and dozens of other ATS) and classifies every posting with
AI. You search by keyword and filters, and each job comes back as one clean row: title, company and its profile
(website, industry, employees, founding year, funding), location down to the city, remote or hybrid, seniority,
contract type, salary range and period, minimum years of experience, tools and skills, degree and language
requirements, benefits, the estimated publish date, the source ATS and the **direct apply link on the employer's own
site**. The full job description (text and HTML) comes too, by default.

No account, cookies or browser needed. It is used to:

- build job boards, newsletters and job alert bots for a niche (remote data jobs, nurse jobs in Texas, senior Rust...);
- research salaries, skills in demand and hiring trends by role, country or industry;
- find companies that are hiring right now, with their website and size, for sales and recruiting outreach.

### At a glance

| What | Price |
|---|---|
| Job delivered | **US$ 1.10 per 1,000 jobs** (US$ 0.0011 each) on the Free plan, lower on paid plans |
| Run start | US$ 0.005 per run |

- 500 jobs with full descriptions = **about US$ 0.56** on the Free plan.
- Paid Apify plans get a lower price per job automatically (Bronze, Silver, Gold and above).
- The full description is included in the job price; there is no extra event for it.
- Error rows, duplicates and jobs already delivered in earlier runs (`onlyNew`) are never charged. `maxItems` is a
  hard cap, and a spending limit set on the run stops it cleanly with everything delivered so far.

### Quick start

```json
{
  "searchQueries": ["data engineer"],
  "location": "United States",
  "maxItems": 50
}
```

Remote senior roles posted in the last week, with a published salary of at least 150,000 a year:

```json
{
  "searchQueries": ["machine learning engineer", "data scientist"],
  "workplaceTypes": ["Remote"],
  "seniorityLevels": ["Senior Level"],
  "postedWithinDays": 7,
  "minYearlySalary": 150000,
  "salaryOnly": true,
  "sortBy": "date",
  "maxItems": 200
}
```

Every filter of the site: set the filters on hiring.cafe in your browser, copy the link from the address bar and
paste it in `startUrls`. The Actor reads the search state in the link as is.

Daily alert: schedule the run once a day with `"onlyNew": true` and only jobs you have not received before come back.

### Input

| Field | What it does |
|---|---|
| `searchQueries` | Job titles or keywords, one per line. Each keyword is one search. |
| `location` | Country, state or city in English (`United States`, `California`, `London`, `Germany`). Cities include a 50-mile radius. Several: separate with a semicolon. Empty = anywhere in the world. |
| `workplaceTypes` | `Remote`, `Hybrid`, `Onsite`, `Field`. Empty = all. |
| `seniorityLevels` | `No Prior Experience Required`, `Entry Level`, `Mid Level`, `Senior Level`. |
| `commitmentTypes` | `Full Time`, `Part Time`, `Contract`, `Internship`, `Temporary`, `Seasonal`, `Volunteer`. |
| `roleTypes` | `Individual Contributor` or `People Manager`. |
| `companyNames` | Only jobs from these companies. |
| `postedWithinDays` | Only jobs found in the last N days (site default: 121). |
| `minYearlySalary` | Only jobs whose salary range reaches this yearly amount. |
| `salaryOnly` | Skip jobs without a published salary. |
| `sortBy` | `default` (relevance), `date`, `date_asc`, `compensation_desc`, `compensation_asc`, `experience_asc`, `experience_desc`. |
| `startUrls` | hiring.cafe search links copied from the browser, with any filter the site offers. |
| `includeDescription` | Full description from each job page (default on). Off = faster, every other field is still there. |
| `maxItems` | Cap for the whole run, across all searches (default 50; 0 = no cap). |
| `onlyNew` | Deliver only jobs not delivered in earlier runs of the same search (for schedules). |
| `proxyConfiguration` | Apify datacenter proxy by default. |

Inputs written for other job tools keep working: `searchQuery`, `query`, `keyword`, `keywords`, `maxResults`,
`limit`, `remote: true`, `remoteOnly`, `jobType`, `employmentType`, `seniority`, `experienceLevel`, `datePosted`,
`minSalary`, `onlyNewJobs` and `urls` are read too.

### Output

Each job is one row with `type: "job"`:

| Field | What it is |
|---|---|
| `jobId`, `requisitionId`, `url` | hiring.cafe ids and the job page on hiring.cafe |
| `title`, `normalizedTitle` | Title as posted, and the clean role name the site assigns ("Data Engineer") |
| `companyName`, `companyWebsite`, `companyTagline` | Employer, its domain and a one-line description |
| `companyIndustry`, `companyIndustries` | Sector of the posting and the company's industries |
| `companyEmployees`, `companyFoundedYear`, `companyHqCountry`, `companyType` | Size, founding year, headquarters country, public, private or non-profit |
| `companyStockSymbol`, `companyLatestFunding` | Ticker when listed; latest funding round (type, year, amount, investors) when known |
| `location`, `cities`, `states`, `countries`, `continents` | Every workplace of the job, from the formatted line down to the city |
| `workplaceType`, `isRemote`, `remoteCountries`, `worldwideOk` | Remote, Hybrid, Onsite or Field; countries a remote role accepts |
| `seniorityLevel`, `roleType`, `jobCategory`, `commitment` | Seniority, IC or manager, job family, contract types |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | Pay range in the period it was posted (yearly, monthly, hourly...) |
| `salaryYearlyMin`, `salaryYearlyMax`, `isSalaryTransparent` | Yearly range when the site computes it; whether the employer published it |
| `minYearsExperience`, `minManagementYears` | Minimum years of experience in the role and in management |
| `requirementsSummary`, `technicalTools`, `roleActivities` | Short summary of the requirements, tools and skills, main activities |
| `languageRequirements`, `degreeRequirements`, `certifications`, `securityClearance` | Languages, degrees by level and field of study, licenses, clearance |
| `visaSponsorship`, `benefits` | Visa sponsorship flag; benefits such as 401(k) matching, relocation, four-day week |
| `publishedAt` | Estimated publish date (UTC) |
| `atsSource`, `applyUrl` | Source ATS (greenhouse, lever, workday, ashby...) and the direct apply link |
| `views`, `isExpired` | Times the job was opened on hiring.cafe; expired flag |
| `description`, `descriptionHtml` | Full description as plain text and as HTML (null with `includeDescription` off) |
| `sourceQuery`, `scrapedAt` | The keyword or link that found the job, and when it was collected |

One real row from 16 Oct 2026 (lists and description shortened):

```json
{
  "type": "job",
  "jobId": "oraclecloud___hbbq.fa.us2___4820",
  "title": "Engineer, Data",
  "normalizedTitle": "Data Engineer",
  "companyName": "ABS Group",
  "companyWebsite": "abs-group.com",
  "companyEmployees": 6875,
  "companyFoundedYear": 1862,
  "location": "Washington or Suitland",
  "countries": ["US"],
  "workplaceType": "Onsite",
  "seniorityLevel": "Entry Level",
  "jobCategory": "Data and Analytics",
  "commitment": ["Full Time"],
  "minYearsExperience": 0,
  "technicalTools": ["Python", "SQL"],
  "degreeRequirements": {"bachelors": {"requirement": "Required", "fieldsOfStudy": ["computer science", "engineering"]}},
  "benefits": ["401(k) matching", "Generous paid time off", "Retirement plan"],
  "publishedAt": "2026-09-18T21:59:29.000Z",
  "atsSource": "oraclecloud",
  "applyUrl": "https://hbbq.fa.us2.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1/requisitions/job/4820",
  "url": "https://hiring.cafe/job/mu3hqnxhelztvs0d"
}
```

### Errors you may see

Every error is a row with `errorCode` and is never charged:

| errorCode | Meaning |
|---|---|
| `INVALID_INPUT` | A field has a wrong value (for example a seniority the site does not have) |
| `INVALID_URL` | A link in `startUrls` is not a hiring.cafe search link |
| `LOCATION_NOT_FOUND` | hiring.cafe does not know that location; try the English name of the country or city |
| `NO_RESULTS` | The search and filters match no job |
| `BLOCKED` | hiring.cafe refused every attempt for this search; run it again in a few minutes |
| `UNEXPECTED` | Something else stopped the run; the message says what |

### Integrations, scheduling and AI agents

- **Schedule** a daily run with `onlyNew` in [Apify schedules](https://docs.apify.com/platform/schedules) to get
  only fresh jobs every morning.
- **Export** as JSON, CSV, Excel or XML, or read the dataset from the [Apify API](https://docs.apify.com/api/v2).
- **Connect** it to Make, n8n, Zapier, Slack or Google Sheets through
  [Apify integrations](https://docs.apify.com/platform/integrations) to post new jobs to a channel or a sheet.
- **AI agents:** call it as a tool through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp)
  in Claude, ChatGPT, Cursor or any MCP client, for example "find remote senior Python jobs posted this week with a
  salary above 150k and list the companies".

### FAQ

**Do I need a hiring.cafe account?** No. Everything comes from public search and job pages, without login.

**Where does the apply link go?** Straight to the employer's career page or ATS (Greenhouse, Lever, Workday...), the
same link the site's Apply button opens.

**Why is the salary empty on some jobs?** Many employers do not publish pay. Turn on `salaryOnly` to keep only jobs
that do.

**How many jobs can one search return?** Each results page has about 100 jobs and the Actor pages until the end of
the search or your `maxItems`. For very broad searches, split by location or seniority.

**How does `onlyNew` work?** The Actor keeps the ids of the jobs it delivered for each search (same keyword and
filters) in a key-value store in your account. Jobs seen before are skipped and not charged.

**Is it legal?** The Actor reads public job postings only. Emails and phone numbers inside descriptions are replaced
by `[contact removed]`, and the list of users who viewed a job is never collected. You are responsible for how you
use the data under the laws that apply to you.

**Something broke or a field is missing?** Open an issue on the Actor page; issues are answered within a day.

### Limitations

- The full description needs one extra page per job; hiring.cafe limits how fast one IP can open job pages, so the
  Actor rotates proxy IPs. If the site still slows it down, the remaining rows come without `description` (every
  other field is there) instead of failing.
- AI fields (seniority, tools, experience, benefits) are hiring.cafe's own classification of the posting.
- `publishedAt` is the site's estimate of when the employer published the job.

### Changelog

- **16 Oct 2026:** first version: keyword and filter search, search links, company profile, salary, skills,
  requirements, direct apply link, full description, `onlyNew` for schedules.

# Actor input Schema

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

Job titles or keywords, one per line, for example data engineer or product manager. Each keyword is one search. Leave empty when you paste search links below.

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

Country, state or city in English, for example United States, California or London (cities include a 50-mile radius). Several locations: separate with a semicolon (London; Berlin). Empty = anywhere in the world.

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

Keep only these workplace types. Empty = all.

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

Keep only these seniority levels, as hiring.cafe classifies them. Empty = all.

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

Keep only these contract types. Empty = all.

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

Individual contributor or people manager roles. Empty = both.

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

Only jobs from these companies, for example Stripe or Airbnb. Empty = all companies.

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

Only jobs hiring.cafe found in the last N days. Empty = the site default (121 days).

## `minYearlySalary` (type: `integer`):

Only jobs whose salary range reaches at least this yearly amount (in the job's own currency), for example 120000.

## `salaryOnly` (type: `boolean`):

On: skip jobs that do not publish a salary range.

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

Order of the results, same options as the site. onlyNew switches Relevance to Most recent.

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

Optional: hiring.cafe search links copied from the address bar after setting filters on the site (the searchState in the link is used as is, with every filter the site offers).

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

On: opens each job page for the full description (text and HTML). Off: faster, the row still has the requirements summary, tools and every other field.

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

Hard cap for the whole run, across all searches. 0 = no cap.

## `onlyNew` (type: `boolean`):

On: remembers the jobs delivered in earlier runs of the same search (in your account) and delivers only jobs not seen before. Skipped jobs are free.

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

Apify datacenter proxy by default, which hiring.cafe accepts. Change it only if you know you need to.

## Actor input object example

```json
{
  "searchQueries": [
    "data engineer"
  ],
  "location": "United States",
  "salaryOnly": false,
  "sortBy": "default",
  "includeDescription": true,
  "maxItems": 50,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (type: `string`):

No description

# 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": [
        "data engineer"
    ],
    "location": "United States",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/hiring-cafe-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": ["data engineer"],
    "location": "United States",
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/hiring-cafe-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": [
    "data engineer"
  ],
  "location": "United States",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/hiring-cafe-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/hiring-cafe-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/JjxAFPWq4HeSDghf8/builds/4wfotXN5c2KTqafxc/openapi.json
