PhD, Postdoc & Research Jobs Scraper — 12 Sources in 1
Pricing
from $3.00 / 1,000 job results
PhD, Postdoc & Research Jobs Scraper — 12 Sources in 1
Every PhD, postdoc and research job source behind one endpoint: EURAXESS, jobs.ac.uk, UN Careers, ReliefWeb, Impactpool, Devex, Ikerbasque, EURES, LinkedIn, AcademicPositions + 2 university boards. One run returns a merged, deduped dataset - billed once. Incremental mode surfaces only new postings.
Every PhD, postdoc, academic, research, policy and NGO job board behind one endpoint, one run, one bill.
Most academic job scrapers cover a single portal. This one merges 12 of them, dedupes across all of them, and hands you a single flat dataset — so you stop running (and paying for) a dozen scrapers and stitching their output together yourself.
EURAXESS · jobs.ac.uk · UN Careers · ReliefWeb · Impactpool · DevexIkerbasque · U. of Copenhagen · Universitat de BarcelonaAcademicPositions · EURES · LinkedIn
Why this one
| This Actor | Typical single-portal scraper | Other academic aggregators | |
|---|---|---|---|
| Sources | 12 | 1 | 9 (EU only) |
| Coverage | EU + UK + global academia and UN / NGO / policy | one board | EU academia only |
| Cross-source dedupe | ✅ | n/a | ✅ |
| Only-new-since-last-run | ✅ | rarely | ✗ |
| Price per 1,000 jobs | $3.00 all-in | $0.50 – $4.90 | $4.00 |
No other Actor in the store combines academic boards and the UN / NGO / development-career sources (UN Careers, ReliefWeb, Impactpool, Devex). If you track research careers that cross between a university and an international organisation, this is the only single feed that sees both.
Pricing
Pay-per-event. You are billed by this Actor and nothing else — the sources run inside this Actor, so there are no hidden child-Actor fees stacked on top.
| Event | Price |
|---|---|
| Actor start | $0.01 per run |
| Job result | $0.003 per unique job returned |
$3.00 per 1,000 unique jobs. A default run (all boards, 20 jobs each) returns ~170 deduped postings and costs about $0.52.
Two details that keep the bill honest:
- You pay per unique job. Cross-source duplicates are dropped before billing, not after. A posting that shows up on both EURAXESS and jobs.ac.uk is one charge, not two.
incrementalModedoesn't re-bill. On a schedule, the Actor remembers every URL it already delivered and skips — and does not charge for — anything you've already received. A daily run typically bills only the handful of genuinely new postings.
One exception:
AcademicPositionsneeds a real browser to clear Cloudflare, so it runs as a separate child Actor and adds that Actor's own fees on top of this one's. It is off by default — tick it only if you want it.
Input
Everything is optional. Run it with {} and you get a sensible default sweep.
| Field | Default | What it does |
|---|---|---|
sources | all 11 in-process boards | Which boards to include. |
keyword | — | Free-text filter, forwarded to the boards that support it (machine learning, climate, postdoc…). |
incrementalMode | false | Return only postings not delivered on a previous run. Turn this on for scheduled runs. |
maxItemsPerSource | 20 | Cap per board before merging. |
maxItems | 240 | Hard cap on the merged output — and therefore on your bill. 0 = no cap. |
mistralApiKey / anthropicApiKey | — | Unlocks devex and ub_doctoral, which use an LLM to extract listings. Billed by Mistral/Anthropic, not by us. |
{"keyword": "machine learning","sources": ["euraxess", "jobs_ac_uk", "un_careers", "eures"],"maxItemsPerSource": 25,"incrementalMode": true}
BYOK sources (Devex & UB doctoral)
These two read listings that need extra rendering and use an AI provider (Mistral or Anthropic) to extract structured data, so they need mistralApiKey or anthropicApiKey — either one is enough; Mistral is used when both are set. Without a key:
- Both are dropped from the run and you are not charged for them.
- One warning row per skipped source is added to the dataset:
{"source": "devex", "warning": "skipped: requires anthropicApiKey or mistralApiKey", ...}. - The run's status message says which sources were skipped and why.
- The other 9 boards are completely unaffected.
Your Mistral/Anthropic usage is billed directly by that provider — it is not part of this Actor's Apify pricing.
Output
One flat, deduped row per posting:
{"source": "euraxess","id": "123456","title": "Postdoctoral Researcher in Machine Learning","company": "KU Leuven","location": "Leuven, Belgium","url": "https://euraxess.ec.europa.eu/jobs/123456","postedAt": "2026-07-10","deadline": "2026-08-31","snippet": "The Department of Computer Science invites applications…","salary": ""}
| Field | Meaning |
|---|---|
source | Which board the record came from, e.g. "euraxess" |
id | Stable source-side identifier ("" when the board has none) |
title | Job title as posted |
company | Hiring organisation |
location | Location / duty station (may include remote hints) |
url | Direct link to the posting — also the cross-source dedupe key |
postedAt | Posting date where the board provides it, else "" |
deadline | Application deadline — populated by euraxess, jobs_ac_uk, un_careers, reliefweb, devex, math_ku_phd, ub_doctoral; the others return "" |
snippet | Short description excerpt |
salary | Salary text — only jobs_ac_uk populates this today; the others return "" |
Fields a board doesn't provide come back as "", never missing — so the schema stays stable across all 12 boards. Warning rows carry an extra warning field, with every other field null.
Run it from your own code
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("nomad-agent/researcher-bundle").call(run_input={"keyword": "postdoc", "maxItems": 50})for job in client.dataset(run["defaultDatasetId"]).iterate_items():print(job["title"], "—", job["company"], "—", job["url"])
Typical uses
- Job-alert products — schedule it daily with
incrementalMode: trueand pipe the new rows into email / Telegram / Slack. - Academic labour-market research — one dataset spanning EU, UK and international-organisation research posts.
- Recruiting and talent mapping — see who is hiring researchers, where, and on what deadline cadence.
Reliability
Every board fails open: if one is down or slow, the run still returns everything the others found, and the failing board is named in the log. A run that hits an unexpected error still finishes SUCCEEDED carrying a diagnostic row, rather than failing and losing the results you already paid for.
Found a bug, or want a board added? Open an issue on the Actor page — we read them. If this saved you time, a review helps other researchers find it.
Is this Actor useful to you? A quick ⭐ review on the Actor's Reviews tab helps other researchers and PhD applicants find it — and tells us what to build next.
From the maker of Oink — an open-source, AI-powered job-search bot for Telegram that runs on these Actors. Try the free bot, get a managed instance at oinkjobsearch.com, or browse the full catalog of 50+ Actors.