Research & Academic Jobs Scraper — 10 Sources avatar

Research & Academic Jobs Scraper — 10 Sources

Pricing

Pay per event

Go to Apify Store
Research & Academic Jobs Scraper — 10 Sources

Research & Academic Jobs Scraper — 10 Sources

Every researcher-relevant job source behind one endpoint: LinkedIn, EURAXESS, jobs.ac.uk, UN Careers, ReliefWeb, Impactpool, Ikerbasque, Devex, University of Copenhagen and Universitat de Barcelona. One run returns a merged, deduped dataset of live research, academic, policy and NGO roles.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Nomad.Dev

Nomad.Dev

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

11 hours ago

Last modified

Categories

Share

One call, ten sources. Fans out to 10 actors covering academia, UN/NGO and policy hiring, merges and dedupes into one dataset.

Two sources need your own Anthropic or Mistral key. devex and ub_doctoral extract listings using an AI provider (Claude/Anthropic or Mistral). Pass anthropicApiKey or mistralApiKey in the input to include them — either key is enough; Anthropic is preferred when both are set. Without either key, those two sources are skipped — you are not charged for them — the other 8 sources run normally, and the output includes a warning row for each skipped source (see BYOK behavior below).

What research jobs data does this scraper extract?

Each result is one flat JSON record per job posting:

FieldTypeMeaning
sourcestringWhich child board the record came from, e.g. "reliefweb"
idstringStable source-side identifier ("" when the source has none)
titlestringJob title as posted
companystringHiring company / organisation
locationstringLocation / duty station (may include remote hints)
urlstringDirect link to the posting
postedAtstringPosting date where the source provides it, else ""
deadlinestringApplication deadline where the source provides it, else "" — populated by euraxess, jobs_ac_uk, un_careers, reliefweb, devex, math_ku_phd and ub_doctoral; linkedin, impactpool and ikerbasque don't expose a deadline, so those always return ""
snippetstringShort description excerpt
salarystringSalary text where the source provides it, else "" — only jobs_ac_uk populates this today; the other 9 sources always return ""

Warning rows (see below) additionally carry a warning field and every other field is null instead of "".

How the bundle works

This is a bundle Actor: one endpoint that fans out to the individual job-source Actors listed below, runs them concurrently, maps every record onto one flat schema and dedupes by URL across boards. You can restrict the run to a subset with the sources input. Each child source is charged its own pay-per-event pricing on top of this bundle's — that is the cost of one-call breadth.

BYOK behavior (Devex & UB doctoral)

devex and ub_doctoral read listings that need extra rendering and use an AI provider (Anthropic or Mistral) to extract structured data from them, so they require anthropicApiKey or mistralApiKey — either one is enough; when both are set, Anthropic is used and mistralApiKey/mistralModel are ignored for these two sources. If you don't pass either:

  • Both sources are removed from the run before any child actor is started — you are not billed their $0.05 actor-start fee.
  • One warning row per skipped source is pushed to the dataset: {"source": "devex", "warning": "skipped: requires anthropicApiKey or mistralApiKey", ...other fields null...}.
  • The run's status message (visible in the Apify Console and via the Runs API) also states which sources were skipped and why.
  • This applies even if you explicitly list devex or ub_doctoral in sources — without a key they still can't produce rows, so they're still skipped and still get a warning row.
  • The other 8 sources are completely unaffected.

Your Anthropic or Mistral usage for these two sources is billed separately, directly by that provider — it is not part of this Actor's Apify pricing.

How to scrape research jobs with this Actor

  1. Click Try for free / Run — no login to the target site, no cookies, no proxies to configure.
  2. Adjust the input (keyword, filters, maxItems) or keep the defaults.
  3. 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 ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("nomad-agent/researcher-bundle").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~researcher-bundle/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"maxItems": 50}'

Input

FieldTypeDefaultNotes
sourcesarray["linkedin", "euraxess", "jobs_ac_uk", "un_careers", "reliefweb", "impactpool", "ikerbasque", "devex", "math_ku_phd", "ub_doctoral"]Which boards to include. Leave empty to run the full default set. Each enabled source costs its own $0.05 actor-start plus per-result fees.
keywordstring""Optional free-text filter forwarded to children that support it (others ignore it).
anthropicApiKeystring (secret)""Needed (or mistralApiKey, below — either is enough) only for devex and ub_doctoral. Without either, those two are skipped with a warning row — see BYOK behavior. Billed separately by Anthropic. Preferred over mistralApiKey when both are set.
mistralApiKeystring (secret)""Alternative to anthropicApiKey for devex and ub_doctoral — pass this instead if you'd rather bring a Mistral key. Billed separately by Mistral.
mistralModelstring"mistral-small-latest"Mistral model forwarded to devex/ub_doctoral when they run on mistralApiKey (no anthropicApiKey supplied).
maxItemsPerSourceinteger36Cap on items fetched from EACH child board before merge.
maxItemsinteger360Hard cap on the merged, deduped output. Default is sources × maxItemsPerSource (the zero-config ceiling). Set 0 for no cap.
cacheTtlSecondsinteger1800How long to reuse results already fetched from a source instead of re-fetching. 0 = always fetch fresh.
concurrencyinteger6How many child boards to run in parallel. (Advanced)
runTimeoutSecsinteger120How long to wait for each source before giving up on it. (Advanced)
apifyTokenstring (secret)""Leave empty — injected automatically on the Apify platform. Only set for local runs outside the platform. (Advanced)
actorOwnerstring""Which Apify account's child actors to call. Leave empty to use this bundle's published sources. (Advanced)

Output example

A normal record:

{
"source": "reliefweb",
"id": "4218889",
"title": "Protection Officer",
"company": "Danish Refugee Council",
"location": "Ukraine",
"url": "https://reliefweb.int/job/4218889/protection-officer",
"postedAt": "2026-06-28",
"deadline": "",
"snippet": "The Protection Officer supports...",
"salary": ""
}

A source populating deadline (euraxess, jobs_ac_uk, un_careers, reliefweb, devex, math_ku_phd, ub_doctoral) or salary (jobs_ac_uk only) fills in that field instead of "". A warning row, pushed when a BYOK source is skipped:

{
"source": "devex",
"id": null,
"title": null,
"company": null,
"location": null,
"url": null,
"postedAt": null,
"deadline": null,
"snippet": null,
"salary": null,
"warning": "skipped: requires anthropicApiKey or mistralApiKey"
}

Pricing

Pay per event: $0.05 per Actor start and $0.004 per job returned — plus each enabled child source's own pay-per-event pricing (also $0.05 per start + $0.004 per result, charged by that child actor directly).

Zero-config run estimate (defaults, no anthropicApiKey/mistralApiKey): 8 runnable sources × up to 36 items = up to ~288 merged items, roughly $2.75 all-in ($0.05 + 8×$0.05 in child starts + up to 288 items × $0.008 combined per-result fee). Pass an anthropicApiKey (or mistralApiKey) to also run devex and ub_doctoral: 10 sources × up to 36 items = up to ~360 items, roughly $3.43 all-in. Real runs usually cost less — not every board returns the full cap, and cross-board duplicates are billed once by whichever child returned them first but not double-billed by the bundle.

Skipped BYOK sources (neither key provided) cost nothing — no child actor-start, no per-result fees, and the warning row itself is not billed. Your own Anthropic or Mistral API usage (when you supply a key) is billed separately, directly by that provider.

Use cases

  • Academic job boards and PhD/postdoc alert bots
  • NGO/policy career services
  • Research-mobility analytics
  • University career offices

FAQ

Is it legal to scrape research 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. 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 (set 0 for no cap). Most sources paginate from newest to oldest.

Why don't I see Devex or UB doctoral jobs? You didn't pass anthropicApiKey or mistralApiKey — see BYOK behavior above. Add either key to include those two sources.

Something broken or missing? Open an issue on the Actor's Issues tab — it is monitored and reliability fixes ship fast.

Integrations

Export the dataset as JSON, CSV or Excel, or read it straight from the Apify API. Works out of the box with Make, Zapier and n8n via their Apify integrations, can be called synchronously with run-sync-get-dataset-items from any backend, and is usable by AI agents through the Apify MCP server.