EURES Job Scraper — EU Job Mobility Portal
Pricing
Pay per usage
EURES Job Scraper — EU Job Mobility Portal
Fetch live vacancies from EURES, the European Commission's official job mobility network, through its public REST API. Every record includes title, employer, location, country and apply URL. A clean, reliable source of pan-European job data for boards, bots and labour-market research.
Fetch pan-European vacancies from EURES, the EU's official job mobility portal, via its public jv-search REST API.
What EURES jobs data does this scraper extract?
Each result is one flat JSON record per job posting:
| Field | Meaning |
|---|---|
id | Stable source-side identifier |
title | Job title as posted |
company | Hiring company / organisation (null if EURES doesn't disclose one) |
country | ISO country code(s) the vacancy is located in (e.g. "DE", or "DE, FR" for multi-country postings). EURES exposes country + NUTS-region codes, not free-text city names, so this is code data, not a street address |
location | Deprecated alias of country — identical value, kept for backward compatibility. New integrations should read country |
url | Direct link to the posting on the EURES portal |
postedAt | Posting date (YYYY-MM-DD), or null if EURES didn't supply a valid creation date |
snippet | Short plain-text description excerpt (HTML stripped) |
source | Always "eures" |
Note: EURES does not expose salary data through this API, so no salary field is emitted.
How to scrape EURES jobs with this Actor
- Click Try for free / Run — no login to the target site, no cookies, no proxies to configure.
- Adjust the input (keyword, filters,
maxItems) or keep the defaults. - Run it and export the dataset as JSON, CSV or Excel, or read it over the API.
Run it from your own code:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("nomad-agent/eures-scraper").call(run_input={"maxItems": 50})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], "—", item["company"], item["url"])
Or a single HTTP call that runs the Actor and returns items in one response:
curl -X POST \"https://api.apify.com/v2/acts/nomad-agent~eures-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"maxItems": 50}'
Input
| Field | Type | Default | Notes |
|---|---|---|---|
keywords | array | (built-in seeds) | One or more search terms. The scraper fans one API call per keyword and deduplicates results. Leave empty to use a built-in set of professional role seeds. |
locationCodes | array | (all EU) | Restrict results to specific EU countries or NUTS regions. Use ISO 3166-1 alpha-2 country codes (e.g. "de", "es", "fr") or NUTS codes. Leave empty to search all EU member states. |
publishedWithin | string (day|week|month) | week | Only fetch vacancies EURES marks as posted within this window (filtered server-side by the EURES API). week matches this Actor's previous fixed behaviour. |
maxItems | integer | 50 (max 1000) | Maximum number of vacancies to return across all keyword queries. Combined with deduplication, this is a hard cap on pushed records. Each result returned is billed — see Pricing below. |
timeoutSeconds (Advanced) | integer | 20 | How long to wait for a reply from the EURES API before giving up on that request, in seconds. |
cacheTtlSeconds (Advanced) | integer | 1800 | Reuse a search's results for this many seconds instead of asking EURES again, so quick repeat runs are faster and cheaper. Set 0 to always fetch fresh results. |
Output example
{"id": "8823771","title": "Mechatronics Technician","company": "Siemens AG","country": "DE","location": "DE","url": "https://europa.eu/eures/portal/jv-se/jv-details/8823771","postedAt": "2026-06-30","snippet": "Siemens is hiring a mechatronics technician...","source": "eures"}
Integrations
Export the dataset as JSON, CSV or Excel from the Console, pull it over the Apify API (e.g. run-sync-get-dataset-items for a single blocking call), wire it into Make/Zapier/n8n, or call it as a tool from AI agents via the Apify MCP server.
Pricing
Pay per event: $0.05 per Actor start and $0.004 per job returned. 100 jobs ≈ $0.45. No subscription, no rental — you pay only for what you fetch.
Use cases
- Pan-EU job boards and relocation services
- Cross-border labour-market research
- Job-alert bots for EU-wide searches
- Feeding matching engines with EU-wide supply
FAQ
Is it legal to scrape EURES jobs? This Actor reads only publicly available job postings — data any visitor can see without logging in. No personal data behind authentication is touched. Review the target site's terms and your local regulations for your specific use case.
Do I need an account on the target site? No. Postings are fetched from public pages/APIs — no login, cookies or session tokens.
How fresh is the data?
Every run fetches live listings, filtered server-side by EURES to postings from the last day/week/month via the publishedWithin input (default: last week). Within that, results are cached for cacheTtlSeconds (default 30 min, set 0 to always hit the source live).
How many jobs can I get?
maxItems caps the run (default 50, maximum 1000). Results are sorted by keyword-match relevance, not strictly newest-first.
Is scraping EURES allowed? EURES data comes from its public API. Per the portal's terms it is intended for personal / link-back use — review the EURES terms for your use case.
Something broken or missing? Open an issue on the Actor's Issues tab — it is monitored and reliability fixes ship fast.