# Company Career Jobs - Greenhouse, Lever, Ashby, Workday (`stevenkramp/company-career-jobs`) Actor

Get public jobs from company career boards in one format. Supply board URLs for Greenhouse, Lever, Ashby and Workday. No recruiter contacts or descriptions.

- **URL**: https://apify.com/stevenkramp/company-career-jobs.md
- **Developed by:** [Steven Kramp](https://apify.com/stevenkramp) (community)
- **Categories:** Jobs, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.56 / 1,000 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

## Company Career Site Jobs

Get public company job listings from Greenhouse, Lever, Ashby and Workday in one JSON format for job-board builders, hiring-market analysts and AI agents.

Supply career **board URLs**. This Actor reads the company's public board directly. It does not search an aggregated jobs database, guess a company's ATS, log in, submit applications or collect recruiter contacts.

### Input

| System | Board URL |
| --- | --- |
| Greenhouse | https://job-boards.greenhouse.io/example or https://boards.greenhouse.io/example |
| Lever | https://jobs.lever.co/example or https://jobs.eu.lever.co/example |
| Ashby | https://jobs.ashbyhq.com/example |
| Workday | https://example.wd5.myworkdayjobs.com/en-US/External_Career_Site |

These example company identifiers are fictional. Use a real board URL, not an individual job URL or a company's home page. Workday requires the actual host and site name; its tenant and site configuration are checked against the career page.

```json
{
  "careerUrls": [
    "https://job-boards.greenhouse.io/example",
    "https://jobs.lever.co/example",
    "https://jobs.ashbyhq.com/example",
    "https://example.wd5.myworkdayjobs.com/en-US/External_Career_Site"
  ],
  "maxResults": 100,
  "maxResultsPerCompany": 50,
  "includeWorkdayDetails": false
}
```

careerUrls accepts 1–50 entries, including different systems. Repeated board URLs are deduplicated. Limits apply in input order, after deduplication: 100 jobs globally and per company by default. The maximum global limit is 10,000; the company maximum is 5,000. Explicit empty input fails validation and starts no example requests. The console prefill is a small real-board example.

includeWorkdayDetails adds one request per Workday job for structured locations, employment type and publication date. It defaults to false. Descriptions are excluded in both modes. Details take about one second per Workday job (200 jobs in 3.6 minutes in our test). The default timeout is 30 minutes, so raise it for more than about 1,500 Workday jobs with details.

### Output

One dataset item per unique job within its source board. Jobs on different boards are not merged. Fictional example:

```json
{
  "id": "example-job-123",
  "source": "ashby",
  "company": "example",
  "companyName": null,
  "title": "Platform Engineer",
  "locations": ["Berlin"],
  "departments": ["Engineering"],
  "employmentType": "FullTime",
  "workplaceType": "remote",
  "isRemote": true,
  "createdAt": null,
  "publishedAt": "2026-11-01T09:00:00+00:00",
  "updatedAt": null,
  "postedAtText": null,
  "salaryRanges": [
    {"minimum": "70000.00", "maximum": "90000.00", "currency": "EUR", "interval": "1 YEAR"}
  ],
  "url": "https://jobs.ashbyhq.com/example/example-job-123",
  "applyUrl": "https://jobs.ashbyhq.com/example/example-job-123/application",
  "scrapedAt": "2026-11-02T10:00:00+00:00",
  "detailsStatus": "not-needed"
}
```

Missing fields stay null; missing money is never zero. Amounts are decimal strings rounded to cents for output. company is a board token or Workday tenant, not an inferred legal company name. companyName is returned only when Greenhouse supplies it.

Lever createdAt describes creation, not publication. Relative Workday dates remain in postedAtText; a precise publication date requires structured details. Remote status is taken from explicit fields, never guessed from location text. Standard Workday listings may say only “2 Locations”.

Descriptions, recruiter/contact fields, free metadata, application questions and HTML are not exported. Only named job fields are selected; obvious contact strings are suppressed in text fields. There is no general person-name recognition: employers control titles and location labels.

The key-value record **SUMMARY** reports counts, errors, unprocessed companies, limits, skipped records, detail failures and completeness per board. Errors are not inserted into the jobs dataset. An empty valid board succeeds with zero results; HTTP 404, malformed JSON, robots restrictions and blocks are errors. If every attempted company has errors, the run fails while keeping already saved jobs.

### Limits and access

- Public requests only, using an identified StevenKrampBot user agent. No proxy or browser. robots.txt and Crawl-delay are respected. Unavailable robots files stop access, except ordinary missing/4xx robots responses permitted by the shared parser.
- Redirects are not followed. Moved APIs and Workday boards requiring redirects need corrected supported URLs.
- Greenhouse and Ashby return board lists. Lever is paginated. Workday pages contain at most 20 jobs; total=0 on later pages is not an end condition.
- Workday's public CXS endpoint is undocumented and may change. Some tenants report 2,000 jobs, possibly a source cap. Such runs never claim complete coverage. More reported jobs than returned also triggers a warning.
- Processing is bounded by 1,000 pages per board and a 32 MB response limit. Large runs may stop before the Actor timeout; saved results remain available. SUMMARY explains the stop.
- Tested on Apify on 2 November 2026 at 512 MB, without proxy: one run with a Greenhouse, Lever, Ashby and Workday board returned 1,000 jobs in 45 seconds; peak memory was 71 MB. No success-rate guarantee is made.
- No cross-run incremental state, custom Workday facets, China-specific Workday domains, EU Greenhouse boards or arbitrary custom domains. US and EU Lever URL handling is tested offline; supplied live Lever evidence covers the US endpoint.

### Pricing and cost example

Pay per event: **$0.80 per 1,000 jobs** ($0.0008 per saved job) on the Apify free plan, lower on paid plans (down to $0.56 per 1,000), plus Apify's tiny actor-start fee. Platform usage is included. Only saved jobs are charged: empty boards, errors and skipped records cost nothing. Workday details cost the same per job. The Store page shows the current prices.

Examples: 100 jobs from one board cost about $0.08; 1,000 jobs from four boards cost about $0.80.

How this compares (Apify Store, 2 November 2026, free-plan prices): the most used single-system Greenhouse, Ashby and Workday Actors list $2.00 per 1,000 jobs, and multi-system Actors for Greenhouse, Lever, Ashby and Workday list $1.50–$3.00 per 1,000. If you only need Workday, a Workday-only Actor at $0.10 per 1,000 jobs plus $1 per 1,000 runs is cheaper.

### API

Use your own Apify token in the Authorization header:

```bash
curl --request POST \
  "https://api.apify.com/v2/acts/stevenkramp~company-career-jobs/run-sync-get-dataset-items?memory=512&timeout=300" \
  --header "Authorization: Bearer YOUR_APIFY_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{"careerUrls":["https://jobs.ashbyhq.com/example"],"maxResults":20}'
```

The example company is fictional. Use the synchronous endpoint for small requests. Use asynchronous Actor runs and read SUMMARY for large lists and Workday details.

### Use with AI agents (MCP)

This Actor works as a tool for AI assistants and agents (Claude, ChatGPT, Cursor, VS Code, n8n and other MCP clients) through Apify's hosted MCP server. Add this server URL to your client:

```
https://mcp.apify.com?tools=stevenkramp/company-career-jobs
```

Example: “Get up to 50 public jobs from these Greenhouse and Workday career board URLs. Return locations and employment type, and tell me if any board was incomplete.”

Agent runs are normal Actor runs on your Apify account at the same pay-per-event price.

### Source documentation

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

### More from stevenkramp

Other Actors by the same developer – same quality standards, pay only for results:

**Search & trends**

- [Google Trends Scraper](https://apify.com/stevenkramp/google-trends-scraper) – interest over time, regions, rising queries
- [Keyword Trends Finder](https://apify.com/stevenkramp/keyword-trends-finder) – keyword ideas with trend direction
- [Google News Scraper](https://apify.com/stevenkramp/google-news-scraper) – news articles with real URLs
- [Google Images Scraper](https://apify.com/stevenkramp/google-images-scraper) – full-size image URLs
- [Google Shopping Scraper](https://apify.com/stevenkramp/google-shopping-scraper) – prices and merchants
- [Google Jobs Scraper](https://apify.com/stevenkramp/google-jobs-scraper) – job listings

**Apps**

- [Google Play Store Scraper](https://apify.com/stevenkramp/google-play-store-scraper) – Android app data and rankings
- [Google Play Reviews Scraper](https://apify.com/stevenkramp/google-play-reviews-scraper) – Play Store reviews and ratings
- [Apple App Store Scraper](https://apify.com/stevenkramp/apple-app-store-scraper) – iPhone, iPad and Mac app data
- [Shopify App Store Scraper](https://apify.com/stevenkramp/shopify-app-store-scraper) – Shopify apps and pricing plans

**Research & media**

- [arXiv Papers Scraper](https://apify.com/stevenkramp/arxiv-papers-scraper) – research papers and abstracts
- [Apple Podcasts Scraper](https://apify.com/stevenkramp/apple-podcasts-scraper) – podcasts with latest episodes

**Websites & places**

- [Website SEO Audit](https://apify.com/stevenkramp/website-seo-audit) – broken links, titles, sitemap
- [Germany Neighborhood Profile](https://apify.com/stevenkramp/germany-neighborhood-profile) – German neighborhood rents and vacancy

# Actor input Schema

## `careerUrls` (type: `array`):

Full board URLs for Greenhouse, Lever, Ashby or Workday. One company or a mixed list; no company-name guessing.

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

Global limit after deduplication. Empty/error records are never charged.

## `maxResultsPerCompany` (type: `integer`):

Limit for each career board, applied in input order after deduplication.

## `includeWorkdayDetails` (type: `boolean`):

One extra request per Workday job for locations, employment type and publication date. Descriptions remain excluded.

## Actor input object example

```json
{
  "careerUrls": [
    "https://job-boards.greenhouse.io/stripe"
  ],
  "maxResults": 10,
  "maxResultsPerCompany": 100,
  "includeWorkdayDetails": false
}
```

# Actor output Schema

## `jobs` (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 = {
    "careerUrls": [
        "https://job-boards.greenhouse.io/stripe"
    ],
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("stevenkramp/company-career-jobs").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 = {
    "careerUrls": ["https://job-boards.greenhouse.io/stripe"],
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("stevenkramp/company-career-jobs").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 '{
  "careerUrls": [
    "https://job-boards.greenhouse.io/stripe"
  ],
  "maxResults": 10
}' |
apify call stevenkramp/company-career-jobs --silent --output-dataset

```

## MCP server setup

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

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/mC9HnqxktSvTHzX5J/builds/5dsyRkHt7QT25DYwF/openapi.json
