# Closed Jobs Feed: Jobs Removed from 11,700+ Career Sites (`dododata/closed-jobs-feed`) Actor

Jobs removed from 11,700+ company career sites (Greenhouse, Ashby, Lever, Personio, SmartRecruiters, Teamtailor, Recruitee) at each index refresh: ids and links to delete stale listings.

- **URL**: https://apify.com/dododata/closed-jobs-feed.md
- **Developed by:** [Dodo Data](https://apify.com/dododata) (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 $0.10 / 1,000 closed jobs

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?

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

## Closed Jobs Feed: Jobs Removed from 11,700+ Career Sites

Jobs removed from 11,700+ company career sites (Greenhouse, Ashby, Lever, Personio, SmartRecruiters, Teamtailor, Recruitee) at each index refresh: ids, titles and links to delete stale listings. The refresh of **2 November 2026** found **1,687 jobs closed** at **300 companies**: 734 on Lever, 556 on SmartRecruiters, 266 on Greenhouse, 124 on Ashby and 7 on Personio, out of an index of 469,712 open jobs from 9,356 career sites.

### In one minute

- **What you get:** one JSON row per closed job: its `id`, the career-page system, the company's board name, the employer's posting address, the job's title and company name as last listed, the dates the index first and last listed it, and `closed_on`, the date of the index refresh that no longer found it. The `id` is the same as in [Career Site Jobs Search](https://apify.com/dododata/career-jobs-search), so you can delete exactly the jobs you took from it.
- **What it costs:** a start fee of $0.02 per run at the default 1 GB of memory (one more for each extra GB) plus $0.10 per 1,000 closed jobs. Every job closed by the refresh of 2 November (1,687) costs about $0.19; a run for three companies (294 jobs) about $0.05; every job closed in the seven days to 2 November (31,892, with Max rows raised above 10,000) about $3.21. Refreshes vary: they closed 16,380, 2,566, 9,622, 1,644 and 1,687 jobs on each day from 29 October to 2 November 2026. Apify's free plan includes $5 of usage every month.
- **Try it:** click **Start**. The form comes filled with Greenhouse and Max rows 100, so the first run returns 100 closed jobs for $0.03 (the start fee plus 100 rows). Clear both fields for every job closed by the latest refresh, which is also what a call with no input returns (up to 10,000 rows): on 2 November 2026 that call returned all 1,687 in about 2 seconds.

One real row from the prefilled run of 2 November 2026:

```json
{
  "id": "greenhouse:affirm:7775353003",
  "ats": "greenhouse",
  "company": "affirm",
  "company_name": "Affirm",
  "title": "Model Risk Management Lead, Machine Learning",
  "url": "https://job-boards.greenhouse.io/affirm/jobs/7775353003",
  "first_seen_at": "2026-10-22",
  "last_seen_at": "2026-11-01",
  "closed_on": "2026-11-02",
  "scraped_at": "2026-11-02T03:16:06.624Z"
}
```

### What you can filter

| Filter | What it does |
|---|---|
| **Closed within (days)** | closures from the index refreshes of the last N days, 1 to 30, counted in UTC days (1 is today's refresh only, from 00:00 UTC); empty for the latest refresh, whatever its date |
| **Career-page systems** | Greenhouse, Ashby, Lever, Personio, SmartRecruiters, Teamtailor, Recruitee |
| **Companies** | by career-page slug (`1password`, `carvana`), career-page URL (`https://jobs.lever.co/boxlunch`) or system and slug (`lever:boxlunch`) |
| **Max rows** | 1 to 100,000 per run (10,000 when empty; the form starts at 100); it is also your spend cap |

Every filter runs before a row is saved, so you only pay for the closed jobs you get. A system the index does not cover (Workday, for example) returns nothing rather than everything, and Max rows of 0 or a window outside 1 to 30 days stops the run with an input error before any row is charged.

### How to use it

1. If you list jobs from Career Site Jobs Search, keep each job's `id`. Run this Actor after each index refresh and delete the ids it returns.
2. **For a daily routine:** schedule it daily at 04:00 UTC with **Closed within (days)** set to 1. Days are counted in UTC, so a run scheduled before the refresh (at 01:00 UTC, say) would find nothing from today. The index refreshes daily, starting at 02:15 UTC and written by about 03:00 UTC, so each run gets that day's closures once; on a day the refresh does not complete, the run returns nothing and costs only the start fee. The run log names the refresh it read.
3. The index keeps each refresh's closures for 30 days, from 29 October 2026, so **Closed within (days)** set to 7 returns the refreshes of the last seven days, each job once, at its latest closure. Use the `id` to match, rather than the `url`: see below.
4. Download as JSON, CSV or Excel, call it from the API, or let an AI agent call it through Apify's MCP server.

### How it knows a job closed

A private collector reads every board in the index at each refresh. A job counts as closed only when its company's board was read in that refresh and no longer lists it; when a board cannot be read, its jobs are kept for the next refresh rather than reported closed. We checked 87 of the closures of 2 November against the live boards the same morning (20 per system, all 7 on Personio): 86 were gone from the employer's board, and one had been re-posted under a new id and a longer title. On SmartRecruiters a large board can list fewer distinct jobs than it reports while it is being read, because its pages shift; such a board reports no closures in that refresh (11 boards on 2 November), so its live jobs are never reported closed, and a job it really closed that day is not reported at all.

A job re-posted under a new id with the same title, place and requisition number is not a closure: the refresh of 2 November found 309 of them, and the new id keeps the first-seen date. Some employers do this daily at scale: 5,979 such false closures, 30% of the 19,811 first recorded for 30 October to 1 November, were removed from the records on 1 November.

A board that has gone (it answers 404) or now lists no jobs at all closes every job it had in that refresh. The refresh of 2 November 2026 read 9,695 boards in full and 11 in part, and found 1,022 gone; it failed on none.

A job that closes and is later listed again counts as a new job: it gets a new `first_seen_at`, and its earlier closure stays in the rows of that day.

`url` is the last address the index listed for the job (built from the `id` the way the index builds it, when a record keeps no address). For Ashby, Lever, Personio and SmartRecruiters it is the posting on the system's own board. For Greenhouse about three in four (74% of the closures of 2 November) are on a Greenhouse board and the rest on the employer's own careers site. That is why `id` is the safer key.

`company_name` is empty for Lever and Ashby, whose listings carry no display name, and on a few Personio boards (3 of 7 on 2 November). `title`, `first_seen_at` and `last_seen_at` are empty only for a job closed and listed again the same day; on 2 November none was.

### What we deliberately do not collect

- No text of a removed posting: the rows carry ids, names of boards, dates and links, nothing the employer took down.
- No personal data, nothing behind a login, no candidate data, no tracking.
- This Actor declares **limited permissions**: it can only write to its own storages on your account.

### Ten real rows

Two per system, from the run of 2 November 2026 with no input (build 0.1.6, the index refresh of the same day):

```json
[
  {
    "id": "ashby:kalshi:346145cd-5542-45fe-93f6-066f64619963",
    "ats": "ashby",
    "company": "kalshi",
    "company_name": null,
    "title": "Senior Accountant",
    "url": "https://jobs.ashbyhq.com/kalshi/346145cd-5542-45fe-93f6-066f64619963",
    "first_seen_at": "2026-10-22",
    "last_seen_at": "2026-11-01",
    "closed_on": "2026-11-02",
    "scraped_at": "2026-11-02T03:16:01.077Z"
  },
  {
    "id": "ashby:clera:5e268976-cfd4-4518-af69-9f7210872667",
    "ats": "ashby",
    "company": "clera",
    "company_name": null,
    "title": "Applied AI Engineer",
    "url": "https://jobs.ashbyhq.com/clera/5e268976-cfd4-4518-af69-9f7210872667",
    "first_seen_at": "2026-10-26",
    "last_seen_at": "2026-11-01",
    "closed_on": "2026-11-02",
    "scraped_at": "2026-11-02T03:16:01.077Z"
  },
  {
    "id": "greenhouse:payoneer:8169291",
    "ats": "greenhouse",
    "company": "payoneer",
    "company_name": "Payoneer",
    "title": "Card Processing Expert",
    "url": "https://www.payoneer.com/careers/position/8169291/?gh_jid=8169291",
    "first_seen_at": "2026-10-22",
    "last_seen_at": "2026-11-01",
    "closed_on": "2026-11-02",
    "scraped_at": "2026-11-02T03:16:01.077Z"
  },
  {
    "id": "greenhouse:artefactlinkedin:8819682002",
    "ats": "greenhouse",
    "company": "artefactlinkedin",
    "company_name": "LinkedIn Job Wrapping",
    "title": "AI Strategist - China Campus Recruitment 2027",
    "url": "https://job-boards.greenhouse.io/artefactlinkedin/jobs/8819682002",
    "first_seen_at": "2026-10-26",
    "last_seen_at": "2026-11-01",
    "closed_on": "2026-11-02",
    "scraped_at": "2026-11-02T03:16:01.077Z"
  },
  {
    "id": "lever:bluelightconsulting:69b46cb3-ed28-40ef-a6bf-1a78253814fb",
    "ats": "lever",
    "company": "bluelightconsulting",
    "company_name": null,
    "title": "Full Stack Laravel + React Developer - Remote, Latin America",
    "url": "https://jobs.lever.co/bluelightconsulting/69b46cb3-ed28-40ef-a6bf-1a78253814fb",
    "first_seen_at": "2026-10-22",
    "last_seen_at": "2026-11-01",
    "closed_on": "2026-11-02",
    "scraped_at": "2026-11-02T03:16:01.077Z"
  },
  {
    "id": "lever:shieldai:247d37ed-a7fd-4e2a-94ce-28902ab26fbd",
    "ats": "lever",
    "company": "shieldai",
    "company_name": null,
    "title": "Senior Staff Deep Learning Engineer (R5675)",
    "url": "https://jobs.lever.co/shieldai/247d37ed-a7fd-4e2a-94ce-28902ab26fbd",
    "first_seen_at": "2026-10-22",
    "last_seen_at": "2026-11-01",
    "closed_on": "2026-11-02",
    "scraped_at": "2026-11-02T03:16:01.077Z"
  },
  {
    "id": "personio:kuhler-and-partners.com:2620738",
    "ats": "personio",
    "company": "kuhler-and-partners",
    "company_name": null,
    "title": "Clinical Internship Amsterdam 1 February 2027 - 31 August 2027",
    "url": "https://kuhler-and-partners.jobs.personio.com/job/2620738",
    "first_seen_at": "2026-10-26",
    "last_seen_at": "2026-11-01",
    "closed_on": "2026-11-02",
    "scraped_at": "2026-11-02T03:16:01.077Z"
  },
  {
    "id": "personio:wfv.de:2832713",
    "ats": "personio",
    "company": "wfv",
    "company_name": "Württembergischer Fußballverband e.V.",
    "title": "Regionalmanager Süd (m/w/d)",
    "url": "https://wfv.jobs.personio.de/job/2832713",
    "first_seen_at": "2026-10-26",
    "last_seen_at": "2026-11-01",
    "closed_on": "2026-11-02",
    "scraped_at": "2026-11-02T03:16:01.077Z"
  },
  {
    "id": "smartrecruiters:bew:744000157764622",
    "ats": "smartrecruiters",
    "company": "bew",
    "company_name": "BEW Berliner Energie und Wärme GmbH",
    "title": "Cloud Engineer – Azure Local & Enterprise Backup Solutions (w/m/d)",
    "url": "https://jobs.smartrecruiters.com/bew/744000157764622",
    "first_seen_at": "2026-10-29",
    "last_seen_at": "2026-11-01",
    "closed_on": "2026-11-02",
    "scraped_at": "2026-11-02T03:16:01.077Z"
  },
  {
    "id": "smartrecruiters:hatohonestjohn:6000000001404830",
    "ats": "smartrecruiters",
    "company": "hatohonestjohn",
    "company_name": "Hato Hone St John",
    "title": "Ambulance & Events Volunteer - Te Manawaroa Pathway",
    "url": "https://jobs.smartrecruiters.com/hatohonestjohn/6000000001404830",
    "first_seen_at": "2026-10-29",
    "last_seen_at": "2026-11-01",
    "closed_on": "2026-11-02",
    "scraped_at": "2026-11-02T03:16:01.077Z"
  }
]
```

### Related Actors

- [Career Site Jobs Search](https://apify.com/dododata/career-jobs-search): search the open jobs of the same index by title, place, remote, pay and date.
- [Career Jobs Feed](https://apify.com/dododata/career-jobs-feed): only the jobs new since your last run, from the same index, each delivered once; schedule it next to this one.
- [Career Page Jobs Scraper](https://apify.com/dododata/career-site-jobs-scraper): read specific companies' career pages live, on ten systems including Workday and SmartRecruiters, with a monitor mode for new, changed and closed jobs.

### Price

**$0.02 per run at up to 1 GB of memory (the default; one more start fee for each extra GB) plus $0.10 per 1,000 closed jobs.** Any change is announced 14 days ahead through Apify, as its rules require, and applies to every user alike.

### Questions and feedback

Something missing, wrong or unclear? Open an Issue on this page: we answer within a day, and fixes usually ship within 48 hours. If the Actor saved you time, a short review here helps other people find it.

### Changelog

- 2026-11-04: Teamtailor and Recruitee joined the index in the refresh of 4 November 2026 (18,605 Teamtailor and 23,260 Recruitee jobs; 511,622 jobs from 11,768 career sites in all), and **Career-page systems** lists both. That refresh was the first to read them, so their closures start with the next one.
- 2026-11-02, v0.1.7: every figure on this page re-measured on Apify from the refresh of 2 November, after the index stopped counting re-posted jobs as closed (5,979 removed from the records of 30 October to 1 November).
- 2026-10-31, v0.1.5: under a maximum cost per run, the run reports the rows Apify really saved and says the cost limit stopped it (a $0.03 cap with Max rows 1,000 saved 100 rows and used to report 1,000).
- 2026-10-31, v0.1.2: SmartRecruiters closures served. The index has carried SmartRecruiters since 29 October; before this build its closures (6,875 of 12,887 on 31 October) were left out. Rows carry title, company name and dates from the dated closure records, kept 30 days from 29 October 2026. The figures on this page were measured on Apify the same day.
- 2026-10-27, v0.1: first build, tested locally against the index refresh of 27 October 2026 (6,570 closed jobs). Before publishing: a system the index does not cover returns nothing, Max rows of 0 and a window outside 1 to 30 days are input errors, a failed read of the index's record list stops the run instead of serving a shorter window, default memory 1 GB, and the history is read one refresh at a time.

# Actor input Schema

## `closedWithinDays` (type: `integer`):

Jobs closed by the index refreshes of the last N days, 1 to 30, counted in UTC days (1 is today's refresh only, from 00:00 UTC). Empty for the latest refresh only, whatever its date.

## `systems` (type: `array`):

Keep closed jobs from these systems only. Empty for all. The form starts with Greenhouse for a quick first look; clear it for every system.

## `companies` (type: `array`):

Keep closed jobs from these companies only, by career-page slug (1password, stripe), career-page URL (https://jobs.lever.co/spotify) or system and slug (lever:spotify). Empty for all.

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

Newest closures first, up to this many (1 to 100,000). It is also your spend cap. The form starts at 100 for a quick first look; left empty, it is 10,000.

## Actor input object example

```json
{
  "systems": [
    "greenhouse"
  ],
  "maxItems": 100
}
```

# Actor output Schema

## `results` (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 = {
    "systems": [
        "greenhouse"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("dododata/closed-jobs-feed").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 = {
    "systems": ["greenhouse"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("dododata/closed-jobs-feed").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 '{
  "systems": [
    "greenhouse"
  ],
  "maxItems": 100
}' |
apify call dododata/closed-jobs-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dododata/closed-jobs-feed"
        }
    }
}
```

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/SocHoT124bG9wgcDf/builds/R37XFztXvcTCQjxzO/openapi.json
