Shnaton Course Catalog API

The public JSON API behind shnaton.huji.ac.il, the Hebrew University's official course catalog. Faculties, departments, degree programs, specializations, study roadmaps, courses, course groups, timetabled study sessions and syllabi, bilingual Hebrew/English, for academic years 2020-2027. Unauthenticated and unpaginated: an anonymous POST to /courses/search-advanced returned 6,355 courses in a single 14,153,560-byte response on 2026-09-01. The university publishes no contract for it — the OpenAPI in this repository was derived by API Evangelist from the catalog's own JavaScript client and then verified operation by operation against the production host.

Operations 21

GET /health Service health probe #
GET /faculties List faculties and schools #
GET /learning-programs List degree programs #
GET /reference-data/active-years List academic years the catalog is published for #
GET /reference-data/threshold-years List roadmap threshold years #
GET /reference-data/languages List languages of instruction #
GET /reference-data/study-session-types List study session types #
GET /reference-data/assignment-filter-options List assessment-type filter options #
GET /specializations/all List all specializations for a year #
GET /specializations/search Search specializations by name #
GET /specializations/search-by-course Find specializations containing a course #
GET /yearly-roadmaps/search Search yearly study roadmaps by name #
GET /yearly-roadmaps/search-by-course Find yearly roadmaps containing a course #
POST /courses/search-advanced Advanced course search #
POST /courses/search-advanced-in-roadmap Advanced course search scoped to a roadmap #
GET /courses/groups-with-sessions Get groups and timetabled sessions for courses #
GET /courses/code/{courseCode}/requirements Get a course's prerequisites #
GET /courses/code/{courseCode}/with-requirement Find courses that require a course #
GET /groups/{groupId}/study-sessions Get the timetable for a course group #
GET /yearly-roadmaps/{roadmapId}/combinations Get valid specialization combinations for a roadmap #
GET /syllabus Get a course syllabus #

Documentation

Specifications

Schemas & Data

Other Resources

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/shnaton-course-catalog"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

hebrew-university-of-jerusalem-shnaton-course-catalog-openapi.yml Raw ↑
# x-method: derived
# x-source-url: https://shnaton.huji.ac.il/api
# Authored by API Evangelist from live probes of the Hebrew University of Jerusalem's own
# hosts. NOT published by the institution. See `method:` below for how it was obtained.
openapi: 3.1.0
info:
  title: Hebrew University of Jerusalem Shnaton Course Catalog API
  version: '2027'
  summary: Public, unauthenticated JSON API behind the Hebrew University of Jerusalem's Shnaton course catalog.
  description: >-
    The read API that serves shnaton.huji.ac.il, the Hebrew University of Jerusalem's
    official course catalog ("Shnaton" / שנתון). It exposes the university's faculties,
    departments, degree programs, specializations, courses, course groups, timetabled
    study sessions and syllabi for the academic years the catalog publishes.

    OPERATOR: institution. shnaton.huji.ac.il is a CNAME to orb-bif5.cc.huji.ac.il — an
    F5 load balancer inside the university's own "authority for computation, communication
    and information" (cc.huji.ac.il) — resolving to 128.139.7.32 in the legacy ILAN
    allocation 128.139.0.0/16 registered to IUCC (Israel Inter-University Computation
    Center, AS378), and presenting a TLS certificate whose subject is
    "C=IL, L=Jerusalem, O=The Hebrew University of Jerusalem, CN=*.huji.ac.il", issued
    through the GEANT TCS research-and-education trust chain. Nothing in the chain leaves
    university or national-research-network infrastructure. This is the university's own
    engineering, not a vendor contract running under its name.

    PROVENANCE: the Hebrew University does not publish this contract. No OpenAPI, Swagger
    UI or developer documentation for it could be found — /api, /swagger, /openapi.json
    and /api/docs all return 404 or the SPA shell. This document was DERIVED by API
    Evangelist: endpoint paths, HTTP methods and parameter names were read out of the
    catalog's own published JavaScript bundle
    (https://shnaton.huji.ac.il/assets/index-DcMgIxCt.js, HTTP 200, 606,643 bytes, where
    the axios client is configured with baseURL "/api"), and every operation described
    here was then called live against the production host on 2026-09-01 and its real
    response recorded. Response schemas are inferred from those observed payloads, so they
    describe what the API actually returned rather than a contract the university has
    committed to. Treat it as an observation, not a promise.

    All human-readable text is returned as a bilingual object with Hebrew (`he`) and
    English (`en`) members; the catalog is a right-to-left Hebrew-first surface and the
    English member is frequently present but occasionally empty.
  contact:
    name: Hebrew University of Jerusalem — Shnaton course catalog
    url: https://shnaton.huji.ac.il/
  termsOfService: https://en.huji.ac.il/en/accessibility-statement
  x-operator: institution
  x-operator-basis: >-
    shnaton.huji.ac.il CNAME -> orb-bif5.cc.huji.ac.il -> 128.139.7.32; RIPE inetnum
    128.139.0.0/16 "ILAN", registrant ORG-IIIC1-RIPE (IUCC - Israel InterUniversity
    Computation Center), announced by AS378 MACHBA-AS; TLS subject
    O=The Hebrew University of Jerusalem, CN=*.huji.ac.il, issuer GEANT TLS RSA 1
    (Hellenic Academic and Research Institutions CA); response header
    X-HujiShnatonServer: Server 2.
  x-provenance:
    method: derived
    generated: '2026-09-01'
    source:
      - https://shnaton.huji.ac.il/assets/index-DcMgIxCt.js
      - https://shnaton.huji.ac.il/api/health
      - https://shnaton.huji.ac.il/api/faculties
      - https://shnaton.huji.ac.il/api/courses/search-advanced
    note: >-
      Derived by API Evangelist from the catalog's own JavaScript client plus live probes
      of the production host. NOT published by the Hebrew University of Jerusalem.
servers:
  - url: https://shnaton.huji.ac.il/api
    description: Production. Public and unauthenticated; verified live 2026-09-01.
tags:
  - name: Reference Data
    description: Enumerations the catalog is indexed by — academic years, languages, session types, assignment filters.
  - name: Organization
    description: The university's academic structure — faculties, departments and degree programs.
  - name: Courses
    description: Course search, course groups, timetabled study sessions and prerequisites.
  - name: Specializations
    description: Specializations, units and yearly study roadmaps.
  - name: Syllabus
    description: Per-course syllabus documents.
  - name: Service
    description: Service health.
paths:
  /health:
    get:
      tags: [Service]
      operationId: getHealth
      summary: Service health probe
      description: Returns the literal string `Healthy` as `text/plain`. Verified 200, 7 bytes, 2026-09-01.
      responses:
        '200':
          description: Service is healthy.
          content:
            text/plain:
              schema:
                type: string
                const: Healthy
  /faculties:
    get:
      tags: [Organization]
      operationId: listFaculties
      summary: List faculties and schools
      description: >-
        Every faculty and school in the university, with its registrar code and bilingual
        name. Verified 200, 2,463 bytes, 2026-09-01.
      responses:
        '200':
          description: Faculty list.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Faculty'
  /learning-programs:
    get:
      tags: [Organization]
      operationId: listLearningPrograms
      summary: List degree programs
      description: >-
        Degree levels the catalog indexes courses by — Bachelor's, Master's and so on —
        each with a registrar `userCode`, a formal `name` and a `displayName`.
        Verified 200, 1,902 bytes, 2026-09-01.
      responses:
        '200':
          description: Degree program list.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/LearningProgram'
  /reference-data/active-years:
    get:
      tags: [Reference Data]
      operationId: listActiveYears
      summary: List academic years the catalog is published for
      description: >-
        Academic years with both Gregorian (`year`) and Hebrew (`hebrewYear`) forms. The
        year whose `current` is `true` is the one the catalog defaults to.
        Verified 200, 495 bytes, 2026-09-01.
      responses:
        '200':
          description: Academic year list.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/AcademicYear'
  /reference-data/threshold-years:
    get:
      tags: [Reference Data]
      operationId: listThresholdYears
      summary: List roadmap threshold years
      description: >-
        The academic years usable as a `thresholdYear` — the year of entry a study roadmap
        or specialization requirement set is keyed to. Same shape as active years.
        Verified 200, 495 bytes, 2026-09-01.
      responses:
        '200':
          description: Threshold year list.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/AcademicYear'
  /reference-data/languages:
    get:
      tags: [Reference Data]
      operationId: listLanguages
      summary: List languages of instruction
      description: Languages a course group may be taught in. Verified 200, 1,011 bytes, 2026-09-01.
      responses:
        '200':
          description: Language list.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/CodedTerm'
  /reference-data/study-session-types:
    get:
      tags: [Reference Data]
      operationId: listStudySessionTypes
      summary: List study session types
      description: >-
        The kinds of timetabled session the university runs — lecture, seminar, lab,
        clinic, preparatory program and so on. Verified 200, 2,430 bytes, 2026-09-01.
      responses:
        '200':
          description: Study session type list.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/CodedTerm'
  /reference-data/assignment-filter-options:
    get:
      tags: [Reference Data]
      operationId: listAssignmentFilterOptions
      summary: List assessment-type filter options
      description: >-
        The assessment types courses can be filtered by for a given year — final exam,
        final essay, final presentation. `year` is REQUIRED; omitting it returns HTTP 400
        with body `{"code":"ERR_1101"}`. Verified 200, 284 bytes, 2026-09-01.
      parameters:
        - $ref: '#/components/parameters/YearRequired'
      responses:
        '200':
          description: Assignment filter options.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssignmentFilterOptions'
        '400':
          $ref: '#/components/responses/CodedError'
  /specializations/all:
    get:
      tags: [Specializations]
      operationId: listSpecializations
      summary: List all specializations for a year
      description: >-
        Every specialization and unit offered in the given academic year, with its degree
        program and any threshold sets. `year` is REQUIRED; omitting it returns HTTP 400
        with body `{"code":"ERR_1101"}`. Verified 200, 60,697 bytes, 153 items, 2026-09-01.
      parameters:
        - $ref: '#/components/parameters/YearRequired'
      responses:
        '200':
          description: Specialization list.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Specialization'
        '400':
          $ref: '#/components/responses/CodedError'
  /specializations/search:
    get:
      tags: [Specializations]
      operationId: searchSpecializations
      summary: Search specializations by name
      description: >-
        Free-text search over specialization names. `name` is REQUIRED and validated as a
        string of 2–100 characters; violations return an RFC 9457 problem document.
        Verified 200 (empty array for a non-matching term) and 400, 2026-09-01.
      parameters:
        - $ref: '#/components/parameters/NameQuery'
        - $ref: '#/components/parameters/YearRequired'
      responses:
        '200':
          description: Matching specializations.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Specialization'
        '400':
          $ref: '#/components/responses/ProblemDetails'
  /specializations/search-by-course:
    get:
      tags: [Specializations]
      operationId: searchSpecializationsByCourse
      summary: Find specializations containing a course
      description: Specializations whose requirements include the given course code, for a threshold year.
      parameters:
        - $ref: '#/components/parameters/CourseCodeQuery'
        - $ref: '#/components/parameters/ThresholdYear'
      responses:
        '200':
          description: Matching specializations.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Specialization'
        '400':
          $ref: '#/components/responses/ProblemDetails'
  /yearly-roadmaps/search:
    get:
      tags: [Specializations]
      operationId: searchYearlyRoadmaps
      summary: Search yearly study roadmaps by name
      description: >-
        Free-text search over study roadmaps. `name` is REQUIRED and validated as 2–100
        characters — a shorter value returns an RFC 9457 problem document naming the
        constraint. Verified 400 on a one-character term, 2026-09-01.
      parameters:
        - $ref: '#/components/parameters/NameQuery'
        - $ref: '#/components/parameters/YearRequired'
      responses:
        '200':
          description: Matching roadmaps.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  additionalProperties: true
        '400':
          $ref: '#/components/responses/ProblemDetails'
  /yearly-roadmaps/search-by-course:
    get:
      tags: [Specializations]
      operationId: searchYearlyRoadmapsByCourse
      summary: Find yearly roadmaps containing a course
      parameters:
        - $ref: '#/components/parameters/CourseCodeQuery'
        - $ref: '#/components/parameters/ThresholdYear'
      responses:
        '200':
          description: Matching roadmaps.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  additionalProperties: true
        '400':
          $ref: '#/components/responses/ProblemDetails'
  /courses/search-advanced:
    post:
      tags: [Courses]
      operationId: searchCoursesAdvanced
      summary: Advanced course search
      description: >-
        The catalog's principal search operation. Accepts a filter document and returns
        matching courses with their groups. Unauthenticated and unpaginated — a broad query
        returns the entire matching set in one response. Verified 200 on 2026-09-01 with
        body `{"textQuery":"computer","year":2027}`, returning 6,355 courses in a single
        14,153,560-byte payload. Callers should expect multi-megabyte responses and filter
        narrowly.
      parameters:
        - name: include
          in: query
          required: false
          description: Include-depth flag observed as `1` in the catalog's own client.
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CourseSearchRequest'
      responses:
        '200':
          description: Matching courses.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Course'
        '400':
          $ref: '#/components/responses/ProblemDetails'
  /courses/search-advanced-in-roadmap:
    post:
      tags: [Courses]
      operationId: searchCoursesAdvancedInRoadmap
      summary: Advanced course search scoped to a roadmap
      description: As `searchCoursesAdvanced`, with the candidate set restricted to `courseIds`.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/CourseSearchRequest'
                - type: object
                  properties:
                    courseIds:
                      type: array
                      items:
                        type: integer
      responses:
        '200':
          description: Matching courses.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Course'
        '400':
          $ref: '#/components/responses/ProblemDetails'
  /courses/groups-with-sessions:
    get:
      tags: [Courses]
      operationId: getCourseGroupsWithSessions
      summary: Get groups and timetabled sessions for courses
      description: >-
        Returns an object keyed by course id, each value the list of that course's groups
        with their study sessions expanded. Verified 200, 4,282 bytes, for
        `year=2027&courseIds=508699` on 2026-09-01.
      parameters:
        - $ref: '#/components/parameters/YearRequired'
        - name: courseIds
          in: query
          required: true
          description: Comma-separated course ids.
          schema:
            type: string
          example: '508699'
      responses:
        '200':
          description: Groups by course id.
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  type: array
                  items:
                    $ref: '#/components/schemas/CourseGroup'
  /courses/code/{courseCode}/requirements:
    get:
      tags: [Courses]
      operationId: getCourseRequirements
      summary: Get a course's prerequisites
      description: >-
        Positive, negative and additional prerequisite sets for a course. All three members
        may be null where the registrar records none. Verified 200, 88 bytes, for course
        code 140713 in 2027 on 2026-09-01.
      parameters:
        - $ref: '#/components/parameters/CourseCodePath'
        - $ref: '#/components/parameters/YearRequired'
      responses:
        '200':
          description: Requirement sets.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CourseRequirements'
  /courses/code/{courseCode}/with-requirement:
    get:
      tags: [Courses]
      operationId: getCoursesWithRequirement
      summary: Find courses that require a course
      parameters:
        - $ref: '#/components/parameters/CourseCodePath'
        - $ref: '#/components/parameters/YearRequired'
      responses:
        '200':
          description: Dependent courses.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Course'
  /groups/{groupId}/study-sessions:
    get:
      tags: [Courses]
      operationId: getGroupStudySessions
      summary: Get the timetable for a course group
      description: >-
        Timetabled meetings for one course group — day of week, start and end time as
        milliseconds after local midnight, room, teaching type, recording and live-broadcast
        flags, and the assigned teaching staff. Verified 200, 3,768 bytes, for group 95783
        in 2027 on 2026-09-01. NOTE: the `teachers` member carries named individuals; treat
        it as personal data.
      parameters:
        - name: groupId
          in: path
          required: true
          schema:
            type: integer
          example: 95783
        - $ref: '#/components/parameters/YearRequired'
      responses:
        '200':
          description: Study sessions.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/StudySession'
  /yearly-roadmaps/{roadmapId}/combinations:
    get:
      tags: [Specializations]
      operationId: getRoadmapCombinations
      summary: Get valid specialization combinations for a roadmap
      parameters:
        - name: roadmapId
          in: path
          required: true
          schema:
            type: string
        - $ref: '#/components/parameters/YearRequired'
      responses:
        '200':
          description: Roadmap combinations.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  additionalProperties: true
  /syllabus:
    get:
      tags: [Syllabus]
      operationId: getSyllabus
      summary: Get a course syllabus
      description: >-
        The syllabus document for a course in a given year — course name, department,
        semester, credit points, ECTS credits where recorded, and degree level. Verified
        200, 1,756 bytes, for `courseCode=140713&year=2027` on 2026-09-01.
      parameters:
        - $ref: '#/components/parameters/CourseCodeQuery'
        - $ref: '#/components/parameters/YearRequired'
      responses:
        '200':
          description: Syllabus document.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Syllabus'
components:
  parameters:
    YearRequired:
      name: year
      in: query
      required: true
      description: Academic year in Gregorian form, as returned by `/reference-data/active-years`.
      schema:
        type: integer
      example: 2027
    ThresholdYear:
      name: thresholdYear
      in: query
      required: true
      description: Year of entry a roadmap or requirement set is keyed to.
      schema:
        type: integer
      example: 2027
    NameQuery:
      name: name
      in: query
      required: true
      description: Search term. Validated server-side as 2–100 characters.
      schema:
        type: string
        minLength: 2
        maxLength: 100
    CourseCodeQuery:
      name: courseCode
      in: query
      required: true
      description: Registrar course code.
      schema:
        type: string
      example: '140713'
    CourseCodePath:
      name: courseCode
      in: path
      required: true
      description: Registrar course code.
      schema:
        type: string
      example: '140713'
  responses:
    ProblemDetails:
      description: >-
        ASP.NET Core validation failure, returned as an RFC 9457 problem document with a
        `type` pointing at RFC 9110 section 15.5.1.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    CodedError:
      description: >-
        Application-coded error — a bare code object, no problem document.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/CodedError'
  schemas:
    BilingualText:
      type: object
      description: >-
        Every human-readable string in this API. Hebrew is the primary member; the English
        member is usually present but may be an empty string.
      properties:
        he:
          type: string
          description: Hebrew text.
        en:
          type: string
          description: English text.
      required: [he]
    CodedTerm:
      type: object
      description: A reference-data enumeration member.
      properties:
        code:
          type: string
        name:
          $ref: '#/components/schemas/BilingualText'
      required: [code, name]
    AcademicYear:
      type: object
      properties:
        id:
          type: integer
        year:
          type: integer
          description: Gregorian year the academic year is labelled by.
        hebrewYear:
          type: string
          description: Hebrew academic year, e.g. תשפ"ז.
        current:
          type: [boolean, 'null']
          description: True on exactly one member — the year the catalog defaults to.
      required: [id, year, hebrewYear]
    Faculty:
      type: object
      properties:
        id:
          type: integer
        code:
          type: string
          description: Registrar faculty code, zero-padded.
        name:
          $ref: '#/components/schemas/BilingualText'
      required: [id, code, name]
    LearningProgram:
      type: object
      properties:
        id:
          type: integer
        userCode:
          type: string
        name:
          $ref: '#/components/schemas/BilingualText'
        displayName:
          $ref: '#/components/schemas/BilingualText'
        sortOrder:
          type: integer
      required: [id, userCode, name]
    Specialization:
      type: object
      properties:
        id:
          type: integer
        code:
          type: string
        name:
          $ref: '#/components/schemas/BilingualText'
        learningProgramName:
          $ref: '#/components/schemas/BilingualText'
        learningProgramDisplayName:
          $ref: '#/components/schemas/BilingualText'
        learningProgramCode:
          type: string
        learningProgramSortOrder:
          type: integer
        thresholds:
          type: array
          items:
            type: object
            additionalProperties: true
        academicInfo:
          type: [object, 'null']
          additionalProperties: true
      required: [id, code, name]
    AssignmentFilterOptions:
      type: object
      properties:
        source:
          type: string
          example: gradeGroup
        options:
          type: array
          items:
            type: object
            properties:
              value:
                type: string
              name:
                $ref: '#/components/schemas/BilingualText'
    CourseSearchRequest:
      type: object
      description: >-
        Filter document for advanced course search. Members are those the catalog's own
        client assembles; the server tolerates a subset.
      properties:
        textQuery:
          type: string
        year:
          type: integer
        facultyIds:
          type: array
          items:
            type: integer
        departmentIds:
          type: array
          items:
            type: integer
        languageCodes:
          type: array
          items:
            type: string
        studySessionTypeCodes:
          type: array
          items:
            type: string
        buildingCodes:
          type: array
          items:
            type: string
        gradeGroupKeys:
          type: array
          items:
            type: string
        assignmentDefinitionIds:
          type: array
          items:
            type: integer
      required: [year]
    Course:
      type: object
      properties:
        id:
          type: integer
        code:
          type: string
          description: Registrar course code — the identifier used across syllabus and requirement operations.
        name:
          $ref: '#/components/schemas/BilingualText'
        departmentId:
          type: integer
        departmentName:
          $ref: '#/components/schemas/BilingualText'
        facultyName:
          $ref: '#/components/schemas/BilingualText'
        academicPoints:
          type: [number, 'null']
        teacherCode:
          type: [string, 'null']
        remark:
          type: [string, 'null']
        coursePeriod:
          type: [integer, 'null']
        coursePeriodName:
          $ref: '#/components/schemas/BilingualText'
        coursePeriodOrder:
          type: [integer, 'null']
        courseStructureType:
          type: [string, 'null']
        courseStructureID:
          type: [integer, 'null']
        startDate:
          type: [string, 'null']
          format: date-time
        endDate:
          type: [string, 'null']
          format: date-time
        lastYearGradeAvg:
          type: [number, 'null']
        sugToar:
          type: [string, 'null']
          description: Degree-program code the course is offered under.
        totalHours:
          type: [integer, 'null']
        isLearning:
          type: [integer, 'null']
        statusCourseCode:
          type: [integer, 'null']
        year:
          type: integer
        groups:
          type: array
          items:
            $ref: '#/components/schemas/CourseGroup'
        studySessionTypeName:
          $ref: '#/components/schemas/BilingualText'
      required: [id, code, name, year]
    CourseGroup:
      type: object
      properties:
        id:
          type: integer
        code:
          type: string
        courseId:
          type: integer
        year:
          type: integer
        period:
          type: [integer, 'null']
        periodName:
          $ref: '#/components/schemas/BilingualText'
        languageCode:
          type: [string, 'null']
        languageName:
          $ref: '#/components/schemas/BilingualText'
        studySessionTypeId:
          type: [integer, 'null']
        studySessionTypeCode:
          type: [string, 'null']
        studySessionTypeName:
          $ref: '#/components/schemas/BilingualText'
        isClinic:
          type: [boolean, 'null']
        isManageAssignments:
          type: [boolean, 'null']
        qualifyingAttendance:
          type: [boolean, 'null']
        startDate:
          type: [string, 'null']
          format: date-time
        endDate:
          type: [string, 'null']
          format: date-time
        remark:
          type: [string, 'null']
        creationDate:
          type: [string, 'null']
          format: date-time
        studySessions:
          type: array
          items:
            $ref: '#/components/schemas/StudySession'
      required: [id, code, courseId, year]
    StudySession:
      type: object
      description: One timetabled meeting of a course group.
      properties:
        id:
          type: integer
        courseId:
          type: integer
        groupId:
          type: integer
        roomId:
          type: [integer, 'null']
        year:
          type: integer
        period:
          type: [integer, 'null']
        dayOfWeek:
          type: [integer, 'null']
          description: 1 = Sunday, the first day of the Israeli academic week.
        startTime:
          type: [integer, 'null']
          description: Milliseconds after local midnight. 52200000 is 14:30.
        endTime:
          type: [integer, 'null']
          description: Milliseconds after local midnight.
        isRecorded:
          type: [boolean, 'null']
        isLiveBroadcast:
          type: [boolean, 'null']
        teachingTypeId:
          type: [integer, 'null']
        calendarFrequency:
          type: [string, 'null']
        teachers:
          type: array
          description: >-
            Assigned teaching staff. Carries named individuals — personal data. Retained
            here as a field description only; no teacher record is stored in this
            repository's examples.
          items:
            type: object
            properties:
              id:
                type: integer
            additionalProperties: true
      required: [id, courseId, groupId, year]
    CourseRequirements:
      type: object
      properties:
        positiveRequirements:
          type: [object, array, 'null']
          description: Courses that must be taken before this one.
        negativeRequirements:
          type: [object, array, 'null']
          description: Courses that exclude this one.
        additionalRequirements:
          type: [boolean, 'null']
    Syllabus:
      type: object
      properties:
        courseCode:
          type: string
        year:
          type: integer
        courseName:
          $ref: '#/components/schemas/BilingualText'
        periodName:
          $ref: '#/components/schemas/BilingualText'
        department:
          $ref: '#/components/schemas/BilingualText'
        semester:
          type: [string, 'null']
        creditPoints:
          type: [string, 'null']
        ectsCredits:
          type: [string, number, 'null']
        degreeLevel:
          type: [string, 'null']
        academicYear:
          type: [string, integer, 'null']
      required: [courseCode, year]
    ProblemDetails:
      type: object
      description: RFC 9457 problem document as emitted by ASP.NET Core model validation.
      properties:
        type:
          type: string
          format: uri
          example: https://tools.ietf.org/html/rfc9110#section-15.5.1
        title:
          type: string
          example: One or more validation errors occurred.
        status:
          type: integer
          example: 400
        errors:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
        traceId:
          type: string
          description: W3C trace context identifier for the failed request.
    CodedError:
      type: object
      description: >-
        Application-coded error. Carries a `code` only — no message, no title, no trace id.
        Observed as `{"code":"ERR_1101"}` when a required `year` parameter is omitted.
      properties:
        code:
          type: string
          example: ERR_1101
      required: [code]