Ac APIprofiles.ucl.ac.uk ↗
Search and retrieve UCL researcher profiles by keyword, department, or field of research. Returns names, positions, ORCID IDs, emails, and publications.
What is the Ac API?
The UCL Profiles API provides two endpoints for accessing researcher data from University College London's academic directory. Use search_researchers to query across thousands of profiles by name, department, or field of research, and get_researcher to pull a full profile including up to 100 recent publications, ORCID ID, email address, and departmental affiliation for a specific academic.
curl -X POST 'https://api.parse.bot/scraper/84a0ea47-1b1f-48e9-ac93-c0d49efba9e8/search_researchers' \
-H 'X-API-Key: $PARSE_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"query": "machine learning",
"department": "Dept of Computer Science",
"field_of_research": "Artificial intelligence",
"page": "1",
"per_page": "25"
}'Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace profiles-ucl-ac-uk-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: UCL Profiles API — search researchers and drill into full profiles."""
from parse_apis.profiles_ucl_ac_uk_api import UclProfiles, ResearcherNotFound
client = UclProfiles()
# Search for machine learning researchers, capped at 5 results.
for researcher in client.researchers.search(query="machine learning", limit=5):
print(researcher.full_name, "-", researcher.position)
print(" Fields:", ", ".join(researcher.research_fields))
# Take the first match and fetch full profile details (publications, email, etc.)
result = client.researchers.search(
query="imaging",
department="Dept of Computer Science",
limit=1,
).first()
if result is not None:
detail = result.details()
print(f"\n{detail.title} {detail.full_name}")
print(f" Email: {detail.email}")
print(f" ORCID: {detail.orcid_id}")
if detail.publications:
pub = detail.publications[0]
print(f" Latest pub: {pub.title} ({pub.journal})")
# Browse researchers in a specific field of research.
try:
for researcher in client.researchers.search(
field_of_research="Artificial intelligence",
per_page=10,
limit=10,
):
print(researcher.last_name, researcher.first_name)
except ResearcherNotFound as e:
# Raised when a derived url_id no longer resolves.
print(f"Not found: {e.message}")
print("\nexercised: researchers.search / details / publications")
Search UCL researcher profiles by name or keyword, optionally filtered by department or field of research. Returns paginated results sorted by relevance when a query is provided, or alphabetically by last name when no query is given. Each result includes the researcher's name, title, position, department, and research fields. Pagination is controlled by page and per_page parameters.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (1-indexed). |
| query | string | Search keyword matching against researcher name, position, bio, research interests, teaching activities, and publications. When omitted or empty, returns all researchers. |
| per_page | integer | Number of results per page (1-100). |
| department | string | Filter by department name exactly as it appears on UCL Profiles (e.g. 'Dept of Computer Science', 'Dept of Statistical Science'). Omitting returns results from all departments. |
| field_of_research | string | Filter by field of research tag (e.g. 'Artificial intelligence', 'Machine learning', 'Neurosciences'). Omitting returns results from all fields. |
{
"type": "object",
"fields": {
"results": "array of researcher profile objects",
"pagination": "object with page, per_page, total, and total_pages"
},
"sample": {
"data": {
"results": [
{
"id": "857",
"title": "Prof",
"url_id": "857-massi-pontil",
"position": "Professor of Computational Statistics & Machine Learning",
"full_name": "Massi Pontil",
"last_name": "Pontil",
"department": "Dept of Computer Science",
"first_name": "Massi",
"has_thumbnail": true,
"research_fields": [
"Information systems",
"Artificial intelligence",
"Machine learning"
],
"has_collaboration_data": true
}
],
"pagination": {
"page": 1,
"total": 1832,
"per_page": 25,
"total_pages": 74
}
},
"status": "success"
}
}About the Ac API
Search and Filter UCL Researchers
The search_researchers endpoint accepts a query string matched against researcher names, positions, bios, research interests, and teaching activities. Results are paginated (1–100 per page via per_page) and sorted by relevance when a query is supplied, or alphabetically by last name when no query is given. Two optional filters narrow results further: department accepts values like 'Dept of Computer Science' exactly as they appear on UCL Profiles, and field_of_research accepts tags such as 'Artificial intelligence' or 'Neurosciences'. The pagination object in the response exposes page, per_page, total, and total_pages for reliable cursor-style iteration.
Detailed Researcher Profiles
Once you have a url_id from search results (e.g. '857-massi-pontil'), pass it to get_researcher to retrieve the full profile. Returned fields include full_name, first_name, last_name, title, position, department, email (or null if not publicly listed), orcid_id (or null if not listed), and a publications array of up to 100 recent works sorted by date. The id field carries the numeric researcher identifier used internally by UCL Profiles.
Coverage and Scope
The API covers researcher profiles listed on profiles.ucl.ac.uk. Data reflects what each researcher has made publicly available on their profile, meaning some fields — particularly email and orcid_id — may be absent for a given individual. Department and field-of-research filter values must match exactly as they appear on UCL Profiles; partial or approximate strings are not supported for those parameters.
The Ac API is a managed, monitored endpoint for profiles.ucl.ac.uk — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when profiles.ucl.ac.uk changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official profiles.ucl.ac.uk API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Find UCL academics working in a specific research area such as 'Machine learning' using
field_of_researchfilter - Build a contact directory of UCL department staff with publicly listed email addresses
- Retrieve ORCID IDs for UCL researchers to cross-reference publication records in external databases
- Enumerate all researchers in a specific department like 'Dept of Statistics' for institutional reporting
- Identify potential collaborators by querying bios and research interests with a keyword search
- Pull recent publication lists for UCL academics to monitor output in a subject area
- Map researcher distribution across departments using paginated search with no query and per-department filtering
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does UCL provide an official developer API for researcher profiles?+
What does `get_researcher` return for email and ORCID, and when are those fields missing?+
email and orcid_id return null when the researcher has not publicly listed them on their UCL profile. There is no fallback or alternative value — the field will be present in the response object but set to null.How strictly must department and field_of_research values match?+
'Dept of Computer Science' rather than 'Computer Science'). Submitting a partial or differently-capitalised string will return no results for that filter. Running a broad search_researchers call first and inspecting the department field in results is the most reliable way to confirm the exact string to use.Does the API return a researcher's full publication list?+
get_researcher returns up to 100 most recent publications per researcher. Publications beyond that limit are not currently returned. You can fork this API on Parse and revise it to add pagination or extended publication retrieval if your use case requires a complete list.