PhDportal APIphdportal.com ↗
Access 19K+ PhD programmes from PhDportal.com. Search by discipline, country, and keyword. Retrieve titles, tuition, duration, start dates, and more.
What is the PhDportal API?
The PhDportal.com API exposes 2 endpoints covering over 19,000 PhD programmes worldwide. Use search_programmes to filter doctoral opportunities by free-text query, discipline ID, and country ID, receiving programme titles, university details, tuition fees, and duration in each result. Use get_programme to fetch full programme details including start dates, description, and discipline classification for any programme ID returned by search.
curl -X GET 'https://api.parse.bot/scraper/c60371b9-360a-48d9-b152-7320a7c1ad99/search_programmes?limit=10&query=computer+science&offset=0&country=30&discipline=281' \ -H 'X-API-Key: $PARSE_API_KEY'
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 phdportal-com-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: PhdPortal SDK — search PhD programmes, drill into details."""
from parse_apis.phdportal_com_api import PhdPortal, ProgrammeNotFound
client = PhdPortal()
# Search for computer science PhD programmes, capped at 5 results
for prog in client.programme_summaries.search(query="computer science", limit=5):
print(prog.title, "-", prog.university_name, "-", prog.country)
# Drill down into the first result's full details
hit = client.programme_summaries.search(query="machine learning", limit=1).first()
if hit:
detail = hit.details()
print(detail.title, detail.degree, detail.university_name)
print("Start dates:", detail.start_dates)
print("Tuition:", detail.tuition_fee_amount, detail.tuition_fee_currency)
# Filter by discipline (281 = Computer Sciences) and country (30 = UK)
for prog in client.programme_summaries.search(discipline="281", country="30", limit=3):
print(prog.title, prog.university_name, prog.tuition_fee_amount, prog.tuition_fee_currency)
# Handle not-found errors
try:
hit2 = client.programme_summaries.search(query="nonexistent xyz qqq", limit=1).first()
if hit2:
detail2 = hit2.details()
print(detail2.title)
except ProgrammeNotFound as exc:
print(f"Programme not found: {exc}")
print("exercised: programme_summaries.search / details / filtered search")
Full-text search across PhD programmes worldwide. Supports filtering by discipline ID and country ID. Results are ordered by relevance (default sort). Each result includes programme title, university, location, tuition fees, and duration.
| Param | Type | Description |
|---|---|---|
| limit | integer | Number of results to return per page (1-50). |
| query | string | Free-text search query matching programme titles and descriptions (e.g. 'computer science', 'machine learning'). |
| offset | integer | Number of results to skip for pagination. |
| country | string | Numeric country ID to filter results (e.g. '30' for United Kingdom, '1' for Netherlands). Obtained from search results or get_programme country_id field. |
| discipline | string | Numeric discipline ID to filter results (e.g. '281' for Computer Sciences). Obtained from get_programme discipline_ids field. |
{
"type": "object",
"fields": {
"limit": "integer current limit",
"total": "integer total number of matching programmes",
"offset": "integer current offset",
"programmes": "array of programme summaries with id, title, degree, url, summary, university info, location, duration, and tuition fees"
},
"sample": {
"data": {
"limit": 5,
"total": 10761,
"offset": 0,
"programmes": [
{
"id": 429318,
"url": "https://www.phdportal.com/studies/429318/computer-science.html",
"title": "Computer Science",
"degree": "Ph.D.",
"country": "United Kingdom",
"summary": "A research degree in Computer Science from the University of Bath...",
"location": "Bath, England, United Kingdom",
"is_online": false,
"country_iso": "gb",
"is_full_time": true,
"is_on_campus": true,
"is_part_time": false,
"university_id": 236,
"duration_months": 48,
"duration_period": "months",
"university_name": "University of Bath",
"tuition_fee_unit": "year",
"tuition_fee_amount": 30450,
"tuition_fee_currency": "GBP"
}
]
},
"status": "success"
}
}About the PhDportal API
Search PhD Programmes
The search_programmes endpoint accepts a free-text query parameter (e.g. 'machine learning', 'biochemistry') alongside optional discipline and country numeric ID filters. Results are ordered by relevance and include pagination via limit and offset parameters. Each item in the returned programmes array carries a programme id, title, degree, url, summary, university metadata, location, duration, and tuition information. The total field in the response indicates the full count of matching programmes, which you can page through using successive offset values.
Programme Detail
The get_programme endpoint takes a single required programme_id (obtained from search_programmes results) and returns a richer record. Key fields include description, start_dates (an array of ISO date strings for upcoming intakes), discipline_ids (array of integers you can reuse as discipline filters in search), country_id, location, degree, university_url, and the canonical url for the programme page on PhDportal.com.
IDs and Filtering
Country and discipline filtering in search_programmes relies on numeric IDs — for example, country ID 30 for the United Kingdom or discipline ID 281 for Computer Sciences. These IDs are surfaced through programme detail records and can be catalogued for building structured filter UIs. There is no dedicated endpoint for listing all available discipline or country IDs directly; they are discovered incrementally through programme records.
The PhDportal API is a managed, monitored endpoint for phdportal.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when phdportal.com 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 phdportal.com 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?+
- Build a PhD programme search tool filtered by academic field using
disciplineIDs and free-textquery - Aggregate tuition fee data across programmes in a target country using the
countryfilter andtuitionresponse fields - Populate application deadline calendars using
start_datesarrays returned byget_programme - Compare doctoral programme durations across disciplines using the
durationfield insearch_programmesresults - Generate a curated list of computer science PhD opportunities by querying with discipline ID
281 - Build a university research profile by collecting all programmes linked to a specific
university_url - Track programme availability across countries by iterating country IDs and recording
totalmatch counts
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does PhDportal.com have an official developer API?+
What does `search_programmes` return and how does pagination work?+
programmes array of summaries alongside total, limit, and offset integers. The total field reflects the full count of matching records. To paginate, increment offset by your chosen limit value on each subsequent call. The maximum limit per request is 50.Does the API expose reviewer ratings, application requirements, or supervisor profiles for programmes?+
Is there an endpoint for listing all available discipline or country IDs?+
get_programme response fields (discipline_ids and country_id) rather than from a dedicated taxonomy endpoint. You can fork this API on Parse and revise it to add a dedicated lookup endpoint for these ID sets.How current is the programme data?+
start_dates and tuition should be re-fetched periodically rather than cached long-term.