# Direct Company Job Search API | Glassdoor Alternative (`khadinakbar/glassdoor-alternative`) Actor

Collect current public job postings from the Greenhouse and Lever career boards you choose. Returns structured, source-linked jobs without scraping Glassdoor or claiming to replace its reviews, salaries, or broad discovery suite.

- **URL**: https://apify.com/khadinakbar/glassdoor-alternative.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Jobs, Automation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 direct company job postings

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/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

## Glassdoor Alternative: Direct Company Jobs

Collect current public job postings from the Greenhouse and Lever career boards you choose, then receive one source-linked, structured dataset row per opening. It is designed for applicants, recruiting teams, and job-market researchers who already know the employers they want to track and need direct application URLs, location, department, employment type, and collection time without parsing a dashboard.

### Best fit and scope

Use this focused workflow when you want to follow openings at selected companies that use Greenhouse or Lever. Start with a short list of public board URLs, export the matching postings, then pass the direct application URLs into your tracker, alerting workflow, or candidate-research process.

This Actor deliberately covers the direct-company job-collection step. Glassdoor remains the broader choice when employee reviews, salary data, employer ratings, anonymous company discovery, or its wider job-search experience matters. This Actor is designed as a focused standalone workflow for selected-company career-board tracking.

### Focused standalone workflow

This Actor is designed as a focused standalone workflow: selected public company boards in, source-linked current openings out. It gives an application tracker or research process a clear next handoff without asserting that one job source fits every career decision.

### How this bounded workflow compares with Glassdoor

| Decision point | This Actor | Glassdoor best fit |
| --- | --- | --- |
| Scope | Current openings from the Greenhouse and Lever boards you select. | Broad job discovery, employee reviews, salary data, ratings, and company profiles. |
| Billing | $0.005 per validated saved posting, a $0.00005 start event, and separate platform usage. | Review current Glassdoor terms for the specific product and workflow. |
| Output | Direct application URL, selected board URL, provider, and collection time on every saved row. | Broader product experience and data types beyond direct-board collection. |
| Input | Explicit company career-board URLs, making a repeatable tracker input. | Search and discovery when the employer list is not known yet. |
| Effective efficiency | One bounded source-linked row is ready to pass to a tracker; a same-job timing comparison awaits an authorized export test. | A full comparison benefits from an authorized same-job export and timing test. |
| Integrations and automation | Structured dataset/API output supports a repeatable saved input; private cloud schedule and webhook evidence is still pending. | Confirm the integrations and automation available for the required Glassdoor product. |
| Freshness | The Actor requests each selected public board during the run and records `collectedAt`. | Confirm the source and freshness needs of the intended Glassdoor workflow. |

This is a scope tradeoff, not a universal comparison or a relative-cost claim. It is useful for selected-company monitoring; Glassdoor remains the better route for the broader jobs-and-employer research workflow.

### A practical workflow

An applicant tracking engineering roles at a few chosen companies starts with their public Greenhouse and Lever board URLs. They add an optional keyword such as `software engineer`, select `remoteOnly` when needed, and set a small result cap for a first run. The Actor fetches each provider’s public posting feed, validates every row, filters it locally, and saves each usable job with its original board and direct apply URL.

Next, they can schedule the same input, compare the new dataset to a previous run, and feed selected job URLs into a personal application tracker. The source URL and collection time let a downstream workflow confirm where and when every record was observed.

### Quick start

```json
{
  "sources": [
    { "url": "https://boards.greenhouse.io/stripe", "companyName": "Stripe" },
    { "url": "https://jobs.lever.co/example-company", "companyName": "Example Company" }
  ],
  "keywords": ["software engineer"],
  "location": "",
  "remoteOnly": true,
  "includeDescription": false,
  "maxResults": 25
}
```

Provide one or more `sources` with public board URLs in exactly these forms:

- `https://boards.greenhouse.io/BOARD`
- `https://jobs.lever.co/BOARD`

Use `keywords` for a local text filter over title, department, location, and Greenhouse descriptions. Lever listing rows are filtered from their public title and category fields. Leave it empty to collect all available postings from the selected boards. `location` is a literal text filter; it does not geocode, infer visa eligibility, or expand a city into nearby regions.

### Data you receive

Every persisted row is one validated public job posting. When `includeDescription` is off, the `description` field remains `null` so agent and spreadsheet exports stay concise.

| Field | Meaning |
| --- | --- |
| `companyName` | Caller-supplied company label or selected board identifier. |
| `title` | Public job title. |
| `location` / `workplaceType` | Provider-supplied location and a public remote/hybrid label when present. |
| `department` / `employmentType` | Public team and commitment labels when supplied by the board. |
| `applyUrl` | Direct provider-hosted job or application URL. |
| `sourceUrl` / `provider` | The selected public career board and the API route that supplied the record. |
| `collectedAt` | ISO 8601 collection time for freshness and provenance. |

```json
{
  "jobId": "1234567",
  "companyName": "Stripe",
  "title": "Software Engineer",
  "location": "Remote - US",
  "workplaceType": "Remote",
  "department": "Engineering",
  "employmentType": null,
  "description": null,
  "applyUrl": "https://boards.greenhouse.io/stripe/jobs/1234567",
  "sourceUrl": "https://boards.greenhouse.io/stripe",
  "provider": "greenhouse",
  "collectedAt": "<ISO 8601 collection time>"
}
```

### Pricing

This Actor uses Pay per event (PPE): **$0.005 for each validated job posting saved**, plus a $0.00005 Actor-start event. Apify platform usage is additional and varies with the selected execution configuration; check the live Pricing tab before a production or scheduled rollout.

For example, a bounded run that saves 25 postings has $0.125 in posting events plus the $0.00005 start event and platform usage. Rows rejected as incomplete and terminal diagnostics are not charged as job postings.

### API

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~glassdoor-alternative/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "sources": [{"url":"https://boards.greenhouse.io/stripe","companyName":"Stripe"}],
    "keywords": ["software engineer"],
    "remoteOnly": true,
    "maxResults": 25
  }'
```

### AI agents and automation

The dataset is intentionally small and machine-readable: each job has direct application provenance, a source URL, and a collection timestamp. Via the Apify API and MCP route, an AI agent can call the Actor, inspect `OUTPUT`, and read the dataset before deciding whether a job should enter a tracker.

> Collect remote software-engineering openings from these public Greenhouse and Lever boards. Return the job title, company, public location, direct apply URL, source URL, and collection time. When the filter returns an empty result, report the Actor outcome and use returned rows only.

`OUTPUT.outcome` is `COMPLETE`, `PARTIAL`, `VALID_EMPTY`, `INVALID_INPUT`, `UPSTREAM_FAILED`, or `CONFIG_ERROR`. A valid board with an empty match set is `VALID_EMPTY`; a board-provider outage with an empty usable set is `UPSTREAM_FAILED`; a mix of saved jobs and unavailable boards is `PARTIAL`. `RUN_SUMMARY` adds board-level attempts and safe diagnostic messages for retry decisions.

### Best results

Provide the employer’s canonical public Greenhouse or Lever board URL and begin with a low `maxResults` cap. Use the explicit source URL again in a scheduled run when you want a repeatable monitor. Confirm the direct application page before acting because postings can change between collection and review. For public company reviews, salary research, and Glassdoor-specific pages, use a Glassdoor scraper instead of treating this direct-career-board workflow as a substitute for those data types.

### Builder's note

I designed this Actor around the part of job hunting that benefits most from an API: watching companies you already care about. The public Greenhouse and Lever feeds have stable enough structured fields to preserve source links and timestamps, while keeping the scope honest: selected employers in, their visible job postings out.

### Responsible use

Collect only public career boards you are authorized to access, follow applicable laws and site terms, and respect employer application processes. This Actor is independent and is not affiliated with, associated with, or endorsed by Glassdoor. Glassdoor is a trademark of its owner.

# Actor input Schema

## `sources` (type: `array`):

One to 50 public Greenhouse or Lever board URLs. Supported examples are https://boards.greenhouse.io/openai and https://jobs.lever.co/netflix. Use sources you are authorized to collect from. This Actor does not accept arbitrary URLs, Glassdoor URLs, logins, or private ATS pages.

## `keywords` (type: `array`):

Optional words or phrases that must appear in a job title, department, location, or a Greenhouse description. For example \["software engineer", "machine learning"]. Lever boards are filtered from their public listing fields. Leave empty to return all postings from each selected board. This is local filtering, not an internet-wide job search.

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

Optional location text filter, such as London, New York, or Remote. The Actor checks each provider's public location text and does not geocode or infer eligibility.

## `remoteOnly` (type: `boolean`):

When enabled, keep only postings whose public location or workplace text says remote. Defaults to false. Hybrid jobs are returned only when the provider labels them remote.

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

Include the public Greenhouse job description in each row. Defaults to false for concise agent output; enabling it can make exports much larger. Lever board-listing rows retain their structured title and category fields while description remains null.

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

Hard cap for validated postings persisted in this run. Defaults to 50 and accepts 1 to 500. Each saved posting is billed at $0.005 plus Apify platform usage; use this cap to bound event charges.

## Actor input object example

```json
{
  "sources": [
    {
      "url": "https://boards.greenhouse.io/stripe",
      "companyName": "Stripe"
    }
  ],
  "keywords": [
    "software engineer"
  ],
  "location": "",
  "remoteOnly": false,
  "includeDescription": false,
  "maxResults": 25
}
```

# Actor output Schema

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

One validated posting from each selected public Greenhouse or Lever board.

## `compactOutput` (type: `string`):

Outcome, persisted count, provider failures, and charge counts for agents.

## `runSummary` (type: `string`):

Detailed source, filter, provider, and terminal diagnostics.

# 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 = {
    "sources": [
        {
            "url": "https://boards.greenhouse.io/stripe",
            "companyName": "Stripe"
        }
    ],
    "keywords": [
        "software engineer"
    ],
    "location": "",
    "remoteOnly": false,
    "includeDescription": false,
    "maxResults": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/glassdoor-alternative").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 = {
    "sources": [{
            "url": "https://boards.greenhouse.io/stripe",
            "companyName": "Stripe",
        }],
    "keywords": ["software engineer"],
    "location": "",
    "remoteOnly": False,
    "includeDescription": False,
    "maxResults": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/glassdoor-alternative").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 '{
  "sources": [
    {
      "url": "https://boards.greenhouse.io/stripe",
      "companyName": "Stripe"
    }
  ],
  "keywords": [
    "software engineer"
  ],
  "location": "",
  "remoteOnly": false,
  "includeDescription": false,
  "maxResults": 25
}' |
apify call khadinakbar/glassdoor-alternative --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/glassdoor-alternative"
        }
    }
}

```

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/GZ2N8tQXaSAojsJId/builds/DRlgYt3NaE4zcG4B7/openapi.json
