# Career Feed: Greenhouse, Lever & Ashby (`burnzzz/career-feed-change-tracker`) Actor

Unofficial tool, not affiliated with Greenhouse, Lever or Ashby. Collect public jobs in a consistent format. Track additions and changes, confirm removals across two complete observations, and preserve prior state during board failures. Includes source URLs and available compensation.

- **URL**: https://apify.com/burnzzz/career-feed-change-tracker.md
- **Developed by:** [burnzzz Tools](https://apify.com/burnzzz) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 job delivereds

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

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

### What does Career Feed do?

Unofficial tool. Not affiliated with Greenhouse, Lever or Ashby.

Get public company job postings in one consistent format for a job board, hiring research workflow, or internal careers dashboard. Retrieve titles, descriptions, locations, departments, source URLs, and compensation where the source supplies structured compensation.

### What makes it useful

- One output shape for three public ATS APIs, including Lever EU.
- Stable job IDs and content fingerprints for baseline, added, changed, and unchanged observations.
- A failed, oversized, or inconsistent board does not erase its previous state.
- A job must be absent from two completed observations before a `no_longer_listed` event is emitted. This means the posting disappeared; it does not prove a role was filled.
- Diagnostics distinguish a genuinely empty board from a failed request.

### Input

```json
{"boards":[{"provider":"ashby","slug":"apify"}]}
```

Supply 1–10 company board identifiers. For Lever EU, add `"region":"eu"`. Use the identifier from the company's published careers URL. No account credentials, proxy, LLM subscription, or applicant data are required.

To compare runs, pass the preceding run's `SNAPSHOT` JSON as `previousSnapshot`. Store and pass that state in your calling automation. State is explicit: this version does not automatically schedule itself or reuse another run's storage.

### Output

The default dataset contains one row per currently listed job. Fields: `id`, `provider`, `companyBoard`, `sourceId`, `title`, `url`, `locations`, `departments`, `description`, `workplaceType`, `employmentType`, `compensation`, `sourceUrl`, `observedAt`, and `change`.

Default key-value-store records:

- `DIAGNOSTICS`: completion or failure for each board, counts, and errors.
- `SNAPSHOT`: fingerprints and pending absences for the next comparison. No job descriptions.
- `CHANGES`: jobs no longer listed after two complete missing observations.
- `DELIVERY`: whether all collected rows were delivered. Spending-limit interruption withholds the new snapshot; retain the preceding one.

Greenhouse compensation is currently null because its list endpoint does not provide the structured detail pay ranges. No salary, remote-work arrangement, or employment type is inferred from text. Compensation is preserved in the source provider's structure.

### Limits and reliability

5,000 jobs per board; 16 MiB per response; 20-second network timeout; Lever pagination deadline 60 seconds; platform run timeout 180 seconds. Failed boards are reported, not retried indefinitely. Redirects are rejected. A source can change during pagination; repeated IDs are detected, but the source APIs do not provide transactional snapshots. Two-observation removal confirmation reduces false disappearance signals; it cannot eliminate upstream errors.

Use boards and data you are entitled to access and use. Public API access does not grant ownership of job descriptions. The tool never submits applications or accesses private recruiting systems.

### Pricing

Launch pricing: $0.005 per run start plus $0.002 per delivered job ($2 per 1,000 jobs). The price shown in Apify Console before starting a run is authoritative. Failed boards do not produce billable job rows. Platform usage is included. At the default 256 MiB memory, one start event applies. Set a maximum spend before starting a run; the default $0.10 limit covers the start and up to 47 jobs. Raise the limit for larger boards.

### How to use Career Feed

1. Enter the company board identifiers in the Input tab.
2. Set your run spending limit and start the Actor.
3. Inspect the Jobs dataset and Source diagnostics.
4. Download the dataset as JSON, HTML, CSV, or Excel. To track changes, pass the SNAPSHOT record into the next run as previousSnapshot.

### Data fields

| Field | Meaning |
| --- | --- |
| id | Stable provider, region, board and posting ID |
| title | Published job title |
| locations | Source locations without geographic inference |
| departments | Published departments and teams |
| description | Plain-text job description |
| compensation | Structured source compensation when supplied |
| change | baseline, added, changed or unchanged |
| observedAt | UTC observation time |
| sourceUrl | Public API used to collect the board |

### Support

Use the Actor Issues tab to report errors, with the provider, public board identifier, and run ID. Exclude passwords, tokens, resumes and applicant information. This Actor supports public listings from the three named providers; it does not search arbitrary career sites.

Official API references: [Greenhouse](https://docs.greenhouse.io/job-board.html), [Lever](https://github.com/lever/postings-api), [Ashby](https://developers.ashbyhq.com/docs/public-job-posting-api).

# Actor input Schema

## `boards` (type: `array`):

1–10 objects: provider (greenhouse, lever, ashby), slug, and optional Lever region (global or eu).

## `previousSnapshot` (type: `object`):

Optional SNAPSHOT JSON from the preceding run. Without this, jobs are baseline observations. Feed this forward in your automation to track changes.

## Actor input object example

```json
{
  "boards": [
    {
      "provider": "ashby",
      "slug": "apify"
    }
  ]
}
```

# Actor output Schema

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

No description

## `diagnostics` (type: `string`):

No description

## `snapshot` (type: `string`):

No description

## `changes` (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 = {
    "boards": [
        {
            "provider": "ashby",
            "slug": "apify"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("burnzzz/career-feed-change-tracker").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 = { "boards": [{
            "provider": "ashby",
            "slug": "apify",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("burnzzz/career-feed-change-tracker").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 '{
  "boards": [
    {
      "provider": "ashby",
      "slug": "apify"
    }
  ]
}' |
apify call burnzzz/career-feed-change-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,burnzzz/career-feed-change-tracker"
        }
    }
}
```

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/KzKp7Mcv74kbhetIM/builds/Pp1vbc1v9ZQZndqh5/openapi.json
