# Company Career-Page Jobs Export (`jj_toolworks/company-career-page-jobs-export`) Actor

Export published jobs from supplied Greenhouse, Lever, and Ashby boards into one schema, with descriptions, source compensation, stable IDs, and explicit board coverage.

- **URL**: https://apify.com/jj_toolworks/company-career-page-jobs-export.md
- **Developed by:** [JJ Toolworks](https://apify.com/jj_toolworks) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 completed results

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?

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-Page Jobs Export

Import published jobs from employer boards on Greenhouse, Lever, and Ashby. Supply the boards you want to monitor and receive a common schema, descriptions, application links, and a coverage row for every input.

### Start a run

```json
{
  "boards": [
    {"provider": "greenhouse", "board": "greenhouse", "label": "Greenhouse public board"}
  ],
  "maxJobsPerBoard": 20,
  "maxJobsTotal": 20,
  "maxScanPerBoard": 500,
  "titleKeywords": []
}
```

`board` accepts a board token or a supported HTTPS board URL. Lever supports US and EU boards (`region: "eu"`, or a `jobs.eu.lever.co` board URL). Optional `clientId` and `label` preserve your own mapping. Repeated board inputs are fetched once. A duplicate board with a different label does not create another copy of every job; use the board identity to join your input mappings.

### Output and useful workflows

Filter `recordType=job` for the paid job results. Each includes `recordId`, source/provider/board identity, your client label, title, location, employment/workplace fields when supplied, `descriptionText`, `descriptionHtml`, `jobUrl`, `applyUrl`, compensation when included in the source response, and fetch/source timestamps. Source descriptions are untrusted HTML; sanitize them before rendering in a website.

Filter `recordType=board_status` to inspect completeness and limits. The `SUMMARY` key-value-store record includes all board statuses. Dataset CSV/JSON exports are available through Apify. Use saved tasks and Apify schedules for employer watchlists, niche job boards, or recruiting research. A company label is your input, not verified legal-entity data.

`complete` means the supported source listing was retrieved and the selected scan/output limits did not omit matching valid jobs. It never means a complete global company inventory. Partial/failed/truncated runs must not be used to infer a job closed. Unknown remote or compensation fields remain unknown. Greenhouse compensation generally needs a separate per-job API request and is not fetched in this base version. Greenhouse prospect posts and Ashby jobs without `isListed=true` are excluded.

### Bounds and charging

One event per distinct published job emitted in a run. Duplicate jobs, duplicate boards, empty results, failed-board records, and summary/status rows are unbilled. Filtering can still require retrieving many source records; use `maxScanPerBoard` to bound work. Selected limits can yield a valid truncated result. A run does not retry failed pages automatically.

Hard limits: 50 boards, 1,000 jobs/board, 5,000 jobs/run, 5,000 scanned source records/board, and 8 MiB per source response. Lever fetches 100-record pages with a bounded look-ahead; Greenhouse and Ashby return bounded complete list responses. Malformed/oversized responses are reported instead of silently becoming empty boards.

This Actor reads public job-board APIs. It does not collect applicants or submit applications. Supported-source documentation: [Greenhouse](https://docs.greenhouse.io/job-board.html), [Lever](https://github.com/lever/postings-api), and [Ashby](https://developers.ashbyhq.com/docs/public-job-posting-api). Published source data, API availability, and customer redistribution rights can vary; retain original links and use the data within your permitted workflow.

### Price and run controls

The launch price is **$2 per 1,000 completed units** ($0.002 per event), as defined above. Check the current Pricing tab before running. Status and duplicate rows do not add this custom event. Set a maximum charge appropriate for your batch; a run stops when its event budget is exhausted. `RUN-SUMMARY` records actual accepted events and execution totals.

Automatic replay of an interrupted run is disabled to prevent duplicate charges. Keep the available output, then start a new run for a new execution. A later run is a new billable execution. Completed dataset rows and individually saved files remain available when a budget stops a run. Combined exports, manifests, and snapshots assembled at the end may be absent after a budget stop or interruption; use a sufficient run budget when you need those aggregate files. The initial release uses documented input limits and public source access; external source changes can require maintenance.

# Actor input Schema

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

1–50 objects with provider (greenhouse, lever, ashby), board (token or supported HTTPS board URL), optional label/clientId and Lever region (us/eu).

## `maxJobsPerBoard` (type: `integer`):

Maximum jobs per board. See the input example and README for supported values.

## `maxJobsTotal` (type: `integer`):

Maximum jobs per run. See the input example and README for supported values.

## `maxScanPerBoard` (type: `integer`):

Bounds pagination even when title filters exclude most jobs. Large complete source responses also have an 8 MiB limit.

## `titleKeywords` (type: `array`):

Case-insensitive OR matching on the published job title. Blank means all titles. Does not search the global job market.

## Actor input object example

```json
{
  "boards": [
    {
      "provider": "greenhouse",
      "board": "greenhouse",
      "label": "Greenhouse public board"
    }
  ],
  "maxJobsPerBoard": 5,
  "maxJobsTotal": 5,
  "maxScanPerBoard": 100,
  "titleKeywords": []
}
```

# Actor output Schema

## `results` (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 = {
    "boards": [
        {
            "provider": "greenhouse",
            "board": "greenhouse",
            "label": "Greenhouse public board"
        }
    ],
    "maxJobsPerBoard": 5,
    "maxJobsTotal": 5,
    "maxScanPerBoard": 100,
    "titleKeywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("jj_toolworks/company-career-page-jobs-export").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": "greenhouse",
            "board": "greenhouse",
            "label": "Greenhouse public board",
        }],
    "maxJobsPerBoard": 5,
    "maxJobsTotal": 5,
    "maxScanPerBoard": 100,
    "titleKeywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("jj_toolworks/company-career-page-jobs-export").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": "greenhouse",
      "board": "greenhouse",
      "label": "Greenhouse public board"
    }
  ],
  "maxJobsPerBoard": 5,
  "maxJobsTotal": 5,
  "maxScanPerBoard": 100,
  "titleKeywords": []
}' |
apify call jj_toolworks/company-career-page-jobs-export --silent --output-dataset

```

## MCP server setup

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

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/QxaotsAwLCnSSxITb/builds/o8Ha1v8TZgbSVOKYq/openapi.json
