# EURAXESS Jobs Scraper: European Research Vacancies (`getascraper/euraxess-jobs-scraper`) Actor

Scrape public EURAXESS research jobs, PhD positions, and postdoc fellowships with deadlines, funding, and application links. Export straight to Google Sheets, Airtable, Make, or n8n. Skip manual daily searches. Pay just $0.0025 per successful job row.

- **URL**: https://apify.com/getascraper/euraxess-jobs-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.87 / 1,000 job results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 🔬 EURAXESS Jobs Scraper: research vacancies that stay current

Find public European research jobs, fellowships, and academic vacancies with the detail needed to decide what to do next. EURAXESS is the official source, while the search alias “Euroaxess” is also covered in this documentation.

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#EEF2FB;border:1px solid #B9C7E8;border-top:4px solid #003399;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">See the opportunity, the deadline, and the next step in one record.</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Build a focused feed from EURAXESS search pages or specific job links. Keep rich details, source links, and meaningful changes together.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B9C7E8;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#003399">🧾 Rich records</span><br>
<span style="font-size:12px;color:#57534E">Capture classification, requirements, contacts, and application routes.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B9C7E8;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#003399">🔔 Change-aware</span><br>
<span style="font-size:12px;color:#57534E">Spot new postings and exact changed fields on recurring runs.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B9C7E8;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#003399">🧭 Source-safe filters</span><br>
<span style="font-size:12px;color:#57534E">Use current EURAXESS labels without silently broadening your search.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B9C7E8;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#003399">🩺 Honest diagnostics</span><br>
<span style="font-size:12px;color:#57534E">See blocked pages, partial detail fetches, and rate limits clearly.</span>
</td>
</tr>
</table>

### 🎯 Who this is for

**Research recruitment teams:** “I need a reliable shortlist before the best deadlines pass.” Keep the source deadline, location, and application path close to the job title.

**Universities and labs:** “I want a recurring view of the roles relevant to our department.” Filter by country, research field, profile, funding, or organisation type.

**Academic job seekers:** “I do not want to reread the same posting every morning.” Use `onlyNewSinceLastRun` to focus on new or changed opportunities.

**Research market analysts:** “I need depth from one important source, not a shallow list from everywhere.” Keep public descriptions and source-labelled fields available for downstream review.

### ✨ What it does

This Actor is EURAXESS-first. It focuses on a dependable, high-depth view of one research opportunity source instead of blending unrelated boards together.

- Start with a public EURAXESS search URL, a public job URL, or structured filters.
- Enrich listing rows with the public detail page when `fetchDetails` is enabled.
- Preserve source URLs, dates, classification, location, funding, application links, and contact details when published.
- Deduplicate by the EURAXESS job ID across pages and mixed inputs.
- Keep missing source fields absent. The dataset never replaces them with guesses.
- Use bounded pages, rows, retries, concurrency, and request pacing for repeatable runs.

### 🧭 How it works

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#EEF2FB;border:1px solid #B9C7E8;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#003399;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Choose the scope</span><br>
<span style="font-size:12px;color:#57534E">Paste a public URL or select visible EURAXESS filters. A supplied URL takes priority.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#EEF2FB;border:1px solid #B9C7E8;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#003399;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Read the opportunity</span><br>
<span style="font-size:12px;color:#57534E">Get the listing first, then collect the public detail page for the fields your workflow needs.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#EEF2FB;border:1px solid #B9C7E8;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#003399;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Monitor what changed</span><br>
<span style="font-size:12px;color:#57534E">Persist a scope baseline and receive `NEW`, `UPDATED`, or `CURRENT` events.</span>
</td>
</tr>
</table>

### 🛡️ Public-source boundaries

The Actor reads public EURAXESS search and detail pages only. It does not use login flows, private profiles, hidden endpoints, or access bypasses. Review the current source terms and robots policy before production use. A source block or rate limit becomes a visible diagnostic, not a silent empty search.

When EURAXESS returns `429`, the Actor honors the published retry delay when available. It does not infer that a missing page means an opportunity expired. Incomplete runs do not advance the monitoring baseline.

### ⚙️ Input

The Console prefill uses a 30-day posting window, one page, ten job rows, one request at a time, a 1.5-second request delay, two retries, public detail enrichment, and Apify datacenter proxy settings. All limits are finite. `startUrls` overrides structured filters when supplied.

| Field                 | Type             | Required | Description                                              |
| --------------------- | ---------------- | -------- | -------------------------------------------------------- |
| `startUrls`           | array of URLs    | No       | Public EURAXESS search or job URLs.                      |
| `keyword`             | string           | No       | Words matched by the source search.                      |
| `offerTypes`          | array of strings | No       | Visible offer types or current source values.            |
| `countries`           | array of strings | No       | Visible country labels or current source values.         |
| `researchFields`      | array of strings | No       | Research field labels or source values.                  |
| `researcherProfiles`  | array of strings | No       | Researcher profile labels or source values.              |
| `organisationTypes`   | array of strings | No       | Organisation type labels or source values.               |
| `fundingProgrammes`   | array of strings | No       | Funding programme labels or source values.               |
| `fundingTypes`        | array of strings | No       | Funding type labels or source values.                    |
| `offerCategories`     | array of strings | No       | Offer category labels or source values.                  |
| `sortBy`              | enum             | No       | `newest`, `oldest`, or `deadline`.                       |
| `postedWithinDays`    | integer          | No       | Age limit for the source posting date.                   |
| `fetchDetails`        | boolean          | No       | Fetch public detail pages for richer records.            |
| `onlyNewSinceLastRun` | boolean          | No       | Emit only new or changed records for the selected state. |
| `stateKey`            | string           | No       | Optional stable monitoring-state name.                   |
| `maxItems`            | integer          | No       | Maximum successful or partial job rows emitted.          |
| `maxPages`            | integer          | No       | Maximum source search pages requested.                   |
| `proxyConfiguration`  | object           | No       | Apify proxy settings for public source requests.         |
| `requestDelayMs`      | integer          | No       | Delay between requests in milliseconds.                  |
| `maxConcurrency`      | integer          | No       | Maximum simultaneous requests.                           |
| `maxRequestRetries`   | integer          | No       | Maximum retries for failed requests.                     |
| `debug`               | boolean          | No       | Enable additional run diagnostics in logs.               |

Invalid filter labels produce a diagnostic row. They never turn into an unfiltered crawl.

### 📦 Data table

| Field                         | Type      | Description                                               |
| ----------------------------- | --------- | --------------------------------------------------------- |
| `record_type`                 | string    | `job` for an opportunity or `diagnostic` for a run issue. |
| `status`                      | string    | `success`, `partial`, or `diagnostic`.                    |
| `event`                       | string    | `CURRENT`, `NEW`, or `UPDATED` for job monitoring.        |
| `job_id`                      | string    | Stable EURAXESS job identifier.                           |
| `source`                      | string    | Always `EURAXESS` for source rows.                        |
| `title`                       | string    | Published opportunity title.                              |
| `url`                         | URL       | Public job page.                                          |
| `source_search_url`           | URL       | Search page that discovered the record.                   |
| `posted_at`                   | date-time | Published posting date.                                   |
| `deadline`                    | date-time | Published application deadline.                           |
| `offer_starting_date`         | date-time | Published starting date.                                  |
| `days_until_deadline`         | number    | Days from collection to the deadline.                     |
| `first_seen_at`               | date-time | First observation in the monitoring scope.                |
| `last_seen_at`                | date-time | Most recent observation.                                  |
| `scraped_at`                  | date-time | Collection timestamp.                                     |
| `organisation`                | string    | Published organisation.                                   |
| `company_institute`           | string    | Published company or institute.                           |
| `department`                  | string    | Published department.                                     |
| `country`                     | string    | Published work country.                                   |
| `city`                        | string    | Published city.                                           |
| `street`                      | string    | Published street address.                                 |
| `postal_code`                 | string    | Published postal code.                                    |
| `latitude`                    | number    | Published work-location latitude.                         |
| `longitude`                   | number    | Published work-location longitude.                        |
| `number_of_offers`            | number    | Number of published offers.                               |
| `opportunity_type`            | string    | Published opportunity type.                               |
| `research_fields`             | array     | Published research fields.                                |
| `researcher_profiles`         | array     | Published researcher profiles.                            |
| `positions`                   | array     | Published position values.                                |
| `education_levels`            | array     | Published education levels.                               |
| `languages`                   | array     | Published language values.                                |
| `contract_type`               | string    | Published contract type.                                  |
| `job_status`                  | string    | Published job status.                                     |
| `hours_per_week`              | number    | Published weekly hours.                                   |
| `funding_programme`           | string    | Published funding programme.                              |
| `funding_type`                | string    | Published funding type.                                   |
| `offer_category`              | string    | Published offer category.                                 |
| `is_research_infrastructure`  | boolean   | Explicit source flag for research infrastructure.         |
| `description_html`            | string    | Published description markup.                             |
| `description_text`            | string    | Plain-text description.                                   |
| `requirements_text`           | string    | Published requirements.                                   |
| `benefits_text`               | string    | Published benefits.                                       |
| `additional_information_text` | string    | Published additional information.                         |
| `where_to_apply_text`         | string    | Published application guidance.                           |
| `apply_url`                   | URL       | Public application link.                                  |
| `organisation_website`        | URL       | Public organisation website.                              |
| `contact_email`               | string    | Public contact email.                                     |
| `contact_phone`               | string    | Public contact phone.                                     |
| `changed_fields`              | array     | Exact job fields changed since the prior snapshot.        |
| `error_code`                  | string    | Stable code for a partial or diagnostic row.              |
| `message`                     | string    | Human-readable source or run message.                     |
| `retry_after_seconds`         | number    | Published retry delay when available.                     |
| `detail_fetched`              | boolean   | Whether the public detail page was requested.             |

#### Example record

```json
{
    "record_type": "job",
    "status": "success",
    "event": "NEW",
    "job_id": "461046",
    "source": "EURAXESS",
    "title": "Research Fellow",
    "url": "https://euraxess.ec.europa.eu/jobs/461046",
    "source_search_url": "https://euraxess.ec.europa.eu/jobs/search",
    "detail_fetched": true,
    "scraped_at": "2026-08-21T00:00:00.000Z"
}
```

### 🔔 Monitoring semantics

- First observation emits `NEW` when `onlyNewSinceLastRun` is enabled.
- An altered fingerprint emits `UPDATED` with exact `changed_fields`.
- An unchanged posting is omitted in changes-only mode.
- A normal snapshot emits `CURRENT`.
- Absence from a bounded or rate-limited crawl never emits `EXPIRED`.
- A partial, blocked, or aborted run does not commit the new baseline.

### 💳 Pricing

Pricing is pay per successful complete job row. Empty runs, no-change runs, diagnostic rows, and partial rows are free. There are no subscriptions or PPR charges.

### ⭐ Enjoying EURAXESS Jobs Scraper?

<table width="100%">
<tr>
<td style="padding:20px 24px 14px;background:#EEF2FB;border:1px solid #B9C7E8;border-left:5px solid #003399;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">A daily EURAXESS search that stops eating your morning is worth a rating.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other research recruitment teams find a trustworthy EURAXESS feed. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#003399;border:1px solid #B9C7E8;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/euraxess-jobs-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### ❓ FAQ

#### Can I use a specific EURAXESS job URL?

Yes. Add one or more public search or job URLs to `startUrls`. They take priority over structured filters, and mixed search and detail inputs are supported.

#### Does it access private researcher information?

No. It reads public search and detail pages only. It does not use login flows, private profiles, or hidden access paths.

#### What happens when a filter label is outdated?

The run records an invalid-filter diagnostic and avoids broadening the search. Use the current visible label or source value from EURAXESS.

#### Does a rate limit delete my monitoring history?

No. The run exposes the rate-limit diagnostic and keeps the last complete monitoring baseline.

### 🔗 Other actors

- [💼 Ashby Jobs Scraper: Hiring Change Monitor](https://apify.com/getascraper/ashby-jobs-monitor) for structured hiring changes from Ashby-powered career pages.
- [HigherEdJobs Scraper: Academic Jobs, Salaries and New-Job Monitoring](https://apify.com/getascraper/higheredjobs-com-scraper) for another academic jobs source.
- [🔬 NIH & NSF grant monitor: research funding status](https://apify.com/getascraper/research-grant-status-monitor) for public research funding status changes.
- [📄 arXiv scraper for RAG: papers as chunked JSON](https://apify.com/getascraper/arxiv-rag-extractor) for research literature collection and retrieval workflows.

# Actor input Schema

## `startUrls` (type: `array`):

Optional public EURAXESS search or job URLs. The default search URL is used when no custom source is supplied.

## `keyword` (type: `string`):

Optional words matched by EURAXESS against the public opportunity search.

## `offerTypes` (type: `array`):

Optional EURAXESS offer types, supplied as live source values or visible labels.

## `countries` (type: `array`):

Optional EURAXESS country filters, supplied as live source values or visible labels.

## `sortBy` (type: `string`):

Order the public EURAXESS search before pagination.

## `postedWithinDays` (type: `integer`):

Keep postings observed within this many days. The default favors recent research opportunities.

## `researchFields` (type: `array`):

Optional EURAXESS research-field filters, supplied as live source values or visible labels.

## `researcherProfiles` (type: `array`):

Optional EURAXESS researcher-profile filters, supplied as live source values or visible labels.

## `organisationTypes` (type: `array`):

Optional EURAXESS organisation-type filters, supplied as live source values or visible labels.

## `fundingProgrammes` (type: `array`):

Optional EURAXESS funding-programme filters, supplied as live source values or visible labels.

## `fundingTypes` (type: `array`):

Optional EURAXESS funding-type filters, supplied as live source values or visible labels.

## `offerCategories` (type: `array`):

Optional EURAXESS offer-category filters, supplied as live source values or visible labels.

## `fetchDetails` (type: `boolean`):

Fetch each matched public EURAXESS job page for descriptions, requirements, contacts, and application fields.

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

Keep only jobs whose fingerprint is new or changed in the selected monitoring state.

## `stateKey` (type: `string`):

Optional stable name for a monitoring baseline. When blank, the normalized search scope determines the state key.

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

Maximum job rows written to the dataset in one run. Diagnostic rows are not job rows.

## `maxPages` (type: `integer`):

Maximum EURAXESS search pages to request across the selected source scope.

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

Apify datacenter proxy settings for polite, reliable public EURAXESS requests.

## `requestDelayMs` (type: `integer`):

Delay between public EURAXESS requests to keep request pacing predictable.

## `maxConcurrency` (type: `integer`):

Maximum simultaneous public EURAXESS requests.

## `maxRequestRetries` (type: `integer`):

Bounded retry attempts for temporary public request failures.

## `debug` (type: `boolean`):

Include additional parser and request diagnostics in logs without changing the dataset contract.

## Actor input object example

```json
{
  "startUrls": [],
  "keyword": "",
  "offerTypes": [
    "job_offer"
  ],
  "countries": [],
  "sortBy": "newest",
  "postedWithinDays": 30,
  "researchFields": [],
  "researcherProfiles": [],
  "organisationTypes": [],
  "fundingProgrammes": [],
  "fundingTypes": [],
  "offerCategories": [],
  "fetchDetails": true,
  "onlyNewSinceLastRun": false,
  "stateKey": "",
  "maxItems": 10,
  "maxPages": 1,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "requestDelayMs": 1500,
  "maxConcurrency": 1,
  "maxRequestRetries": 2,
  "debug": false
}
```

# Actor output Schema

## `jobResults` (type: `string`):

Structured job and diagnostic rows from the latest run.

## `jobDetails` (type: `string`):

Enriched public opportunity descriptions and application fields.

## `monitoring` (type: `string`):

New, updated, and current rows with persisted observation timestamps.

## `diagnostics` (type: `string`):

Partial and diagnostic rows with source error details.

## `monitorState` (type: `string`):

Persisted EURAXESS monitoring and abort markers in the default key-value store.

# 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 = {
    "startUrls": [],
    "keyword": "",
    "offerTypes": [
        "job_offer"
    ],
    "countries": [],
    "sortBy": "newest",
    "postedWithinDays": 30,
    "researchFields": [],
    "researcherProfiles": [],
    "organisationTypes": [],
    "fundingProgrammes": [],
    "fundingTypes": [],
    "offerCategories": [],
    "fetchDetails": true,
    "onlyNewSinceLastRun": false,
    "stateKey": "",
    "maxItems": 10,
    "maxPages": 1,
    "proxyConfiguration": {
        "useApifyProxy": true
    },
    "requestDelayMs": 1500,
    "maxConcurrency": 1,
    "maxRequestRetries": 2,
    "debug": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/euraxess-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 = {
    "startUrls": [],
    "keyword": "",
    "offerTypes": ["job_offer"],
    "countries": [],
    "sortBy": "newest",
    "postedWithinDays": 30,
    "researchFields": [],
    "researcherProfiles": [],
    "organisationTypes": [],
    "fundingProgrammes": [],
    "fundingTypes": [],
    "offerCategories": [],
    "fetchDetails": True,
    "onlyNewSinceLastRun": False,
    "stateKey": "",
    "maxItems": 10,
    "maxPages": 1,
    "proxyConfiguration": { "useApifyProxy": True },
    "requestDelayMs": 1500,
    "maxConcurrency": 1,
    "maxRequestRetries": 2,
    "debug": False,
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/euraxess-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 '{
  "startUrls": [],
  "keyword": "",
  "offerTypes": [
    "job_offer"
  ],
  "countries": [],
  "sortBy": "newest",
  "postedWithinDays": 30,
  "researchFields": [],
  "researcherProfiles": [],
  "organisationTypes": [],
  "fundingProgrammes": [],
  "fundingTypes": [],
  "offerCategories": [],
  "fetchDetails": true,
  "onlyNewSinceLastRun": false,
  "stateKey": "",
  "maxItems": 10,
  "maxPages": 1,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "requestDelayMs": 1500,
  "maxConcurrency": 1,
  "maxRequestRetries": 2,
  "debug": false
}' |
apify call getascraper/euraxess-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/euraxess-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/jh4JBNZE8l5Hgj54m/builds/2aPciq3KheP3QC1uF/openapi.json
