> 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/read-a-program.md).

# Read a program

Use this endpoint to read one program by its `external_id` (its short name, matched exactly, including case), with its concentrations. Each concentration's `external_id`, and its `concentration_type.external_id`, are the values you send as `data.concentration` and `data.concentration_type` when you [add concentration requirements to an audit](/stellic-partner-api/audits/add-a-sub-requirement.md).

## GET /programs/{external\_id}

>

```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":{"ProgramDetail":{"allOf":[{"$ref":"#/components/schemas/ProgramSummary"},{"type":"object","properties":{"concentrations":{"type":"array","description":"Every concentration configured on the program, archived ones included and not marked. Empty array when the program has none.","items":{"$ref":"#/components/schemas/ConcentrationSummary"}}}}]},"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"}}}}},"ConcentrationSummary":{"type":"object","properties":{"id":{"type":"integer","description":"Internal database ID of the concentration."},"name":{"type":"string"},"external_id":{"type":"string","description":"The concentration's `short_name`; send it as `data.concentration` when adding a concentration child requirement."},"concentration_type":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"external_id":{"type":"string","description":"The concentration type's `short_name`; send it as `data.concentration_type` when adding a concentration parent requirement."}}}}}}},"paths":{"/programs/{external_id}":{"get":{"tags":["Programs"],"parameters":[{"name":"external_id","in":"path","required":true,"description":"The program's `short_name` (the `external_id` value returned by `GET /programs/`, and the `program_short_name` in your program feed). Matched exactly, case-sensitive.","schema":{"type":"string"}}],"responses":{"200":{"description":"Program found. `concentrations` lists every concentration configured on the program, archived ones included and not marked, each with its own `external_id` and its `concentration_type`; these are the values you send as `concentration` and `concentration_type` when adding concentration requirements to an audit, which accepts only active concentrations. `shared_requirement` appears only for programs of type `shared requirement`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgramDetail"}}}},"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. Also returned, with only `error` set to `Compliance requirements are not available via the API.`, when the program is a compliance requirement.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"client_ip":{"type":"string"}}}}}},"404":{"description":"No program has this `short_name`.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}}}}}}}}}}}
```

#### Notes

* **Archived concentrations are listed too,** with nothing marking them, but an audit accepts only active ones. `concentrations` is an empty array when the program has none.
* **A compliance requirement returns a 403** with `Compliance requirements are not available via the API.`
* **`shared_requirement` appears only on shared requirements.**

#### Related APIs

* [`GET /programs/`](/stellic-partner-api/programs/list-programs.md) to find a program's `external_id`.
* [`GET /programs/{program_short_name}/audits`](/stellic-partner-api/programs/list-a-program-s-audits.md) to list the program's audits.
* [`POST /audits/{audit_id}/requirements/{parent_req_id}/subrequirements`](/stellic-partner-api/audits/add-a-sub-requirement.md) to add concentration requirements.
