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

# Bulk-update section enrollment caps

Use this endpoint to update seat counts, visibility, and instructors on many sections in one call. Send only the fields you want to change. `support_permission_number` isn't written here; use [`PUT /catalog/section/{id}`](/stellic-partner-api/catalog-sections/update-section-enrollment-caps.md) for it.

## PUT /catalog/section/bulk

>

```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":{"UpdateCourseSectionBulkRequest":{"type":"object","properties":{"id":{"description":"Catalog ID of the section to update. Every section carrying this ID is updated. Entries that repeat an ID are merged, and for each field the later entry wins.","type":"string"},"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},"hidden":{"description":"Section visibility flag. Omit to preserve the stored value. Accepts only a JSON boolean; null is rejected for the row.","type":"boolean"},"instructors":{"description":"A non-empty list replaces the section's entire instructor list. Omission, null, or an empty list leaves instructors unchanged; an empty list does not clear them. Instructors are not included in the success response.","type":"array","nullable":true,"items":{"type":"object","properties":{"id":{"description":"An existing instructor's SIS ID or username.","type":"string"}},"required":["id"]}}},"required":["id"]},"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/bulk":{"put":{"tags":["Catalog Sections"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UpdateCourseSectionBulkRequest"}}}}},"responses":{"200":{"description":"Batch processed. Inspect `success[]` and `errors[]`; a 200 doesn't mean every row succeeded. Successful rows are saved; a failed row leaves that section unchanged without rolling back other rows. `success[]` and `errors[]` describe section updates only, not catalog-search updates. Each key is present only when its list is non-empty.\n\nSome catalog-search update failures are caught and appear in neither list; a section can appear in `success[]` even when its search result was not updated.\n\nAn unknown ID is listed in `errors[]` as `{ message }` with no `id`: `Course section with id:{id} does not exist`. Other row failures include both `id` and `message`.\n\nRow validation messages:\n- Non-integer seat counts, including strings, lists, objects, and booleans: `'{field}' is a field that requires a positive integer value`\n- Non-boolean `hidden` or `support_permission_number`, including null: `'{field}' is a field that requires a boolean value`. A valid `support_permission_number` is not written by this endpoint.\n- An instructor entry without an `id`: `Every entry in \"instructors\" needs an \"id\"`\n- Unknown instructor IDs: `Instructors with ids:{sorted_ids} do not exist`, where `{sorted_ids}` is the sorted list of unmatched IDs.\n\nOther row save failures return `Something went wrong. If this issue persists, please contact a Stellic representative for assistance.`","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"array","items":{"$ref":"#/components/schemas/UpdateCourseSectionResponse"}},"errors":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Catalog ID of the failed section. Omitted for unknown section IDs."},"message":{"type":"string","description":"Reason the section was not updated."}},"required":["message"]}}}}}}},"400":{"description":"Up-front validation rejected the request before any row was processed.\n\nCommon causes:\n- Empty body - returns `\"course_sections\" is a required field`\n- A row without `id` - returns `\"['id']\" are required fields which are not found in one of the elements` (stops at the first failing row)\n- A row with `id: null` - returns `\"id\" is a required field and cannot be null`"},"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"}}}}}},"500":{"description":"Unhandled server error.\n\nCommon causes:\n- Server error while updating catalog search: section updates have already committed, so this can return a 500 even though the section values were saved"}}}}}}
```

#### What happens after the call

* Successful rows are saved right away. A failed row leaves that section unchanged without rolling back other rows.
* Catalog search can still show old counts after the response returns. Don't use an immediate search result to confirm what was saved.
* Your next data sync replaces these values with the ones it carries.

#### Notes

{% hint style="warning" %}
**Check each row's result.** A 200 can include failed rows. Correct those rows and resend them rather than resending the whole batch.
{% endhint %}

* **Unknown IDs don't fail the call.** Each is listed in `errors[]` without an `id`, and the other rows are saved.
* **Listing a section twice merges the entries.** For each field, the later entry wins. Send each section once.
* Other section details aren't changed here; use your data sync for them.
* **Keep each request under five minutes.** Requests that run longer than 300 seconds return a 504, and bodies over 100 MB return a 413. A few hundred rows per request keeps both well out of reach.

#### Related APIs

* [`PUT /catalog/section/{id}`](/stellic-partner-api/catalog-sections/update-section-enrollment-caps.md) to update one section, including `support_permission_number`.
* [`PUT /catalog/section/timings/bulk`](/stellic-partner-api/catalog-sections/bulk-replace-timings-for-multiple-sections.md) to replace meeting times on many sections.
* [`POST /catalog/section/{id}`](/stellic-partner-api/catalog-sections/create-a-catalog-section.md) to create a section.
