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.
PhD, Postdoc & Research Jobs Scraper — 11 Sources in 1
Claude / Codex skill to describe and setup this actor: SKILL.md
PhD, postdoc, academic, research, policy and NGO job boards behind one endpoint.
Most academic job scrapers cover a single portal. This one merges 11 sources, dedupes them within the run, and hands you one canonical six-root dataset.
EURAXESS · jobs.ac.uk · UN Careers · ReliefWeb · ImpactpoolIkerbasque · U. of Copenhagen · Universitat de BarcelonaAcademicPositions · EURES · LinkedIn
Why this one
| This Actor | Typical single-portal scraper | Other academic aggregators | |
|---|---|---|---|
| Sources | 11 | 1 | 9 (EU only) |
| Coverage | EU + UK + global academia and UN / NGO / policy | one board | EU academia only |
| Cross-source dedupe | ✅ | n/a | ✅ |
| Bundle price per 1,000 jobs | $3.00 for the default in-process set | $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). 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. The 10 default sources run inside this Actor, so a default run
has only this bundle's charges. AcademicPositions is the 11th, opt-in source;
it runs as a separate child Actor and adds that Actor's own start/result fees to
the bundle charges.
| Event | Price |
|---|---|
| Actor start | $0.01 per run |
| Job result | $0.003 per unique job returned |
$3.00 per 1,000 unique jobs delivered by this bundle. The separate
AcademicPositions fees are not included in that rate.
One detail that keeps 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.
AcademicPositionsis off by default. Selecting it explicitly starts the separate child Actor and incurs both the bundle's charges and the child Actor's independently configured charges.
Local integration status
The fleet-v2 bundle described here is a local, unreleased mixed-fleet integration. These files are not evidence that the Store Actor has been deployed or migrated. Dedupe is limited to records in the current run; cross-run inventory and dedupe remain disabled and deferred.
The shared runtime is installed from the checked-in
nomad-job-scraper-core==1.1.22 wheel, whose exact SHA-256 is pinned in
requirements.lock; no Actor-local core source copy is shipped.
Input
Everything is optional. Run it with {} and you get a sensible default sweep.
| Field | Default | What it does |
|---|---|---|
sources | 10 in-process boards | Which boards to include; AcademicPositions is opt-in. |
keyword | — | Free-text filter, forwarded to the boards that support it (machine learning, climate, postdoc…). |
maxItemsPerSource | 20 | Cap per board before merging. |
maxItems | 220 | Hard cap on the merged output — and therefore on your bill. 0 = no cap. |
mistralApiKey / anthropicApiKey | — | Optional keys retained for compatible source features; not needed for full-description extraction. |
{"keyword": "machine learning","sources": ["euraxess", "jobs_ac_uk", "un_careers", "eures"],"maxItemsPerSource": 25}
Devex availability
Devex is excluded from the bundle until its canonical job pages can be fetched reliably. Search-result snippets and model reconstructions are not accepted as complete position descriptions.
Output
Breaking fleet-v2 output: every dataset item is a canonical
nomad-agent-job-v1 record with exactly six roots. Flat bundle rows and
diagnostic warning rows are no longer emitted.
Abbreviated root layout (actual data objects contain every canonical field):
{"schemaVersion": "nomad-agent-job-v1","identity": {"source": "euraxess", "externalId": "123456", "url": "https://euraxess.ec.europa.eu/jobs/123456"},"data": {"title": "Postdoctoral Researcher in Machine Learning", "company": {"name": "KU Leuven"}},"custom": {"schemaId": "https://raw.githubusercontent.com/Exdenta/OinkJobSearch/main/apify/job_custom_schemas/euraxess-v1.schema.json","data": {"academicLevelRaw": ["PhD Positions"],"researchInfrastructureStaffPosition": null,"unmappedJobInformation": null,"unparsedGeofields": null}},"llm": {"status": "not_requested", "requestedFields": [], "filledFields": [], "provider": null, "model": null, "promptVersion": null, "completedAt": null},"raw": {"description": "The complete position description...", "descriptionHtml": null}}
Every normalized field is present. null means unknown; arrays are empty only
when the source explicitly established emptiness. Full source descriptions are
in raw.description. Bounded source status and counters are written separately
to the default key-value store record RUN-SUMMARY.
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():company = job["data"]["company"]print(job["data"]["title"],"—",company["name"] if company else None,"—",job["identity"]["url"],)
Typical uses
- Job-alert products — schedule full-snapshot runs and compare the rows downstream before piping alerts into email, Telegram or 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 failure is recorded in logs and RUN-SUMMARY without adding a non-job row to the dataset.
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.