Universitat de Barcelona Jobs: PhD, Postdoc & Research
Pricing
from $3.10 / 1,000 job results
Universitat de Barcelona Jobs: PhD, Postdoc & Research
Scrape currently-open vacancies from Universitat de Barcelona's official vacancy board — PhD/predoctoral contracts by default, or postdoc, research, teaching and staff jobs via keyword. No API key needed. Incremental new-only runs for scheduled alerts.
Universitat de Barcelona Jobs Scraper — PhD, Postdoc & Research
Claude / Codex skill to describe and setup this actor: SKILL.md
Scrapes currently-open vacancies from Universitat de Barcelona's official public-vacancy board (the UB seu electrònica → Ofertes de feina) — the same board UB itself publishes to.
No API key. No proxy. No AI credits. Just run it.
By default it returns open PhD / predoctoral research contracts. Change one field and it returns postdoc, research, teaching, technical or administrative vacancies instead — or all of them at once.
What you get
Published postings follow nomad-agent-job-row-v1. The shared fields carry
source identity, title and company, parsed locations, dates, the complete
plain-text body when available, source markup when usable, and work type.
Unavailable scalar facts are null; no parsed location is []. Source-only
facts appear in versioned custom.data only when mapped there. See the
Output example section for the exact dataset fields and diagnostic rows.
Deadline policy: UB publishes application deadlines only inside the PDF bases attached to each vacancy — never on the listing or detail HTML. The Actor accepts a date only when PDF text explicitly labels it as the application deadline and returns that excerpt in deadlineEvidence. Otherwise deadline remains null; publication and modification dates are never substituted.
Every run also emits one uncharged RUN-SUMMARY row using schema nomad-agent-source-run-summary-v1. Its status distinguishes a genuinely empty source from complete, partial, or failed document enrichment, and its counters reconcile listings, detail attempts, attachment failures, and complete jobs.
Output example
Every row follows nomad-agent-job-row-v1, the one shape shared by all of
this fleet's job Actors. A row carries every field; null means the
source did not publish that fact, and locations: [] means no
usable location was parsed from the posting. Nothing is guessed.
{"schemaVersion": "nomad-agent-job-row-v1","recordType": "posting","source": "ub_doctoral","id": "a1b2c3","url": "https://example.com/ub_doctoral/jobs/a1b2c3","title": "Senior Backend Engineer","company": "Example Company","locations": ["Bilbao","Spain"],"postedAt": "2026-09-02T00:00:00Z","deadline": "2026-10-15","description": "The complete posting body as plain text, exactly as the source published it — never truncated.","descriptionHtml": null,"workType": null,"custom": {"schemaId": "nomad-agent-job-custom-ub-doctoral-v1","data": {"deadlineEvidence": "…"}}}
| Field | Meaning |
|---|---|
schemaVersion | Always "nomad-agent-job-row-v1". |
recordType | "posting" for a job, "diagnostic" for a row reporting something about the run itself. |
source | Which job source the posting came from, from the collector registry's vocabulary — not the Actor name. |
id | Stable identifier for the posting within source. |
url | Canonical public URL of the posting on the source site. |
title | Job title exactly as the source publishes it, untruncated. |
company | Employer name as published. |
locations | Places the role is based, most specific first — e.g. ["Bilbao", "Spain"]. |
postedAt | When the source published the posting, ISO-8601 UTC (YYYY-MM-DDTHH:MM:SSZ). |
deadline | Closing date for applications as an ISO-8601 calendar date (YYYY-MM-DD). |
description | The complete posting body as plain text — never truncated, never summarised. |
descriptionHtml | The posting body as the source's own markup, preserving lists, headings and links. |
workType | Working arrangement: "remote", "hybrid" or "onsite". |
custom | Facts only this source publishes, as {"schemaId", "data"}. |
A run also emits diagnostic rows — recordType: "diagnostic" with a
warnings array — when it has something to report, such as a source
returning nothing. They are never billed and are easy to filter out on
recordType.
Input
| Field | Default | What it does |
|---|---|---|
keyword | predoctoral | Full-text search against UB's own board. Try postdoctoral, investigador, Física, a project name… Set it to an empty string to get every open UB vacancy. |
maxItems | 12 | Cap on vacancies returned (0 = no limit). Each one is billed as one result. |
postedWithin | string | any |
| Only currently-open vacancies are ever returned — closed and in-progress calls are filtered out by UB server-side, so you never pay for a result you can't apply to. |
Run it from your own code
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("nomad-agent/ub-doctoral-scraper").call(run_input={"keyword": "predoctoral", # "" for every open UB vacancy"maxItems": 50,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["postedAt"], item["title"], item["url"])
Or a single HTTP call that runs the Actor and returns the items in one response:
curl -X POST \"https://api.apify.com/v2/acts/nomad-agent~ub-doctoral-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"keyword": "predoctoral", "maxItems": 50}'
Export the dataset as JSON, CSV, Excel or XML, or read it over the Apify API.
Pricing
Pay per event: a small actor-start fee plus a per-vacancy result fee. Your total is the start fee plus the number of vacancies returned.
Notes & limits
- Covers Universitat de Barcelona only. For EU-wide academic vacancies, see our EURAXESS and jobs.ac.uk scrapers.
- UB publishes vacancy titles mostly in Catalan (some Spanish/English).
keywordmatches whatever UB actually wrote, so Catalan terms (predoctoral,investigador,professorat) match best. - If a run can't reach UB or a populated listing collapses during PDF enrichment, it still finishes as a succeeded run with a
failed_enrichmentRUN-SUMMARY that explains the loss. A real zero-listing result is reported asempty_source.
Found a bug, or want another Spanish university covered? Open an issue on the Actor — and if it works for you, a review helps a lot.
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.