# EURES Jobs Scraper (`sampon/eures-jobs`) Actor

Search the European Commission's EURES job portal by words, countries, occupation and posting date. One row per job, with plain field names.

- **URL**: https://apify.com/sampon/eures-jobs.md
- **Developed by:** [Sampon](https://apify.com/sampon) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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

## EURES Jobs Scraper

EURES is the European Commission's job mobility portal. Public employment services in the EU, Norway, Iceland, Liechtenstein and Switzerland send their vacancies to it, so one search there covers more than two million jobs across 31 countries.

This Actor runs that search for you and gives back one clean row per job. You choose the words, the countries and a few filters; it returns the title, employer, country and region, contract type, dates and a link to the job on EURES.

### What you put in

The smallest useful input is a few words and a country:

```json
{
  "keywords": "software developer",
  "countries": ["IE"],
  "maxItems": 20
}
```

List several countries and they are searched together in a single run, for example `["NL", "BE", "LU"]`. Leave `countries` empty to search every EURES country.

| Setting | What it does |
|---|---|
| `keywords` | Words to look for. Leave empty to get every job that matches the other filters. |
| `searchIn` | `everywhere` (the default) behaves like the EURES website and also finds related jobs. `title` only keeps jobs with your words in the title, which gives fewer and closer matches. |
| `countries` | Two-letter codes such as `DE`, `FR`, `PL` or `GR`. Region codes as EURES lists them also work, for example `IE061` for Dublin or `DE2` for Bavaria. |
| `postedWithin` | `day`, `3days`, `week` or `month`. Counts from the date the job was published or last updated on EURES. |
| `maxItems` | Stops after this many jobs. Default 100. |
| `sortBy` | `relevance` (default) or `newest`. |
| `onlyNewJobs` | Skips jobs this exact search already returned in earlier runs. Made for scheduled runs: the first run returns everything, later runs return only what has appeared since. |
| `includeDetails` | Opens each job's own page to add city, postal code, closing date, start date, salary and how to apply. Slower, see below. |
| `includeDescription` | Turn off if you only need titles, places and links. |
| `occupations` | ESCO occupation codes, if you already work with ESCO. |
| `sectors`, `workingTime`, `contractTypes`, `experience` | The same filters the EURES website offers. |
| `euresFlagOnly` | Keeps only jobs with the EURES flag, which marks employers interested in hiring people from other countries. |

### What you get

One row per job. The values below are made up to show the shape:

```json
{
  "jobId": "MTIzNDU2NyAxOA",
  "reference": "1234567",
  "title": "Line Cook",
  "company": "Example Hotels Ltd",
  "companyWebsite": null,
  "country": "MT",
  "countryName": "Malta",
  "countries": ["MT"],
  "region": "MT001",
  "regions": ["MT001"],
  "city": "Sliema",
  "postalCode": null,
  "workingTime": "Full time",
  "contractType": "Fixed-term contract",
  "openings": 2,
  "postedAt": "2026-09-14T09:30:00Z",
  "updatedAt": "2026-10-08T18:00:00Z",
  "applicationDeadline": "2026-10-31",
  "startDate": null,
  "occupationCodes": ["http://data.europa.eu/esco/occupation/..."],
  "sectorCodes": null,
  "languages": ["en"],
  "euresFlag": true,
  "salary": { "min": 1500, "max": 1800, "currency": "EUR", "period": "month" },
  "howToApply": "Send a CV through the national employment service website.",
  "description": "You will prepare dishes to the head chef's standards...",
  "url": "https://europa.eu/eures/portal/jv-se/jv-details/MTIzNDU2NyAxOA?lang=en",
  "scrapedAt": "2026-10-10T08:21:22Z"
}
```

`city`, `postalCode`, `applicationDeadline`, `startDate`, `salary` and `howToApply` are filled only when `includeDetails` is on, and only when the employer gave them. Anything EURES does not have comes back as `null`.

Titles and descriptions are in the language the job was published in. Most German jobs are in German, most Irish jobs in English, and so on. `languages` tells you which versions exist.

The output is about the job, not about people. Contact persons listed on a vacancy are never collected, and e-mail addresses and phone numbers inside descriptions and application notes are replaced with `[email removed]` and `[phone removed]`. Names written into the free text of a description cannot be removed reliably.

### How long it takes

europa.eu asks automated visitors to leave 10 seconds between requests, and this Actor does exactly that, one request at a time.

- Without details, one request brings back 50 jobs. 20 jobs take about 15 seconds, 1,000 jobs about 3.5 minutes.
- With `includeDetails`, every job needs one more request, so add about 10 seconds per job. 100 jobs take roughly 17 minutes.

### Price

Free for now. You only pay Apify's usual platform usage for the run, and that is small: a run of 20 jobs takes about 15 seconds on 256 MB of memory. A per-job price may be added later. If that happens, it will be shown on this page before it applies to you.

### Limits

- EURES returns at most 10,000 jobs for one search. For more, split the run by country or region.
- Some region codes are not used by EURES. If a region gives no results, try a shorter code (`DE2` instead of `DE21`).
- `everywhere` searches are broad by design and can include loosely related jobs. Use `searchIn: "title"` or an ESCO occupation when you need precise results.
- Some employers do not publish their name; `company` is then `null` or a placeholder chosen by the employer.

This Actor is an independent tool. It is not made by, or affiliated with, the European Commission, the European Labour Authority or EURES.

# Actor input Schema

## `keywords` (type: `string`):

Words to look for, for example software developer or nurse. Leave empty to get every job that matches the other filters.

## `searchIn` (type: `string`):

Everywhere works like the EURES website and also finds related jobs. Title only is stricter and returns fewer, closer matches.

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

Two-letter country codes such as IE, DE, NL or GR. All of them are searched together in one run. You can also use a region code as EURES lists it, such as IE061 (Dublin) or DE2 (Bavaria). If a region code gives no results, try a shorter one. Leave empty to search all EURES countries.

## `postedWithin` (type: `string`):

Only jobs published or updated on EURES in this period.

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

Stop after this many jobs. EURES returns at most 10,000 jobs for one search; split large runs by country or region.

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

Best match first, or most recently published or updated first.

## `onlyNewJobs` (type: `boolean`):

Remembers the jobs this exact search returned in earlier runs and skips them, so a scheduled run gives you only what is new. The first run returns everything and starts the list.

## `includeDetails` (type: `boolean`):

Opens each job's own page on EURES. EURES asks for a 10 second gap between requests, so this adds about 10 seconds per job (100 jobs take roughly 17 minutes).

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

Turn off if you only need titles, places and links. E-mail addresses and phone numbers in descriptions are always removed.

## `occupations` (type: `array`):

Optional. ESCO occupation URIs or IDs, for example http://data.europa.eu/esco/occupation/f2b15a0e-e65a-438a-affb-29b9d50b77d1 (software developer). Jobs on EURES are tagged with these codes.

## `sectors` (type: `array`):

Optional. Keep jobs from employers in these sectors.

## `workingTime` (type: `array`):

Optional.

## `contractTypes` (type: `array`):

Optional.

## `experience` (type: `array`):

Optional.

## `euresFlagOnly` (type: `boolean`):

Keep only vacancies that carry the EURES flag, which marks employers interested in hiring from other EU/EEA countries.

## `language` (type: `string`):

Two-letter language code used for the EURES job page links and, when available, for titles and descriptions. Most jobs are published in their original language only.

## Actor input object example

```json
{
  "keywords": "software developer",
  "searchIn": "everywhere",
  "countries": [
    "IE"
  ],
  "postedWithin": "any",
  "maxItems": 20,
  "sortBy": "relevance",
  "onlyNewJobs": false,
  "includeDetails": false,
  "includeDescription": true,
  "euresFlagOnly": false,
  "language": "en"
}
```

# Actor output Schema

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

One row per EURES job: title, employer, country and region, contract, dates and the job page link.

# 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 = {
    "keywords": "software developer",
    "countries": [
        "IE"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("sampon/eures-jobs").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": "software developer",
    "countries": ["IE"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("sampon/eures-jobs").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": "software developer",
  "countries": [
    "IE"
  ],
  "maxItems": 20
}' |
apify call sampon/eures-jobs --silent --output-dataset

```

## MCP server setup

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

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/nDH97REpkQbYLir9b/builds/V9dQ545mvyO3K6p2h/openapi.json
