# EURES Jobs Scraper - European Employment Data (`benthepythondev/eures-jobs-scraper`) Actor

Scrape jobs from the official EURES European employment portal with employer, locations, description, contract, schedule, dates and application contacts.

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

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## EURES Jobs Scraper - European Employment Data

Search and export current vacancies from **EURES**, the European Employment Services portal operated for job mobility across the European Union and participating countries. Enter one or more keywords, optionally narrow the search by country, working time, or contract type, and receive normalized job records with titles, employers, locations, descriptions, posting dates, application links, and public contact details.

The Actor reads EURES' official public job-search service directly. It does not need a browser, a job-seeker login, an API key, a paid unblocker, or residential proxy traffic. Results are saved to the default Apify dataset and can be exported as JSON, CSV, Excel, XML, or RSS, called through the API, scheduled, or connected to Make, Zapier, n8n, a database, or a notification workflow.

### What does the EURES Jobs Scraper collect?

Each result can include:

- Stable EURES vacancy ID
- Job title and full plain-text description
- Original description HTML for link-aware workflows
- Employer name, legal ID, size, ownership, website, and sector codes when provided
- Country codes and EURES location or NUTS codes
- Number of advertised positions
- Full-time, part-time, or other working-time codes
- Direct-hire or other contract-offering code
- ESCO occupation and job-category identifiers
- EURES mobility flag
- Available listing languages and translation type
- Creation and last-modification timestamps
- Public application URL or additional linked URLs
- Public contact email and telephone links found in the vacancy
- Canonical EURES detail URL
- Search keyword, rank, total matches, and scrape timestamp

EURES aggregates vacancies from many national services and employers. Not every source supplies every field. The Actor returns `null` or an empty list when EURES does not publish a value and never invents missing company or contact information.

### Why use this Actor?

EURES covers a large and multilingual employment market. Its results are useful, but manually searching every term and country, opening vacancies, cleaning HTML, and reconciling location codes is slow. This Actor creates repeatable records that can be filtered, compared, stored, and monitored.

Common uses include:

- Cross-border European job alerts
- Recruitment-market and hiring-demand research
- Country-by-country vacancy comparisons
- Employer and role discovery for recruiters
- Skills and occupation trend analysis
- Monitoring multilingual job descriptions
- Building reviewed job newsletters or internal feeds
- Detecting newly created or recently modified vacancies
- Finding public application links and employer contacts
- Feeding a human-qualified recruiting or business-development workflow

### Input

#### Keywords

The default run searches EURES for `python` and returns up to 10 unique jobs:

```json
{
  "keywords": ["python"],
  "countryCodes": [],
  "workingTimeCodes": [],
  "contractTypeCodes": [],
  "maxResults": 10
}
````

Use a narrow phrase when you need a focused feed:

```json
{
  "keywords": ["data engineer", "machine learning"],
  "maxResults": 25
}
```

The Actor searches each phrase across EURES titles and descriptions, deduplicates vacancy IDs across queries, and stops when the global `maxResults` limit is reached.

#### Country filters

Use two-letter country codes to narrow the results:

```json
{
  "keywords": ["software developer"],
  "countryCodes": ["DE", "NL", "SE"],
  "maxResults": 30
}
```

Leave `countryCodes` empty to search all countries available through EURES. Country and location values in the output follow the codes supplied by EURES, which makes them suitable for deterministic filtering and later reference-data enrichment.

#### Working time and contract filters

EURES exposes normalized filter codes. Typical values include `fulltime`, `parttime`, and `directhire`:

```json
{
  "keywords": ["nurse"],
  "countryCodes": ["DE"],
  "workingTimeCodes": ["fulltime"],
  "contractTypeCodes": ["directhire"],
  "maxResults": 20
}
```

The available vocabulary can change with EURES reference data. If an unfamiliar code produces no results, remove that filter and confirm the current option on the EURES portal.

### Example output

Values below illustrate the normalized schema. Live vacancies and counts change continuously.

```json
{
  "source": "EURES",
  "id": "MzI2ODIwNDA3MzYgNg",
  "title": "Python Developer, Vývojáři softwaru",
  "employer_name": "Resistant AI s.r.o.",
  "country_codes": ["CZ"],
  "location_codes": ["CZ010"],
  "number_of_posts": 1,
  "working_time_codes": ["fulltime"],
  "contract_type_code": "directhire",
  "available_languages": ["cs"],
  "created_at": "2026-05-25T00:28:35.267000+00:00",
  "application_url": null,
  "contact_email": null,
  "url": "https://europa.eu/eures/portal/jv-se/jv-details/MzI2ODIwNDA3MzYgNg?lang=en",
  "search_keyword": "python",
  "rank": 1,
  "total_matching": 12172,
  "scraped_at": "2026-07-11T09:00:00+00:00"
}
```

`description` contains cleaned readable text. `description_html` preserves the source markup when your workflow needs application links or original formatting. `application_urls`, `contact_emails`, and `contact_phones` retain all public links extracted from the description, while the singular fields contain the first available value for table exports.

### Build a repeatable job-monitoring workflow

For recurring alerts, keep the query narrow and save the EURES `id` as the stable key. On each scheduled run:

1. Run the Actor with the same keyword and filters.
2. Compare returned IDs with the prior dataset or your database.
3. Keep only unseen vacancies or records whose `modified_at` changed.
4. Apply your own relevance, language, employer, or location rules.
5. Send the shortlist to email, Slack, Telegram, a CRM, or a human review queue.

Do not notify on every row in every run. State and deduplication belong in the downstream workflow because different teams define “new” and “relevant” differently.

The same design works for market research: append daily snapshots, retain `total_matching`, and analyze direction over time. A total count is a source observation, not a guarantee that every underlying vacancy is unique, current, or suitable.

### Pricing

The Actor uses transparent pay-per-event pricing:

- **$0.00005** when the Actor starts
- **$0.003** for each job saved to the default dataset

A successful 10-job run costs about **$0.03005** in Actor charges before ordinary Apify platform usage. Use `maxResults` to bound both the dataset and the result charge. Queries that produce no saved row are not charged as result events.

### Reliability and implementation

The Actor calls the official public EURES job-search endpoint over direct HTTP. It uses bounded retries, explicit timeouts, a maximum of 50 records per API page, a hard 20-page safety limit, global deduplication, and a maximum input result limit of 500.

Every successful row is written once to the default dataset. A run that returns no useful jobs fails explicitly instead of reporting an empty success. This matters for schedules: a source or extractor failure should be visible in monitoring.

The Actor also strips HTML into readable text while preserving the original HTML, public links, and source codes. It does not translate job descriptions or infer company attributes that EURES did not provide.

### Responsible use

Use EURES data for legitimate employment research and follow the portal's terms, applicable privacy and labor law, database rights, and your organization's compliance policies. Public employer or applicant-contact details are not automatic consent for bulk marketing. Keep outreach relevant, lawful, proportionate, and reviewed by a person.

Vacancies can expire, change, be duplicated across national feeds, or contain source errors. Confirm the role, employer, eligibility, salary, relocation terms, and application instructions on the current EURES or employer page before making decisions.

### FAQ

#### Does the Actor require an EURES account?

No. It reads the official public job-search service and returns public vacancy data.

#### Does it need a proxy or browser?

No. The current implementation uses direct HTTP and a small 512 MB runtime.

#### Can I search several countries?

Yes. Add two-letter codes to `countryCodes`, or leave the field empty for all countries.

#### Can I search several keywords?

Yes. Results are deduplicated by EURES vacancy ID and the global `maxResults` limit applies across all queries.

#### Does the Actor translate descriptions?

No. It returns the public title, description, available language codes, and translation metadata supplied by EURES. Automated translation should be a separate, explicit downstream step.

#### Why are application or contact fields empty?

Some vacancy providers keep applications on EURES, omit public contact details, or publish instructions only in free text. The Actor extracts public hyperlinks, `mailto:` links, `tel:` links, and visible email patterns when present.

#### How do I report a problem?

Open an issue on the Actor page with the run ID, input, expected field, and a public example vacancy. Never post account credentials or private applicant information.

If the Actor saves you time, please leave a Store review. Reviews help prioritize maintenance and help other users assess the tool.

### You might also like

- [StepStone Scraper](https://apify.com/benthepythondev/stepstone-scraper) for major commercial European job boards
- [Remote Jobs Aggregator](https://apify.com/benthepythondev/remote-jobs-aggregator) for remote roles across multiple sources
- [EU Jobs Intelligence](https://apify.com/benthepythondev/eu-jobs-intelligence) for another European hiring-data workflow

### Keywords

EURES scraper, EURES jobs API, Europe jobs scraper, EU employment data, European job vacancies, cross-border jobs, EURES vacancy export, European recruitment data, job market research, EURES automation, jobs JSON, jobs CSV, employer leads, EURES monitoring, Apify jobs scraper

# Actor input Schema

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

Keywords searched across EURES job titles and descriptions.

## `countryCodes` (type: `array`):

Optional two-letter EURES country filters such as DE, FR, NL, ES, IT, PL, or SE. Leave empty to search all available countries.

## `workingTimeCodes` (type: `array`):

Optional EURES schedule filters, for example fulltime or parttime.

## `contractTypeCodes` (type: `array`):

Optional EURES offering filters, for example directhire.

## `maxResults` (type: `integer`):

Maximum number of unique jobs saved across all keyword searches.

## Actor input object example

```json
{
  "keywords": [
    "python",
    "data engineer"
  ],
  "countryCodes": [
    "DE"
  ],
  "workingTimeCodes": [
    "fulltime"
  ],
  "contractTypeCodes": [
    "directhire"
  ],
  "maxResults": 10
}
```

# 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 = {
    "keywords": [
        "python",
        "data engineer"
    ],
    "countryCodes": [
        "DE"
    ],
    "workingTimeCodes": [
        "fulltime"
    ],
    "contractTypeCodes": [
        "directhire"
    ],
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/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": [
        "python",
        "data engineer",
    ],
    "countryCodes": ["DE"],
    "workingTimeCodes": ["fulltime"],
    "contractTypeCodes": ["directhire"],
    "maxResults": 10,
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "python",
    "data engineer"
  ],
  "countryCodes": [
    "DE"
  ],
  "workingTimeCodes": [
    "fulltime"
  ],
  "contractTypeCodes": [
    "directhire"
  ],
  "maxResults": 10
}' |
apify call benthepythondev/eures-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=benthepythondev/eures-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "EURES Jobs Scraper - European Employment Data",
        "description": "Scrape jobs from the official EURES European employment portal with employer, locations, description, contract, schedule, dates and application contacts.",
        "version": "1.0",
        "x-build-id": "IIPA9vBRrk0CPX5Ew"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/benthepythondev~eures-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-benthepythondev-eures-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/benthepythondev~eures-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-benthepythondev-eures-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/benthepythondev~eures-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-benthepythondev-eures-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "keywords": {
                        "title": "Job-search keywords",
                        "type": "array",
                        "description": "Keywords searched across EURES job titles and descriptions.",
                        "default": [
                            "python"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "countryCodes": {
                        "title": "Country codes",
                        "type": "array",
                        "description": "Optional two-letter EURES country filters such as DE, FR, NL, ES, IT, PL, or SE. Leave empty to search all available countries.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "workingTimeCodes": {
                        "title": "Working-time codes",
                        "type": "array",
                        "description": "Optional EURES schedule filters, for example fulltime or parttime.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "contractTypeCodes": {
                        "title": "Contract-type codes",
                        "type": "array",
                        "description": "Optional EURES offering filters, for example directhire.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Maximum jobs",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of unique jobs saved across all keyword searches.",
                        "default": 10
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
