# Career Jobs Feed: New Greenhouse, SmartRecruiters, Ashby Jobs (`dododata/career-jobs-feed`) Actor

The jobs that are new since your last run, from about 9,300 company career sites on Greenhouse, Ashby, Lever, Personio and SmartRecruiters. Run it as a feed.

- **URL**: https://apify.com/dododata/career-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 $1.10 / 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

## Career Jobs Feed: New Greenhouse, SmartRecruiters, Ashby Jobs

Only the jobs that are **new since your last run**, from **about 9,300 company career sites** on **Greenhouse**, **Ashby**, **Lever**, **Personio** and **SmartRecruiters**. Schedule it, and every run hands you the jobs this feed has not delivered yet, as clean JSON. No career-page URLs, no company list, no de-duplication on your side. It reads the same index as [Career Site Jobs Search](https://apify.com/dododata/career-jobs-search): 469,340 open jobs on 31 October 2026, refreshed daily.

### In one minute

- **What you get:** one JSON row per new job: title, company, locations, remote flag, employment type, pay range as numbers when the employer publishes one, publish date, the date our index first saw it, the employer's apply link and, if you ask for it, the full text.
- **What it costs:** $1.50 per 1,000 jobs on Apify's free plan, $1.10 on Gold and higher plans, plus a start fee of $0.00005 per GB of memory, one event at the default 1 GB. A run that finds nothing new costs only the start fee. Apify's free plan includes $5 of usage every month.
- **Try it:** click **Start**. The prefilled feed ("data engineer", "analytics engineer") returned **38 new jobs from 31 companies** in about 8 seconds on 31 October 2026, out of 2,300 open jobs that match: about $0.06 on the free plan. Run it again and it returns **0**, because nothing is new until the index refreshes. That is the point.

One real row from that run:

```json
{
    "id": "ashby:virtahealth:714ee3dd-46f5-425a-b19b-a92d948a069b",
    "title": "Senior Analytics Engineer",
    "company": "virtahealth",
    "location": "Remote",
    "country": "USA",
    "workplace_type": "remote",
    "employment_type": "FullTime",
    "salary_min": 161500,
    "salary_max": 209000,
    "salary_currency": "USD",
    "salary_period": "year",
    "posted_at": "2026-10-30T19:03:34.721Z",
    "first_seen_at": "2026-10-31",
    "change_status": "new",
    "apply_url": "https://jobs.ashbyhq.com/virtahealth/714ee3dd-46f5-425a-b19b-a92d948a069b/application"
}
```

### Who it is for

- **A job board or newsletter** that publishes new openings every morning and must never post the same job twice.
- **A recruiter or sourcing team** watching a role, a city or a list of companies, who wants only what appeared since yesterday.
- **A data pipeline or AI agent** that appends new postings to a table on a schedule and wants the de-duplication done before the data arrives.

If you want to search everything that is open right now instead, use [Career Site Jobs Search](https://apify.com/dododata/career-jobs-search): same index, same filters, newest first.

### How "new" works

Every job in the index carries `first_seen_at`, the date our index first listed it. A feed is a name (**Feed name**, `default` unless you change it) plus a memory on your own Apify account: a key-value store called `dododata-feed-<name>` that this Actor creates on the feed's first run.

1. **First run of a feed:** the jobs the index first saw in its latest refresh (**First run: days of new jobs**, 1 by default; up to 3). A feed starts from the latest refreshes; for everything open now, use Career Site Jobs Search.
2. **Every later run:** the jobs first seen since the previous run that this feed has not delivered. Each job comes once per feed; a run that fails part-way may repeat up to 500 of its jobs in the next run.
3. **Max items spreads a large refresh over several runs.** New jobs beyond **Max items** wait and come first in the next run, for as long as the employer still lists them: a job closed before its turn is not sent. Measured on 27 October 2026 with no filters: the latest refresh held 4,929 new jobs; three runs at 1,000, 1,500 and 10,000 returned 1,000, 1,500 and 2,429, which is all 4,929, each id exactly once, and a fourth run returned 0.
4. **Backlog is not news.** When we add career sites to the index, their whole existing job list is "first seen" on that day: on 26 October 2026 the index first saw 98,261 jobs, 94,778 of them on 4,134 career sites it had never read before, and 81,870 of the 98,261 had been posted more than a week earlier. So a job counts as new only if the site posted it at most 7 days before our index first saw it (**Skip backlog older than (days)**; 0 turns this off). In a normal refresh this leaves out about one newly listed job in eight (681 of 5,610 on 27 October 2026, 308 of 2,378 on 23 October): postings re-published on a board the index already read. Set it to 0 to receive them too.
5. **Not every new listing is a new job.** The index keeps the first-seen date when a job is re-posted under a new id with the same title, place and requisition number, and not when one of those changes. Measured on 3 November 2026: the refresh first saw 9,573 listings, and 7,357 remain once these are set aside: 1,245 on two boards that replaced hundreds of listings that day (`jobgether`, `aogarciaagency`; **Exclude companies** drops a board), 641 with the title of a job the same board closed that day, and 330 that had closed earlier and came back. The feed delivers all of them unless your filters drop them.
6. **Several feeds side by side:** use one feed name per schedule or per set of filters. Names that differ only in case, spaces or punctuation (`My Feed`, `my-feed`) are the same feed. Changing the filters of an existing feed applies from that run on; it does not replay the past. **Start this feed over** forgets what a feed delivered (turn it off again afterwards).

The memory is small (155 KB after remembering 10,000 jobs) and stays in your account until you delete the store. Two runs of the same feed cannot overlap: a run started while another run of that feed is still going stops at once, before delivering any job, so it costs only the start fee.

### Filters

The same filters as Career Site Jobs Search, applied before anything is saved, so you only pay for jobs you get:

| Filter                                       | What it does                                                                                                                                  |
| -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| **Title keywords** / **Exclude title words** | a title word that starts with one of these ("engineer" also finds "Engineering Manager"); drop titles with these whole words (senior, intern) |
| **Locations** / **Exclude locations**        | whole words in the location, country or workplace type: `berlin`, `united kingdom`, `us`, `remote`                                            |
| **Remote only** / **Workplace type**         | jobs the employer marks as remote; or remote, hybrid, on-site as marked (most Greenhouse boards mark none)                                    |
| **Companies** / **Exclude companies**        | by name or career-page slug (`stripe`, `Figma`)                                                                                               |
| **Career-page systems**                      | Greenhouse, Ashby, Lever, Personio, SmartRecruiters                                                                                           |
| **Only jobs with a pay range**               | jobs whose pay is in the index (Ashby, Lever, Personio); Greenhouse and SmartRecruiters jobs are read one by one for theirs: see below        |
| **Seniority**                                | as the title states it: intern, junior, senior, lead (staff, principal), director (VP, head of), or no level in the title                     |
| **Employment types**                         | full-time, part-time, contract, intern, temporary; Greenhouse publishes none, so this leaves Greenhouse out                                   |
| **Max jobs per company**                     | empty for a complete feed; a number caps each company per run, and the jobs over it are not sent later                                        |
| **Include full descriptions**                | off by default; on, the full text is fetched live from each employer's board                                                                  |
| **Max items**                                | up to 10,000 per run (1,000 by default); with your **Maximum cost per run** in Apify, it caps what a run costs, and jobs past either wait     |

Measured on 27 October 2026, first runs: "engineer", remote only, senior or lead, Ashby and Lever, excluding India, three days of refreshes, full descriptions on and Max items 40 returned 40 of 490 new jobs from 12 companies, 12 with pay and 39 with full text (the 40th had closed since the refresh), in 31 to 52 seconds; the other 450 waited. "Product manager" with full descriptions on returned 20 of 78 new jobs (Max items 20), all 20 with full text and 16 with pay, in 16 seconds; the other 58 waited for the next run.

**Pay on Greenhouse and SmartRecruiters.** Neither system's job list carries pay, so with **Only jobs with a pay range** on, each new Greenhouse or SmartRecruiters job the feed picks is read for its own pay range (the same polite requests as the full text). A job that states one is delivered; a job that states none is left out, not charged, and remembered, so later runs do not read it again; a job that cannot be read (closed since the refresh) waits for the next run, and is left out if a later refresh still lists it and it still cannot be read. Reads of jobs without pay stop at 4 times the jobs the run can return (Max items, or fewer under your maximum cost per run; at least 200), or after 20 minutes, and the jobs not read yet wait for the next run, with the same companies' jobs held back behind them by Max jobs per company; the run log counts each kind. Measured on 30 October 2026 (local run, first run, "software engineer", Max items 40): 31 jobs read, 20 with pay, and 25 new jobs delivered, all 25 with pay, 20 of them from Greenhouse and SmartRecruiters, in 25 seconds. The second run of that feed read only the one job the first could not read.

### How to schedule it

1. Set your filters and a **Feed name**, and run it once: that run is the feed's first run.
2. In Apify Console, create a **Schedule** for this Actor with the same input, daily after 03:00 UTC.
3. Read each run's dataset, or connect it to Google Sheets, a webhook, Make, Zapier or your own code through the API. AI agents can call it through Apify's MCP server.

The index refreshes every day at about 02:15 UTC and is usually written by 03:00 UTC, so schedule the feed after that: each daily run then returns that day's new jobs once. A run before the day's refresh returns an empty dataset, which costs only the start fee. A whole unfiltered refresh is large: the 4,929 new jobs of 27 October 2026 would cost $7.39 on the free plan and $5.42 on Gold, so on the free plan add filters or keep Max items low and let the rest wait.

**How long it takes:** 6 to 15 seconds a run in our measurements of 31 October 2026, most of it loading the index; 10,000 jobs without descriptions took about 15 seconds (11 to 17 in our runs of 27 October 2026). Full text is fetched politely, at most five requests a second to the job boards (one a second to Lever), so with descriptions on, 1,000 Greenhouse jobs need about three and a half minutes at that rate.

### Three real rows

From the prefilled run of 31 October 2026 (descriptions off, the default):

```json
[
    {
        "id": "ashby:virtahealth:714ee3dd-46f5-425a-b19b-a92d948a069b",
        "ats": "ashby",
        "company": "virtahealth",
        "company_name": null,
        "title": "Senior Analytics Engineer",
        "department": "Product Development",
        "team": "Engineering",
        "location": "Remote",
        "locations": [
            "Remote"
        ],
        "country": "USA",
        "workplace_type": "remote",
        "remote": true,
        "employment_type": "FullTime",
        "experience_level": null,
        "salary_min": 161500,
        "salary_max": 209000,
        "salary_currency": "USD",
        "salary_period": "year",
        "salary_text": null,
        "posted_at": "2026-10-30T19:03:34.721Z",
        "updated_at": null,
        "requisition_id": null,
        "description": null,
        "apply_url": "https://jobs.ashbyhq.com/virtahealth/714ee3dd-46f5-425a-b19b-a92d948a069b/application",
        "url": "https://jobs.ashbyhq.com/virtahealth/714ee3dd-46f5-425a-b19b-a92d948a069b",
        "change_status": "new",
        "first_seen_at": "2026-10-31",
        "last_seen_at": null,
        "scraped_at": "2026-10-31T04:26:45.510Z",
        "salary_source": "description"
    },
    {
        "id": "greenhouse:anthropic:5464234008",
        "ats": "greenhouse",
        "company": "anthropic",
        "company_name": "Anthropic",
        "title": "Data Engineer",
        "department": null,
        "team": null,
        "location": "San Francisco, CA | New York City, NY; Seattle, WA",
        "locations": [
            "San Francisco, CA | New York City, NY; Seattle, WA"
        ],
        "country": null,
        "workplace_type": null,
        "remote": null,
        "employment_type": null,
        "experience_level": null,
        "salary_min": null,
        "salary_max": null,
        "salary_currency": null,
        "salary_period": null,
        "salary_text": null,
        "posted_at": "2026-10-30T23:34:18.000Z",
        "updated_at": "2026-10-30T23:37:41.000Z",
        "requisition_id": "PIP-267933",
        "description": null,
        "apply_url": "https://job-boards.greenhouse.io/anthropic/jobs/5464234008",
        "url": "https://job-boards.greenhouse.io/anthropic/jobs/5464234008",
        "change_status": "new",
        "first_seen_at": "2026-10-31",
        "last_seen_at": null,
        "scraped_at": "2026-10-31T04:26:45.510Z",
        "salary_source": null
    },
    {
        "id": "smartrecruiters:deliveryhero:744000158742670",
        "ats": "smartrecruiters",
        "company": "deliveryhero",
        "company_name": "Delivery Hero",
        "title": "Data Analytics Engineer MX Global",
        "department": null,
        "team": "Information Technology",
        "location": "Barcelona, Spain",
        "locations": [
            "Barcelona, Spain"
        ],
        "country": "ES",
        "workplace_type": "hybrid",
        "remote": false,
        "employment_type": "Full-time",
        "experience_level": "Mid-Senior Level",
        "salary_min": null,
        "salary_max": null,
        "salary_currency": null,
        "salary_period": null,
        "salary_text": null,
        "posted_at": "2026-10-30T13:22:10.885Z",
        "updated_at": null,
        "requisition_id": "JR0086646",
        "description": null,
        "apply_url": "https://jobs.smartrecruiters.com/deliveryhero/744000158742670",
        "url": "https://jobs.smartrecruiters.com/deliveryhero/744000158742670",
        "change_status": "new",
        "first_seen_at": "2026-10-31",
        "last_seen_at": null,
        "scraped_at": "2026-10-31T04:26:45.510Z",
        "salary_source": null
    }
]
```

Fields that a system does not publish are null rather than guessed: Greenhouse listings carry no department, country or employment type; only Greenhouse carries `updated_at`; Greenhouse and SmartRecruiters carry a requisition number; SmartRecruiters and Personio state an experience level. Greenhouse and SmartRecruiters pay comes from each job's own record, so it appears only with full descriptions on or with **Only jobs with a pay range** (8 of the 38 prefilled jobs had pay with descriptions on, 3 without, 31 October 2026).

### Where the jobs come from

Only from each company's own public job board, through the endpoint that system publishes for it: Greenhouse's Job Board API, Ashby's job posting API, Lever's postings API (one request a second, as its robots.txt asks), Personio's documented public XML feed and SmartRecruiters' public Posting API. On 31 October 2026 the index held 198,205 SmartRecruiters jobs, 169,015 Greenhouse, 53,007 Ashby, 34,096 Lever and 15,017 Personio, from 9,326 career sites. Which companies use which system was found from public web data (the Common Crawl URL index) and confirmed by reading each board. No aggregator, no LinkedIn, no Indeed, nothing behind a login. Every row links back to the employer's own posting; a company that wants its board left out can say so in the Issues tab: we add the board to the index's exclusion list and refresh the index at once, so its jobs leave the index, and every feed and search over it, within 24 hours of the request.

### What we deliberately do not collect

- No personal data: e-mail addresses and phone numbers are removed from the job text, and the names of contact people where the text makes them recognisable.
- 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, which are each run's dataset and one key-value store per feed name, `dododata-feed-<name>`, created by this Actor. If a store of that name already exists that this Actor did not create, Apify will not let the Actor open it, and the run stops with a message asking for another feed name.

### Related Actors

- [Career Site Jobs Search](https://apify.com/dododata/career-jobs-search): search the same index of about 470,000 open jobs by title, place, remote, pay and date.
- [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.

### Price

**$1.50 per 1,000 jobs** on Apify's free plan, less on paid plans: $1.30 on Bronze, $1.20 on Silver, $1.10 on Gold and above. You pay only for new jobs delivered; a run with nothing new costs the start fee alone. 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 feed saves you time, a short review here helps other people find it.

### Changelog

- 2026-11-03: "How new works" now says what share of new listings are really new, measured on the 3 November refresh.
- 2026-10-31: SmartRecruiters named in the sources and field notes (in the index since 29 October 2026, about 198,000 jobs); figures and the sample row measured again on build 0.1.4.
- 2026-10-30, v0.1.4: a job whose pay cannot be read waits one run, then is left out, so it never holds the feed back. v0.1.3: a store of the feed's name that this Actor did not create stops the run with a plain message.
- 2026-10-27, v0.1: first build. Measured locally against the index of 270,722 jobs from 8,476 career sites (refresh of 27 October 2026).

# Actor input Schema

## `feedName` (type: `string`):

Each feed name keeps its own memory of the jobs it already delivered, in a key-value store on your Apify account called dododata-feed-<name>. Use one name per schedule or per set of filters. Every run returns only the jobs that are new to this feed since its previous run. Names that differ only in case, spaces or punctuation (My Feed, my-feed, my_feed) are the same feed and share one memory.

## `firstRunDays` (type: `integer`):

A feed's first run returns the jobs the index first saw in its latest N days (1: the latest refresh only; at most 3). Later runs return only what is new since the run before. For everything open now, use Career Site Jobs Search.

## `backlogDays` (type: `integer`):

A job counts as new only if the career site posted it at most this many days before our index first saw it. This keeps out the whole existing job list of a career site the index has just added, and old jobs re-published under the same id. In a normal refresh it leaves out about one newly listed job in eight (681 of 5,610 on 27 October 2026). 0 keeps every job the index sees for the first time.

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

Keep jobs whose title has a word starting with one of these ("engineer" also finds "Engineering Manager"). Empty for every new job.

## `excludeKeywords` (type: `array`):

Drop jobs whose title contains one of these whole words, for example senior or intern.

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

Keep jobs whose location, country or workplace type contains one of these whole words: berlin, united kingdom, us, remote.

## `excludeLocations` (type: `array`):

Drop jobs whose location, country or workplace type names one of these places, by the same rule as Locations: "uk" also drops "United Kingdom", "remote" drops jobs marked remote.

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

Keep only jobs the employer marks as remote.

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

Keep jobs from these companies only, by name or career-page slug (stripe, Figma).

## `excludeCompanies` (type: `array`):

Drop jobs from these companies, by name or career-page slug.

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

Keep jobs from these systems only. Empty for all.

## `onlyWithSalary` (type: `boolean`):

Keep only jobs that state a pay range. Ashby, Lever and Personio pay is in the index; each new Greenhouse or SmartRecruiters job is read for its own, and kept only when it states a range. Jobs without pay are left out, not charged, and not read again in later runs. Per run, at most 4 times the jobs the run can return (Max items, or fewer under your maximum cost per run), and at least 200, are read without finding pay; the rest wait for the next run, and the run log says so.

## `employmentTypes` (type: `array`):

Keep jobs whose employment type contains one of these: full-time, part-time, contract, intern, temporary. Greenhouse boards publish no employment type, so this filter leaves out every Greenhouse job.

## `seniority` (type: `array`):

Keep jobs whose title states one of these levels: "Senior Data Engineer" is senior, "Staff Engineer" lead, "Head of Sales" director. Read from the title words only (and Personio's own level field), never guessed; about two titles in three state no level, which "No level in the title" keeps.

## `workplaceTypes` (type: `array`):

Keep jobs the employer marks as remote, hybrid or on-site. Many boards (most Greenhouse boards) publish no workplace type; those jobs are left out when this is set.

## `maxPerCompany` (type: `integer`):

Empty or 0: no limit, so the feed is complete. A number: at most this many new jobs from one company in a run; the others are left out for good, not sent in a later run.

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

Fetch the full job text for the jobs returned, live from each career site, politely (at most five requests a second). Off by default: a feed is mostly metadata, and the text is one click away in url.

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

At most this many new jobs per run, oldest first-seen date first. New jobs past it come first in the next run, for as long as their employers still list them. Together with your maximum cost per run, it caps what a run can cost. A run that fails part-way may repeat up to 500 of its jobs in the next run.

## `resetFeed` (type: `boolean`):

Forget what this feed delivered and run it as a first run again. Turn it off again before the next scheduled run.

## Actor input object example

```json
{
  "feedName": "default",
  "firstRunDays": 1,
  "backlogDays": 7,
  "keywords": [
    "data engineer",
    "analytics engineer"
  ],
  "remoteOnly": false,
  "onlyWithSalary": false,
  "includeDescription": false,
  "maxItems": 1000,
  "resetFeed": false
}
```

# 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 = {
    "feedName": "default",
    "keywords": [
        "data engineer",
        "analytics engineer"
    ],
    "maxItems": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("dododata/career-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 = {
    "feedName": "default",
    "keywords": [
        "data engineer",
        "analytics engineer",
    ],
    "maxItems": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("dododata/career-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 '{
  "feedName": "default",
  "keywords": [
    "data engineer",
    "analytics engineer"
  ],
  "maxItems": 1000
}' |
apify call dododata/career-jobs-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dododata/career-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/aLlghho8O5Ft10teD/builds/u30ewzknkYFqxbIUd/openapi.json
