# Hiring Cafe Jobs Scraper - Roles + Company Firmographics (`sian.agency/hiring-cafe-jobs-scraper`) Actor

Export aggregated job listings with structured company data: employees, industries, founded year, public or private, plus seniority, workplace type and requirements.

- **URL**: https://apify.com/sian.agency/hiring-cafe-jobs-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.10 / 1,000 job searches

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## ☕ Hiring Cafe Jobs Scraper — Roles With Company Data Attached

[![Actor](https://img.shields.io/badge/Apify-Actor-brightgreen)](https://apify.com/sian.agency/hiring-cafe-jobs-scraper)
[![Pricing](https://img.shields.io/badge/Pay%20per%20result-%240.00125%20per%20job-blue)](https://apify.com/sian.agency/hiring-cafe-jobs-scraper)
[![Data](https://img.shields.io/badge/117%20jobs-per%20page-orange)](https://apify.com/sian.agency/hiring-cafe-jobs-scraper)
[![Support](https://img.shields.io/badge/Support-Issues%20%26%20Reviews-purple)](https://apify.com/sian.agency/hiring-cafe-jobs-scraper/issues)

### 🔎 What is the Hiring Cafe Jobs Scraper — and when should you use it?

The **Hiring Cafe Jobs Scraper** turns aggregated job listings with the employer's firmographics on every row into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** job rows that already carry the company behind them. Each role brings seniority, workplace type, commitment, cities and countries, required languages, tools, degree requirement, a condensed requirements summary and the real application link. The same row carries the employer's headcount, industries, founding year, organization type and stock ticker, filled on 95 to 100% of results, so you can size a company without a second enrichment step.

**Use something else when:** you want one specific job board rather than an aggregate view. Use [Indeed Jobs Scraper](https://apify.com/sian.agency/indeed-jobs-scraper?fpr=sian) for Indeed listings by keyword or URL. Use [Seek Jobs Scraper](https://apify.com/sian.agency/seek-jobs-scraper?fpr=sian) for Seek listings across Australia and New Zealand. Use [Dice Jobs Scraper](https://apify.com/sian.agency/dice-jobs-scraper?fpr=sian) for Dice technology roles in the US. Use [ZipRecruiter Jobs Scraper](https://apify.com/sian.agency/ziprecruiter-jobs-scraper?fpr=sian) for ZipRecruiter listings by keyword and location. Salary is present on only about 12% of roles because most employers never publish one, and recruiter contact details are not in the source at all. Neither is a limitation of the scraper.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/hiring-cafe-jobs-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want job listings with company firmographics attached using the Apify Actor `sian.agency/hiring-cafe-jobs-scraper`.

Use it when I need: job rows that already carry the company behind them. Each role brings seniority, workplace type, commitment, cities and countries, required languages, tools, degree requirement, a condensed requirements summary and the real application link. The same row carries the employer's headcount, industries, founding year, organization type and stock ticker, filled on 95 to 100% of results, so you can size a company without a second enrichment step.

Don't use it when: you want one specific job board rather than an aggregate view — use indeed-jobs-scraper or seek-jobs-scraper or dice-jobs-scraper or ziprecruiter-jobs-scraper instead.

How to call it: set `searchQuery` to a job title, skill or discipline
  searchQuery    -> the search term, e.g. engineer, product manager, data scientist
  maxPages       -> pages to walk, 1-25, about 117 jobs each (default 2)
  maxResults     -> hard cap on jobs returned and on what the run charges (default 200)
  includeExpired -> off by default, so only open roles are returned and billed
The run stops at whichever of maxPages and maxResults it reaches first. Filtering is
done on the OUTPUT, not the input: every row carries seniority, workplaceType,
commitment, workplaceCities and workplaceCountries, so pull one broad search and
slice it. A role aggregated under two source systems is charged once, not twice..

Start with this input:
{
  "searchQuery": "engineer",
  "maxPages": 2,
  "maxResults": 200,
  "includeExpired": false
}

Ask me which role or skill to search for, and how many jobs I want, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Find machine learning roles and show me only the ones at companies under 200 people.*
- *Pull product manager jobs and group them by employer industry and headcount band.*
- *Which companies are hiring for Kubernetes right now, and how big are they?*
- *Track what these five competitors are recruiting for and tell me what changed since last month.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/hiring-cafe-jobs-scraper.md](https://apify.com/sian.agency/hiring-cafe-jobs-scraper.md).

### Overview

Aggregated job listings where every row already carries the employer's firmographics — headcount,
industries, founding year, public or private, and stock ticker where the company is listed.

Most job scrapers hand back a title, a company name and a link. This one adds 91 structured fields
per role plus a company block that is populated on 95–100% of rows, so you can tell a fifty-person
startup's opening from a twenty-thousand-person incumbent's without a second enrichment step.

### Features

- **Company data on every row** — employees, industries, founded year, organization type, ticker, HQ country and tagline, filled on 95–100% of results.
- **Roles already normalised** — seniority, workplace type, commitment, degree requirements, languages, tools and role activities, so you are not parsing free-text descriptions.
- **117 jobs per page**, with a page limit and a result cap so you control exactly what a run costs.
- **Open roles only by default** — expired listings are excluded, so you do not pay for closed jobs.
- **Duplicate-safe** — the same role aggregated under two systems is charged once, not twice.
- **Real application links** straight to the employer's own applicant tracking system.
- **An HTML run report** with the jobs, what you paid, and a fix for anything that failed.

### Quick start

1. Open the Actor and press **Start** — the default searches `engineer` across two pages.
2. Change `searchQuery` to the role you care about.
3. Read the results in the **Output** tab, or export to JSON, CSV or Excel.

```json
{
  "searchQuery": "product manager",
  "maxPages": 3,
  "maxResults": 300
}
```

### Getting started

Search by keyword — a job title, a skill or a discipline. Broad terms survey a market; narrow ones
build a shortlist.

Each page returns about 117 jobs, so `maxPages` is the main volume dial and `maxResults` is the
hard ceiling on what a run can charge. The run stops at whichever it reaches first.

Filtering happens on the output rather than the input: every row carries seniority, workplace type,
commitment, cities and countries, so pull a broad search once and slice it however you need.

### Input configuration

| Field | Type | Default | What it does |
|---|---|---|---|
| `searchQuery` | string | `engineer` | Job title, skill or discipline to search for |
| `maxPages` | integer | `2` | Pages to walk, ~117 jobs each (1–25) |
| `maxResults` | integer | `200` | Hard cap on jobs returned, and so on what a run charges |
| `includeExpired` | boolean | `false` | Include closed listings for historical analysis |

### Output

One row per job.

| Field | Type | Fill rate | Example |
|---|---|---|---|
| `jobTitle` | string | 100% | `Configuration Engineer` |
| `companyName` | string | 100% | `Lam Research` |
| `applyUrl` | string | 100% | employer's own application page |
| `workplaceType` | string | 100% | `Hybrid` |
| `seniorityLevel` | string | 98% | `Entry Level` |
| `commitment` | array | 100% | `["Full Time"]` |
| `workplaceCities` | array | 87% | `["Yokohama, Kanagawa, JP"]` |
| `workplaceCountries` | array | 99% | `["JP"]` |
| `requirementsSummary` | string | 100% | condensed requirements |
| `roleActivities` | array | 100% | `["determining configurations", …]` |
| `technicalTools` | array | 73% | tools named in the posting |
| `languageRequirements` | array | — | `["English", "Japanese"]` |
| `bachelorsDegreeRequirement` | string | — | `Preferred` |
| `publishedDate` | string | 100% | `2026-07-03T07:19:32.000Z` |
| `yearlyMinCompensation` / `yearlyMaxCompensation` | integer | **12%** | salary range where published |
| `compensationCurrency` | string | — | `USD` |
| `companyEmployees` | integer | 95% | `19000` |
| `companyIndustries` | array | 96% | `["Semiconductor Equipment", …]` |
| `companyFoundedYear` | integer | 99% | `1980` |
| `companyType` | string | 96% | `Public` |
| `companyStockSymbol` | string | — | `LRCX` |
| `companyWebsite` | string | 96% | `lamresearch.com` |
| `companyTagline` / `companyHqCountry` | string | — | — |
| `sourceSystem` | string | 100% | `eightfold` |
| `jobId` / `searchQuery` / `scrapedAt` | string | 100% | — |

Fill rates are measured across a real 117-row page, not estimated. **Salary is the honest weak
spot at 12%** — most employers do not publish a range, and no scraper can supply what was never
posted.

### Use cases

- **Recruitment market research** — see who is hiring for a role, with company size and industry on the same row.
- **Competitor hiring signals** — track what a set of companies recruits for over time; hiring leaks strategy early.
- **Sales prospecting on hiring intent** — a company hiring for what you sell into has budget and intent, and the firmographics tell you if it is worth a call.
- **Job board and newsletter content** — populate a niche board filtered by seniority, workplace type and location.
- **Labour market analysis** — measure demand by seniority, remote versus on-site, and required tools across an industry.

### Integration examples

**JavaScript**

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('sian.agency/hiring-cafe-jobs-scraper').call({
    searchQuery: 'machine learning engineer',
    maxPages: 3,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
const startups = items.filter((j) => j.companyEmployees && j.companyEmployees < 200);
console.log(`${startups.length} roles at companies under 200 people`);
```

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("sian.agency/hiring-cafe-jobs-scraper").call(run_input={
    "searchQuery": "data engineer",
    "maxPages": 3,
})

jobs = list(client.dataset(run["defaultDatasetId"]).iterate_items())
remote = [j for j in jobs if j.get("workplaceType") == "Remote"]
print(f"{len(remote)} remote roles of {len(jobs)}")
```

**cURL**

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~hiring-cafe-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQuery":"product manager","maxPages":2}'
```

**Automation workflows** — run it as a step in n8n, Make or Zapier through Apify's connectors. A
common pattern is a weekly schedule that pulls a role, filters to companies in your target size
band, and pushes new employers into a CRM.

### FAQ

**Do I get salary data?**
Sometimes — about 12% of roles publish a range, because most employers do not. The currency is
recorded when a range is listed and the range is left empty when it is not.

**What company data comes with each job?**
Name, website, employee count, industries, founding year, organization type, and stock ticker where
the company is public. That block is filled on 95–100% of rows.

**How many jobs does one run return?**
About 117 per page. Set the page count and a maximum; the run stops at whichever it hits first.

**Are expired roles included?**
Not by default, so you only pay for roles still open. Turn the option on for historical analysis.

**Where do the listings come from?**
They are aggregated from employers' own applicant tracking systems. Every row records which system
it came from and links to the real application page.

**Can I filter by location or seniority?**
Search by keyword, then filter the output on the location, seniority, workplace type and commitment
fields every row carries.

**Will the same job appear twice?**
Not in one run. A role aggregated under two source systems is de-duplicated before anything is
charged, so you pay once.

### Troubleshooting

| What you see | What it means | What to do |
|---|---|---|
| No jobs, run succeeded | The keyword genuinely matched nothing open | Try a broader keyword, or switch on expired roles |
| `Search keyword is empty` | Rejected before anything was charged | Provide a title, skill or discipline |
| `Pages to fetch must be a whole number between 1 and 25` | Out of range | Use 1–25; each page is ~117 jobs |
| Salary columns mostly empty | Expected — only ~12% of employers publish a range | Filter to rows where the range exists |
| Fewer rows than expected on a free plan | Free Apify accounts are capped at 25 rows per run | Add credits or a payment method to lift the cap |
| `Job search is temporarily unavailable` | The source was briefly unreachable; the run already retried | Re-run in a few minutes |

### Legal

This Actor collects only publicly listed job vacancies and the public company information
published alongside them. It does not log in, does not bypass authentication, and does not collect
personal data about applicants or recruiters.

All company names, trademarks and job listings belong to their respective owners. This tool is not
affiliated with, endorsed by or sponsored by any employer or job platform. You are responsible for
ensuring your use of the data complies with applicable law and the source's terms.

### Support

- 🐛 **Issues:** https://apify.com/sian.agency/hiring-cafe-jobs-scraper/issues
- ⭐ **Reviews:** https://apify.com/sian.agency/hiring-cafe-jobs-scraper/reviews
- 🌐 **More actors:** https://apify.com/sian.agency?fpr=sian
- 🚀 **New to Apify?** https://apify.com/pricing?fpr=sian

Related job actors: [Indeed Jobs Scraper](https://apify.com/sian.agency/indeed-jobs-scraper),
[Seek Jobs Scraper](https://apify.com/sian.agency/seek-jobs-scraper),
[Dice Jobs Scraper](https://apify.com/sian.agency/dice-jobs-scraper),
[ZipRecruiter Jobs Scraper](https://apify.com/sian.agency/ziprecruiter-jobs-scraper),
[Naukri Jobs Scraper](https://apify.com/sian.agency/naukri-jobs-scraper).

### Keywords for LLM Discovery

jobs api, job scraper, job board api, job listings api, scrape job postings, job postings data,
hiring data api, recruitment data api, company hiring data, job market data, applicant tracking
system data, ats job feed, hiring intent data, company firmographics, employer data, job feed api,
remote jobs data, seniority level data, tech job listings, engineering jobs data, talent market
research, recruiting intelligence, competitor hiring analysis, sales prospecting data, job
aggregator api, vacancy data, structured job data, workforce analytics data, labour market
dataset, job requirements data, salary range data, job posting enrichment

# Actor input Schema

## `operation` (type: `string`):

One search returns about 117 jobs per page, each with the role, the employer and that employer's firmographics.

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

What to search for — a job title, skill or discipline, for example engineer, product manager or data scientist. Leave broad to survey a market, narrow to shortlist.

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

How many result pages to walk. Each page returns roughly 117 jobs, so two pages is about 235 roles.

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

Upper bound on jobs returned, and therefore on what a run can charge. Reached before the page limit if you set it low.

## `includeExpired` (type: `boolean`):

Off by default, so you only pay for roles that are still open. Turn on to include closed listings for historical analysis.

## Actor input object example

```json
{
  "operation": "jobSearch",
  "searchQuery": "engineer",
  "maxPages": 2,
  "maxResults": 200,
  "includeExpired": false
}
```

# Actor output Schema

## `hiringCafeJob` (type: `string`):

Every job this run returned.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "jobSearch",
    "searchQuery": "engineer",
    "maxPages": 2,
    "maxResults": 200,
    "includeExpired": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/hiring-cafe-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 = {
    "operation": "jobSearch",
    "searchQuery": "engineer",
    "maxPages": 2,
    "maxResults": 200,
    "includeExpired": False,
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/hiring-cafe-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 '{
  "operation": "jobSearch",
  "searchQuery": "engineer",
  "maxPages": 2,
  "maxResults": 200,
  "includeExpired": false
}' |
apify call sian.agency/hiring-cafe-jobs-scraper --silent --output-dataset

```

## MCP server setup

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