> 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/catalog-sections/update-section-enrollment-caps.md).

# Update section enrollment caps

Use this endpoint to update one section's seat counts, for example after opening seats or changing the waitlist cap. You can also change the section's instructors, visibility, auto-enroll sections, and description. To update many sections at once, use [`PUT /catalog/section/bulk`](/stellic-partner-api/catalog-sections/bulk-update-section-enrollment-caps.md).

## PUT /catalog/section/{id}

>

```json
{"openapi":"3.0.0","info":{"title":"Stellic for Developers","version":"1.0"},"tags":[{"name":"Catalog Sections"}],"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":{"UpdateCourseSectionRequest":{"type":"object","properties":{"max_enrollment":{"description":"Total seats. Nullable. Negative values are normalized to `0`.","type":"integer","nullable":true},"available_enrollment":{"description":"Open seats remaining. Nullable. Negative values are normalized to `0`.","type":"integer","nullable":true},"max_waitlist":{"description":"Maximum waitlist size. Nullable. Negative values are normalized to `0`.","type":"integer","nullable":true},"waitlist":{"description":"Current waitlist count. Nullable. Negative values are normalized to `0`.","type":"integer","nullable":true},"support_permission_number":{"description":"Whether the registration flow prompts for a permission number on this section. Omit to leave unchanged; send `false` to clear. Any value other than `true` or `false` (including the string `\"true\"`) is stored as `false`, and `null` returns a 500.","type":"boolean"},"first_auto_enroll_section":{"description":"Catalog ID of the first auto-enroll section, in the same term. Nullable. Omit to leave unchanged; send `null` or `\"\"` to clear. An ID that matches no section in the term returns a 400.","type":"string","nullable":true},"second_auto_enroll_section":{"description":"Catalog ID of the second auto-enroll section. Same rules as `first_auto_enroll_section`.","type":"string","nullable":true},"details":{"description":"Only `description` is read on update; other keys are ignored.","type":"object","properties":{"description":{"description":"Description of the section. Nullable; send `null` or `\"\"` to clear. Only a section that already has section details takes a description; a non-empty value on any other section returns a 400.","type":"string","nullable":true}}}}},"UpdateSingleCourseSectionResponse":{"description":"Response from `PUT /catalog/section/{id}`. The bulk endpoint returns `UpdateCourseSectionResponse` without these extra fields.","allOf":[{"$ref":"#/components/schemas/UpdateCourseSectionResponse"},{"type":"object","properties":{"first_auto_enroll_section":{"description":"Catalog ID of the first auto-enroll section, or `null`.","type":"string","nullable":true},"second_auto_enroll_section":{"description":"Catalog ID of the second auto-enroll section, or `null`.","type":"string","nullable":true},"description":{"description":"Description of the section, or `null` when it has no section details. Returned at the top level, not inside `details`.","type":"string","nullable":true}}}]},"UpdateCourseSectionResponse":{"type":"object","properties":{"id":{"description":"Catalog ID of the section.","type":"string"},"max_enrollment":{"description":"Total seats. Nullable.","type":"integer","nullable":true},"available_enrollment":{"description":"Open seats remaining. Nullable.","type":"integer","nullable":true},"max_waitlist":{"description":"Maximum waitlist size. Nullable.","type":"integer","nullable":true},"waitlist":{"description":"Current waitlist count. Nullable.","type":"integer","nullable":true},"support_permission_number":{"description":"Whether the registration flow prompts for a permission number on this section.","type":"boolean"},"hidden":{"description":"Stored section visibility flag.","type":"boolean"}}}}},"paths":{"/catalog/section/{id}":{"put":{"tags":["Catalog Sections"],"parameters":[{"name":"id","in":"path","required":true,"description":"Catalog ID of the section (the section ID your data sync carries). Leading and trailing spaces are trimmed.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCourseSectionRequest"}}}},"responses":{"200":{"description":"Section updated. Recognized fields are `max_enrollment`, `available_enrollment`, `max_waitlist`, `waitlist`, `support_permission_number`, `hidden`, `instructors`, `first_auto_enroll_section`, `second_auto_enroll_section`, and `details.description`. Anything else in the body is ignored. The response also returns `first_auto_enroll_section`, `second_auto_enroll_section`, and `description`. The section's cached data is cleared and catalog search reflects the new seat counts right away.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSingleCourseSectionResponse"}}}},"400":{"description":"Missing body, invalid field value, instructor entry missing an `id`, unknown string instructor ID, or ambiguous section ID. Malformed instructor ID types can return `500` instead.\n\nThe response is an `application/json` object with an `errors` array. Each entry is an object with a string `message`, not a bare string or a `detail` field. For example, an unknown string instructor ID returns `{\"errors\":[{\"message\":\"Instructors with ids:['unknown'] do not exist\"}]}`.\n\nCommon causes:\n- Empty body - returns `\"course_section\" is a required field`\n- Seat-count field sent as anything other than an integer or `null`, including a boolean, string, list, or object - returns `'{field}' is a field that requires a positive integer value`\n- `support_permission_number` or `hidden` sent as anything other than a JSON boolean, including `null` - returns `'{field}' is a field that requires a boolean value`\n- Instructor entry without an `id` - returns `Every entry in \"instructors\" needs an \"id\"`\n- Instructor ID is a string that matches no existing instructor\n- More than one section carries `{id}` - returns `Course section id {id} matches more than one section`\n- `first_auto_enroll_section` or `second_auto_enroll_section` is neither a string nor null - returns `\"{field}\" must be a string`\n- `details.description` is neither a string nor null - returns `\"details.description\" must be a string`\n- `first_auto_enroll_section` or `second_auto_enroll_section` unknown in the section's term - returns `Course section with id:{auto_enroll_id} for {field} does not exist in term:{term}`\n- Non-empty `details.description` sent for a section with no section details - returns `Course section with id:{id} has no section details to add a description to. Send the description with the section's other details when creating it.`\n\nInstructor, auto-enroll, and description validation happens before any section changes are saved."},"401":{"description":"Missing or invalid Bearer token."},"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":"Section with `{id}` does not exist.\n\nCommon causes:\n- Section doesn't exist - returns `Course section with id:{id} does not exist`"},"500":{"description":"Unhandled server error, including some malformed instructor ID inputs.\n\nCommon causes:\n- For an existing section, `{\"instructors\":[{\"id\":null},{\"id\":\"definitely-unknown\"}]}` returns `500` before any section changes are saved. Validate every instructor ID as a string before sending; malformed ID types can return `500` rather than `400`.\n- The save fails"}}}}}}
```

#### What happens after the call

* The fields you sent are updated right away, and catalog search reflects the new counts right away.
* Instructor changes are saved during the request, but instructor-based catalog search can show the previous roster until the next search refresh.
* Your next data sync replaces these values with the ones it carries.

#### Notes

* **Validate every instructor ID as a string before sending.** Malformed ID types can return `500` instead of `400`, including a list containing both `{"id": null}` and an unknown string ID.
* **Send the complete instructor list when changing instructors.** A non-empty list replaces the existing instructors, so leave someone out to remove them. Omitting `instructors`, sending `null`, or sending `[]` leaves the existing instructors unchanged; an empty list cannot clear them all.
* **Only fields you send change.** Sending `first_auto_enroll_section`, `second_auto_enroll_section`, or `details.description` as `null` or `""` clears it; leaving the key out keeps it. Of `details`, only `description` is read.
* **Use auto-enroll IDs that identify exactly one section within the target section's term.** If multiple sections in that term carry the ID, the endpoint takes the first match rather than returning an ambiguity error. Matching is not restricted by course or campus, and there is no course or campus disambiguation parameter. An ID found only in another term returns a 400.
* **A description needs existing section details.** A non-empty `details.description` on a section created without `details` returns a 400 and changes nothing. Send the description with `details` when you create the section instead.
* **The description comes back at the top level.** The response has `description`, not `details.description`, and it's `null` when the section has no section details.

#### Related APIs

* [`PUT /catalog/section/bulk`](/stellic-partner-api/catalog-sections/bulk-update-section-enrollment-caps.md) to update seat counts on many sections.
* [`POST /catalog/section/{id}`](/stellic-partner-api/catalog-sections/create-a-catalog-section.md) to create a section.
* [`PUT /catalog/section/timings/{id}`](/stellic-partner-api/catalog-sections/replace-a-section-s-timings.md) to replace a section's meeting times.
* [`DELETE /catalog/section/{id}`](/stellic-partner-api/catalog-sections/delete-a-catalog-section.md) to delete a cancelled section.
