EU Academic Jobs: PhD, Postdoc & Research Positions
Pricing
from $4.00 / 1,000 result returneds
EU Academic Jobs: PhD, Postdoc & Research Positions
All PhD, postdoc, professor, and research positions from 9 major EU portals — EURES, DAAD, EuroScienceJobs, UniversityPositions, INOMICS — in one deduplicated dataset. Keyword, country, and date filters; academic-only mode drops corporate noise. Weekly scheduled runs surface only new postings.
Pricing
from $4.00 / 1,000 result returneds
Rating
4.6
(3)
Developer
ScholarStack
Maintained by CommunityActor stats
5
Bookmarked
46
Total users
17
Monthly active users
4 days ago
Last modified
Categories
Share
Find every PhD position, postdoc job, and research vacancy in Europe in one run. This actor aggregates 9 major academic job portals — EURES, DAAD PhDGermany, EuroScienceJobs, UniversityPositions, INOMICS, AcademicTransfer (NL), jobs.ac.uk (UK), Nature Careers, and CNRS Emploi (FR) — into a single normalized, deduplicated dataset (JSON / CSV / Excel / XML). Keyword auto-translation finds local-language postings an English-only search misses, and academic-only mode drops the corporate noise that EURES mixes into general "research" searches.
Manually checking nine portals every week takes hours. This actor does it in minutes — and with a scheduled weekly run in incremental mode, you only ever see new postings, for about $0.20/week.
Who is this for?
- PhD & postdoc job seekers — set up a weekly scheduled run with
incrementalMode: trueand only see new positions in your field and countries - Research groups — monitor hiring across Germany, Netherlands, France, etc.
- Recruitment platforms & career services — enrich your listings database with structured EU academic job data via the Apify API
- Data analysts — track hiring trends in specific fields (Physics, CS, Economics) over time
Job portals covered (EURES, DAAD, EuroScienceJobs, UniversityPositions, INOMICS)
- EURES — European Employment Services (a general EU job board with millions of listings). With
academicOnlyon, the actor filters server-side by 155 ESCO academic occupations (lecturers, researchers, scientists, professors) — surfacing thousands of tagged academic jobs, including strong Nordic coverage (SE/NO/DK) other boards miss — and additionally matches your keywords in the job title (euresKeywordScope). The academic filter then drops loosely-tagged corporate noise. This is the main volume source. - DAAD PhDGermany — Germany's official PhD position database (Germany only; skipped automatically if you don't request
DE). - EuroScienceJobs — Science and research jobs across Europe; the actor pulls each country's full listing and filters by keyword in the title/tags.
- UniversityPositions — University and research-institute positions EU-wide. The actor walks the full paginated catalogue (~300 jobs) plus a server-side keyword search, and extracts structured data including salary ranges, application deadlines, and exact posting dates.
- INOMICS — Economics, finance, and social-science academic jobs. Because it's economics-focused, non-economics keywords (e.g.
biology) will legitimately return few or no results from this source. - AcademicTransfer — The official jobs portal of the Dutch research universities, UMCs, and NWO institutes. Strongest single source for Netherlands (NL) coverage. Honours
academicOnlyto switch between scientific-only and full vacancy lists. - jobs.ac.uk — The UK's dominant academic jobs board, ~2,500 live listings. Covers UK universities plus a meaningful share of continental EU postings.
- Nature Careers — Top-tier science postings from Springer Nature, including Max Planck, EMBL, DKFZ, and other premier research institutes. Smaller volume but high-quality.
- CNRS Emploi — France's national research org (CNRS) job portal, ~630 positions across all CNRS labs nationwide. Strongest single source for FR research coverage.
Two optional opt-in sources are not in the default enabledSources list. AcademicPositions (academicpositions.com, ~1,150 European jobs with explicit application deadlines and position types; the deepest source for Belgium, Sweden, Switzerland, and Luxembourg) — add "academicpositions" to enable it; if the run reports Cloudflare blocks, enable RESIDENTIAL proxy. And Euraxess (the European Commission's official researcher-mobility portal, ~8,300 jobs across all EU member states) — add "euraxess" to enable it. It works in two modes. Without proxy it collects up to ~750 listings and stops gracefully the moment the euraxess.fr per-IP rate limit kicks in, keeping everything gathered so far. With Apify proxy (proxyConfiguration.useApifyProxy: true, RESIDENTIAL group) rotating IPs lift that limit and the full catalogue becomes reachable, with country filters applied server-side for fast targeted runs.
By enabling the opt-in source you confirm you have the right to access the target site's data per its terms of service in your jurisdiction.
How to find all PhD and postdoc positions in Europe in one search
- Click Try for free on the Apify page.
- Adjust keywords (e.g.
["postdoc", "PhD"]) and countries (e.g.["DE", "NL"]). - Leave academicOnly = true unless you specifically want corporate R&D as well.
- Click Start. Download results as JSON / CSV / Excel / XML from the Output tab.
Quick-start input — copy and paste this:
{"keywords": ["research"],"countries": ["DE", "NL", "FR"],"academicOnly": true,"translateKeywords": true,"maxResultsPerSource": 500,"postedWithinDays": 30,"incrementalMode": false}
Set up a weekly job alert (scheduled runs + incremental mode)
The strongest way to use this actor — a personal academic job alert that costs ~$0.20/week:
- Run the actor once with your keywords and countries to seed the baseline.
- In Apify Console, open Schedules and schedule the actor weekly with the same input plus
incrementalMode: true. - Every scheduled run now returns only jobs not seen in previous runs — your weekly "new positions" digest.
- Optional: attach an Apify integration (email, Slack, webhook) to get the new postings delivered automatically.
Filter by keyword, country, and posting date
| Field | Description | Default |
|---|---|---|
keywords | Search terms, combined with OR — a job matching any keyword is kept (results are merged fairly across keywords). Use a multi-word entry like "machine learning" to match that phrase. Each portal matches the keyword in the job title (EURES title scope, and title/tags on the curated boards), so add several related terms if you want broader recall. | ["research"] |
countries | ISO country codes. Leave empty to search all of Europe. | [] (all EU) |
translateKeywords | Auto-expand keywords into the languages of the selected countries (e.g. research → recherche (FR), Forschung (DE), ricerca (IT)). Surfaces local-language jobs an English-only search misses — French results jumped from ~2 to 50+ in testing. Unrecognised keywords are searched as-is. | true |
academicOnly | Keep only genuine academic / research roles. On EURES this also activates a server-side filter on 155 ESCO academic occupations, surfacing thousands of tagged academic jobs. Drops corporate and staffing-agency postings (e.g. "Research Associate" at a GmbH / AG / CRO / Personalservice) while keeping universities and research institutes — including those legally registered as a GmbH (Helmholtz, Forschungszentrum Jülich, etc.). | true |
euresKeywordScope | How EURES matches keywords. title = keyword must be in the job title (precise, recommended). everywhere = match anywhere in the listing (broad but noisy — machine learning matches 200k+ jobs). Only affects EURES. | title |
maxResultsPerSource | Cap per portal (after the academic filter). Raise it for more results — portals like EURES have thousands of listings. | 500 (max 5000) |
maxTotalResults | Overall cap after dedup. 0 = no cap. | 0 |
enabledSources | Which portals to query. | all 9 |
postedWithinDays | Only return jobs posted within N days. 0 = all. | 0 |
incrementalMode | Only return jobs not seen in previous runs. | false |
proxyConfiguration | Optional Apify proxy. | disabled |
debug | Show detailed diagnostic logs (per-request URLs, page-by-page progress). Off by default for a clean run log; enable only for troubleshooting. | false |
Output: what each job record contains
Each item is a flat JSON object. Example:
{"id": "daad_d5366ddc0d43c536","title": "PhD Student (f/m/d) ImmunoFLASH: CAR T immunotherapy with FLASH radiotherapy","institution": "Helmholtz-Zentrum Dresden-Rossendorf","department": "Institute of Radiooncology – OncoRay","country": "DE","city": "Dresden","deadline": "2026-06-30","postedDate": "2026-05-12","salaryInfo": null,"salaryMonthlyEur": null,"contractDuration": "01.10.2026","workingLanguage": "German, English","jobType": "Full PhD","requiredDegree": "Master, Diplom","field": "Medicine","fundingSource": "Helmholtz Association","applicationUrl": "https://www.daad.de/en/.../phd-student-fmd-immunoflash-...","sourcePortal": "DAAD","scrapedAt": "2026-05-14T17:24:18.823Z"}
You can download the dataset in JSON, CSV, Excel, or XML from the Output tab or via the Apify API.
Data fields
| Field | Type | Notes |
|---|---|---|
id | string | Format: {sourceCode}_{md5hash}. Cross-source duplicates dedupe to one row; the kept id is the first source seen. |
title | string | Job title |
institution | string | Hiring organization |
department | string|null | Lab / faculty if available |
country | string|null | ISO-2 code (e.g. DE, NL) |
city | string|null | City or region name; NUTS region codes resolved to human-readable names |
deadline | string|null | ISO date when available |
postedDate | string|null | ISO date |
salaryInfo | string|null | Raw salary text when explicitly stated on the listing (rare; most listings don't expose structured salary). |
salaryMonthlyEur | number|null | Normalized monthly gross EUR — best-effort parse from salaryInfo. Frequently null. |
contractDuration | string|null | Schedule ("Full-time" / "Part-time" from EURES & UniversityPositions) OR start date from DAAD. |
workingLanguage | string|null | DAAD only |
jobType | string|null | e.g. "Full PhD", "Structured programme" |
requiredDegree | string|null | DAAD only |
field | string|null | Inferred research field (Physics, CS, Medicine, etc.) |
fundingSource | string|null | Funding agency OR research-consortium affiliation when mentioned in the listing. Examples: "DFG", "ERC", "Horizon Europe", "MSCA", "BMBF", "Helmholtz Association", "Max Planck Society", "Leibniz Association", "Fraunhofer". Heuristic — verify on the source page if critical. |
tags | array|null | EuroScienceJobs / UniversityPositions tag chips |
descriptionRaw | string|null | EURES/INOMICS/UniversityPositions: first ~400 chars, HTML stripped. DAAD: synthetic summary from metadata fields. EuroScienceJobs: not populated. Emails and IBANs always redacted. |
applicationUrl | string|null | Direct link to the posting |
sourcePortal | string | EURES / DAAD / EuroScienceJobs / UniversityPositions / INOMICS / AcademicTransfer / JobsAcUk / NatureCareers / CNRS (+ Euraxess and AcademicPositions if enabled) |
scrapedAt | string | ISO timestamp |
How much does it cost to scrape EU academic jobs?
Pay-per-result: $4.00 per 1,000 results.
Concrete examples:
- 200 academic jobs across all 9 sources = $0.80
- A weekly incremental run that surfaces ~50 new jobs = $0.20/week
Incremental mode is free to enable and significantly reduces cost on recurring runs.
For recruitment platforms and career services: API access
Everything works programmatically through the Apify API — start runs with your own keyword/country matrix, fetch normalized JSON, and feed it into your own job board, CRM, or analytics pipeline. Combine schedules, incrementalMode, and webhooks to keep a continuously fresh EU academic jobs feed without re-paying for unchanged listings.
Tips
- Non-English countries: leave
translateKeywordson — searchingresearchacross["FR","DE","IT"]automatically also matchesrecherche,Forschung,ricerca, so you don't need to know the local words. (In testing this took France from ~2 results to 50+.) - More results vs. more precision: the default matches your keyword in the job title (precise). For broader recall, add related keywords (e.g.
["biology", "molecular", "genetics"]) or seteuresKeywordScope: "everywhere"(more results from EURES, but noisier). - Want more total results? Raise
maxResultsPerSource(up to 5000). For the maximum haul, run with emptykeywordsandacademicOnly: true— EURES then returns its full occupation-tagged academic inventory (thousands of jobs EU-wide, auto-partitioned per country). The specialist boards are smaller and are already returned in full. - Turn academicOnly off only if you specifically want corporate R&D positions from EURES.
- Use
postedWithinDays: 14for fresh-only feeds. - Combine
incrementalMode: truewith a scheduled run to build a deduplicated weekly digest. - For large multi-country crawls, enable
proxyConfigurationto avoid IP rate-limiting on INOMICS / EuroScienceJobs. - Countries must be ISO-2 codes (
"DE","NL","FR") — full country names are not supported.
FAQ
How do I get notified about new PhD positions every week?
Schedule the actor weekly in Apify Console with incrementalMode: true — each run returns only postings not seen before. Attach an email or Slack integration to deliver them automatically. Typical cost: ~$0.20/week.
Does it find jobs posted in German, French, or Dutch?
Yes — with translateKeywords on (the default), your keywords are auto-expanded into the languages of the selected countries, so local-language postings are found without you knowing the local terms.
Which countries are supported?
Any European country by ISO-2 code. Verified with DE; the other sources expose NL, FR, AT, CH, BE, SE, DK, FI, NO, IT, ES, PL, IE, GR and more. DAAD only covers Germany; other sources cover broader EU.
Can I get only university positions, no company jobs?
Yes — that's the default (academicOnly: true). It drops corporate and staffing-agency postings while keeping universities and research institutes, including those legally registered as a GmbH (Helmholtz, Forschungszentrum Jülich, etc.).
Why are some salaryInfo / deadline fields null?
Not all portals expose them. EURES doesn't return deadlines via API; salary is rarely structured. We extract what's available.
Why don't I get all the jobs a portal's website shows?
Two reasons. First, the website count is unfiltered — with academicOnly on, the actual academic share is much smaller. Second, EURES's search API only serves the first 10,000 results of any single query (a fixed result-window limit, unrelated to proxies or your plan); for narrower keyword searches this is never a problem since they return well under 10,000.
Is this legal?
The Actor only fetches publicly-listed job postings. It respects rate limits, identifies itself, and redacts emails / IBANs from descriptions. You are responsible for downstream use complying with each portal's terms.
Support / bugs
Use the Issues tab on this Actor page to report problems or request features.
Disclaimer
The Actor scrapes third-party websites whose layouts may change without notice. Results are best-effort; verify critical details (deadlines, salaries) on the source page before applying. This is an independent, unofficial tool — not affiliated with or endorsed by EURES, DAAD, EuroScienceJobs, UniversityPositions, INOMICS, AcademicTransfer, jobs.ac.uk, Nature Careers, CNRS, Euraxess, or AcademicPositions.