---
search:
  tags:
    - Modules
    - POST
seo:
  description: >-
    Attaches an existing Module version as a reusable… Reference for the POST
    /modules/{id}/versions/{versionId}/submodules endpoint in the Fuxam API v4.
sidebar:
  label: Add a Submodule to a Module version
  badge: POST
title: Add a Submodule to a Module version
type: openapi-operation
---
Attaches an existing Module version as a reusable Submodule of the parent version. Requires an Idempotency-Key. Repeating the same parent/child catalog relationship returns the existing connection. `cascadeChoice` decides how linked curricula receive term-specific occurrences. Requires Module Hierarchy to be enabled. Scoped to your integration's institution via Basic Auth credentials.

`POST /modules/{id}/versions/{versionId}/submodules`

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

- `childModuleVersionId` (string, required) — Existing child Module version to attach.
- `cascadeChoice` (string, required)
- `ectsContributionMode` (string) — Optional. Defaults to CONTRIBUTE\_TO\_PARENT when omitted.
- `isRequiredForPass` (boolean) — Optional. Defaults to true when omitted.

Request body example:

```json
{
  "childModuleVersionId": "cmv_qa_api_child_a_1",
  "cascadeChoice": "propagate",
  "ectsContributionMode": "CONTRIBUTE_TO_PARENT",
  "isRequiredForPass": true
}
```

**Responses**

- `201` — Submodule connection created or replayed
- `400` — Bad Request
- `401` — Unauthorized
- `404` — Not Found
- `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": {
    "connectionId": "cmc_parent_child_a",
    "parentModuleId": "cm_qa_api_parent",
    "parentModuleVersionId": "cmv_qa_api_parent_1",
    "childModuleId": "cm_qa_api_child_a",
    "childModuleVersionId": "cmv_qa_api_child_a_1",
    "childModuleName": "QA API Child A",
    "childModuleCode": "QA-CHILD-A",
    "childVersion": "1.0",
    "ectsContributionMode": "CONTRIBUTE_TO_PARENT",
    "isRequiredForPass": true,
    "createdAt": "2026-08-23T10:00:00.000Z",
    "updatedAt": "2026-08-23T10:00:00.000Z"
  },
  "meta": {
    "requestId": "req_abc123",
    "timestamp": "2026-06-26T00:00:00.000Z",
    "version": "v4"
  }
}
```
