# Headless LMS

> An open-source, API-first headless LMS built in modern TypeScript. Composable adapters and extendable with plugins.

Headless LMS is MIT-licensed and self-hosted. The domain lives in `@headless-lms/core`, the HTTP layer in `@headless-lms/server`, and capabilities such as email, storage and workflows are swappable adapters. Every route validates against shared Zod schemas, which produce the OpenAPI spec, which generates the typed SDK, so API, docs and client stay in sync.

Append `.md` to any page URL on this site to get its Markdown source.

## Documentation

- [API & SDK](https://headless-lms.dev/docs/api-reference.md): How the API, OpenAPI spec, and typed SDK relate.
- [Architecture](https://headless-lms.dev/docs/architecture.md): How everything fits together - easy to extend and modify.
- [Building a frontend](https://headless-lms.dev/docs/building-a-frontend.md): Read a signed-in member's courses, downloads and community, and show their files.
- [Custom editor](https://headless-lms.dev/docs/editor.md): The contract a lesson content editor implements, and what the app hosting it does.
- [Introduction](https://headless-lms.dev/docs.md): What Headless LMS is, why it is API-first, and how an installation composes the server.
- [Project structure](https://headless-lms.dev/docs/project-structure.md): How the monorepo is organized and what each workspace is responsible for.
- [Self-hosting](https://headless-lms.dev/docs/self-hosting.md): Create a standalone installation, or run the full workspace locally for development.
- [Webhooks](https://headless-lms.dev/docs/webhooks.md): Send an organization's events to your own endpoint as signed HTTP requests.
- [Adapters](https://headless-lms.dev/docs/adapters.md): Adapters are what makes headless-lms incredibly extendable.
- [API reference](https://headless-lms.dev/docs/api.md): Every Headless LMS REST endpoint, grouped by domain, generated from the OpenAPI spec at https://headless-lms.dev/openapi.json.
- [Connect an AI assistant](https://headless-lms.dev/docs/mcp.md): Let Claude, ChatGPT and other MCP clients work in one organization, with your role and only the scopes you grant.
- [Permissions](https://headless-lms.dev/docs/mcp/permissions.md): The scopes a connection can carry, and which roles can grant them.
- [Tools](https://headless-lms.dev/docs/mcp/tools.md): Every tool an assistant can use, the scope it needs and the input it takes.
- [Plate editor](https://headless-lms.dev/docs/plugins/content-plate.md): Notion-style activity content editing with the content-plate plugin.
- [Overview](https://headless-lms.dev/docs/plugins.md): How plugins extend an installation, and which ones ship with the platform.
- [Slack](https://headless-lms.dev/docs/plugins/slack.md): Post domain events to a Slack channel with the Slack plugin.
- [React Email](https://headless-lms.dev/docs/adapters/email/react-email.md): Render transactional emails from React Email components with the email-templates adapter.
- [Resend](https://headless-lms.dev/docs/adapters/email/resend.md): Send transactional email through Resend with the email-resend adapter.
- [MinIO](https://headless-lms.dev/docs/adapters/storage/minio.md): Store course assets in MinIO or any S3-compatible store with the storage-minio adapter.
- [Hatchet](https://headless-lms.dev/docs/adapters/workflows/hatchet.md): Run automations durably with the workflow-hatchet adapter.

## API reference

- [Create an API key](https://headless-lms.dev/docs/api/access/createApiKey.md): POST /api/access/api-keys
- [Delete an API key](https://headless-lms.dev/docs/api/access/deleteApiKey.md): DELETE /api/access/api-keys/{id}
- [Access](https://headless-lms.dev/docs/api/access.md)
- [Every access scope and whether your role can grant it](https://headless-lms.dev/docs/api/access/listAccessScopes.md): GET /api/access/scopes
- [Your API keys for this organization](https://headless-lms.dev/docs/api/access/listApiKeys.md): GET /api/access/api-keys
- [Apps connected to this organization as you](https://headless-lms.dev/docs/api/access/listConnectedApps.md): GET /api/access/apps
- [Disconnect an app](https://headless-lms.dev/docs/api/access/revokeConnectedApp.md): DELETE /api/access/apps/{clientId}
- [Confirm a library upload completed (staff)](https://headless-lms.dev/docs/api/assets/confirmAsset.md): POST /api/assets/{id}/confirm
- [Delete an asset nothing references (staff)](https://headless-lms.dev/docs/api/assets/deleteAsset.md): DELETE /api/assets/{id}
- [Delete an upload of yours that nothing references](https://headless-lms.dev/docs/api/assets/deleteMemberUpload.md): DELETE /api/member/uploads/{id}
- [Redirect to a library file saved under its filename (staff)](https://headless-lms.dev/docs/api/assets/downloadLibraryFile.md): GET /api/assets/{id}/download
- [Confirm an upload you started](https://headless-lms.dev/docs/api/assets/finalizeMemberUpload.md): POST /api/member/uploads/{id}/finalize
- [Get an asset's metadata (staff)](https://headless-lms.dev/docs/api/assets/getAsset.md): GET /api/assets/{id}
- [Redirect to a library file to show it (staff)](https://headless-lms.dev/docs/api/assets/getLibraryFile.md): GET /api/assets/{id}/file
- [Assets](https://headless-lms.dev/docs/api/assets.md)
- [Browse the organization's media library (staff)](https://headless-lms.dev/docs/api/assets/listAssets.md): GET /api/assets
- [Register an image you are about to upload and get a presigned upload URL](https://headless-lms.dev/docs/api/assets/requestMemberUpload.md): POST /api/member/uploads
- [Register a library asset and get a presigned upload URL (staff)](https://headless-lms.dev/docs/api/assets/requestUpload.md): POST /api/uploads
- [Create a workflow automation (staff)](https://headless-lms.dev/docs/api/automations/createAutomation.md): POST /api/automations
- [Create a webhook (staff)](https://headless-lms.dev/docs/api/automations/createWebhook.md): POST /api/automations/webhooks
- [Delete a workflow automation (staff)](https://headless-lms.dev/docs/api/automations/deleteAutomation.md): DELETE /api/automations/{id}
- [Delete a webhook and its signing secret (staff)](https://headless-lms.dev/docs/api/automations/deleteWebhook.md): DELETE /api/automations/webhooks/{id}
- [Get an automation (staff)](https://headless-lms.dev/docs/api/automations/getAutomation.md): GET /api/automations/{id}
- [Get a webhook (staff)](https://headless-lms.dev/docs/api/automations/getWebhook.md): GET /api/automations/webhooks/{id}
- [Reveal a webhook's signing secret (staff)](https://headless-lms.dev/docs/api/automations/getWebhookSecret.md): GET /api/automations/webhooks/{id}/secret
- [Automations](https://headless-lms.dev/docs/api/automations.md)
- [List the actions automations can use (staff)](https://headless-lms.dev/docs/api/automations/listAutomationActions.md): GET /api/automations/actions
- [List an automation's runs (staff)](https://headless-lms.dev/docs/api/automations/listAutomationRuns.md): GET /api/automations/{id}/runs
- [List the domain events automations can react to (staff)](https://headless-lms.dev/docs/api/automations/listAutomationTriggers.md): GET /api/automations/triggers
- [List automations (staff)](https://headless-lms.dev/docs/api/automations/listAutomations.md): GET /api/automations
- [List the organization's webhooks (staff)](https://headless-lms.dev/docs/api/automations/listWebhooks.md): GET /api/automations/webhooks
- [Run a finished run again (staff)](https://headless-lms.dev/docs/api/automations/rerunAutomationRun.md): POST /api/automations/{id}/runs/{runId}/rerun
- [Replace a webhook's signing secret (staff)](https://headless-lms.dev/docs/api/automations/rotateWebhookSecret.md): POST /api/automations/webhooks/{id}/secret/rotate
- [Update a workflow automation (staff)](https://headless-lms.dev/docs/api/automations/updateAutomation.md): PATCH /api/automations/{id}
- [Change a webhook's URL, events, description or enabled flag (staff)](https://headless-lms.dev/docs/api/automations/updateWebhook.md): PATCH /api/automations/webhooks/{id}
- [Accept a message request](https://headless-lms.dev/docs/api/chats/acceptChat.md): POST /api/member/chats/{chatId}/acceptance
- [Add a person to a group chat you are in](https://headless-lms.dev/docs/api/chats/addChatParticipant.md): POST /api/member/chats/{chatId}/participants
- [Block a person in a community](https://headless-lms.dev/docs/api/chats/blockMember.md): PUT /api/member/communities/{communityId}/blocks/{orgUserId}
- [Withdraw your reaction from a message](https://headless-lms.dev/docs/api/chats/clearMessageReaction.md): DELETE /api/member/messages/{messageId}/reaction
- [Delete your message, or one in a community you moderate](https://headless-lms.dev/docs/api/chats/deleteChatMessage.md): DELETE /api/member/messages/{messageId}
- [Edit your own message](https://headless-lms.dev/docs/api/chats/editChatMessage.md): PATCH /api/member/messages/{messageId}
- [Flag a message for the moderators](https://headless-lms.dev/docs/api/chats/flagMessage.md): POST /api/member/messages/{messageId}/flags
- [Chats](https://headless-lms.dev/docs/api/chats.md)
- [Leave a chat](https://headless-lms.dev/docs/api/chats/leaveChat.md): POST /api/member/chats/{chatId}/leave
- [Read the messages in a chat, newest first](https://headless-lms.dev/docs/api/chats/listChatMessages.md): GET /api/member/chats/{chatId}/messages
- [List your chats in a community](https://headless-lms.dev/docs/api/chats/listMemberChats.md): GET /api/member/communities/{communityId}/chats
- [Lock a chat in a community you moderate](https://headless-lms.dev/docs/api/chats/lockChat.md): POST /api/member/chats/{chatId}/lock
- [Mark a chat read up to a message](https://headless-lms.dev/docs/api/chats/markChatRead.md): POST /api/member/chats/{chatId}/read
- [Mute a chat until a time, or until unmuted](https://headless-lms.dev/docs/api/chats/muteChat.md): POST /api/member/chats/{chatId}/mute
- [Dismiss the open flags on a message in a community you moderate](https://headless-lms.dev/docs/api/chats/resolveMessageFlags.md): POST /api/member/messages/{messageId}/flags/resolution
- [Send a message](https://headless-lms.dev/docs/api/chats/sendChatMessage.md): POST /api/member/chats/{chatId}/messages
- [Set your reaction on a message](https://headless-lms.dev/docs/api/chats/setMessageReaction.md): PUT /api/member/messages/{messageId}/reaction
- [Start a direct chat, or return the one that already exists](https://headless-lms.dev/docs/api/chats/startDirectChat.md): POST /api/member/chats/direct
- [Start a group chat](https://headless-lms.dev/docs/api/chats/startGroupChat.md): POST /api/member/chats/group
- [Unblock a person in a community](https://headless-lms.dev/docs/api/chats/unblockMember.md): DELETE /api/member/communities/{communityId}/blocks/{orgUserId}
- [Unlock a chat in a community you moderate](https://headless-lms.dev/docs/api/chats/unlockChat.md): POST /api/member/chats/{chatId}/unlock
- [Unmute a chat](https://headless-lms.dev/docs/api/chats/unmuteChat.md): POST /api/member/chats/{chatId}/unmute
- [Accept your invitation to a space](https://headless-lms.dev/docs/api/communities/acceptSpaceInvite.md): POST /api/member/communities/{communityId}/spaces/{spaceId}/acceptance
- [Add a person to a space (staff)](https://headless-lms.dev/docs/api/communities/addCommunitySpaceMember.md): POST /api/communities/{communityId}/spaces/{spaceId}/members
- [Link a course, download, or community into a space (staff)](https://headless-lms.dev/docs/api/communities/addSpaceLink.md): POST /api/communities/{communityId}/spaces/{spaceId}/links
- [Add a person to a space you moderate](https://headless-lms.dev/docs/api/communities/addSpaceMember.md): POST /api/member/communities/{communityId}/spaces/{spaceId}/members
- [Publish a post that is awaiting review (staff)](https://headless-lms.dev/docs/api/communities/approveCommunityPost.md): POST /api/communities/{communityId}/posts/{postId}/approval
- [Approve a person's request to join a space (staff)](https://headless-lms.dev/docs/api/communities/approveCommunitySpaceRequest.md): POST /api/communities/{communityId}/spaces/{spaceId}/members/{orgUserId}/approval
- [Approve a person's request to join a space you moderate](https://headless-lms.dev/docs/api/communities/approveSpaceRequest.md): POST /api/member/communities/{communityId}/spaces/{spaceId}/members/{orgUserId}/approval
- [Create a community (staff)](https://headless-lms.dev/docs/api/communities/createCommunity.md): POST /api/communities
- [Create a space (staff)](https://headless-lms.dev/docs/api/communities/createSpace.md): POST /api/communities/{communityId}/spaces
- [Decline a person's request to join a space (staff)](https://headless-lms.dev/docs/api/communities/declineCommunitySpaceRequest.md): POST /api/communities/{communityId}/spaces/{spaceId}/members/{orgUserId}/decline
- [Decline a person's request to join a space you moderate](https://headless-lms.dev/docs/api/communities/declineSpaceRequest.md): POST /api/member/communities/{communityId}/spaces/{spaceId}/members/{orgUserId}/decline
- [Delete a community (staff)](https://headless-lms.dev/docs/api/communities/deleteCommunity.md): DELETE /api/communities/{communityId}
- [Delete a space (staff)](https://headless-lms.dev/docs/api/communities/deleteSpace.md): DELETE /api/communities/{communityId}/spaces/{spaceId}
- [Get a community (staff)](https://headless-lms.dev/docs/api/communities/getCommunity.md): GET /api/communities/{communityId}
- [Staff analytics for a community](https://headless-lms.dev/docs/api/communities/getCommunityAnalytics.md): GET /api/communities/{communityId}/analytics
- [Open message flags in a community (staff)](https://headless-lms.dev/docs/api/communities/getCommunityMessageQueue.md): GET /api/communities/{communityId}/message-queue
- [The moderation queue of a space (staff)](https://headless-lms.dev/docs/api/communities/getCommunitySpaceQueue.md): GET /api/communities/{communityId}/spaces/{spaceId}/queue
- [People in a community](https://headless-lms.dev/docs/api/communities/getMemberCommunityDirectory.md): GET /api/member/communities/{communityId}/directory
- [The spaces a member can see in a community](https://headless-lms.dev/docs/api/communities/getMemberCommunityHome.md): GET /api/member/communities/{communityId}/home
- [One space as a member sees it](https://headless-lms.dev/docs/api/communities/getMemberSpace.md): GET /api/member/communities/{communityId}/spaces/{spaceId}
- [Get a space (staff)](https://headless-lms.dev/docs/api/communities/getSpace.md): GET /api/communities/{communityId}/spaces/{spaceId}
- [Communities](https://headless-lms.dev/docs/api/communities.md)
- [Invite a person into a space (staff)](https://headless-lms.dev/docs/api/communities/inviteCommunitySpaceMember.md): POST /api/communities/{communityId}/spaces/{spaceId}/invites
- [Invite a person into a space you moderate](https://headless-lms.dev/docs/api/communities/inviteSpaceMember.md): POST /api/member/communities/{communityId}/spaces/{spaceId}/invites
- [Leave a space](https://headless-lms.dev/docs/api/communities/leaveSpace.md): POST /api/member/communities/{communityId}/spaces/{spaceId}/departure
- [List communities (staff)](https://headless-lms.dev/docs/api/communities/listCommunities.md): GET /api/communities
- [List the people who hold a community (staff)](https://headless-lms.dev/docs/api/communities/listCommunityMembers.md): GET /api/communities/{communityId}/members
- [List the members, requests and invitations of a space (staff)](https://headless-lms.dev/docs/api/communities/listCommunitySpaceMembers.md): GET /api/communities/{communityId}/spaces/{spaceId}/members
- [List the spaces in a community (staff)](https://headless-lms.dev/docs/api/communities/listCommunitySpaces.md): GET /api/communities/{communityId}/spaces
- [List the members of a space](https://headless-lms.dev/docs/api/communities/listSpaceMembers.md): GET /api/member/communities/{communityId}/spaces/{spaceId}/members
- [Lock a chat (staff)](https://headless-lms.dev/docs/api/communities/lockCommunityChat.md): POST /api/communities/{communityId}/chats/{chatId}/lock
- [Change direct-message settings for a community (staff)](https://headless-lms.dev/docs/api/communities/patchCommunityDmSettings.md): PATCH /api/communities/{communityId}/settings
- [Publish a community (staff)](https://headless-lms.dev/docs/api/communities/publishCommunity.md): POST /api/communities/{communityId}/publish
- [Refuse your invitation to a space](https://headless-lms.dev/docs/api/communities/refuseSpaceInvite.md): POST /api/member/communities/{communityId}/spaces/{spaceId}/refusal
- [Remove a comment on a post (staff)](https://headless-lms.dev/docs/api/communities/removeCommunityComment.md): POST /api/communities/{communityId}/comments/{commentId}/removal
- [Remove a post (staff)](https://headless-lms.dev/docs/api/communities/removeCommunityPost.md): POST /api/communities/{communityId}/posts/{postId}/removal
- [Remove a person from a space (staff)](https://headless-lms.dev/docs/api/communities/removeCommunitySpaceMember.md): POST /api/communities/{communityId}/spaces/{spaceId}/members/{orgUserId}/removal
- [Remove a link from a space (staff)](https://headless-lms.dev/docs/api/communities/removeSpaceLink.md): DELETE /api/communities/{communityId}/spaces/{spaceId}/links/{linkId}
- [Remove a person from a space you moderate](https://headless-lms.dev/docs/api/communities/removeSpaceMember.md): POST /api/member/communities/{communityId}/spaces/{spaceId}/members/{orgUserId}/removal
- [Reorder the links in a space (staff)](https://headless-lms.dev/docs/api/communities/reorderSpaceLinks.md): PUT /api/communities/{communityId}/spaces/{spaceId}/links/order
- [Reorder the spaces in a community (staff)](https://headless-lms.dev/docs/api/communities/reorderSpaces.md): PUT /api/communities/{communityId}/spaces/order
- [Ask to join a space](https://headless-lms.dev/docs/api/communities/requestSpaceMembership.md): POST /api/member/communities/{communityId}/spaces/{spaceId}/requests
- [Dismiss the open flags on a comment (staff)](https://headless-lms.dev/docs/api/communities/resolveCommunityCommentFlags.md): POST /api/communities/{communityId}/comments/{commentId}/flags/resolution
- [Dismiss the open flags on a message (staff)](https://headless-lms.dev/docs/api/communities/resolveCommunityMessageFlags.md): POST /api/communities/{communityId}/messages/{messageId}/flags/resolution
- [Dismiss the open flags on a post (staff)](https://headless-lms.dev/docs/api/communities/resolveCommunityPostFlags.md): POST /api/communities/{communityId}/posts/{postId}/flags/resolution
- [Restore a removed comment on a post (staff)](https://headless-lms.dev/docs/api/communities/restoreCommunityComment.md): POST /api/communities/{communityId}/comments/{commentId}/restoration
- [Restore a removed post (staff)](https://headless-lms.dev/docs/api/communities/restoreCommunityPost.md): POST /api/communities/{communityId}/posts/{postId}/restoration
- [Replace the topics on a space (staff)](https://headless-lms.dev/docs/api/communities/setSpaceTopics.md): PUT /api/communities/{communityId}/spaces/{spaceId}/topics
- [Unlock a chat (staff)](https://headless-lms.dev/docs/api/communities/unlockCommunityChat.md): POST /api/communities/{communityId}/chats/{chatId}/unlock
- [Unpublish a community (staff)](https://headless-lms.dev/docs/api/communities/unpublishCommunity.md): POST /api/communities/{communityId}/unpublish
- [Update a community (staff)](https://headless-lms.dev/docs/api/communities/updateCommunity.md): PATCH /api/communities/{communityId}
- [Update a space (staff)](https://headless-lms.dev/docs/api/communities/updateSpace.md): PATCH /api/communities/{communityId}/spaces/{spaceId}
- [Add content to a bundle (staff)](https://headless-lms.dev/docs/api/content/addBundleItem.md): POST /api/bundles/{bundleId}/items
- [Add a library file to a download (staff)](https://headless-lms.dev/docs/api/content/addDownloadAsset.md): POST /api/downloads/{downloadId}/assets
- [Add an activity (staff)](https://headless-lms.dev/docs/api/content/createActivity.md): POST /api/courses/{courseId}/modules/{moduleId}/activities
- [Create a bundle, optionally with initial content (staff)](https://headless-lms.dev/docs/api/content/createBundle.md): POST /api/bundles
- [Create a course (staff)](https://headless-lms.dev/docs/api/content/createCourse.md): POST /api/courses
- [Create a download (staff)](https://headless-lms.dev/docs/api/content/createDownload.md): POST /api/downloads
- [Add a module (staff)](https://headless-lms.dev/docs/api/content/createModule.md): POST /api/courses/{courseId}/modules
- [Delete an activity (staff)](https://headless-lms.dev/docs/api/content/deleteActivity.md): DELETE /api/courses/{courseId}/modules/{moduleId}/activities/{activityId}
- [Delete a bundle (staff)](https://headless-lms.dev/docs/api/content/deleteBundle.md): DELETE /api/bundles/{bundleId}
- [Delete a course (staff)](https://headless-lms.dev/docs/api/content/deleteCourse.md): DELETE /api/courses/{id}
- [Delete a download (staff)](https://headless-lms.dev/docs/api/content/deleteDownload.md): DELETE /api/downloads/{downloadId}
- [Delete a module (staff)](https://headless-lms.dev/docs/api/content/deleteModule.md): DELETE /api/courses/{courseId}/modules/{moduleId}
- [Get a bundle (staff)](https://headless-lms.dev/docs/api/content/getBundle.md): GET /api/bundles/{bundleId}
- [Get a course (staff)](https://headless-lms.dev/docs/api/content/getCourse.md): GET /api/courses/{id}
- [Get a download (staff)](https://headless-lms.dev/docs/api/content/getDownload.md): GET /api/downloads/{downloadId}
- [Get one course you can open](https://headless-lms.dev/docs/api/content/getMemberCourse.md): GET /api/member/courses/{courseId}
- [One download you can open, with its files in order](https://headless-lms.dev/docs/api/content/getMemberDownload.md): GET /api/member/downloads/{downloadId}
- [Content](https://headless-lms.dev/docs/api/content.md)
- [List a course's activities (staff)](https://headless-lms.dev/docs/api/content/listActivities.md): GET /api/courses/{courseId}/activities
- [List the library files each activity of a course uses (staff)](https://headless-lms.dev/docs/api/content/listActivityAssets.md): GET /api/courses/{courseId}/activity-assets
- [List a bundle's content (staff)](https://headless-lms.dev/docs/api/content/listBundleItems.md): GET /api/bundles/{bundleId}/items
- [List bundles (staff)](https://headless-lms.dev/docs/api/content/listBundles.md): GET /api/bundles
- [List courses (staff)](https://headless-lms.dev/docs/api/content/listCourses.md): GET /api/courses
- [List a download's files in order (staff)](https://headless-lms.dev/docs/api/content/listDownloadAssets.md): GET /api/downloads/{downloadId}/assets
- [List downloads (staff)](https://headless-lms.dev/docs/api/content/listDownloads.md): GET /api/downloads
- [List the published activities of a course you can open](https://headless-lms.dev/docs/api/content/listMemberActivities.md): GET /api/member/courses/{courseId}/activities
- [List the courses you can open](https://headless-lms.dev/docs/api/content/listMemberCourses.md): GET /api/member/courses
- [List the downloads you can open](https://headless-lms.dev/docs/api/content/listMemberDownloads.md): GET /api/member/downloads
- [List the modules and activities of a course you can open](https://headless-lms.dev/docs/api/content/listMemberModules.md): GET /api/member/courses/{courseId}/modules
- [List a course's modules (staff)](https://headless-lms.dev/docs/api/content/listModules.md): GET /api/courses/{courseId}/modules
- [Remove content from a bundle (staff)](https://headless-lms.dev/docs/api/content/removeBundleItem.md): DELETE /api/bundles/{bundleId}/items/{contentId}
- [Remove a file from a download (staff)](https://headless-lms.dev/docs/api/content/removeDownloadAsset.md): DELETE /api/downloads/{downloadId}/assets/{assetId}
- [Set a file's display name within a download (staff)](https://headless-lms.dev/docs/api/content/renameDownloadAsset.md): PATCH /api/downloads/{downloadId}/assets/{assetId}
- [Reorder the activities in a module (staff)](https://headless-lms.dev/docs/api/content/reorderActivities.md): POST /api/courses/{courseId}/modules/{moduleId}/activities/reorder
- [Reorder a download's files (staff)](https://headless-lms.dev/docs/api/content/reorderDownloadAssets.md): PUT /api/downloads/{downloadId}/assets/order
- [Reorder a course's modules (staff)](https://headless-lms.dev/docs/api/content/reorderModules.md): POST /api/courses/{courseId}/modules/reorder
- [Update an activity (staff)](https://headless-lms.dev/docs/api/content/updateActivity.md): PATCH /api/courses/{courseId}/modules/{moduleId}/activities/{activityId}
- [Rename a bundle (staff)](https://headless-lms.dev/docs/api/content/updateBundle.md): PATCH /api/bundles/{bundleId}
- [Update a course (staff)](https://headless-lms.dev/docs/api/content/updateCourse.md): PATCH /api/courses/{id}
- [Update a course's settings (staff)](https://headless-lms.dev/docs/api/content/updateCourseSettings.md): PATCH /api/courses/{id}/settings
- [Update a download (staff)](https://headless-lms.dev/docs/api/content/updateDownload.md): PATCH /api/downloads/{downloadId}
- [Rename a module (staff)](https://headless-lms.dev/docs/api/content/updateModule.md): PATCH /api/courses/{courseId}/modules/{moduleId}
- [Withdraw your reaction from a comment](https://headless-lms.dev/docs/api/discussion/clearCommentReaction.md): DELETE /api/member/comments/{commentId}/reaction
- [Delete your comment, or one you moderate](https://headless-lms.dev/docs/api/discussion/deleteComment.md): DELETE /api/member/comments/{commentId}
- [Dismiss every open report on a course comment (staff)](https://headless-lms.dev/docs/api/discussion/dismissCommentReports.md): DELETE /api/comments/{commentId}/reports
- [Revise your own comment](https://headless-lms.dev/docs/api/discussion/editComment.md): PATCH /api/member/comments/{commentId}
- [Discussion](https://headless-lms.dev/docs/api/discussion.md)
- [Read an activity's comments](https://headless-lms.dev/docs/api/discussion/listActivityComments.md): GET /api/member/activities/{activityId}/comments
- [List course comments for moderation (staff)](https://headless-lms.dev/docs/api/discussion/listComments.md): GET /api/comments
- [Remove a course comment (staff)](https://headless-lms.dev/docs/api/discussion/moderateRemoveComment.md): DELETE /api/comments/{commentId}
- [Post a comment or reply on an activity](https://headless-lms.dev/docs/api/discussion/postComment.md): POST /api/member/activities/{activityId}/comments
- [Publish a course comment (staff)](https://headless-lms.dev/docs/api/discussion/publishComment.md): PATCH /api/comments/{commentId}
- [Reply to a course comment from the moderation queue (staff)](https://headless-lms.dev/docs/api/discussion/replyToComment.md): POST /api/comments/{commentId}/replies
- [Flag a comment for the moderators](https://headless-lms.dev/docs/api/discussion/reportComment.md): POST /api/member/comments/{commentId}/reports
- [Dismiss the open flags on a comment in a space you moderate](https://headless-lms.dev/docs/api/discussion/resolveCommentFlags.md): POST /api/member/comments/{commentId}/flags/resolution
- [Set your reaction on a comment](https://headless-lms.dev/docs/api/discussion/setCommentReaction.md): PUT /api/member/comments/{commentId}/reaction
- [Grant a person access to content or a bundle (staff)](https://headless-lms.dev/docs/api/entitlements/grantEntitlement.md): POST /api/entitlements
- [Entitlements](https://headless-lms.dev/docs/api/entitlements.md)
- [List entitlements (staff)](https://headless-lms.dev/docs/api/entitlements/listEntitlements.md): GET /api/entitlements
- [Revoke or reinstate an entitlement (staff)](https://headless-lms.dev/docs/api/entitlements/setEntitlementStatus.md): PATCH /api/entitlements/{id}
- [Redirect to a file used in a lesson](https://headless-lms.dev/docs/api/files/getActivityFile.md): GET /api/member/activities/{activityId}/assets/{assetId}
- [Redirect to a community's thumbnail](https://headless-lms.dev/docs/api/files/getCommunityThumbnail.md): GET /api/member/communities/{communityId}/thumbnail
- [Redirect to a course's thumbnail](https://headless-lms.dev/docs/api/files/getCourseThumbnail.md): GET /api/member/courses/{courseId}/thumbnail
- [Redirect to a file in a download, saved under its display name](https://headless-lms.dev/docs/api/files/getDownloadFile.md): GET /api/member/downloads/{downloadId}/assets/{assetId}
- [Redirect to a download's thumbnail](https://headless-lms.dev/docs/api/files/getDownloadThumbnail.md): GET /api/member/downloads/{downloadId}/thumbnail
- [Redirect to an image you uploaded](https://headless-lms.dev/docs/api/files/getMemberUploadFile.md): GET /api/member/uploads/{id}/file
- [Redirect to an image attached to a chat message](https://headless-lms.dev/docs/api/files/getMessageAttachment.md): GET /api/member/chats/{chatId}/messages/{messageId}/attachments/{assetId}
- [Redirect to an org user's profile photo](https://headless-lms.dev/docs/api/files/getPersonImage.md): GET /api/member/people/{orgUserId}/image
- [Redirect to a post's cover image](https://headless-lms.dev/docs/api/files/getPostCover.md): GET /api/member/posts/{postId}/cover
- [Files](https://headless-lms.dev/docs/api/files.md)
- [Change a connection's configuration or active flag (staff)](https://headless-lms.dev/docs/api/integrations/configureConnection.md): PATCH /api/integrations/{id}
- [Connect an integration (staff)](https://headless-lms.dev/docs/api/integrations/connectIntegration.md): POST /api/integrations
- [Disconnect an integration (staff)](https://headless-lms.dev/docs/api/integrations/disconnectIntegration.md): DELETE /api/integrations/{id}
- [Get a connection (staff)](https://headless-lms.dev/docs/api/integrations/getConnection.md): GET /api/integrations/{id}
- [Integrations](https://headless-lms.dev/docs/api/integrations.md)
- [Invoke one of a connection's actions (staff)](https://headless-lms.dev/docs/api/integrations/invokeConnectionAction.md): POST /api/integrations/{id}/actions/{actionId}
- [List the integrations this deployment supports (staff)](https://headless-lms.dev/docs/api/integrations/listAvailableIntegrations.md): GET /api/integrations/available
- [List the organization's integration connections (staff)](https://headless-lms.dev/docs/api/integrations/listConnections.md): GET /api/integrations
- [Replace a connection's secrets (staff)](https://headless-lms.dev/docs/api/integrations/reconnectIntegration.md): POST /api/integrations/{id}/reconnect
- [Read how you are told about each kind of notification](https://headless-lms.dev/docs/api/notifications/getMemberNotificationPreferences.md): GET /api/member/notification-preferences
- [Notifications](https://headless-lms.dev/docs/api/notifications.md)
- [List your notifications, newest first, with your unread count](https://headless-lms.dev/docs/api/notifications/listMemberNotifications.md): GET /api/member/notifications
- [Mark all your notifications read](https://headless-lms.dev/docs/api/notifications/markAllMemberNotificationsRead.md): POST /api/member/notifications/read
- [Mark one of your notifications read](https://headless-lms.dev/docs/api/notifications/markMemberNotificationRead.md): POST /api/member/notifications/{notificationId}/read
- [Set how you are told about the given kinds of notification](https://headless-lms.dev/docs/api/notifications/setMemberNotificationPreferences.md): PUT /api/member/notification-preferences
- [Accept an invite with the signed-in account](https://headless-lms.dev/docs/api/organizations/acceptInvite.md): POST /api/organizations/invites/accept
- [Invite a member or student into the active organization (staff)](https://headless-lms.dev/docs/api/organizations/createInvite.md): POST /api/organizations/invites
- [Create an organization and make it active](https://headless-lms.dev/docs/api/organizations/createOrganization.md): POST /api/organizations
- [Delete a student (staff)](https://headless-lms.dev/docs/api/organizations/deleteStudent.md): DELETE /api/students/{id}
- [Read an invite by its token](https://headless-lms.dev/docs/api/organizations/getInvite.md): GET /api/organizations/invites/{token}
- [Get the portal org's public identity (branding)](https://headless-lms.dev/docs/api/organizations/getMemberOrg.md): GET /api/member/org
- [Get the caller's identity within the session's org](https://headless-lms.dev/docs/api/organizations/getMemberViewer.md): GET /api/member/viewer
- [Get a student (staff)](https://headless-lms.dev/docs/api/organizations/getStudent.md): GET /api/students/{id}
- [Organizations](https://headless-lms.dev/docs/api/organizations.md)
- [List the organization's team members (staff)](https://headless-lms.dev/docs/api/organizations/listMembers.md): GET /api/organizations/members
- [List students (staff)](https://headless-lms.dev/docs/api/organizations/listStudents.md): GET /api/students
- [Remove an organization member (staff)](https://headless-lms.dev/docs/api/organizations/removeMember.md): DELETE /api/organizations/members/{id}
- [Re-send a pending student's invite email (staff)](https://headless-lms.dev/docs/api/organizations/resendStudentInvite.md): POST /api/students/{id}/invite/resend
- [Change a member's role (staff)](https://headless-lms.dev/docs/api/organizations/updateMemberRole.md): PATCH /api/organizations/members/{id}/role
- [Update the active organization (staff)](https://headless-lms.dev/docs/api/organizations/updateOrganization.md): PATCH /api/organizations
- [Read your profile](https://headless-lms.dev/docs/api/profile/getMemberProfile.md): GET /api/member/profile
- [Profile](https://headless-lms.dev/docs/api/profile.md)
- [Update your profile](https://headless-lms.dev/docs/api/profile/updateMemberProfile.md): PATCH /api/member/profile
- [Publish a post that awaits review in a space you moderate](https://headless-lms.dev/docs/api/posts/approvePost.md): POST /api/member/posts/{postId}/approval
- [Bookmark a post](https://headless-lms.dev/docs/api/posts/bookmarkPost.md): POST /api/member/posts/{postId}/bookmark
- [Withdraw your reaction from a post](https://headless-lms.dev/docs/api/posts/clearPostReaction.md): DELETE /api/member/posts/{postId}/reaction
- [Close comments on a post in a space you moderate](https://headless-lms.dev/docs/api/posts/closePostComments.md): POST /api/member/posts/{postId}/comments/close
- [Create a post](https://headless-lms.dev/docs/api/posts/createPost.md): POST /api/member/communities/{communityId}/spaces/{spaceId}/posts
- [Comment on a post](https://headless-lms.dev/docs/api/posts/createPostComment.md): POST /api/member/posts/{postId}/comments
- [Flag a post for the moderators](https://headless-lms.dev/docs/api/posts/flagPost.md): POST /api/member/posts/{postId}/flags
- [Follow a post](https://headless-lms.dev/docs/api/posts/followPost.md): POST /api/member/posts/{postId}/follow
- [Published posts across the spaces you can open](https://headless-lms.dev/docs/api/posts/getMemberFeed.md): GET /api/member/communities/{communityId}/feed
- [Read a post](https://headless-lms.dev/docs/api/posts/getPost.md): GET /api/member/posts/{postId}
- [Published posts in a space](https://headless-lms.dev/docs/api/posts/getSpaceFeed.md): GET /api/member/communities/{communityId}/spaces/{spaceId}/feed
- [The moderation queue of a space you moderate](https://headless-lms.dev/docs/api/posts/getSpaceQueue.md): GET /api/member/communities/{communityId}/spaces/{spaceId}/queue
- [Posts](https://headless-lms.dev/docs/api/posts.md)
- [The posts you bookmarked in a community, newest bookmark first](https://headless-lms.dev/docs/api/posts/listBookmarkedPosts.md): GET /api/member/communities/{communityId}/bookmarks
- [Your own posts in a community, newest first](https://headless-lms.dev/docs/api/posts/listOwnPosts.md): GET /api/member/communities/{communityId}/own-posts
- [Read a post's comments](https://headless-lms.dev/docs/api/posts/listPostComments.md): GET /api/member/posts/{postId}/comments
- [Open comments on a post in a space you moderate](https://headless-lms.dev/docs/api/posts/openPostComments.md): POST /api/member/posts/{postId}/comments/open
- [Pin a post in a space you moderate](https://headless-lms.dev/docs/api/posts/pinPost.md): POST /api/member/posts/{postId}/pin
- [Remove your post, or one in a space you moderate](https://headless-lms.dev/docs/api/posts/removePost.md): POST /api/member/posts/{postId}/removal
- [Dismiss the open flags on a post in a space you moderate](https://headless-lms.dev/docs/api/posts/resolvePostFlags.md): POST /api/member/posts/{postId}/flags/resolution
- [Restore a removed post in a space you moderate](https://headless-lms.dev/docs/api/posts/restorePost.md): POST /api/member/posts/{postId}/restoration
- [Schedule your post](https://headless-lms.dev/docs/api/posts/schedulePost.md): POST /api/member/posts/{postId}/schedule
- [Set your reaction on a post](https://headless-lms.dev/docs/api/posts/setPostReaction.md): PUT /api/member/posts/{postId}/reaction
- [Turn reactions on or off for a post in a space you moderate](https://headless-lms.dev/docs/api/posts/setPostReactionPolicy.md): PUT /api/member/posts/{postId}/reactions
- [Submit your draft or scheduled post](https://headless-lms.dev/docs/api/posts/submitPost.md): POST /api/member/posts/{postId}/submission
- [Remove a bookmark](https://headless-lms.dev/docs/api/posts/unbookmarkPost.md): DELETE /api/member/posts/{postId}/bookmark
- [Stop following a post](https://headless-lms.dev/docs/api/posts/unfollowPost.md): DELETE /api/member/posts/{postId}/follow
- [Unpin a post in a space you moderate](https://headless-lms.dev/docs/api/posts/unpinPost.md): POST /api/member/posts/{postId}/unpin
- [Edit your own post](https://headless-lms.dev/docs/api/posts/updatePost.md): PATCH /api/member/posts/{postId}
- [Your progress in one course](https://headless-lms.dev/docs/api/progress/getMemberCourseProgress.md): GET /api/member/courses/{courseId}/progress
- [Progress](https://headless-lms.dev/docs/api/progress.md)
- [Report usage on an activity; the progress service decides completion](https://headless-lms.dev/docs/api/progress/reportProgress.md): POST /api/member/progress
- [Completion and engagement stats for a course (staff)](https://headless-lms.dev/docs/api/reporting/getCourseAnalytics.md): GET /api/courses/{id}/analytics
- [Enrollments granted per day for a course over a trailing window (staff)](https://headless-lms.dev/docs/api/reporting/getCourseEnrollmentSeries.md): GET /api/courses/{id}/analytics/enrollments
- [Enrollments granted per day over a trailing window (staff)](https://headless-lms.dev/docs/api/reporting/getEnrollmentSeries.md): GET /api/overview/enrollments
- [Back-office overview stats (staff)](https://headless-lms.dev/docs/api/reporting/getOverview.md): GET /api/overview
- [A student's learner record (staff)](https://headless-lms.dev/docs/api/reporting/getStudentAnalytics.md): GET /api/students/{id}/analytics
- [Reporting](https://headless-lms.dev/docs/api/reporting.md)

## Blog

- [Building an LMS from scratch in 2026](https://headless-lms.dev/blog/building-an-lms-from-scratch-in-2026.md): Unpacking the business case for a headless LMS using domain-driven design — the domains, their boundaries, and how they were discovered and documented.

## Changelog

- [Changelog](https://headless-lms.dev/changelog.md): New features, improvements, and fixes in Headless LMS.

## Optional

- [OpenAPI specification](https://headless-lms.dev/openapi.json): the complete machine-readable API contract.
- [Full documentation as one file](https://headless-lms.dev/llms-full.txt): every page inlined.
- [Source repository](https://github.com/mdwt/headless-lms): issues, releases and the reference implementation.
