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 5 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
5.0
(2)
Developer
ScholarStack
Maintained by CommunityActor stats
2
Bookmarked
20
Total users
13
Monthly active users
3 days ago
Last modified
Categories
Share
Find every PhD position, postdoc job, and research vacancy in Europe in one run. This actor aggregates 5 major academic job portals — EURES, DAAD PhDGermany, EuroScienceJobs, UniversityPositions, and INOMICS — 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 five 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). Keywords are matched in the job title by default (
euresKeywordScope), then the academic filter keeps only academic/research roles. 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; full country listing filtered by keyword in the title/tags.
- 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.
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": 300,"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. | ["DE"] |
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. 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. | 300 (max 5000) |
maxTotalResults | Overall cap after dedup. 0 = no cap. | 0 |
enabledSources | Which portals to query. | all 5 |
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: first ~400 chars, HTML stripped. DAAD: synthetic summary from metadata fields. EuroScienceJobs/UniversityPositions: not populated. Emails and IBANs always redacted. |
applicationUrl | string|null | Direct link to the posting |
sourcePortal | string | EURES / DAAD / EuroScienceJobs / UniversityPositions / INOMICS |
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 5 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) and add more countries. EURES is the only source large enough to scale; 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, or INOMICS.