# Hiring.Cafe \[Only $1.25💰] Search by URLs or Filters/Keywords (`memo23/apify-hiring-cafe-scraper`) Actor

💰$1.25 per 1,000 jobs, including job titles, descriptions, requirements, company information, compensation details, and location data. Users get fields like job ID, application URL, education requirements, employment type, company size, and geolocation coordinates for market analysis.

- **URL**: https://apify.com/memo23/apify-hiring-cafe-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Jobs, Automation, Lead generation
- **Stats:** 656 total users, 127 monthly users, 98.8% runs succeeded, 11 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.25 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

There are two versions of the Hiring.cafe Job Scraper available:

- **Rentable Version:** [Hiring.cafe Job Scraper (Rent)](https://apify.com/memo23/apify-hiring-cafe-scraper-rental)
- **Pay Per Result Version:** [Hiring.cafe Job Scraper (Pay Per Result)](https://apify.com/memo23/apify-hiring-cafe-scraper)

> **Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by HiringCafe, Inc. or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

### Overview

This actor allows you to scrape detailed job listings from Hiring.cafe, a platform that aggregates job postings from various sources. You can use this tool to gather comprehensive job data including position details, company information, requirements, and more. This information is valuable for job market research, competitive analysis, and talent acquisition strategies.

### Features

- Extract detailed job information including titles, descriptions, requirements, and application details.
- Capture comprehensive company information for each job listing.
- Gather detailed employment requirements including education levels, experience, and skills.
- Collect compensation and benefit information when available.
- Built-in proxy configuration for reliable and anonymous scraping.

### How to Use

1. **Set Up**: Ensure you have an Apify account and access to the Apify platform.
2. **Configure Search Parameters**: Set up your search criteria including job titles, locations, and other filters.
3. **Adjust Scraper Settings**: Modify settings like `maxItems`, `maxConcurrency`, and `minConcurrency` to suit your requirements.
4. **Configure Proxy Settings**: (Optional) Configure proxy settings for better reliability and to avoid IP blocks.
5. **Run the Scraper**: Execute the scraper on the Apify platform. The output will be available in various formats like JSON, CSV, or Excel.

### Input Configuration

Here's an example of how to set up the input for the Hiring.cafe Job Scraper:

```json
{
    "startUrls": [
        "https://hiring.cafe/?searchState=%7B%22sortBy%22%3A%22date%22%2C%22dateFetchedPastNDays%22%3A2%7D",
        "https://hiring.cafe/?company=Z3JuaHNlX19fZ2Vuc3luX19fR2Vuc3luX19fZ2Vuc3luLmFp&searchState=%7B%22sortBy%22%3A%22date%22%2C%22dateFetchedPastNDays%22%3A2%7D"
    ],
    "maxItems": 100,
    "maxConcurrency": 5,
    "minConcurrency": 1,
    "maxRequestRetries": 3,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
}
```

#### Input Fields Explanation

- **Start URLs** (`startUrls`): URLs of Hiring.cafe job search pages to scrape from, here is one example: `https://hiring.cafe/?searchState=%7B%22sortBy%22%3A%22date%22%2C%22dateFetchedPastNDays%22%3A2%7D`.
- **Max Items to Scrape** (`maxItems`): Maximum number of job listings to scrape in a single run. Default is `100`.
- **Max Concurrency** (`maxConcurrency`): Maximum number of pages that can be processed simultaneously. Default is `5`.
- **Min Concurrency** (`minConcurrency`): Minimum number of pages that will be processed simultaneously. Default is `1`.
- **Max Request Retries** (`maxRequestRetries`): Number of times the scraper will retry a failed request before giving up. Default is `3`.
- **Proxy Configuration** (`proxy`): Specifies proxy servers that will be used by the scraper to ensure anonymity and bypass rate limits. For more details, refer to the [Proxy configuration](https://apify.com/apify/web-scraper#proxy-configuration).

### Output Structure

The scraper produces a list of job listings, with each job's information containing fields like:

```json
{
  "id": "avature___rohde-schwarz___13391",
  "board_token": "rohde-schwarz",
  "source": "avature",
  "apply_url": "https://jobs.rohde-schwarz.com/en_US/careers/JobDetail/Werkstudent-im-Bereich-Software-Entwicklung/13391",
  "source_and_board_token": "avature_rohde-schwarz",
  "job_information": {
      "title": "Werkstudent im Bereich Software Entwicklung (w/m/d)",
      "description": "Wir suchen zum nächstmöglichen Zeitpunkt Verstärkung für unser Team. Übernehmen Sie interessante Aufgaben und verwirklichen Sie mit uns Ihre Ideen!"
  },
  "v5_processed_job_data": {
      "core_job_title": "Working Student",
      "requirements_summary": "Looking for a working student to take on interesting tasks and realize ideas with the team.",
      "technical_tools": [],
      "licenses_or_certifications": [],
      "associates_degree_requirement": "Not Mentioned",
      "associates_degree_fields_of_study": [],
      "bachelors_degree_requirement": "Required",
      "bachelors_degree_fields_of_study": [
          "Software Engineering",
          "Computer Science"
      ],
      "masters_degree_requirement": "Not Mentioned",
      "masters_degree_fields_of_study": [],
      "doctorate_degree_requirement": "Not Mentioned",
      "doctorate_degree_fields_of_study": [],
      "licenses_or_certifications_not_mentioned": true,
      "min_industry_and_role_yoe": 0,
      "401k_matching": false,
      "is_min_industry_and_role_yoe_not_mentioned": false,
      "min_management_and_leadership_yoe": null,
      "is_min_management_and_leadership_yoe_not_mentioned": true,
      "job_category": "Software Development",
      "role_activities": [
          "Taking on tasks",
          "Realizing ideas"
      ],
      "commitment": [
          "Part Time"
      ],
      "role_type": "Individual Contributor",
      "seniority_level": "No Prior Experience Required",
      "workplace_countries": [
          "DE"
      ],
      "boundless_workplace_states": [],
      "boundless_workplace_countries": [],
      "boundless_workplace_continents": [],
      "workplace_continents": [
          "Europe"
      ],
      "workplace_states": [],
      "workplace_cities": [
          "Siegburg, null, DE"
      ],
      "workplace_counties": [],
      "workplace_type": "Onsite",
      "workplace_physical_environment": "Office",
      "oral_communication_level": "Medium",
      "physical_labor_intensity": "Low",
      "physical_position": "Sitting",
      "computer_usage": "High",
      "cognitive_demand": "Medium",
      "air_travel_requirement": "None",
      "land_travel_requirement": "None",
      "morning_shift_work": "Not Indicated",
      "evening_shift_work": "Not Indicated",
      "overnight_work": "Not Indicated",
      "formatted_workplace_location": "Siegburg, Germany",
      "on_call_requirement": "None",
      "weekend_availability_required": false,
      "holiday_availability_required": false,
      "generous_paid_time_off": false,
      "four_day_work_week": false,
      "overtime_required": false,
      "is_workplace_worldwide_ok": false,
      "language_requirements": [
          "German"
      ],
      "num_language_requirements": 1,
      "yearly_max_compensation": null,
      "yearly_min_compensation": null,
      "monthly_max_compensation": null,
      "monthly_min_compensation": null,
      "weekly_max_compensation": null,
      "weekly_min_compensation": null,
      "hourly_max_compensation": null,
      "hourly_min_compensation": null,
      "bi-weekly_min_compensation": null,
      "bi-weekly_max_compensation": null,
      "daily_min_compensation": null,
      "daily_max_compensation": null,
      "estimated_publish_date": "2025-07-16T17:06:12.379Z",
      "fair_chance": false,
      "visa_sponsorship": false,
      "relocation_assistance": false,
      "military_veterans": false,
      "tuition_reimbursement": false,
      "retirement_plan": false,
      "generous_parental_leave": false,
      "is_high_school_required": true,
      "is_driver_license_required": false,
      "is_compensation_transparent": false,
      "listed_compensation_currency": "EUR",
      "listed_compensation_frequency": "Hourly",
      "security_clearance": "None",
      "position_employer_type": "Internal Position",
      "company_name": "Schönhofer Sales & Engineering GmbH",
      "company_website": "https://jobs.rohde-schwarz.com",
      "company_sector_and_industry": "Information Technology",
      "company_activities": [
          "Sales",
          "Engineering"
      ],
      "company_tagline": "A company focused on making ideas real to ensure a safer and connected world."
  },
  "v5_processed_company_data": {
      "name": "Schönhofer Sales & Engineering GmbH",
      "image_url": null,
      "subsidiaries": [],
      "parent_company": null,
      "website": "https://jobs.rohde-schwarz.com",
      "linkedin_url": null,
      "industries": [
          "Information Technology"
      ],
      "activities": [
          "Sales",
          "Engineering"
      ],
      "tagline": "A company focused on making ideas real to ensure a safer and connected world.",
      "is_non_profit": false,
      "is_public_company": null,
      "is_dissolved": null,
      "is_acquired": null,
      "num_employees": null,
      "year_founded": null,
      "headquarters_country": null,
      "total_funding_amount": null,
      "total_funding_currency": null,
      "latest_investment_amount": null,
      "latest_investment_currency": null,
      "latest_investment_year": null,
      "latest_investment_series": null,
      "investors": [],
      "stock_exchange": null,
      "stock_symbol": null,
      "latest_revenue": null,
      "latest_revenue_currency": null,
      "latest_revenue_year": null
  },
  "_geoloc": [
      {
          "lat": 50.7333,
          "lon": 7.5667
      }
  ],
  "objectID": "avature___rohde-schwarz___13391"
}
```

#### Output Fields Explanation

##### Job Identification

- **id**: Unique identifier for the job listing (e.g., "avature___rohde-schwarz___13391")
- **board_token**: Identifier for the job board (e.g., "rohde-schwarz")
- **source**: Source system of the job listing (e.g., "avature")
- **source_and_board_token**: Combined source and board identifier
- **apply_url**: Direct URL to apply for the position
- **objectID**: Internal identifier used by the search system

##### Job Information

- **job_information**: Object containing:
  - **title**: Job title in original language
  - **description**: Detailed job description

##### Processed Job Data (v5_processed_job_data)

- **core_job_title**: Standardized job title
- **requirements_summary**: Summary of job requirements
- **technical_tools**: List of technical skills or tools required
- **licenses_or_certifications**: Required professional certifications
- **education_requirements**: Object containing degree requirements for different education levels
- **job_category**: Industry category of the position (e.g., "Software Development")
- **role_activities**: Array of key responsibilities and tasks
- **commitment**: Employment type (e.g., \["Part Time"])
- **role_type**: Type of role (e.g., "Individual Contributor")
- **seniority_level**: Experience level required (e.g., "No Prior Experience Required")
- **workplace_type**: Onsite/Remote/Hybrid
- **workplace_location**: Formatted location string (e.g., "Siegburg, Germany")
- **language_requirements**: Array of required languages
- **compensation**: Object containing salary/rate information when available
- **benefits**: Object containing various employment benefits
- **visa_sponsorship**: Boolean indicating if visa sponsorship is available
- **relocation_assistance**: Boolean indicating if relocation assistance is provided

##### Company Information (v5_processed_company_data)

- **name**: Company name
- **website**: Company website URL
- **industries**: Array of industry sectors
- **activities**: Array of company activities
- **tagline**: Company description or tagline
- **company_size**: Number of employees (when available)
- **year_founded**: Year company was founded (when available)
- **headquarters_country**: Country where company is headquartered
- **total_funding_amount**: Total funding received
- **latest_revenue**: Most recent revenue figure (when available)

##### Location Data

- **\_geoloc**: Array containing geographic coordinates of the job location
  - **lat**: Latitude
  - **lon**: Longitude

### Explore More Job Scrapers

If you found this Apify Smartbuyglasses Scraper useful, be sure to check out our other powerful scrapers and actors at [memo23's Apify profile](https://apify.com/memo23). We offer a wide range of tools to enhance your web scraping and automation needs across various platforms and use cases.

### Support

- For issues or feature requests, please use the [Issues](https://console.apify.com/actors/a2HOBr55E3T4TZBcJ/issues) section of this actor.
- If you need customization or have questions, feel free to contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

### Additional Services

- Request customization or whole dataset: <muhamed.didovic@gmail.com>
- If you need anything else scraped, or this actor customized, email: <muhamed.didovic@gmail.com>
- For API services of this scraper (no Apify fee, just usage fee for the API), contact: <muhamed.didovic@gmail.com>
- Email: muhamed.didovic@gmail.com

# Actor input Schema

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

Paste hiring.cafe URLs — three kinds are supported:

• **Search pages** — `https://hiring.cafe/?searchState=…` (copy the address bar after setting filters on the site).
• **Company pages** — `https://hiring.cafe/org/<domain>` (e.g. `https://hiring.cafe/org/nikasolutions.com`) to scrape one company's jobs.
• **Job pages** — `https://hiring.cafe/job/<id>` (e.g. `https://hiring.cafe/job/9naqj25yblgrkhki`) to scrape one listing each.

**If any URL is set, these are used and Keyword / Location / Workplace are ignored.** Leave empty to build from **Search by filters** below.

*Accepts plain URL strings (recommended) or {"url": "…"} objects.*

## `keyword` (type: `string`):

Search query → `searchState.searchQuery`. **Only used when Start URLs are empty.**

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

United States (default) uses the site’s country preset. **Only used when Start URLs are empty.** For exact regions (e.g. Florida with place id), paste a full hiring.cafe URL in Start URLs instead.

## `workplaceType` (type: `string`):

Remote, Hybrid, Onsite, or Any (all three). Ignored when **Workplace types** below is set. **Only used when Start URLs are empty.**

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

Pick more than one (e.g. Remote + Hybrid). Wins over Workplace Type. **Only used when Start URLs are empty.**

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

Full Time, Contract, Internship, etc. **Only used when Start URLs are empty.**

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

hiring.cafe seniority facet. **Only used when Start URLs are empty.**

## `dateFetchedPastNDays` (type: `integer`):

Only jobs fetched in the last N days (site facet). **Only used when Start URLs are empty.**

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

Search sort. **Only used when Start URLs are empty.**

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

Narrows `searchState.jobTitleQuery`. **Only used when Start URLs are empty.**

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

Only these companies (hiring.cafe matches subsidiaries). **Only used when Start URLs are empty.**

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

Drop these companies. **Only used when Start URLs are empty.**

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

Include these industries. **Only used when Start URLs are empty.**

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

Drop these industries. **Only used when Start URLs are empty.**

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

Low end of compensation, same units as the site (usually annual USD). **Only used when Start URLs are empty.**

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

High end of compensation. **Only used when Start URLs are empty.**

## `onlyTransparentSalaries` (type: `boolean`):

Hide jobs without a posted salary. **Only used when Start URLs are empty.**

## `minYoe` (type: `integer`):

Role YOE low bound. **Only used when Start URLs are empty.**

## `maxYoe` (type: `integer`):

Role YOE high bound. **Only used when Start URLs are empty.**

## `incrementalMode` (type: `boolean`):

Remember jobs across runs. Each row gets <code>\_watchStatus</code>: NEW, UPDATED, or UNCHANGED. Turn on for a schedule so you only pay for what changed.

## `skipUnchanged` (type: `boolean`):

When Incremental mode is on, do not push UNCHANGED rows. Default on.

## `watchStateKey` (type: `string`):

Optional name for this watch. Different keys keep separate histories (e.g. one per keyword). Leave empty to derive a key from the start URLs / keyword.

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

Maximum number of jobs to scrape.

## `maxConcurrency` (type: `integer`):

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

Number of times the crawler will retry a failed request before giving up.

## `flattenOutput` (type: `boolean`):

If on, nested objects in each job record are flattened with underscores (e.g. <code>enriched_company_data.name</code> becomes <code>enriched_company_data_name</code>). Useful for CSV/Excel export or to match the field shape some other hiring.cafe scrapers produce. Off (default) keeps the nested JSON shape returned by the hiring.cafe API.

## `enrichDescription` (type: `boolean`):

When on (default), the actor fetches each job's detail page after the listing to populate <code>job_information.description</code> with the full HTML description. Adds ~1 extra request per job. Turn off if you only need the structured listing fields (title, company, salary, apply URL, etc.) and want faster runs.

## `scrapingbeeKey` (type: `string`):

Optional, and almost never needed. Paste your own <a href='https://scrapingbee.com' target='_blank' rel='noopener'>ScrapingBee</a> API token to enable a last-resort unblocker. It is only reached if every built-in route fails first — direct, Apify proxy, Apify Unblocker, and the browser — which happens rarely. On the pay-per-event plan there is no built-in token, so leaving this blank simply skips that last resort and the run fails instead of billing you for a third-party service.

## `scrapedoKey` (type: `string`):

Optional. A second last-resort unblocker, tried only after ScrapingBee. Same conditions apply, and on the pay-per-event plan it likewise needs your own token. Note that hiring.cafe's Cloudflare currently blocks Scrape.do during its hardest windows, so ScrapingBee is the more dependable of the two.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    "https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22software%20engineer%22%2C%22dateFetchedPastNDays%22%3A7%7D",
    "https://hiring.cafe/org/nikasolutions.com",
    "https://hiring.cafe/job/9naqj25yblgrkhki"
  ],
  "keyword": "software engineer",
  "location": "United States",
  "workplaceType": "Any",
  "sortBy": "default",
  "onlyTransparentSalaries": false,
  "incrementalMode": false,
  "skipUnchanged": true,
  "maxItems": 10000,
  "maxConcurrency": 100,
  "minConcurrency": 1,
  "maxRequestRetries": 200,
  "flattenOutput": false,
  "enrichDescription": true
}
```

# 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 = {
    "startUrls": [
        "https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22software%20engineer%22%2C%22dateFetchedPastNDays%22%3A7%7D",
        "https://hiring.cafe/org/nikasolutions.com",
        "https://hiring.cafe/job/9naqj25yblgrkhki"
    ],
    "keyword": "software engineer",
    "location": "United States",
    "workplaceType": "Any",
    "maxItems": 10000
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/apify-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 = {
    "startUrls": [
        "https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22software%20engineer%22%2C%22dateFetchedPastNDays%22%3A7%7D",
        "https://hiring.cafe/org/nikasolutions.com",
        "https://hiring.cafe/job/9naqj25yblgrkhki",
    ],
    "keyword": "software engineer",
    "location": "United States",
    "workplaceType": "Any",
    "maxItems": 10000,
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/apify-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 '{
  "startUrls": [
    "https://hiring.cafe/?searchState=%7B%22searchQuery%22%3A%22software%20engineer%22%2C%22dateFetchedPastNDays%22%3A7%7D",
    "https://hiring.cafe/org/nikasolutions.com",
    "https://hiring.cafe/job/9naqj25yblgrkhki"
  ],
  "keyword": "software engineer",
  "location": "United States",
  "workplaceType": "Any",
  "maxItems": 10000
}' |
apify call memo23/apify-hiring-cafe-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/apify-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/5mV5rBsvmjtTVRB9h/builds/1YWbvC9BrRJxVxTeX/openapi.json
