EURES Jobs Scraper avatar

EURES Jobs Scraper

Pricing

from $0.79 / 1,000 jobs

Go to Apify Store
EURES Jobs Scraper

EURES Jobs Scraper

Scrape job vacancies from EURES, the European Job Mobility Portal: titles, employers, countries, regions, ISCO codes, salaries, contacts, and full descriptions from any EURES search URL.

Pricing

from $0.79 / 1,000 jobs

Rating

0.0

(0)

Developer

ParseBird

ParseBird

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

EURES Jobs Scraper

EURES Jobs Scraper extracts job vacancies from EURES, the European Job Mobility Portal. Give it any EURES search URL and get structured job data back: titles, employers, countries and regions, occupation codes, salaries, deadlines, how to apply, and full descriptions.

Paste any EURES search URL with its keyword, country, region, occupation, sector, contract, experience, education, and language filters, and get up to 10,000 vacancies per run from public employment services in 31 European countries, with salary, deadline, and application details for each one.

Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

Apify Actor: parsebird/eures-jobs-scraper. Scrapes job vacancies from EURES, the European Job Mobility Portal (europa.eu/eures), covering public employment services in EU/EEA countries and Switzerland. Call via ApifyClient: client.actor("parsebird/eures-jobs-scraper").call(run_input={"startUrl": "https://europa.eu/eures/portal/jv-se/search?keywordsEverywhere=nurse&locationCodes=de,at&orderBy=MOST_RECENT&lang=en", "results_wanted": 200, "max_pages": 10, "include_details": true}). Inputs: startUrl (string, a EURES search URL from https://europa.eu/eures/portal/jv-se/search with any filters, or a single jv-details vacancy URL; default is a sample "admin" search), results_wanted (integer 1-10000, default 20), max_pages (integer 1-200, default 10, up to 50 vacancies per page), include_details (boolean, default true, adds city, salary, deadline, application and contact data), proxyConfiguration (object, optional, not needed). Output fields per vacancy: identifier, title, url, company, publication_date, creation_date, last_modification_date, number_of_posts, location_country_codes, location_region_codes (NUTS), job_category_codes (ISCO), esco_occupation_uris, position_schedule_codes, position_offering_code, available_languages, translated_title, description_html, description_text, summary, eures_flag; with details: city, postal_code, application_deadline, salary_min, salary_max, salary_currency, salary_period, application_url, application_instructions_text, contact_emails, contact_phones, required_skills_esco_uris, required_languages, required_years_of_experience, employer_website, data_source. Pricing: pay per vacancy saved. Full API spec: https://apify.com/parsebird/eures-jobs-scraper/api. Get your token: https://console.apify.com/settings/integrations.

What is EURES Jobs Scraper?

EURES (European Employment Services) is the European Commission's job mobility network. Its job search collects vacancies published by the public employment services of EU and EEA countries and Switzerland, like the Bundesagentur für Arbeit in Germany, Arbetsförmedlingen in Sweden, and Jobsplus in Malta. When we tested in October 2026, a blank EURES search returned about 2 million open vacancies.

EURES Jobs Scraper turns any EURES search into a clean dataset. Build a search on the EURES portal, copy the URL, and paste it into the Actor. Every filter in that URL is applied. It's a simple EURES API alternative: you don't need to write any code, log in, or get an API key.

  • 🔗 Works from your EURES search URL. Keywords, country and region, occupation (ESCO/ISCO), sector, working time, contract type, experience, education, required languages, EURES flag, and publication date are all supported.
  • 📄 Full vacancy details. Optionally opens each vacancy to add city, postal code, salary range, application deadline, how to apply, contact person, required skills, languages, experience, and employer details.
  • 🌍 31 countries. Covers every country that publishes to EURES, from Germany, France, and the Netherlands to Malta, Iceland, and Liechtenstein.
  • 🗣️ Language-aware. The lang parameter in your URL picks the language version of each vacancy when the employer published one.
  • 🎯 Single vacancies too. Paste one jv-details URL to get one vacancy with full details.
  • ⚡ Fast and lightweight. It reads the same data the EURES website loads. There's no browser, so runs are quick and cheap.
  • 📅 Scheduling and monitoring. Run the same search daily or weekly with Apify Schedules to track new vacancies.
  • 🔌 API and integrations. Use the results from the Apify API, or send them to Google Sheets, Zapier, Make, Slack, or webhooks via Apify integrations.

What data can you extract from EURES?

FieldDescription
identifierEURES vacancy ID
titleJob title as published
urlLink to the vacancy page on EURES
company / employer_nameHiring employer
publication_datePublication date shown on EURES (last update, or creation date if never updated)
creation_date / last_modification_dateSource timestamps (ISO 8601, UTC)
number_of_postsNumber of open positions
location_country_codes / location_region_codesCountry codes and NUTS region codes
job_category_codes / job_category_primaryISCO occupation codes
esco_occupation_urisESCO occupation URIs
position_schedule_codes / position_offering_codeWorking time (full-time, part-time, flextime) and contract type (direct hire, temporary, contract, apprenticeship, and others)
available_languages / translated_title / translated_description_textLanguage versions of the vacancy
description_html / description_text / summaryFull description as HTML and plain text, plus a short summary
eures_flagWhether the employer flagged the vacancy as open to EURES (cross-border) applicants
city / postal_code / street_addressWorkplace location (details)
salary_min / salary_max / salary_currency / salary_periodSalary range when published (details)
application_deadline / application_url / application_instructions_textHow and when to apply (details)
contact_name / contact_emails / contact_phonesContact person, when published (details)
required_skills_esco_uris / required_languages / required_years_of_experience / required_driving_licensesRequirements (details)
employment_start_date / immediate_start / remote_work_allowedStart date and work arrangement (details)
employer_website / employer_size / employer_sector_codesEmployer profile (details)
data_source / source_referenceEmployment service that published the vacancy and its own reference number (details)

Fields marked (details) need Include vacancy details turned on (it's on by default). Countries and employers publish different amounts of information, so some fields are empty on some vacancies.

How to scrape EURES job vacancies

  1. Open the EURES job search and search with the keywords and filters you need (country, occupation, working time, publication date, and so on).
  2. Copy the full URL from your browser's address bar.
  3. Open EURES Jobs Scraper on Apify and paste the URL into EURES search URL.
  4. Set Max vacancies and Max result pages to control the size of the run.
  5. Keep Include vacancy details on for salary, deadline, and contact data, or turn it off for a faster run with search-level fields only.
  6. Click Start and watch vacancies appear in the dataset preview.
  7. Download the results as JSON, CSV, Excel, XML, or HTML, or get them through the API.

Input parameters

ParameterTypeRequiredDefaultDescription
startUrlstringNoSample "admin" searchA EURES search results URL (https://europa.eu/eures/portal/jv-se/search?...) or a single vacancy URL (.../jv-details/...)
results_wantedintegerNo20Maximum vacancies to save (1–10,000)
max_pagesintegerNo10Maximum result pages to request (1–200). Each page holds up to 50 vacancies
include_detailsbooleanNotrueAdd city, salary, deadline, application, contact, requirement, and employer fields
proxyConfigurationobjectNoNo proxyOptional. EURES works without a proxy

Supported URL filters: keywordsEverywhere, keywordsTitle, keywordsDescription, keywordsEmployer, keywordsLegalID, keywordsJvId, locationCodes (countries like de or regions like fr1), escoOccupation, escoIsco, escoSkill, sector, positionScheduleCodes, positionOfferingCodes, experience, educationGroupCodes, educationAndQualificationLevel, requiredLanguages, euresFlagCodes, otherBenefitsCodes, minNumberPost, publicationPeriod (LAST_DAY, LAST_THREE_DAYS, LAST_WEEK, LAST_MONTH), orderBy (BEST_MATCH, MOST_RECENT), and lang. The Actor always starts from the first result, whatever page and resultsPerPage say in the URL.

Example inputs

Basic vacancy search

{
"startUrl": "https://europa.eu/eures/portal/jv-se/search?page=1&resultsPerPage=10&orderBy=BEST_MATCH&keywordsEverywhere=admin&lang=en",
"results_wanted": 20,
"max_pages": 5
}

Data analyst jobs in Germany and Austria, newest first

{
"startUrl": "https://europa.eu/eures/portal/jv-se/search?keywordsTitle=data%20analyst&locationCodes=de,at&orderBy=MOST_RECENT&lang=en",
"results_wanted": 100,
"max_pages": 10
}

Weekly monitoring of engineering jobs posted in the last 7 days

{
"startUrl": "https://europa.eu/eures/portal/jv-se/search?keywordsEverywhere=engineer&publicationPeriod=LAST_WEEK&orderBy=MOST_RECENT&lang=en",
"results_wanted": 500,
"max_pages": 20,
"include_details": false
}

Output example

A real vacancy, shortened. Contact person fields are left out of this example.

{
"identifier": "NDU1MjMxIDEwMQ",
"title": "NURSE",
"url": "https://europa.eu/eures/portal/jv-se/jv-details/NDU1MjMxIDEwMQ?lang=en",
"company": "ST. GEORGE'S CARE LTD",
"employer_name": "ST. GEORGE'S CARE LTD",
"publication_date": "2026-10-07",
"creation_date": "2026-09-15T15:40:00.615Z",
"last_modification_date": "2026-10-07T17:55:09.083Z",
"number_of_posts": 3,
"location_country_codes": "MT",
"location_region_codes": "MT001",
"job_category_codes": "2221",
"job_category_primary": "2221",
"position_schedule_codes": "fulltime",
"position_offering_code": "contract",
"available_languages": "en",
"translation_type": "REQUESTED",
"translation_language": "en",
"translated_title": "NURSE",
"description_text": "Assess patient health and wellbeing, deliver person-centred care, communicate sensitively, support colleagues’ development, and promote best practices in health, safety, security, and clinical care.",
"summary": "Assess patient health and wellbeing, deliver person-centred care, communicate sensitively, support colleagues’ development, and promote best practices in health, safety, security, and clinical care.",
"eures_flag": true,
"source": "EURES",
"source_url": "https://europa.eu/eures/api/jv-searchengine/public/jv-search/search",
"city": "HAL BALZAN",
"application_deadline": "2026-10-13",
"salary_min": 8.98,
"salary_max": 12.66,
"salary_currency": "EUR",
"salary_period": "hour",
"salary_type": "basepay",
"application_instructions_text": "Submit an APPLICATION LETTER and CV by EMAIL OR apply through the Jobsplus website via the URL: https://jobsplus.gov.mt/vacancy/vacancy-details?id=455231",
"application_url": "https://jobsplus.gov.mt/vacancy/vacancy-details?id=455231",
"required_languages": "en (B1)",
"required_education_level_code": "6",
"employer_legal_id": "1",
"data_source": "Jobsplus, Public Employment Service, Malta",
"source_reference": "455231"
}

Use cases

  • Recruitment and sourcing. Find employers hiring for a role across Europe and reach out with the published contact and application details.
  • Labour market research. Measure demand by country, NUTS region, ISCO occupation, or sector, and follow how it changes over time.
  • Cross-border mobility. Collect vacancies flagged for EURES applicants (euresFlagCodes=WITH) for relocation services, job boards, and career advisors.
  • Salary benchmarking. Compare published salary ranges by occupation and country.
  • Job board aggregation. Feed fresh European public-sector job data into your own job board or newsletter.
  • Skills analysis. Use the ESCO skill and occupation URIs to map required skills to occupations.

How it works

  1. The Actor reads the filters from your EURES search URL. It uses the same rules the EURES portal uses, so you get the same results you see in your browser.
  2. It requests result pages of up to 50 vacancies from the EURES job search. While one page is processed, the next few load.
  3. If Include vacancy details is on, it opens each vacancy to add location, salary, application, contact, requirement, and employer fields.
  4. It cleans and flattens each vacancy into one row: dates become ISO format, HTML descriptions also come as plain text, and multi-value fields become comma-separated strings that work in CSV and Excel.
  5. It skips duplicate vacancies and stops when it reaches your vacancy limit or page limit, or runs out of results. EURES returns at most 10,000 results per search. When duplicates leave the run short of your target, it makes a second pass in the opposite sort order to find the missing vacancies.

How much does it cost to scrape EURES?

EURES Jobs Scraper charges per vacancy saved to the dataset. The price is lower on higher Apify plans:

EventPlanPrice per vacancyPrice per 1,000 vacancies
job-scrapedFree$0.00099$0.99
job-scrapedBronze$0.00089$0.89
job-scrapedSilver / Gold$0.00079$0.79

The price is the same whether vacancy details are on or off, and platform usage (compute and proxy) is included, so you pay only for the vacancies you get. For example, 5,000 vacancies cost $4.95 on the Free plan or $3.95 on Silver. Apify's Free plan comes with monthly platform credits that cover your first runs. Set a spending limit on any run and the Actor stops as soon as it's reached.

Use the EURES scraper via API

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("parsebird/eures-jobs-scraper").call(run_input={
"startUrl": "https://europa.eu/eures/portal/jv-se/search?keywordsEverywhere=nurse&locationCodes=de,at&orderBy=MOST_RECENT&lang=en",
"results_wanted": 200,
"include_details": True,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["title"], "|", job["company"], "|", job["location_country_codes"], "|", job.get("city"))

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('parsebird/eures-jobs-scraper').call({
startUrl: 'https://europa.eu/eures/portal/jv-se/search?keywordsTitle=software%20developer&locationCodes=nl&lang=en',
results_wanted: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((job) => console.log(job.title, job.company, job.salary_min, job.salary_currency));

Get your API token in Apify Console → Settings → Integrations. See the API tab for every endpoint, including running the Actor synchronously and getting results in one call.

Export formats and integrations

Download EURES job data as JSON, CSV, Excel, XML, HTML, or RSS from the Storage tab or the dataset API. Connect runs to Google Sheets, Slack, Zapier, Make, Airbyte, or webhooks, or use the Apify MCP server to let AI agents call the Actor directly.

FAQ

Do I need an EURES account or API key? No. The Actor only reads public vacancy data that anyone can see on the EURES portal without logging in.

Which countries does EURES cover? EU member states, Iceland, Liechtenstein, Norway, and Switzerland. Use locationCodes in your URL (for example locationCodes=fr,be) to pick countries, or NUTS region codes such as fr1 for regions.

How many vacancies can I get per run? Up to 10,000, which is the most EURES returns for one search. For bigger exports, split your search into several runs, for example one per country or occupation.

Why are salary, city, or contact fields empty on some vacancies? Each national employment service publishes different information, and many employers leave out salary or contact details. The Actor returns everything EURES publishes and leaves the rest empty. It never guesses.

What do job_category_codes and esco_occupation_uris contain? job_category_codes are 4-digit ISCO-08 occupation codes, and esco_occupation_uris link to the ESCO occupation classification. Many vacancies have only one of the two.

Can I get vacancies in English? Add lang=en (or another language code) to your URL. When the employer published a vacancy in that language, translated_title and translated_description_text contain that version. Otherwise they contain the original language. The Actor doesn't machine-translate.

My URL uses orderBy=PUBLICATION_DATE or publicationPeriod=LAST_7_DAYS. Does it work? Yes. EURES itself only accepts MOST_RECENT and LAST_WEEK, so the Actor switches to those values and notes the change in the log.

Is a proxy needed? No. EURES is a public EU service, and the Actor runs without a proxy by default. The proxy setting is there only if you need requests to come from a specific network.

Can I schedule the scraper to monitor new jobs? Yes. Use orderBy=MOST_RECENT with publicationPeriod=LAST_DAY or LAST_WEEK in your URL, and create an Apify Schedule to run it daily or weekly.

Something isn't working. Where do I report it? Open an issue on the Issues tab. We read every report.

EURES Jobs Scraper only collects public job vacancy data that EURES publishes for anyone to see without logging in. It doesn't access private accounts, CVs, or anything behind a login. Some vacancies include a contact person's name, email, or phone number, which is personal data under the GDPR. Process it only if you have a legitimate reason and follow data protection rules. Please also respect the EURES legal notice. For more background, read Apify's guide Is web scraping legal?

Other job scrapers by ParseBird

ActorWhat it does
Platsbanken Jobs ScraperSwedish job ads from Arbetsförmedlingen's Platsbanken
Xing Jobs ScraperJob listings from XING across Germany, Austria, and Switzerland
Karriere.at Austrian Jobs ScraperAustrian job listings from karriere.at
Jobs.ch ScraperSwiss job listings from jobs.ch
Arbeitnow Jobs ScraperJob listings from Arbeitnow, with remote filter
HelloWork Jobs ScraperFrench job listings from HelloWork
InfoJobs Jobs ScraperSpanish job listings from InfoJobs
Totaljobs ScraperUK job listings from Totaljobs
LinkedIn Jobs ScraperPublic job postings from LinkedIn
Indeed Jobs ScraperJob listings from Indeed