> For the complete documentation index, see [llms.txt](https://docs.stellic.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.stellic.com/stellic-partner-api/student/read-courses-from-a-student-s-primary-planner.md).

# Read courses from a student's primary planner

Use this endpoint to read the courses on a student's default plan in terms after the current one, for example to show what a student plans to take next term. `{course_filter}` picks `planned` (not yet registered), `registered`, or `all`. For progress against requirements, use the audit endpoints instead.

## GET /student/{student\_username}/planner/primary/{course\_filter}/{property}

>

```json
{"openapi":"3.0.0","info":{"title":"Stellic for Developers","version":"1.0"},"tags":[{"name":"Student"}],"servers":[{"url":"https://{institution}.stellic.com/partnerapi/v1","variables":{"institution":{"default":"{institution}","description":"Your institution's Stellic subdomain: the part before `.stellic.com` in the URL you use to sign in. It becomes the host in every request, as in `https://{institution}.stellic.com/partnerapi/v1/...`. Replace the `{institution}` placeholder with your subdomain before sending."}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Personal Access Token issued by your Stellic integration partner. Send it as `Authorization: Bearer <token>` on every request. One token per institution; do not share across environments."}},"schemas":{"FutureCourses":{"type":"object","properties":{"future_courses":{"type":"array","items":{"type":"object","description":"A plan course in the future-term slice of the student's default plan. `pathways`, `notes`, and `version_id` are conditional and only appear when their corresponding flag/source is set.","properties":{"code":{"type":"string","description":"Catalog code for the course."},"units":{"type":"number","nullable":true,"description":"Planned units on the plan course. May differ from catalog units (split credits, transfer awards). `null` when no units are set."},"sections":{"type":"array","description":"SIS section IDs of the sections the student is linked to for this plan course. An entry is `null` when the section has no SIS ID.","items":{"type":"string","nullable":true}},"grade":{"type":"string","nullable":true,"description":"Display letter when a grade is recorded; `null` otherwise. Always `null` for transfer courses on prospective instances."},"grade_option":{"type":"string","nullable":true,"description":"Grade option name when set; `null` otherwise."},"is_transfer":{"type":"boolean"},"term":{"type":"object","description":"The term the plan course is in.","properties":{"name":{"type":"string","description":"Name of the term."},"year":{"type":"integer","description":"Calendar year of the term."},"code":{"type":"string","description":"The SIS term code."}}},"cross_course_link_destination_ids":{"type":"array","description":"Plan-course IDs this course points to via cross-course links.","items":{"type":"integer"}},"cross_course_link_source_ids":{"type":"array","description":"Plan-course IDs that point at this course via cross-course links.","items":{"type":"integer"}},"version_id":{"type":"integer","description":"Present only when the plan course is pinned to a specific catalog version."},"pathways":{"description":"Present only when `?pathways=true`. Mixed type: returns the boolean `false` when the course wasn't added from a pathway, or an array of `{id, name}` objects when it was.","oneOf":[{"type":"boolean"},{"type":"array","items":{"$ref":"#/components/schemas/FromTemplate"}}]},"notes":{"type":"array","description":"Present only when `?notes=true`. The notes attached to this plan course.","items":{"$ref":"#/components/schemas/PlannerNote"}}}}},"success":{"type":"boolean"}}},"FromTemplate":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}},"PlannerNote":{"type":"object","description":"A note attached to a plan course, as returned when `?notes=true`.","properties":{"id":{"type":"string","description":"The note's ID."},"content":{"type":"string","description":"Text of the note."},"creator":{"type":"object","nullable":true,"description":"The note's author. Includes the author's email address and legal name.","properties":{"title":{"type":"string","nullable":true,"description":"The author's job title, or `null` if none is set."},"pronouns":{"type":"string","nullable":true},"username":{"type":"string"},"userid":{"type":"string","nullable":true,"description":"The author's SIS-displayed ID."},"first_name":{"type":"string"},"last_name":{"type":"string"},"photo_url":{"type":"string","nullable":true},"email":{"type":"string"},"last_log_in":{"type":"string","nullable":true,"description":"When the author was last active, or `null` if never."},"legal_name":{"type":"string","description":"The author's legal name, or an empty string."}}},"created":{"type":"string","description":"When the note was created, as a timestamp string."},"modified":{"type":"string","description":"When the note was last changed, as a timestamp string."},"desc":{"type":"string","description":"Short description of what the note is on (for example `Note on CS 101 in Fall 2025`)."},"from_template":{"type":"string","nullable":true,"description":"ID of the pathway this note was added from, or `null` if it wasn't added from one."},"plancourse_id":{"type":"integer","description":"Stellic's internal ID of the plan course the note is on."}}}}},"paths":{"/student/{student_username}/planner/primary/{course_filter}/{property}":{"get":{"tags":["Student"],"parameters":[{"name":"student_username","in":"path","required":true,"description":"Student's platform username. Case-sensitive on lookup; an SIS-side identifier will return `404`.","schema":{"type":"string"}},{"name":"course_filter","in":"path","required":true,"description":"Picks which planner courses to return. `registered` returns only registered courses; `planned` returns only planned-but-not-yet-registered courses. Any other value (including `all`) returns both planned and registered courses with no error.","schema":{"type":"string","enum":["registered","planned","all"]}},{"name":"property","in":"path","required":true,"description":"Legacy positional segment. Captured but not used; the response is always the future-courses payload. Send `future` for readability.","schema":{"type":"string"}},{"name":"pathways","in":"query","required":false,"description":"When `true`, each course in the response gets a `pathways` field: the boolean `false` if the course wasn't added from a pathway, or an array of `{id, name}` objects if it was. Only the exact string `true` turns this on.","schema":{"type":"boolean","default":false}},{"name":"notes","in":"query","required":false,"description":"When `true`, each course in the response gets a `notes` array: each note's `id`, `content`, `creator` (including the author's email address and legal name), timestamps, and the pathway it came from. Only the exact string `true` turns this on.","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"A flat `future_courses` array plus `success: true`. The contents are the planner's forward-looking slice (usually the terms after the current term).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FutureCourses"}}}},"401":{"description":"Missing or invalid Bearer token.\n\nCommon causes:\n- Auth failure"},"403":{"description":"Your IP address isn't on the allowlist for this endpoint. Contact Stellic to add it; the response includes the `client_ip` Stellic saw.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"client_ip":{"type":"string"}}}}}},"404":{"description":"Student or default plan not found. Body is `{\"errors\": [{\"message\": \"...\"}]}`.\n\nCommon causes:\n- Username does not resolve - returns `Student with username '{username}' not found`\n- Student exists but has no default plan - returns `Student with username '{username}' does not have a plan`"},"500":{"description":"Unhandled server error.\n\nCommon causes:\n- Server error - returns `{\"errors\": []}` with no parseable message"}}}}}}
```

#### Notes

* **Only terms after the current one are returned.** Between terms, the term that just ended still counts as current, so the next term is included. Course status isn't filtered, so dropped or withdrawn courses in a future term still appear.
* **Any `{course_filter}` other than `planned` or `registered` returns both.** A typo isn't rejected.
* **`{property}` is ignored.** Send `future`.
* **`pathways=true` returns `false` for courses not added from a template**, not an empty list.
* **Notes include the author's contact details.** With `notes=true`, each note's `creator` includes the author's email address and legal name. Don't pass it on to anyone who shouldn't see it.
* **Cross-course link IDs can't be matched to courses in this response.** `cross_course_link_destination_ids` and `cross_course_link_source_ids` are plan-course IDs, and courses don't carry their own ID here.
* **Usernames must match exactly.** The username isn't lowercased here, unlike on the profile endpoints. Archived students and test accounts are returned.

#### Related APIs

* [`GET /student/{student_username}/audit/official/{course_filter}/{property}`](/stellic-partner-api/student/read-a-student-s-official-degree-audit.md) for the student's audit.
* [`GET /student/{student_username}/progress/summary`](/stellic-partner-api/student/read-a-student-s-progress-summary.md) for completion percentages.
* [`PUT /planner/enrollment/course/{username}/{term_id}`](/stellic-partner-api/course-enrollments/replace-a-student-s-course-enrollments-for-a-term.md) to replace a term's course enrollments.
