---
search:
  tags:
    - Terms
    - POST
seo:
  description: >-
    Creates an organization term (semester/period) with start and end dates.
    termStart… Reference for the POST /organization-terms endpoint in the Fuxam
    API v4.
sidebar:
  label: Create an organization term
  badge: POST
title: Create an organization term
type: openapi-operation
---
Creates an organization term (semester/period) with start and end dates. `termStart` must be strictly before `termEnd`. Optionally set election and reassessment registration windows. Returns `422` when start and end are the same instant (`… must not be the same`) or when start is after end (`… must be before …`). Idempotency keys are stored under `/organization-terms` — the same key replays identically when using the `/terms` alias path. Scoped to your integration's institution via Basic Auth credentials.

`POST /organization-terms`

**Request body** (`application/json`, required)

- `name` (string, required)
- `code` (string) — Optional term code. Whitespace-only values are stored as null.
- `termStart` (string<date-time>, required) — Term start date. Must include a timezone offset (\`Z\` or \`±HH:MM\`); values without offset return 422. Must be strictly before \`termEnd\`. If equal to \`termEnd\`, the API returns \`422\` with field error \`termStart and termEnd must not be the same\`.
- `termEnd` (string<date-time>, required) — Term end date. Must include a timezone offset (\`Z\` or \`±HH:MM\`); values without offset return 422. Must be strictly after \`termStart\`. If equal to \`termStart\`, the API returns \`422\` with field error \`termStart and termEnd must not be the same\`.
- `electionStart` (string<date-time>) — Must include a timezone offset (\`Z\` or \`±HH:MM\`).
- `electionEnd` (string<date-time>) — Must include a timezone offset (\`Z\` or \`±HH:MM\`).
- `reassessmentRegistrationStart` (string<date-time>) — Must include a timezone offset (\`Z\` or \`±HH:MM\`).
- `reassessmentRegistrationEnd` (string<date-time>) — Must include a timezone offset (\`Z\` or \`±HH:MM\`).

Request body example:

```json
{
  "name": "Winter Semester 2024/25",
  "code": "WS2425",
  "termStart": "2024-10-01T00:00:00.000Z",
  "termEnd": "2025-03-31T23:59:59.000Z",
  "electionStart": "2024-09-01T00:00:00.000Z",
  "electionEnd": "2024-09-15T23:59:59.000Z"
}
```

**Responses**

- `201` — Term created
- `400` — Bad Request
- `401` — Unauthorized
- `409` — Conflict — duplicate email or membership code (body includes \`existingUserId\` when known), a time-tracking session that is already running (\`activeSession\`), a time-tracking interval that overlaps an existing log (\`conflictingLog\`), idempotency key reused with a different body (\`idempotency\_key\_reused\`), or concurrent request with the same key still in progress (\`idempotency\_key\_in\_progress\`)
- `422` — Unprocessable Entity — validation or business rule error
- `429` — Too Many Requests — 1000 requests per minute per institution. Includes \`X-RateLimit-Limit\`, \`X-RateLimit-Remaining\`, \`X-RateLimit-Reset\` (ISO-8601), and \`Retry-After\` (seconds).
- `500` — Internal Server Error

Response example, 201:

```json
{
  "data": {
    "id": "ot_001",
    "name": "WS 2024/25",
    "termEnd": "2025-03-31T23:59:59.000Z",
    "institutionId": "inst_123",
    "termStart": "2024-10-01T00:00:00.000Z",
    "code": "WS24",
    "electionEnd": null,
    "electionStart": null,
    "reassessmentRegistrationEnd": null,
    "reassessmentRegistrationStart": null
  },
  "meta": {
    "requestId": "req_abc123",
    "timestamp": "2026-06-26T00:00:00.000Z",
    "version": "v4"
  }
}
```
