# create_product_groups — Student

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

<!-- INPUT_BLOCK_START -->

## Input

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `productGroups` | `CreateStudentProductGroupInput[]` | Yes | Array of product group entries to create - [CreateStudentProductGroupInput](#createstudentproductgroupinput) |

### CreateStudentProductGroupInput

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `workspaceId` | `string` | Yes | The ID of the workspace |
| `internalReference` | `string` | Yes | 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 are set. Null or omit for no limit. |
| `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. Null or omit for no limit. |
| `academicYear` | `string` | Yes | 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 (e.g. for e-signing). Omit or pass null for not set. |
| `defaultExpiryDurationInSeconds` | `number` | No | The default expiry duration in seconds |
| `productSegment` | `ProductSegment` | No | Segment classification for this student product group - [ProductSegment](#productsegment) |
| `publishing` | `PublishingInput` | No | Publishing window configuration - [PublishingInput](#publishinginput) |

### Contract Dates

Contract dates establish two levels of boundaries that control the allowable booking window. All four
fields are required.

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` | Yes | The earliest date a booking may start (outer lower bound) |
| `contractLatestStartDate` | `string` | Yes | The latest date a booking may start (inner upper bound for start) |
| `contractEarliestEndDate` | `string` | Yes | The earliest date a booking may end (inner lower bound for end) |
| `contractLatestEndDate` | `string` | Yes | 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": [
    {
      "workspaceId": "workspace-id",
      "internalReference": "PG-STUDENT-2026",
      "academicYear": "2026/2027",
      "contractEarliestStartDate": "2026-09-01",
      "contractLatestStartDate": "2026-09-30",
      "contractEarliestEndDate": "2027-05-01",
      "contractLatestEndDate": "2027-08-31",
      "productSegment": "ACADEMIC_YEAR",
      "allowBookingExpiryTimer": true,
      "defaultExpiryDurationInSeconds": 1800,
      "publishing": {
        "startDate": "2026-02-01",
        "endDate": "2027-06-30"
      }
    }
  ]
}
```

<!-- 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 -->
