# Company Jobs Scraper · Greenhouse, Lever, Ashby & 6 More (`agentsgearbox/company-jobs-scraper`) Actor

Every open job on a company's careers page from its domain: Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio, BambooHR and Breezy boards in one schema with salary, remote, department, dates, links. Filters, since-last-run monitoring, free hiring summary. $0.90 per 1,000.

- **URL**: https://apify.com/agentsgearbox/company-jobs-scraper.md
- **Developed by:** [AgentsGearbox](https://apify.com/agentsgearbox) (community)
- **Categories:** Jobs, Lead generation, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.54 / 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 Jobs Scraper

Every open job on a company's careers page, as rows. Give the actor **company domains, careers URLs or job board URLs** and it
finds the board behind the page (**Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio, BambooHR or Breezy**),
reads it through the board's own public API and returns every job in **one schema**: title, department, location and country,
remote or hybrid, employment type, salary when the posting states one, full description, posting date, job and apply links.
Filter by title keywords, location, department, remote and posting date; monitor for new postings with a since-last-run checkpoint.
**$0.90 per 1,000 jobs.** A free `company` record per input reports the board, the number of open jobs and the hiring mix even when you take no jobs. The first 25 jobs each month are free for every account.

### Why this one

| | This actor |
|---|---|
| Any company, not a list of boards | Give it `stripe.com` and it finds the board: links on the site, then the careers page, then a guess from the brand name verified against each board API. Board URLs and `greenhouse:airbnb` shorthands work too. |
| Nine systems, one schema | Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio, BambooHR and Breezy, normalized to the same fields, with each system's quirks handled (Greenhouse's escaped HTML, Lever's split description, SmartRecruiters' paged list and per-job detail, Personio's XML). |
| Salary and remote, where the data allows | Structured salary from Lever, Ashby, Recruitee and Breezy, parsed from the text elsewhere (`$120,000 - $150,000`, `€60k–80k`); remote and hybrid from the board's own flags, then from the location. |
| Filters at the source | Title keywords, locations, departments, remote only and `postedAfter` are applied before anything is charged. |
| Hiring signals for free | One `company` record per input: the board, how many jobs are open, the top departments and locations, how many are remote, the newest posting date. With `maxJobsPerCompany: 1` that is a cheap "is this company hiring, and for what" check across thousands of domains. |
| Monitoring | `onlyNewSinceLastRun` remembers the job IDs already delivered per board and returns only new postings next time. |
| Price | $0.0009 per job, Apify's default $0.00005 start fee. No platform usage charged on top. |

### What people use it for

- **Sales and partnerships**: which of your target accounts are hiring, in which teams, and since when. A new "Head of Data" posting is a buying signal.
- **Recruiting and sourcing**: every open role at the companies you place candidates with, with salaries where the postings state them, refreshed daily.
- **Job boards and aggregators**: structured postings with apply links from companies that use any of the nine systems, deduplicated by job ID.
- **Market and compensation research**: titles, locations, remote share and stated salary ranges across an industry.
- **AI agents**: "what is this company hiring for" as structured data through the Apify MCP server.

### Example tasks

Ready-made configurations you can open, copy and run as they are:

- [Hiring signals: new jobs at your target accounts, daily](https://apify.com/agentsgearbox/company-jobs-scraper/examples/monitor-target-accounts-for-new-jobs): three companies watched daily for new postings with the checkpoint on.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `companies` | array | – | Domains (`stripe.com`), careers URLs, board URLs (`https://jobs.lever.co/palantir`) or shorthands (`greenhouse:airbnb`, `ashby:notion`, `workable:skroutz`, `smartrecruiters:BoschGroup`, `recruitee:bunq`, `personio:demo`, `bamboohr:zapier`, `breezy:breezy-hr`). |
| `keywords` | array | `[]` | Keep jobs whose title contains any of these words. |
| `locations` | array | `[]` | Keep jobs whose location, city or country contains any of these (`Berlin`, `United States`, `Remote`, `DE`). |
| `departments` | array | `[]` | Keep jobs whose department or team contains any of these. |
| `remoteOnly` | boolean | false | Only jobs marked remote. |
| `postedAfter` | string | – | `2026-10-01`, `7d`, `30d`, `12w`. |
| `maxJobsPerCompany` | integer | 200 | Newest first, after the filters. |
| `includeDescription` | boolean | true | Description as text and HTML. SmartRecruiters and BambooHR need one extra request per job for it, which the actor makes. |
| `onlyNewSinceLastRun` | boolean | false | Monitoring mode: only postings not delivered in earlier runs. |
| `checkpointStoreName` | string | `company-jobs-state` | Key-value store for the monitoring state. |
| `proxyConfiguration` | object | none | Not needed for the boards. Useful only when a company's own website blocks datacenter IPs and the board has to be found from the domain. |

```json
{
    "companies": ["airbnb.com", "notion.so", "lever:palantir", "https://careers.smartrecruiters.com/BoschGroup"],
    "keywords": ["engineer", "data"],
    "locations": ["Remote", "United States", "Germany"],
    "postedAfter": "30d",
    "maxJobsPerCompany": 100,
    "includeDescription": true
}
```

### Output

Three record types share one dataset: job rows (no `type` field), one free `company` record per input, and free `error` records.

**Job** ($0.0009). A real row, description shortened:

```json
{
  "company": "Notion",
  "companyDomain": "notion.so",
  "ats": "Ashby",
  "boardUrl": "https://jobs.ashbyhq.com/notion",
  "query": "notion.so",
  "title": "Solutions Consultant, Mid-Market, France",
  "department": "Sales",
  "team": "Solutions Consultant",
  "location": "Paris, France",
  "locations": ["Paris, France"],
  "city": "Paris",
  "country": "France",
  "countryCode": null,
  "remote": false,
  "workplaceType": "hybrid",
  "employmentType": "Full-Time",
  "seniority": null,
  "salaryMin": 174000,
  "salaryMax": 186000,
  "salaryCurrency": "EUR",
  "salaryPeriod": "year",
  "salaryText": "€174,000 - €186,000",
  "descriptionText": "WHO WE ARE\n\nNotion is the collaborative AI workspace where teams and agents think together…",
  "descriptionHtml": "<h1>Who We Are</h1><p>Notion is the collaborative AI workspace…",
  "postedAt": "2026-11-02T12:55:06.411Z",
  "updatedAt": null,
  "url": "https://jobs.ashbyhq.com/notion/14c52e6b-b00b-42b5-96fb-195919ef6bab",
  "applyUrl": "https://jobs.ashbyhq.com/notion/14c52e6b-b00b-42b5-96fb-195919ef6bab/application",
  "language": null,
  "requisitionId": null,
  "jobId": "14c52e6b-b00b-42b5-96fb-195919ef6bab",
  "scrapedAt": "2026-11-02T13:02:11.512Z"
}
```

| Field | Type | Notes |
|---|---|---|
| `company`, `companyDomain`, `ats`, `boardUrl`, `query` | string | The company as the board names it (its slug when the board publishes no name), the domain you gave, the system, the board's page and your input string. |
| `jobId`, `requisitionId` | string | The board's job ID (stable; used by the monitoring checkpoint) and the company's own requisition number when published. |
| `title`, `department`, `team`, `seniority`, `employmentType` | string or null | As the board publishes them; `employmentType` is the board's wording (`Full-time`, `Internship`, `Contract`…). |
| `location`, `locations`, `city`, `country`, `countryCode` | misc | Primary location, every location of the posting, and the parts the board states separately. Codes are ISO 3166-1 alpha-2 when the board gives one. |
| `remote`, `workplaceType` | boolean or null, string or null | `workplaceType` is `remote`, `hybrid` or `onsite` from the board's flag, else from the location text; `remote` is true only for remote. |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryText` | misc | Structured from Lever, Ashby, Recruitee and Breezy; parsed from the description elsewhere (`salaryText` is the matched text). Null when the posting states no salary. |
| `descriptionText`, `descriptionHtml` | string or null | The full posting. Null when `includeDescription` is off; Breezy publishes no descriptions through its API. |
| `postedAt`, `updatedAt` | string or null | ISO 8601 UTC. `postedAt` is the board's first-published, created or released date. |
| `url`, `applyUrl` | string | The job page and the application page. |

**`company`** (free, one per input): `status` is `COMPLETE`, `PARTIAL` (stopped by your spending limit), `EMPTY` or `ERROR`; `stoppedBy` is `maxJobs`, `endOfBoard`, `checkpoint`, `chargeLimit` or `error`; `detectedBy` tells you how the board was found:

```json
{
  "type": "company",
  "query": "airbnb.com",
  "companyName": "Airbnb",
  "companyDomain": "airbnb.com",
  "ats": "Greenhouse",
  "boardSlug": "airbnb",
  "boardUrl": "https://boards.greenhouse.io/airbnb",
  "careersUrl": "https://www.airbnb.com/careers",
  "detectedBy": "domain guess, verified against the board API",
  "jobsOnBoard": 202,
  "jobsMatched": 202,
  "jobsScraped": 100,
  "departments": [{"name": "Engineering", "count": 61}, {"name": "Community Support", "count": 23}],
  "locations": [{"name": "United States", "count": 88}, {"name": "Japan", "count": 11}],
  "remoteJobs": 156,
  "newestPostedAt": "2026-11-02T08:52:24.000Z",
  "status": "COMPLETE",
  "stoppedBy": "maxJobs",
  "note": null
}
```

**`error`** (free): `{"type": "error", "query": "acme.com", "error": "acme.com: a careers page was found but no supported job board behind it. Supported: Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio, BambooHR, Breezy. You can also pass the board URL directly."}`

### Pricing and cost examples

**Try it free.** The first 25 jobs each calendar month are free for every Apify account, with nothing to enter: the actor keeps count in a small key-value store in your account (`free-slice-company-jobs-scraper`) and charges only from the 26th on. The free results are real results you keep; the counter resets on the first of each month.

| Job | Jobs | Cost |
|---|---|---|
| "Is this company hiring, and for what?" across 2,000 domains (`maxJobsPerCompany: 1`; the free company records carry the counts) | 2,000 | $1.80 |
| Daily monitor of 50 target accounts, only new postings, about 3 a day each | 150 a day | $0.14 a day |
| Every engineering job at 100 companies, with descriptions | 5,000 | $4.50 |
| A full market snapshot: 500 companies, 200 jobs each | 100,000 | $90 |

Platform compute is included, descriptions too. A company whose board cannot be found costs nothing: the `error` record is free and the start fee is $0.00005.

**Discounts for paid Apify plans**, applied automatically to the buyer's plan: Bronze 10% off, Silver 25% off, Gold and enterprise tiers 40% off the prices above. Free-plan users pay the listed price.

### Monitoring: hiring signals every morning

1. Create a task from this actor with your target companies, the filters you care about (`keywords`, `departments`, `locations`) and `onlyNewSinceLastRun: true`.
2. Add an Apify schedule (daily is plenty; boards change slowly).
3. Add an integration on the task: Slack, e-mail, Google Sheets, Make, Zapier, n8n or a webhook. Each run delivers only postings you have not seen; the `company` records tell you per company whether the run was complete.

The checkpoint is kept per board in the key-value store named in `checkpointStoreName`. To start over, change the name or delete the store.

### Run it from your code

Node.js:

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('agentsgearbox/company-jobs-scraper').call({
    companies: ['airbnb.com', 'notion.so', 'lever:palantir'], keywords: ['engineer'], remoteOnly: true, maxJobsPerCompany: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((i) => i.jobId).map((i) => [i.company, i.title, i.location, i.salaryText, i.url]));
```

Python:

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("agentsgearbox/company-jobs-scraper").call(run_input={
    "companies": ["bosch.com", "skroutz.gr"], "locations": ["Germany", "Greece"], "postedAfter": "30d", "maxJobsPerCompany": 200})
jobs = [i for i in client.dataset(run["defaultDatasetId"]).iterate_items() if "jobId" in i]
```

cURL (synchronous, returns the dataset):

```bash
curl -X POST "https://api.apify.com/v2/acts/agentsgearbox~company-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companies": ["airbnb.com"], "keywords": ["data"], "maxJobsPerCompany": 50, "includeDescription": false}'
```

### For AI agents

Give your agent hands. Careers pages are nine different JavaScript applications; this actor returns their jobs as one JSON schema, priced per job and known in advance. "Is Notion hiring data engineers in Europe, and what do they pay" becomes one tool call.

- **MCP, this actor only:** add `https://mcp.apify.com?tools=agentsgearbox/company-jobs-scraper` to Claude Desktop, Claude Code, Cursor or any MCP client (with your Apify token), then ask for "remote engineering jobs at airbnb.com and notion.so posted in the last 30 days".

* **MCP, all agentsgearbox actors:** `https://mcp.apify.com?tools=agentsgearbox/telegram-channel-scraper,agentsgearbox/google-play-reviews-scraper,agentsgearbox/substack-scraper,agentsgearbox/google-news-scraper,agentsgearbox/brand-name-generator,agentsgearbox/ai-readiness-audit,agentsgearbox/company-lookup,agentsgearbox/app-intelligence,agentsgearbox/app-store-reviews-scraper,agentsgearbox/company-jobs-scraper,agentsgearbox/apple-podcasts-scraper,agentsgearbox/remote-jobs-scraper`

- **No Apify account?** This actor is eligible for Apify's agentic payments: an agent can buy a spend-capped token through [agi.apify.com](https://agi.apify.com) (x402, MPP or Skyfire) and call the API directly.
- Prices are per job and known in advance, so the agent can set a spending limit; a company without a supported board comes back as a free `error` record, not as a failed run.

### Limitations, stated plainly

- The actor reads nine systems. Companies on Workday, Teamtailor, Jobvite, iCIMS, SuccessFactors, Taleo or Welcome to the Jungle are recognised and reported in the `company` record, but their jobs are not read: those systems publish no documented public job API, and this actor does not reverse-engineer private ones.
- Finding a board from a bare domain works when the site links to its careers page or the board slug equals the brand name. When neither holds, pass the careers or board URL and the actor reads it directly.
- Salary appears only when the posting states one; the text parser catches the common formats and leaves the rest null rather than guessing.
- Breezy's board API publishes no descriptions, and its job pages sit behind a bot check, so Breezy rows have title, location, type, salary text and links only.
- SmartRecruiters boards with thousands of jobs are read newest first; with filters on, the actor pages through the whole board (up to 5,000 jobs) to apply them.
- Postings are written by employers and belong to them. Store and index them freely for your own use, link back to `url`, and do not republish full descriptions as your own content.

### Troubleshooting

| Symptom | Cause and fix |
|---|---|
| `error`: no supported job board | The site runs on a system without a public API, or links to its careers page in a way the actor did not follow. Pass the board URL directly if you know it. |
| `error`: no board named "…" | The slug in your shorthand or URL is wrong. Open the company's careers page and copy the board URL. |
| `jobsMatched: 0` with `jobsOnBoard` > 0 | The filters removed everything; the `company` record's `departments` and `locations` show what the board holds. |
| 0 jobs with the checkpoint on | Nothing new since the last run; `stoppedBy` is `checkpoint`. |
| `status: "PARTIAL"` | Your spending limit for the run was reached. Raise it or lower `maxJobsPerCompany`. |
| `descriptionText` null on SmartRecruiters or BambooHR | The per-job detail request failed; `descriptionStatus` on the row says why. Rerun the company. |

### Track record

- Published 2 November 2026 and tested every day since by an automated run on the Apify platform. The Store's run statistics on this page reflect those runs with a delay of up to a day.
- No browser, so a run cannot fail on Chrome crashes or memory limits; the boards' APIs answer in seconds.
- Every actor from this account is monitored daily, so a change on a board's side is normally fixed the same day.

### More from agentsgearbox

- [Telegram Channel Scraper](https://apify.com/agentsgearbox/telegram-channel-scraper): public Telegram channels as JSON, no API key.
- [Google Play Reviews Scraper](https://apify.com/agentsgearbox/google-play-reviews-scraper): Google Play reviews with replies and versions, any market.
- [Substack Scraper](https://apify.com/agentsgearbox/substack-scraper): Substack posts with full text and comments, custom domains too.
- [Google News Scraper](https://apify.com/agentsgearbox/google-news-scraper): Google News with real publisher URLs and full text.
- [Brand & Business Name Generator](https://apify.com/agentsgearbox/brand-name-generator): brand names verified live on domains, handles and app stores.
- [AI Readiness Audit](https://apify.com/agentsgearbox/ai-readiness-audit): how well AI search engines and agents can read a site: crawler access, llms.txt, structured data, content without JavaScript, scored with fixes.
- [Company Lookup](https://apify.com/agentsgearbox/company-lookup): one row per domain with legal identity and VAT validation, contacts, socials, tech stack, open jobs, apps, news and Wikidata facts.
- [App Intelligence](https://apify.com/agentsgearbox/app-intelligence): App Store and Google Play in one run: search, top charts, full app details and each app's twin on the other store.
- [App Store Reviews Scraper · iOS + Google Play, Any Country](https://apify.com/agentsgearbox/app-store-reviews-scraper): Reviews of any iOS or Android app from both stores in one run: stars, text, version, votes, developer replies, since-last-run checkpoint, rating trend per app..
- [Apple Podcasts Scraper](https://apify.com/agentsgearbox/apple-podcasts-scraper): Apple Podcasts search, charts, episodes with audio links and listener reviews, any country.
- [Remote Jobs Scraper](https://apify.com/agentsgearbox/remote-jobs-scraper): remote jobs from six boards and the Hacker News hiring thread in one schema, deduplicated, only-new mode for alerts.

All of them are pay-per-event, run without a browser, and are compared with their alternatives on [agentsgearbox.com](https://agentsgearbox.com/actors/).

### Support

Open an issue on this actor's Issues tab, usually answered within a day, or email <support@agentsgearbox.com>. More actors and daily comparisons of scrapers for 200+ websites at [agentsgearbox.com](https://agentsgearbox.com).

### Legal and fair use

This actor is an independent tool, not affiliated with Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio, BambooHR or Breezy; their names are used only to say which systems it reads. It uses the job board APIs those systems publish for careers pages, without keys, logins or workarounds, and it stores nothing on your behalf beyond your own Apify datasets. Job postings are public by their employers' intent, so that candidates can find them; keep that intent: link to the posting, do not spam applicants, and do not republish descriptions as your own.

# Actor input Schema

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

One per line: a company domain (`stripe.com`), a careers page URL, a job board URL (`https://jobs.lever.co/palantir`, `https://boards.greenhouse.io/airbnb`) or a board shorthand (`greenhouse:airbnb`, `ashby:notion`, `workable:skroutz`). From a domain the actor finds the board itself: links on the site, then the careers page, then a verified guess from the brand name.

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

Keep only jobs whose title contains any of these words (case-insensitive), for example `engineer`, `sales`, `data`. Empty means all jobs.

## `locations` (type: `array`):

Keep only jobs whose location, city or country contains any of these, for example `Berlin`, `United States`, `Remote`, `DE`.

## `departments` (type: `array`):

Keep only jobs whose department or team contains any of these, for example `Engineering`, `Marketing`.

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

Keep only jobs the board marks as remote (or whose location says so).

## `postedAfter` (type: `string`):

Skip jobs posted before this: an ISO date such as `2026-10-01` or a relative value such as `7d`, `30d`, `12w`. Jobs without a posting date are skipped too when this is set.

## `maxJobsPerCompany` (type: `integer`):

Newest first, after the filters. The free `company` record always reports how many jobs the board has.

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

Full description as text and HTML. Most boards include it in the listing; SmartRecruiters and BambooHR need one extra request per job, which the actor makes for you. Turn off for a lighter dataset.

## `onlyNewSinceLastRun` (type: `boolean`):

For hiring-signal monitoring. Remembers the job IDs already delivered per board in a named key-value store and returns only new postings next time.

## `checkpointStoreName` (type: `string`):

Key-value store that keeps the per-board list of seen job IDs (created automatically in your account). Use different names for independent monitors.

## `proxyConfiguration` (type: `object`):

Not needed: the boards' public APIs answer datacenter requests. Available for company websites that block datacenter IPs when the board has to be found from the domain.

## Actor input object example

```json
{
  "companies": [
    "airbnb.com",
    "https://jobs.ashbyhq.com/notion",
    "lever:palantir"
  ],
  "keywords": [],
  "locations": [],
  "departments": [],
  "remoteOnly": false,
  "maxJobsPerCompany": 200,
  "includeDescription": true,
  "onlyNewSinceLastRun": false,
  "checkpointStoreName": "company-jobs-state"
}
```

# Actor output Schema

## `results` (type: `string`):

Jobs as JSON (one item per job, one schema for every applicant tracking system), plus one free company summary per input and free error records.

# 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 = {
    "companies": [
        "airbnb.com",
        "https://jobs.ashbyhq.com/notion",
        "lever:palantir"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("agentsgearbox/company-jobs-scraper").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 = { "companies": [
        "airbnb.com",
        "https://jobs.ashbyhq.com/notion",
        "lever:palantir",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("agentsgearbox/company-jobs-scraper").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 '{
  "companies": [
    "airbnb.com",
    "https://jobs.ashbyhq.com/notion",
    "lever:palantir"
  ]
}' |
apify call agentsgearbox/company-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

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/pFoSfjP9vHNJKzmMp/builds/Y7uTX2SfffmipHLvd/openapi.json
