# update_product_groups — Student

Update one or more Student product groups, including academic year, contract date windows, and segment classification.

<!-- INPUT_BLOCK_START -->

## Input

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `productGroups` | `UpdateStudentProductGroupInput[]` | Yes | Array of product group entries to update - [UpdateStudentProductGroupInput](#updatestudentproductgroupinput) |

### UpdateStudentProductGroupInput

All fields except `productGroupId` are optional. Only provided fields are patched.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `productGroupId` | `string` | Yes | The ID of the product group to update |
| `workspaceId` | `string` | No | The ID of the workspace |
| `internalReference` | `string` | No | The internal reference of the product group |
| `maxOccupants` | `number \| null` | No | Most people who may live in a unit booked through this product group. A head count, not target occupancy. Must be at least 1 and >= `minOccupants` when both end up set. Pass null to clear (no limit); omit to leave unchanged. |
| `minOccupants` | `number \| null` | No | Fewest people who may live in a unit booked through this product group. A head count, not target occupancy. Must be at least 1. Pass null to clear (no limit); omit to leave unchanged. |
| `academicYear` | `string` | No | The academic year in `YYYY/YYYY` format (e.g. `2026/2027`) |
| `agreementId` | `string` | No | The ID of the associated agreement |
| `allowBookingExpiryTimer` | `boolean` | No | Whether booking expiry timer is allowed |
| `cancelationPolicyId` | `string` | No | The ID of the cancelation policy to associate |
| `contractTemplateExternalId` | `string \| null` | No | External ID of the contract template. Pass null to clear; omit to leave unchanged. |
| `defaultExpiryDurationInSeconds` | `number` | No | The default expiry duration in seconds |
| `productSegment` | `ProductSegment \| null` | No | Segment classification for this student product group. Pass null to clear. - [ProductSegment](#productsegment) |
| `publishing` | `PublishingInput` | No | Publishing window configuration - [PublishingInput](#publishinginput) |

### Contract Dates

All contract date fields are optional on update — provide only the fields you want to change.

The **outer bounds** (`contractEarliestStartDate` and `contractLatestEndDate`) define the absolute window — no
booking can start before `contractEarliestStartDate` or end after `contractLatestEndDate`.

The **inner bounds** (`contractLatestStartDate` and `contractEarliestEndDate`) define flexibility within those
outer limits:

- A booking can start anywhere between `contractEarliestStartDate` and `contractLatestStartDate`
  (e.g. a student arriving late).
- A booking can end anywhere between `contractEarliestEndDate` and `contractLatestEndDate`
  (e.g. a student leaving early).

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `contractEarliestStartDate` | `string` | No | The earliest date a booking may start (outer lower bound) |
| `contractLatestStartDate` | `string` | No | The latest date a booking may start (inner upper bound for start) |
| `contractEarliestEndDate` | `string` | No | The earliest date a booking may end (inner lower bound for end) |
| `contractLatestEndDate` | `string` | No | The latest date a booking may end (outer upper bound) |

### ProductSegment

| Value | Description |
| --- | --- |
| `FULL_YEAR` | Student accommodation spanning the full calendar year including summer |
| `ACADEMIC_YEAR` | Student accommodation covering the full academic year, excluding the summer period |
| `SEMESTER_1` | Student accommodation for the first semester of the academic year only |
| `SEMESTER_2` | Student accommodation for the second semester of the academic year only |

### PublishingInput

The publishing window controls when products are visible to bookers. Its lifecycle moves through three
states: `SCHEDULED` (not yet active), `ONGOING` (currently active), and `FINISHED` (window has ended).

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `startDate` | `string` | No | Date when products start showing. Defaults to today if not provided. |
| `endDate` | `string` | No | Date when products stop showing. Defaults to `contractLatestEndDate` from the request payload if not provided. |

## Example

```json
{
  "productGroups": [
    {
      "productGroupId": "product-group-id",
      "productSegment": "SEMESTER_1",
      "contractLatestStartDate": "2026-10-15",
      "contractLatestEndDate": "2027-09-30",
      "publishing": {
        "endDate": "2027-07-31"
      }
    }
  ]
}
```

<!-- INPUT_BLOCK_END -->

<!-- OUTPUT_BLOCK_START -->

## Output

| Field | Type | Description |
| --- | --- | --- |
| `content` | `ContentItem[]` | Array of content items returned by the tool - [ContentItem](#contentitem) |
| `isError` | `boolean` | Whether the tool execution resulted in an error |

### ContentItem

| Field | Type | Description |
| --- | --- | --- |
| `type` | `'text'` | Content type (currently only 'text' is supported) |
| `text` | `string` | The text content to display |

<!-- OUTPUT_BLOCK_END -->
