su APIsu.se ↗
Search courses and degree programs at Stockholm University. Filter by semester, level, study form, and pace. Get full course details, schedules, and syllabi.
What is the su API?
This API covers Stockholm University's full education catalog across 5 endpoints, letting you search courses and degree programs, retrieve detailed course metadata, look up available filter facets, and generate direct schedule links. The search_courses endpoint returns paginated results with fields like credits, educationCode, occasions, and level, and supports filtering by semester, study pace, teaching language, and institution.
curl -X POST 'https://api.parse.bot/scraper/5ddbca99-2632-42a0-a0da-e905a7234b57/search_courses' \
-H 'X-API-Key: $PARSE_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"page": "0",
"level": "1",
"query": "matematik",
"language": "sv",
"semester": "HT2026",
"study_form": "1",
"study_pace": "25",
"study_time": "101052",
"teaching_language": "SWE"
}'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 su-se-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.
from parse_apis.stockholm_university_course_catalog_api import (
StockholmUniversity,
Course,
CourseDetail,
Facet,
Program,
Language,
EducationLevel,
TeachingLanguage,
)
su = StockholmUniversity()
# Browse available filter facets
for facet in su.facets.list(language=Language.SWEDISH):
print(facet.group_name, facet.heading)
for item in facet.items:
print(f" {item.label} = {item.value}")
# Search for advanced-level courses taught in English
for course in su.courses.search(
query="statistics",
level=EducationLevel.SECOND_CYCLE,
teaching_language=TeachingLanguage.ENGLISH,
language=Language.ENGLISH,
):
print(course.education_code, course.name, course.credits)
for occ in course.occasions:
print(f" {occ.semester} {occ.study_time} {occ.location}")
# Get the schedule for this occasion
schedule = course.schedule.get(semester=occ.semester, event_code=occ.event_code)
print(f" Schedule: {schedule.schedule_url}")
# Get full course detail
detail = su.coursedetails.get(url="/utbildning/utbildningskatalog/fi/fimf10?semester=HT2025&eventcode=10031")
print(detail.education_data.name, detail.education_data.credits)
print(detail.education_data.entry_requirements)
for lit in detail.literature:
print(lit.text, lit.url)
# Search degree programs
for program in su.programs.search(query="data", level=EducationLevel.SECOND_CYCLE):
print(program.education_code, program.name, program.credits)
Full-text search over Stockholm University's course catalog. Supports filtering by education level, semester, teaching language, study form, study pace, study time, and institution. Returns paginated results with course metadata including credits, subjects, and occasion details. Each course item includes a URI for fetching full details via get_course_detail.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (0-based). |
| level | string | Education level ID filter. Comma-separated for multiple values. '1' for Grundnivå, '2' for Avancerad nivå. |
| query | string | Search keyword (e.g. 'matematik'). |
| language | string | Interface language: 'sv' (Swedish) or 'en' (English). |
| semester | string | Semester code filter (e.g. 'HT2026', 'VT2026'). Comma-separated for multiple. |
| study_form | string | Study form ID filter. '1' for Normal, '2' for Distance. Comma-separated for multiple. |
| study_pace | string | Study pace code filter. Values: '25', '50', '75', '100'. Comma-separated for multiple. |
| study_time | string | Study time ID filter. '101052' for Dagtid, '101055' for Kvällstid. Comma-separated for multiple. |
| institution | string | Organisation/institution ID filter. Comma-separated for multiple. |
| teaching_language | string | Teaching language code filter. 'SWE' for Swedish, 'ENG' for English. Comma-separated for multiple. |
{
"type": "object",
"fields": {
"items": "array of course objects with fields: credits, level, educationType, subjects, name, occasions, educationCode, uri",
"numPages": "integer total number of pages",
"pageIndex": "integer current page index",
"approximateTotalHitCount": "integer total matching courses"
},
"sample": {
"data": {
"items": [
{
"uri": "/utbildning/utbildningskatalog/fi/fimf10",
"name": "Matematikens filosofi",
"level": "Grundnivå",
"credits": "7,5",
"subjects": [
"Filosofi"
],
"occasions": [
{
"uri": "/utbildning/utbildningskatalog/fi/fimf10?semester=HT2025&eventcode=10031",
"period": "Period 1",
"location": "På campus",
"semester": "HT 2025",
"eventCode": "10031",
"studyPace": "50",
"studyTime": "Dagtid",
"studyPeriodEnd": "2025-11-02",
"admissionStatus": {
"color": "grey",
"label": "Stängd för anmälan"
},
"studyPeriodStart": "2025-09-01",
"isForInternationalStudents": false
}
],
"educationCode": "FIMF10",
"educationType": "Kurs",
"isPartOfProgramme": false
}
],
"numPages": 33,
"pageIndex": 0,
"approximateTotalHitCount": 650
},
"status": "success"
}
}About the su API
Searching Courses and Programs
The search_courses and search_programs endpoints accept a query keyword along with a range of structured filters: semester (e.g. HT2026, VT2026), level (e.g. 1 for Grundnivå, 2 for Avancerad nivå), study_form (normal vs. distance), study_pace (25%, 50%, 75%, or 100%), and study_time (daytime vs. evening). Both return paginated arrays of education objects that include name, credits, educationType, subjects, occasions, educationCode, and a uri pointing to the detail page. The approximateTotalHitCount field tells you the total number of matching records across all pages.
Course Detail and Scheduling
get_course_detail accepts a URL path from search results and returns a structured educationData object — covering code, name, description, credits, entryRequirements, organisation, educationType, and educationLevel — alongside an eventData array with per-instance admission and scheduling details. It also surfaces literature links, a syllabus_archive_link, a course_report_url, and a time_edit_base_url. For constructing a direct schedule link, get_course_schedule takes a semester and an event_code (sourced from occasions[].eventCode in search results) and returns a ready-to-use TimeEdit URL.
Filter Discovery
The list_subjects endpoint returns all available filter facets — subjects, education levels, semesters, study forms, study times, study paces, teaching languages, and institutions — as structured facet groups. Each facet item includes name, label, value, and checked fields, making it straightforward to populate dynamic filter UIs or validate parameter values before running searches. The language parameter (sv or en) controls the language of returned labels across all endpoints.
The su API is a managed, monitored endpoint for su.se — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when su.se 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 su.se 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 course discovery tool that lets students filter by semester, study pace, and teaching language using
search_courses. - Aggregate all degree programs at a specific institution by filtering
search_programswith aninstitutionID. - Display a full course profile page by fetching
educationData,entryRequirements, andliteraturefromget_course_detail. - Generate direct TimeEdit schedule links for course instances using
get_course_schedulewithsemesterandevent_code. - Populate a filter UI dynamically with all valid facet options from
list_subjectsto avoid invalid parameter submissions. - Monitor which semesters have active offerings by scanning
occasionsarrays returned from course search results. - Compare entry requirements across courses by extracting
entryRequirementsfrom multipleget_course_detailresponses.
| 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 Stockholm University have an official public developer API?+
What does `get_course_detail` return beyond basic course metadata?+
educationData object (which includes code, name, description, credits, entryRequirements, organisation, and educationLevel), the endpoint returns an eventData array with per-instance admission and cost details, a literature array with linked reading list resources, a syllabus_archive_link, a course_report_url, and a time_edit_base_url for schedule access.How does pagination work in search results?+
search_courses and search_programs use 0-based page indexing via the page parameter. Each response includes numPages (total pages), pageIndex (current page), and approximateTotalHitCount (total matching records). Iterate through pages incrementing page until you reach numPages - 1.Does the API cover exam registrations, student grades, or personal academic records?+
Can I retrieve the actual course syllabus document through this API?+
get_course_detail returns a syllabus_archive_link — a URL pointing to the syllabus archive on su.se — but the API does not fetch or parse the syllabus document contents itself. You can fork the API on Parse and revise it to add an endpoint that retrieves and parses syllabus document content from that link.