# EURES Jobs Scraper - European Job Portal, EU-wide (`kamerozkan/eures-jobs-scraper`) Actor

Scrape EURES, the official European job portal: job ads from the EU, Norway, Iceland, Liechtenstein and Switzerland by keyword, country and posting date. Employer, city, contract, schedule, apply URL, full description, ESCO occupation. No login. Pay per job.

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

## Pricing

from $0.64 / 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

## EURES Jobs Scraper - European Job Portal, EU-wide

Get job ads from EURES, the official European job portal, as clean JSON, CSV or Excel: one row per ad with employer, city, contract, apply URL and full description, from any EU country plus Norway, Iceland, Liechtenstein and Switzerland.

### What does EURES Jobs Scraper do?

EURES (europa.eu/eures) collects the vacancies of the public employment services of 31 European countries, many of them never posted on the big job boards. This actor searches EURES by keyword, country and posting date and returns every matching ad with its details. It needs no login, API key or proxy setup.

### Who is it for?

- **Recruiters and staffing agencies**: find employers in Germany, the Netherlands or Ireland that are hiring nurses, drivers or engineers right now, with a direct apply link.
- **Relocation and mobility services**: list the jobs open to EU candidates in a target country, filtered to the last 24 hours, on a daily schedule.
- **Job boards and aggregators**: feed official public-employment-service vacancies into your own site, de-duplicated by EURES id.
- **Labour market researchers**: count ads per country, region, sector (NACE) and ESCO occupation.

### What data can you get?

| Field | Example |
|---|---|
| title | (Senior) Data Engineer |
| employerName | CoreGo GmbH |
| country, regionCodes | DE, DE600 |
| city, postalCode | Hamburg, 20459 |
| postedAt, updatedAt | 2026-10-09T21:04:58Z |
| contractType, schedule | directhire, fulltime |
| applyUrl | https://corego.odoo.com/jobs/senior-data-engineer-group-35 |
| applicationDeadline | 2026-11-12T00:00:00Z (when published) |
| employerSize, employerSectorCodes | smallenterprise, k62.2.0 (NACE) |
| salaryMin, salaryMax, salaryCurrency | when the employer publishes a salary |
| requiredLanguages | de:B1 |
| escoOccupationUris | ESCO occupation links |
| description | full ad text, plain text without HTML |
| url | link to the ad on EURES |

Contact persons, their names, phone numbers and e-mail addresses are never returned. Some public employment services (for example the Dutch UWV) publish part of their ads without the employer name; those rows have `employerName: null`.

### How much does it cost?

You pay only for job ads: **$0.80 per 1,000 job ads** on the Free plan, with lower prices on paid Apify plans. Example: 1,000 ads cost about $0.80, a daily feed of 100 new ads costs about $2.40 a month. Ads that do not match your keyword are skipped and not charged. Set "Max job ads per keyword" or a maximum cost per run to cap spending.

### How to use it

1. Click **Try for free**.
2. Enter one or more keywords (job titles or skills) and the country codes, for example `de`, `nl`, `ie`. Leave keywords empty to get every ad in those countries.
3. Pick "Posted within" (last 24 hours, 3 days, 7 days, 30 days or any time).
4. Click **Start** and download results as JSON, CSV, Excel or via API.

**Daily new-jobs feed:** set "Posted within" to "Last 24 hours" and add a daily schedule in Apify.

**Multi-word keywords:** EURES itself returns ads that contain ANY of the words, so "data engineer" also finds "data center technician". With "Every word must appear" on (default), only ads with the keyword in the title or the exact phrase in the text are kept and charged.

### Input example

```json
{
  "keywords": ["data engineer", "nurse"],
  "countries": ["de", "ie", "at"],
  "postedWithin": "month",
  "maxResultsPerSearch": 30
}
```

### Output example

```json
{
  "id": "MTAwMDEtMTAwMzgzMzgzNi1TIDE",
  "title": "(Senior) Data Engineer (Data Engineer)",
  "employerName": "CoreGo GmbH",
  "country": "DE",
  "regionCodes": ["DE600"],
  "city": "Hamburg",
  "postalCode": "20459",
  "postedAt": "2026-10-09T21:04:58Z",
  "contractType": "directhire",
  "schedule": ["fulltime"],
  "language": "de",
  "employerSize": "smallenterprise",
  "employerSectorCodes": ["k62.2.0"],
  "immediateStart": true,
  "contractNote": "Das Stellenangebot ist unbefristet",
  "applyUrl": "https://corego.odoo.com/jobs/senior-data-engineer-group-35",
  "description": "Corego is an event technology company powering large-scale events and festivals. ...",
  "url": "https://europa.eu/eures/portal/jv-se/jv-details/MTAwMDEtMTAwMzgzMzgzNi1TIDE?lang=en",
  "searchKeyword": "data engineer"
}
```

### Integrations and API

Run it from your code with the Apify API or the `apify-client` package, schedule it in Apify, or connect it to Make, n8n, Zapier, Google Sheets or a webhook.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("kamerozkan/eures-jobs-scraper").call(run_input={"keywords": ["nurse"], "countries": ["ie"], "postedWithin": "week"})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

### FAQ

**Which countries are covered?** All EU member states plus Iceland, Liechtenstein, Norway and Switzerland. Use two-letter codes (`de`, `fr`, `nl`, `ie`, `at`, `es`, `pl`, `se`, `no`, `ch`, ...). NUTS region codes such as `de2` (Bavaria) also work.

**Why is the description in German or Dutch?** Each ad comes in the language the employer wrote it in; the `language` field tells you which. Use your own translation step if you need English.

**Does it return salaries?** Yes, when the employer publishes one (`salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`). Most EURES ads do not include a salary.

**How fast is it?** About 50 ads with full details in 20 seconds.

**Is it legal to collect this data?** EURES content is published by the European Labour Authority, which authorises re-use when EURES/ELA is acknowledged as the source. The actor collects public job ads only and never returns contact persons. You are responsible for how you use the data, including privacy laws like GDPR.

### Support

Something not working, a field missing or a country returning fewer ads than the EURES website? Open an issue on the **Issues** tab with your run link and input. We answer within one working day and usually ship a fix the same week. Feature requests (for example ESCO occupation labels or translated descriptions) are welcome there too.

# Actor input Schema

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

Job titles or skills, one per line, for example 'software developer', 'nurse' or 'truck driver'. Each keyword is one search. Leave empty to get every job ad in the chosen countries.

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

Two-letter country codes, for example de, fr, nl, ie, at, es, pl, se, no, ch. A NUTS region code also works (de2 = Bavaria, nl3 = West Netherlands). Leave empty to search all EURES countries (EU, Iceland, Liechtenstein, Norway, Switzerland).

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

Only ads published in this period. Use '24h' with a daily schedule to get new jobs only.

## `maxResultsPerSearch` (type: `integer`):

Stop each keyword search after this many ads. You are charged per ad, so this caps the cost.

## `requireAllWords` (type: `boolean`):

EURES matches ads that contain ANY word of a multi-word keyword. When on, only ads whose title or description contain every word are kept (and charged).

## `searchInTitleOnly` (type: `boolean`):

Match keywords against the job title only instead of title and description.

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

Best match puts ads with the keyword in the title first (recommended). Newest first lists the latest ads, but EURES then mixes in ads that contain only one of the words, so fewer of them pass the 'every word' filter.

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

Adds city, postal code, apply URL, employer website, employer size and sector, start date and contract note (one extra request per ad, same price).

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

Optional cap over all keywords together. 0 means no cap beyond the per-keyword limit.

## Actor input object example

```json
{
  "keywords": [
    "software developer"
  ],
  "countries": [
    "ie",
    "nl"
  ],
  "postedWithin": "week",
  "maxResultsPerSearch": 50,
  "requireAllWords": true,
  "searchInTitleOnly": false,
  "sortBy": "relevance",
  "includeDetails": true,
  "maxItems": 0
}
```

# Actor output Schema

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

One row per result in the default dataset.

# 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",
        "nl"
    ],
    "postedWithin": "week",
    "maxResultsPerSearch": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("kamerozkan/eures-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 = {
    "keywords": ["software developer"],
    "countries": [
        "ie",
        "nl",
    ],
    "postedWithin": "week",
    "maxResultsPerSearch": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("kamerozkan/eures-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 '{
  "keywords": [
    "software developer"
  ],
  "countries": [
    "ie",
    "nl"
  ],
  "postedWithin": "week",
  "maxResultsPerSearch": 50
}' |
apify call kamerozkan/eures-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kamerozkan/eures-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/8kwpDN4sZqgRgxbeX/builds/NjZh5I7B645aBg11B/openapi.json
