PhDScanner APIphdscanner.com ↗
Access PhD opportunities and professor postings from PhDScanner.com. Filter by country, university, and funding status. Returns titles, supervisors, AI summaries, and more.
What is the PhDScanner API?
The PhDScanner API exposes 3 endpoints that cover PhD opportunities and professor-shared position postings indexed on phdscanner.com. The search_opportunities endpoint lets you filter by country, university, and funding status, returning paginated results with fields including title, discipline, supervisor, funding details, and an AI-generated summary per listing. The get_opportunity endpoint delivers full details — including department, city, view count, and status — for any single position by UUID.
curl -X GET 'https://api.parse.bot/scraper/7939701b-6ecc-48e4-8084-b024250fa10c/search_opportunities?limit=10&funded=true&offset=0&country=Germany&university=Technical+University+of+Munich' \ -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 phdscanner-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: PhDScanner SDK — search PhD opportunities and professor postings."""
from parse_apis.PhDScanner_API import PhDScanner, Funded, OpportunityNotFound
client = PhDScanner()
# Search funded PhD positions in Germany
for opp in client.opportunities.search(country="Germany", funded=Funded.TRUE, limit=3):
print(opp.title, "|", opp.university, "|", opp.department)
# Drill into a single opportunity for full details
opp = client.opportunities.search(country="Netherlands", limit=1).first()
if opp:
detail = client.opportunities.get(opportunity_id=opp.id)
print(detail.title, "|", detail.supervisor, "|", detail.fully_funded)
# Handle not-found errors gracefully
try:
client.opportunities.get(opportunity_id="00000000-0000-0000-0000-000000000000")
except OpportunityNotFound as exc:
print(f"Opportunity not found: {exc}")
# Browse professor PhD postings from LinkedIn
for posting in client.postings.list(limit=3):
print(posting.ai_title, "|", posting.professor_name, "|", posting.university)
print("exercised: opportunities.search / opportunities.get / postings.list")
Search PhD opportunities with optional filters for country, university, and funding status. Returns paginated results sorted by most recent. Each result includes title, university, location, discipline, supervisor, funding details, and an AI-generated summary.
| Param | Type | Description |
|---|---|---|
| limit | integer | Number of results to return per page. |
| funded | string | Filter for fully funded positions only. Pass 'true' to include only fully funded positions. |
| offset | integer | Pagination offset (number of results to skip). |
| country | string | Filter by country name (e.g. Germany, Netherlands, United Kingdom, Switzerland, Australia). |
| university | string | Filter by university name (e.g. EPFL, University of Vienna, TU Dresden, Technical University of Munich). |
{
"type": "object",
"fields": {
"items": "array of PhD opportunity summaries",
"limit": "integer",
"total": "integer",
"offset": "integer"
},
"sample": {
"items": [
{
"id": "a1df8e61-f852-41c0-8a0d-e68c593e64f1",
"city": "Munich",
"title": "Doctoral Candidate in Computational Literary Studies",
"views": "7",
"country": "Germany",
"ai_summary": "PhD position at MPI for investigating macroevolution in European literature.",
"created_at": 1782782417,
"department": "Digital Humanities",
"supervisor": "Dr. Oleg Sobchuk",
"university": "Max Planck Gesellschaft",
"closing_date": "1786752000",
"fully_funded": true,
"funded_amount": "65% of TVoD E13 salary",
"opportunity_url": "https://www.mpg.de/26850384/doctoral-candidate"
}
],
"limit": 5,
"total": 105,
"offset": 0
}
}About the PhDScanner API
PhD Opportunity Search
The search_opportunities endpoint accepts up to five optional parameters: country (e.g. Germany, Australia, Netherlands), university (e.g. EPFL, TU Dresden), funded (pass 'true' to restrict results to fully funded positions), limit, and offset for pagination. Results are sorted by most recent and each item includes a title, university, location, discipline, supervisor name, funding details, and an AI-generated summary of the position.
Full Opportunity Detail
Passing a UUID from search results to get_opportunity returns the complete record for that position: id, title, city, country, category, department, status, views, created_at (Unix timestamp), and ai_summary. The response also includes the full HTML description, supervisor contact information, and application details — content not surfaced in the search results list.
Professor PhD Postings
The list_phd_postings endpoint returns PhD position announcements shared by professors, sourced from LinkedIn activity. Each item includes the professor's details, university, department, and the post content itself. This endpoint supports limit and offset pagination and surfaces a different slice of the PhD opportunity landscape than the main search — informal or recently announced openings that may not yet appear as formal listings.
Data Coverage
The API covers international PhD positions across Europe, Australia, and beyond, with country and university filters making it practical to narrow results to a specific institution or region. The funded filter is particularly useful for surfaces where only fully-funded positions are actionable for a given audience.
The PhDScanner API is a managed, monitored endpoint for phdscanner.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when phdscanner.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 phdscanner.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 opportunity aggregator filtered by country and funding status using
search_opportunities - Send email alerts when new fully funded positions appear at a target university by polling with the
universityandfundedfilters - Display full position descriptions and supervisor contact info on a research portal using
get_opportunity - Track how many views a PhD listing accumulates over time using the
viewsfield fromget_opportunity - Surface informal professor PhD announcements from LinkedIn alongside formal listings using
list_phd_postings - Classify opportunities by discipline or department using the
categoryanddepartmentfields for recommendation systems - Monitor newly posted opportunities by sorting on
created_attimestamps from the search results
| 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 PhDScanner have an official developer API?+
What does the `get_opportunity` endpoint return beyond what `search_opportunities` shows?+
get_opportunity endpoint returns the complete HTML description of the position, supervisor contact information, and application details, along with fields like city, department, status, views, and a Unix created_at timestamp — several of which are not included in the search results list.Can I filter `search_opportunities` by discipline or department?+
search_opportunities endpoint currently supports filtering by country, university, and funded status. Discipline and department data are present as fields on individual results but are not available as filter parameters. You can fork this API on Parse and revise it to add a discipline or department filter endpoint.Does the API cover PhD positions outside Europe and Australia?+
What data does `list_phd_postings` return, and how is it different from the main search?+
list_phd_postings returns PhD position announcements shared by professors on LinkedIn, including professor details, university, department, and the post content. These are informal or recently announced openings and are distinct from the formal, structured listings returned by search_opportunities. The two endpoints complement each other but draw from different sources.