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

Extract public HiringCafe job-search results with normalized job, compensation, skills, and company fields. Use for recruiting research and labor-market analysis; returns one validated record per listing. Charged per persisted job plus Apify platform usage.

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

## Pricing

from $1.50 / 1,000 hiringcafe job record scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## HiringCafe Jobs Scraper

Extract public HiringCafe search results into one normalized job record per listing. It is designed for recruiters, labor-market analysts, and AI agents that need stable job titles, company names, locations, salary signals, skills, application links, source provenance, and collection times.

### Best fit for this Actor

- Start with a role or skill query when you need a bounded sample of current HiringCafe listings.
- Paste a public HiringCafe search URL when the site filters represent the exact market you need.
- Use `sourceUrl`, `applyUrl`, and `scrapedAt` to retain provenance in a recruiting or market-research workflow.

The Actor works with public search results and keeps the collection workflow read-only.

### Focused standalone workflow

This Actor is designed as a focused standalone workflow for collecting and normalizing public HiringCafe search results. Start with it when one structured job record per listing is the useful handoff to your own recruiting, analytics, or AI workflow.

### Practical workflow

A talent analyst starts with `data engineer`, limits collection to 25 listings, and receives normalized `title`, `companyName`, `location`, `workplaceType`, `skills`, compensation fields, and `applyUrl`. They can then compare demand and salary signals across saved datasets while retaining the exact `sourceUrl` and `scrapedAt` for review.

### Quick start

```json
{
  "searchQuery": "data engineer",
  "maxResults": 25,
  "maxPages": 3
}
````

To preserve filters selected in HiringCafe, use a public search URL instead:

```json
{
  "searchUrls": [
    {
      "url": "https://hiringcafe.com/?searchState=%7B%22searchQuery%22%3A%22data%20engineer%22%7D"
    }
  ],
  "maxResults": 25,
  "maxPages": 3
}
```

### Input reference

| Field         | Type    | What it controls                                                                                 |
| ------------- | ------- | ------------------------------------------------------------------------------------------------ |
| `searchQuery` | string  | Role, skill, or phrase used for standard HiringCafe search.                                      |
| `searchUrls`  | array   | Public HiringCafe search pages; these preserve site-selected filters and override `searchQuery`. |
| `maxResults`  | integer | Maximum persisted job records and billable job events.                                           |
| `maxPages`    | integer | Maximum public search pages examined per supplied search URL.                                    |

### What data you receive

Each dataset item represents one public HiringCafe listing. Fields are normalized into a concise schema that works well in spreadsheets, warehouses, and AI workflows:

| Field                                                            | Meaning                                        |
| ---------------------------------------------------------------- | ---------------------------------------------- |
| `jobId`, `title`, `companyName`                                  | Stable identity and employer context.          |
| `location`, `workplaceType`, `seniorityLevel`, `employmentTypes` | Role location and arrangement attributes.      |
| `skills`, `requirementsSummary`                                  | Public requirements and technical signals.     |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`       | Reported compensation when present.            |
| `applyUrl`, `source`, `sourceUrl`, `scrapedAt`                   | Application destination and source provenance. |

```json
{
  "jobId": "grnhse___example___42",
  "title": "Data Engineer",
  "companyName": "Example Inc",
  "location": "Remote, United States",
  "workplaceType": "Remote",
  "skills": ["Python", "SQL"],
  "salaryMin": 120000,
  "salaryMax": 160000,
  "salaryCurrency": "USD",
  "salaryPeriod": "Yearly",
  "applyUrl": "https://boards.example.com/jobs/42",
  "sourceUrl": "https://hiringcafe.com/?searchState=%7B%7D",
  "scrapedAt": "2024-01-01T00:00:00.000Z"
}
```

### Use through the API

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~hiringcafe-jobs-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQuery":"data engineer","maxResults":25,"maxPages":3}'
```

After completion, read the default dataset URL returned by Apify to retrieve the job records. Check the `OUTPUT` record for the compact terminal outcome and `RUN_SUMMARY` for page coverage and safe diagnostics.

### Use with AI agents through Apify MCP

> Find up to 25 public HiringCafe data-engineer listings. Return title, company, location, workplace type, skills, salary fields, application URL, and source URL. Stop at 25 and report whether the terminal outcome is complete, partial, or empty.

The Actor is read-only. Give the agent a bounded query or public search URL, then have it preserve `applyUrl`, `sourceUrl`, and `scrapedAt` in downstream work.

### Pricing

This Actor uses Pay per event plus Apify platform usage. A billable event occurs only when a complete, validated job record is persisted. Use `maxResults` to bound job events; platform usage is additional. Open the live Pricing tab for current event details.

### Best results

- Start with a narrow role, skill, or location filter for more focused records.
- Use a copied public search URL when you need HiringCafe's exact filter combination.
- Keep `maxResults` and `maxPages` aligned with the dataset size your workflow can review.
- Use scheduled runs with the same input when you need recurring market snapshots.

### Builder's note

I designed the Actor around HiringCafe's server-rendered search data. I validate and write each normalized listing as it is found, which keeps output durable as collection continues and makes coverage explicit in `RUN_SUMMARY`.

### Responsible use

Use public or otherwise authorized data responsibly and comply with applicable laws and source-site terms.

# Actor input Schema

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

Free-text terms sent to HiringCafe, for example 'senior data engineer'. Use a role, skill, or phrase; the default is 'software engineer'. It accepts up to 120 characters. This is not a job URL or an employer-only lookup.

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

Optional public HiringCafe search URLs, for example 'https://hiringcafe.com/?searchState=%7B%22searchQuery%22%3A%22data%20engineer%22%7D'. When supplied, these URLs override the keyword field and preserve the filters selected on HiringCafe. Leave this empty for the standard keyword mode. This is not for individual job or external application URLs.

## `maxResults` (type: `integer`):

Hard cap on persisted job records and job-record event charges. Enter an integer from 1 to 200, for example 25. The default is 25 and collection stops once the cap is reached. This is not a page count and cannot return more than 200 records.

## `maxPages` (type: `integer`):

Maximum HiringCafe result pages examined for each search URL, for example 3. The default is 3 and each page is fetched sequentially to keep collection bounded. Raise it only when the result cap requires more coverage. This is not a request-concurrency control.

## Actor input object example

```json
{
  "searchQuery": "senior data engineer",
  "searchUrls": [
    {
      "url": "https://hiringcafe.com/?searchState=%7B%22searchQuery%22%3A%22data%20engineer%22%7D"
    }
  ],
  "maxResults": 25,
  "maxPages": 3
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

## `output` (type: `string`):

No description

## `summary` (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 = {
    "searchQuery": "software engineer",
    "maxResults": 25,
    "maxPages": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/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 = {
    "searchQuery": "software engineer",
    "maxResults": 25,
    "maxPages": 3,
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "software engineer",
  "maxResults": 25,
  "maxPages": 3
}' |
apify call khadinakbar/hiringcafe-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=khadinakbar/hiringcafe-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "HiringCafe Jobs Scraper",
        "description": "Extract public HiringCafe job-search results with normalized job, compensation, skills, and company fields. Use for recruiting research and labor-market analysis; returns one validated record per listing. Charged per persisted job plus Apify platform usage.",
        "version": "1.0",
        "x-build-id": "zokNyu5ZkKKS0stzf"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/khadinakbar~hiringcafe-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-khadinakbar-hiringcafe-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/khadinakbar~hiringcafe-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-khadinakbar-hiringcafe-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/khadinakbar~hiringcafe-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-khadinakbar-hiringcafe-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQuery": {
                        "title": "Job search query",
                        "type": "string",
                        "description": "Free-text terms sent to HiringCafe, for example 'senior data engineer'. Use a role, skill, or phrase; the default is 'software engineer'. It accepts up to 120 characters. This is not a job URL or an employer-only lookup.",
                        "default": "software engineer"
                    },
                    "searchUrls": {
                        "title": "HiringCafe search URLs",
                        "type": "array",
                        "description": "Optional public HiringCafe search URLs, for example 'https://hiringcafe.com/?searchState=%7B%22searchQuery%22%3A%22data%20engineer%22%7D'. When supplied, these URLs override the keyword field and preserve the filters selected on HiringCafe. Leave this empty for the standard keyword mode. This is not for individual job or external application URLs.",
                        "default": [],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxResults": {
                        "title": "Maximum job records",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Hard cap on persisted job records and job-record event charges. Enter an integer from 1 to 200, for example 25. The default is 25 and collection stops once the cap is reached. This is not a page count and cannot return more than 200 records.",
                        "default": 25
                    },
                    "maxPages": {
                        "title": "Maximum search pages",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum HiringCafe result pages examined for each search URL, for example 3. The default is 3 and each page is fetched sequentially to keep collection bounded. Raise it only when the result cap requires more coverage. This is not a request-concurrency control.",
                        "default": 3
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
