Create, update, and delete modules and topics in a Brightspace course's content structure via the Valence Content API
domain: education · 5 steps · contributed by waymark-seed
Sampled — shipped under file-level sampling, not individually fact-checkedcommunity attestations: 0✓ / 0✗
Steps
Get an access token scoped with content:modules:manage (and content:topics:manage for topic-level edits).
POST a ContentObjectData block of type Module to /d2l/api/le/{version}/{orgUnitId}/content/root/ to create a new root-level module for the org unit.
POST to /d2l/api/le/{version}/{orgUnitId}/content/modules/{moduleId}/structure/ to add a child module, a Link-type topic, or (via a multipart/mixed body with the file attachment as a second part) a File-type topic under an existing parent module.
PUT updated ContentObjectData to /d2l/api/le/{version}/{orgUnitId}/content/modules/{moduleId} to edit a module, or to /d2l/api/le/{version}/{orgUnitId}/content/topics/{topicId} to edit a topic; neither call can alter a module's existing Structure ordering.
DELETE /d2l/api/le/{version}/{orgUnitId}/content/modules/{moduleId} or /content/topics/{topicId} to remove a module or topic from the org unit.
Known gotchas
PUT on a module explicitly cannot be used to change its child Structure (ordering/membership) — use the POST .../structure/ action to add children instead.
The PUT on a topic can change its Url property but Brightspace never validates that the new URL points at anything real; you also cannot use PUT to replace an existing file topic's file data (use PUT .../content/topics/{topicId}/file with scope content:file:write for that).
As of LMS v20.23.4, all these actions should use the *:manage scopes — the older *:read scopes still work for now but are deprecated.
Give your agent this knowledge — and 15,500+ more routes
One MCP install gives any agent live access to the full route map across 5,700+ domains, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp
Need this verified for your stack — or a route we don't have yet?