> 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/programs/list-programs.md).

# List programs

Use this endpoint to list the programs of one or more types and get each program's `external_id`, the identifier the other program, audit, and program enrollment endpoints take. Repeat `type` for each type you want (`?type=major&type=minor`). Type names match your institution's configuration exactly, including case, and `shared requirement` is sent as `shared%20requirement`. The full list comes back in one response.

## GET /programs/

>

```json
{"openapi":"3.0.0","info":{"title":"Stellic for Developers","version":"1.0"},"tags":[{"name":"Programs","description":"Programs in your catalog and the audits (requirement versions) attached to them. Programs are addressed by `short_name`; audits by internal numeric ID."}],"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":{"ProgramListResponse":{"type":"object","properties":{"programs":{"type":"array","items":{"$ref":"#/components/schemas/ProgramSummary"}}}},"ProgramSummary":{"type":"object","description":"A program as the programs and audits endpoints return it.","properties":{"id":{"type":"integer","description":"Internal database ID of the program. Only needed where an endpoint asks for it, such as `base_program`."},"name":{"type":"string"},"external_id":{"type":"string","description":"The program's `short_name`, the identifier you use in path parameters and in your program feed. For a shared requirement program it equals `name`."},"shared_requirement":{"type":"object","description":"Present only for programs of type `shared requirement`. `id` is the value to send as `shared_requirement_id` when linking this shared requirement into an audit.","properties":{"id":{"type":"integer"}}}}},"ErrorMessage":{"type":"object","description":"Error envelope used by the programs, audits, and requirements endpoints.","properties":{"error":{"type":"string","description":"Human-readable reason. Match on it if you need to branch; the strings on each endpoint page are verbatim."}}}}},"paths":{"/programs/":{"get":{"tags":["Programs"],"parameters":[{"name":"type","in":"query","required":true,"description":"Program type name to include, exactly as configured for your institution (for example `major`, `minor`, or `shared requirement`). Repeat the parameter to include more than one type (`?type=major&type=minor`); comma-separated values are not split. Matched exactly, case-sensitive. Compliance-requirement programs are never returned, whatever you pass.","schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":true}],"responses":{"200":{"description":"Every program whose type matches one of the `type` values. `shared_requirement` appears only on programs of type `shared requirement`; its `id` is the value to send as `shared_requirement_id` when you add that shared requirement to an audit. Archived programs are included and aren't marked. The list is not paginated and not sorted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgramListResponse"}}}},"400":{"description":"Missing filter.\n\nCommon causes:\n- No `type` query parameter - returns `At least one 'type' query parameter is required.`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Missing or invalid Bearer token.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}}}}}},"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"}}}}}}}}}}}
```

#### Notes

* **Repeat `type`; don't comma-separate it.** `?type=major,minor` looks for one type named `major,minor` and returns an empty `programs` array, as does any unknown type name. Leaving `type` out returns a 400.
* **Archived programs are included,** and nothing in the response marks them.
* **Compliance requirements are never listed,** whatever `type` you send.
* **`external_id` and `id` are different.** `external_id` goes in paths and enrollment calls. `id` is only for `base_program` when you [create a shared requirement](/stellic-partner-api/programs/create-a-shared-requirement-program.md).
* **`shared_requirement.id` appears only on shared requirements.** Send it as `shared_requirement_id` to link the block into an audit.
* **The list has no set order.**

#### Related APIs

* [`GET /programs/{external_id}`](/stellic-partner-api/programs/read-a-program.md) to read one program with its concentrations.
* [`GET /programs/{program_short_name}/audits`](/stellic-partner-api/programs/list-a-program-s-audits.md) to list a program's audits.
* [`POST /planner/enrollment/program/{username}/{program_id}`](/stellic-partner-api/program-enrollments/enroll-a-student-in-a-program.md) to enroll a student; `program_id` is the `external_id`.
