Download OpenAPI specification:
Download OpenAPI specification:
Welcome to the HumHub account API reference, v2 — the authenticated user's own data.
+These endpoints are shipped by HumHub core (1.19+), not by the REST API module — the
+module only contributes its authentication methods to them and documents them here until
+core ships its own API documentation. See the core docs,
+docs/develop/concept-api.md.
Conventions of this API generation, differing from /api/v1: camelCase field names,
+ISO-8601 timestamps with offset, and plain HTTP status codes instead of a
+{code, message} envelope.
Requests may authenticate with any token method the REST API module offers. Core's own +browser session is accepted too for these endpoints, which is what the platform's Vue UI +uses.
+Clients need this to reproduce the platform's blocked-author masking: payloads are +always unmasked, since masking is a display concern rather than an access boundary. +Empty when user blocking is disabled by an administrator.
+{- "results": [
- 0
]
}Download OpenAPI specification:
Welcome to the HumHub comment API reference, v2.
+These endpoints are shipped by HumHub core (1.19+), not by the REST API module — the
+module only contributes its authentication methods to them and documents them here until
+core ships its own API documentation. See the core docs,
+docs/develop/concept-api.md.
Conventions of this API generation, differing from /api/v1:
2026-08-22T08:00:00+00:00).{code, message}
+success/failure envelope. Validation failures answer 422 with
+{"errors": {"<field>": ["<message>"]}}, a successful delete answers 204.GET /comment/{id}/permissions
+for edit/delete, GET /like/states for like state.Requests may authenticate with any token method the REST API module offers. Core's own +browser session is accepted too for these endpoints, which is what the platform's Vue UI +uses; state-changing session requests additionally require the CSRF token.
+A window of the content's root comments. Without any cursor the newest comments are
+returned; commentId + direction pages from a comment ("show previous/next N
+comments"), commentId alone focuses the window around a permalinked comment.
total counts all comments of the content including replies (what a comment
+badge shows), while results, prevCount and nextCount describe the root level
+only. rootTotal is the root-only total a root list needs to compute its own
+remaining count.
Readable by guests for guest-visible content while guest access is enabled
+platform-wide, unless the comment module hides comments from guests
+(guestHideComments).
| id required | integer The primary key of the content + |
| commentId | integer Cursor comment, or the anchor to focus the window around when no direction is given + |
| direction | string Enum: "previous" "next" Paging direction relative to |
| pageSize | integer Comments per page while paging with |
| limit | integer Size of an initial (cursor-less) window. Clamped to the comment module's configured +block load size. + |
{- "results": [
- {
- "id": 0,
- "message": "string",
- "messageRenderOptions": { },
- "contentId": 0,
- "parentCommentId": 0,
- "recordId": 0,
- "createdBy": {
- "id": 0,
- "guid": "string",
- "displayName": "string",
- "url": "string",
- "imageUrl": "string",
- "contentContainerId": 0,
- "online": true
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "url": "string",
- "files": [
- {
- "id": 0,
- "guid": "string",
- "mimeType": "string",
- "size": 0,
- "fileName": "string",
- "url": "string",
- "previewUrl": "string"
}
], - "childCount": 0,
- "replies": {
- "total": 0,
- "hasMore": true,
- "items": [
- { }
]
}, - "extensions": { }
}
], - "total": 0,
- "rootTotal": 0,
- "prevCount": 0,
- "nextCount": 0
}The same window semantics as the content window, for the replies of one root comment.
+total/rootTotal still describe the whole content, so a client can keep its badge
+and its root list consistent while paging replies.
| id required | integer The primary key of the root comment + |
| commentId | integer Cursor comment, or the anchor to focus the window around when no direction is given + |
| direction | string Enum: "previous" "next" Paging direction relative to |
| pageSize | integer Comments per page while paging with |
| limit | integer Size of an initial (cursor-less) window. Clamped to the comment module's configured +block load size. + |
{- "results": [
- {
- "id": 0,
- "message": "string",
- "messageRenderOptions": { },
- "contentId": 0,
- "parentCommentId": 0,
- "recordId": 0,
- "createdBy": {
- "id": 0,
- "guid": "string",
- "displayName": "string",
- "url": "string",
- "imageUrl": "string",
- "contentContainerId": 0,
- "online": true
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "url": "string",
- "files": [
- {
- "id": 0,
- "guid": "string",
- "mimeType": "string",
- "size": 0,
- "fileName": "string",
- "url": "string",
- "previewUrl": "string"
}
], - "childCount": 0,
- "replies": {
- "total": 0,
- "hasMore": true,
- "items": [
- { }
]
}, - "extensions": { }
}
], - "total": 0,
- "rootTotal": 0,
- "prevCount": 0,
- "nextCount": 0
}Creates a comment on the given content. Replies pass their parent through
+parentCommentId; comments nest at most one level, a deeper reply answers 422.
| contentId required | integer The primary key of the content + |
| parentCommentId | integer The primary key of the root comment this is a reply to + |
| message required | string Markdown message + |
| fileList | Array of strings Guids of already uploaded files to attach + |
{- "message": "string",
- "fileList": [
- "string"
]
}{- "id": 0,
- "message": "string",
- "messageRenderOptions": { },
- "contentId": 0,
- "parentCommentId": 0,
- "recordId": 0,
- "createdBy": {
- "id": 0,
- "guid": "string",
- "displayName": "string",
- "url": "string",
- "imageUrl": "string",
- "contentContainerId": 0,
- "online": true
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "url": "string",
- "files": [
- {
- "id": 0,
- "guid": "string",
- "mimeType": "string",
- "size": 0,
- "fileName": "string",
- "url": "string",
- "previewUrl": "string"
}
], - "childCount": 0,
- "replies": {
- "total": 0,
- "hasMore": true,
- "items": [
- { }
]
}, - "extensions": { }
}Deliberately not part of the comment shape: these are the only caller-dependent +values a comment needs, and only when its context menu is opened — keeping them out +is what makes the comment payload identical for every reader (and cacheable). The +same checks the update and delete endpoints enforce.
+Authenticated callers only: a guest has no permissions to report.
+| id required | integer The primary key of the comment + |
{- "canEdit": true,
- "canDelete": true
}A root comment carries a preview of its newest replies under replies; a reply has
+replies: null. Readable by guests under the same conditions as the windows.
| id required | integer The primary key of the comment + |
{- "id": 0,
- "message": "string",
- "messageRenderOptions": { },
- "contentId": 0,
- "parentCommentId": 0,
- "recordId": 0,
- "createdBy": {
- "id": 0,
- "guid": "string",
- "displayName": "string",
- "url": "string",
- "imageUrl": "string",
- "contentContainerId": 0,
- "online": true
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "url": "string",
- "files": [
- {
- "id": 0,
- "guid": "string",
- "mimeType": "string",
- "size": 0,
- "fileName": "string",
- "url": "string",
- "previewUrl": "string"
}
], - "childCount": 0,
- "replies": {
- "total": 0,
- "hasMore": true,
- "items": [
- { }
]
}, - "extensions": { }
}| id required | integer The primary key of the comment + |
| message required | string Markdown message + |
| fileList | Array of strings Guids of already uploaded files to attach + |
{- "message": "string",
- "fileList": [
- "string"
]
}{- "id": 0,
- "message": "string",
- "messageRenderOptions": { },
- "contentId": 0,
- "parentCommentId": 0,
- "recordId": 0,
- "createdBy": {
- "id": 0,
- "guid": "string",
- "displayName": "string",
- "url": "string",
- "imageUrl": "string",
- "contentContainerId": 0,
- "online": true
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "url": "string",
- "files": [
- {
- "id": 0,
- "guid": "string",
- "mimeType": "string",
- "size": 0,
- "fileName": "string",
- "url": "string",
- "previewUrl": "string"
}
], - "childCount": 0,
- "replies": {
- "total": 0,
- "hasMore": true,
- "items": [
- { }
]
}, - "extensions": { }
}Deletes the comment. The optional body parameters trigger the moderation flow: with
+notify, the author receives a notification carrying a preview of the removed text
+and the given message as the reason.
| id required | integer The primary key of the comment + |
| notify | boolean Notify the author about the removal + |
| message | string Reason shown to the author + |
{- "notify": true,
- "message": "string"
}Download OpenAPI specification:
Welcome to the HumHub like API reference, v2.
+These endpoints are shipped by HumHub core (1.19+), not by the REST API module — the
+module only contributes its authentication methods to them and documents them here until
+core ships its own API documentation. See the core docs,
+docs/develop/concept-api.md.
Conventions of this API generation, differing from /api/v1: camelCase field names,
+ISO-8601 timestamps with offset, plain HTTP status codes instead of a
+{code, message} envelope, and {results, total, page, pageSize, pages} for paginated
+lists.
Every likeable record is addressed either by its platform-wide recordId (what shapes
+carrying likes expose) or by model + pk.
Requests may authenticate with any token method the REST API module offers. Core's own +browser session is accepted too for these endpoints, which is what the platform's Vue UI +uses; state-changing session requests additionally require the CSRF token.
+The caller-context like state. Readable by guests for content they can see, with
+liked and canLike always false.
| recordId | integer Platform-wide record id — the addressing every shape that carries likes exposes as
+ |
| model | string Class name of the record, when addressing it by model and primary key + |
| pk | integer Primary key of the record, when addressing it by model and primary key + |
{- "total": 0,
- "liked": true,
- "canLike": true
}The caller's like state for up to 100 records in one request, keyed by record id —
+what a client asks for after receiving a page of records whose payloads deliberately
+carry no like state (see the LikeState schema).
Records the caller may not see, and ids that resolve to nothing, are absent from
+the map rather than failing the request. Readable by guests, with liked and
+canLike always false.
| recordIds | string Comma-separated (or repeated |
{- "results": {
- "14": {
- "total": 2,
- "liked": true,
- "canLike": true
}
}
}| recordId | integer Platform-wide record id — the addressing every shape that carries likes exposes as
+ |
| model | string Class name of the record, when addressing it by model and primary key + |
| pk | integer Primary key of the record, when addressing it by model and primary key + |
{- "total": 0,
- "liked": true,
- "canLike": true
}Idempotent — unliking something that was never liked is a success.
+| recordId | integer Platform-wide record id — the addressing every shape that carries likes exposes as
+ |
| model | string Class name of the record, when addressing it by model and primary key + |
| pk | integer Primary key of the record, when addressing it by model and primary key + |
{- "total": 0,
- "liked": true,
- "canLike": true
}Newest first. Readable by guests for content they can see.
+| recordId | integer Platform-wide record id — the addressing every shape that carries likes exposes as
+ |
| model | string Class name of the record, when addressing it by model and primary key + |
| pk | integer Primary key of the record, when addressing it by model and primary key + |
| page | integer Page number, starting at 1 + |
| pageSize | integer Records per page (default 25, maximum 100) + |
{- "results": [
- {
- "id": 0,
- "guid": "string",
- "displayName": "string",
- "url": "string",
- "imageUrl": "string",
- "contentContainerId": 0,
- "online": true
}
], - "total": 0,
- "page": 0,
- "pageSize": 0,
- "pages": 0
}Download OpenAPI specification:
Welcome to the HumHub account API reference, v2 — the authenticated user's own data.
-These endpoints are shipped by HumHub core (1.19+), not by the REST API module — the
-module only contributes its authentication methods to them and documents them here until
-core ships its own API documentation. See the core docs,
-docs/develop/concept-api.md.
Conventions of this API generation, differing from /api/v1: camelCase field names,
-ISO-8601 timestamps with offset, and plain HTTP status codes instead of a
-{code, message} envelope.
Requests may authenticate with any token method the REST API module offers. Core's own -browser session is accepted too for these endpoints, which is what the platform's Vue UI -uses.
-Clients need this to reproduce the platform's blocked-author masking: payloads are -always unmasked, since masking is a display concern rather than an access boundary. -Empty when user blocking is disabled by an administrator.
-{- "results": [
- 0
]
}Download OpenAPI specification:
Welcome to the HumHub comment API reference, v2.
-These endpoints are shipped by HumHub core (1.19+), not by the REST API module — the
-module only contributes its authentication methods to them and documents them here until
-core ships its own API documentation. See the core docs,
-docs/develop/concept-api.md.
Conventions of this API generation, differing from /api/v1:
2026-08-22T08:00:00+00:00).{code, message}
-success/failure envelope. Validation failures answer 422 with
-{"errors": {"<field>": ["<message>"]}}, a successful delete answers 204.GET /comment/{id}/permissions
-for edit/delete, GET /like/states for like state.Requests may authenticate with any token method the REST API module offers. Core's own -browser session is accepted too for these endpoints, which is what the platform's Vue UI -uses; state-changing session requests additionally require the CSRF token.
-A window of the content's root comments. Without any cursor the newest comments are
-returned; commentId + direction pages from a comment ("show previous/next N
-comments"), commentId alone focuses the window around a permalinked comment.
total counts all comments of the content including replies (what a comment
-badge shows), while results, prevCount and nextCount describe the root level
-only. rootTotal is the root-only total a root list needs to compute its own
-remaining count.
Readable by guests for guest-visible content while guest access is enabled
-platform-wide, unless the comment module hides comments from guests
-(guestHideComments).
| id required | integer The primary key of the content - |
| commentId | integer Cursor comment, or the anchor to focus the window around when no direction is given - |
| direction | string Enum: "previous" "next" Paging direction relative to |
| pageSize | integer Comments per page while paging with |
| limit | integer Size of an initial (cursor-less) window. Clamped to the comment module's configured -block load size. - |
{- "results": [
- {
- "id": 0,
- "message": "string",
- "messageRenderOptions": { },
- "contentId": 0,
- "parentCommentId": 0,
- "recordId": 0,
- "createdBy": {
- "id": 0,
- "guid": "string",
- "displayName": "string",
- "url": "string",
- "imageUrl": "string",
- "contentContainerId": 0,
- "online": true
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "url": "string",
- "files": [
- {
- "id": 0,
- "guid": "string",
- "mimeType": "string",
- "size": 0,
- "fileName": "string",
- "url": "string",
- "previewUrl": "string"
}
], - "childCount": 0,
- "replies": {
- "total": 0,
- "hasMore": true,
- "items": [
- { }
]
}, - "extensions": { }
}
], - "total": 0,
- "rootTotal": 0,
- "prevCount": 0,
- "nextCount": 0
}The same window semantics as the content window, for the replies of one root comment.
-total/rootTotal still describe the whole content, so a client can keep its badge
-and its root list consistent while paging replies.
| id required | integer The primary key of the root comment - |
| commentId | integer Cursor comment, or the anchor to focus the window around when no direction is given - |
| direction | string Enum: "previous" "next" Paging direction relative to |
| pageSize | integer Comments per page while paging with |
| limit | integer Size of an initial (cursor-less) window. Clamped to the comment module's configured -block load size. - |
{- "results": [
- {
- "id": 0,
- "message": "string",
- "messageRenderOptions": { },
- "contentId": 0,
- "parentCommentId": 0,
- "recordId": 0,
- "createdBy": {
- "id": 0,
- "guid": "string",
- "displayName": "string",
- "url": "string",
- "imageUrl": "string",
- "contentContainerId": 0,
- "online": true
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "url": "string",
- "files": [
- {
- "id": 0,
- "guid": "string",
- "mimeType": "string",
- "size": 0,
- "fileName": "string",
- "url": "string",
- "previewUrl": "string"
}
], - "childCount": 0,
- "replies": {
- "total": 0,
- "hasMore": true,
- "items": [
- { }
]
}, - "extensions": { }
}
], - "total": 0,
- "rootTotal": 0,
- "prevCount": 0,
- "nextCount": 0
}Creates a comment on the given content. Replies pass their parent through
-parentCommentId; comments nest at most one level, a deeper reply answers 422.
| contentId required | integer The primary key of the content - |
| parentCommentId | integer The primary key of the root comment this is a reply to - |
| message required | string Markdown message - |
| fileList | Array of strings Guids of already uploaded files to attach - |
{- "message": "string",
- "fileList": [
- "string"
]
}{- "id": 0,
- "message": "string",
- "messageRenderOptions": { },
- "contentId": 0,
- "parentCommentId": 0,
- "recordId": 0,
- "createdBy": {
- "id": 0,
- "guid": "string",
- "displayName": "string",
- "url": "string",
- "imageUrl": "string",
- "contentContainerId": 0,
- "online": true
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "url": "string",
- "files": [
- {
- "id": 0,
- "guid": "string",
- "mimeType": "string",
- "size": 0,
- "fileName": "string",
- "url": "string",
- "previewUrl": "string"
}
], - "childCount": 0,
- "replies": {
- "total": 0,
- "hasMore": true,
- "items": [
- { }
]
}, - "extensions": { }
}Deliberately not part of the comment shape: these are the only caller-dependent -values a comment needs, and only when its context menu is opened — keeping them out -is what makes the comment payload identical for every reader (and cacheable). The -same checks the update and delete endpoints enforce.
-Authenticated callers only: a guest has no permissions to report.
-| id required | integer The primary key of the comment - |
{- "canEdit": true,
- "canDelete": true
}A root comment carries a preview of its newest replies under replies; a reply has
-replies: null. Readable by guests under the same conditions as the windows.
| id required | integer The primary key of the comment - |
{- "id": 0,
- "message": "string",
- "messageRenderOptions": { },
- "contentId": 0,
- "parentCommentId": 0,
- "recordId": 0,
- "createdBy": {
- "id": 0,
- "guid": "string",
- "displayName": "string",
- "url": "string",
- "imageUrl": "string",
- "contentContainerId": 0,
- "online": true
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "url": "string",
- "files": [
- {
- "id": 0,
- "guid": "string",
- "mimeType": "string",
- "size": 0,
- "fileName": "string",
- "url": "string",
- "previewUrl": "string"
}
], - "childCount": 0,
- "replies": {
- "total": 0,
- "hasMore": true,
- "items": [
- { }
]
}, - "extensions": { }
}| id required | integer The primary key of the comment - |
| message required | string Markdown message - |
| fileList | Array of strings Guids of already uploaded files to attach - |
{- "message": "string",
- "fileList": [
- "string"
]
}{- "id": 0,
- "message": "string",
- "messageRenderOptions": { },
- "contentId": 0,
- "parentCommentId": 0,
- "recordId": 0,
- "createdBy": {
- "id": 0,
- "guid": "string",
- "displayName": "string",
- "url": "string",
- "imageUrl": "string",
- "contentContainerId": 0,
- "online": true
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "url": "string",
- "files": [
- {
- "id": 0,
- "guid": "string",
- "mimeType": "string",
- "size": 0,
- "fileName": "string",
- "url": "string",
- "previewUrl": "string"
}
], - "childCount": 0,
- "replies": {
- "total": 0,
- "hasMore": true,
- "items": [
- { }
]
}, - "extensions": { }
}Deletes the comment. The optional body parameters trigger the moderation flow: with
-notify, the author receives a notification carrying a preview of the removed text
-and the given message as the reason.
| id required | integer The primary key of the comment - |
| notify | boolean Notify the author about the removal - |
| message | string Reason shown to the author - |
{- "notify": true,
- "message": "string"
}Download OpenAPI specification:
Welcome to the HumHub like API reference, v2.
-These endpoints are shipped by HumHub core (1.19+), not by the REST API module — the
-module only contributes its authentication methods to them and documents them here until
-core ships its own API documentation. See the core docs,
-docs/develop/concept-api.md.
Conventions of this API generation, differing from /api/v1: camelCase field names,
-ISO-8601 timestamps with offset, plain HTTP status codes instead of a
-{code, message} envelope, and {results, total, page, pageSize, pages} for paginated
-lists.
Every likeable record is addressed either by its platform-wide recordId (what shapes
-carrying likes expose) or by model + pk.
Requests may authenticate with any token method the REST API module offers. Core's own -browser session is accepted too for these endpoints, which is what the platform's Vue UI -uses; state-changing session requests additionally require the CSRF token.
-The caller-context like state. Readable by guests for content they can see, with
-liked and canLike always false.
| recordId | integer Platform-wide record id — the addressing every shape that carries likes exposes as
- |
| model | string Class name of the record, when addressing it by model and primary key - |
| pk | integer Primary key of the record, when addressing it by model and primary key - |
{- "total": 0,
- "liked": true,
- "canLike": true
}The caller's like state for up to 100 records in one request, keyed by record id —
-what a client asks for after receiving a page of records whose payloads deliberately
-carry no like state (see the LikeState schema).
Records the caller may not see, and ids that resolve to nothing, are absent from
-the map rather than failing the request. Readable by guests, with liked and
-canLike always false.
| recordIds | string Comma-separated (or repeated |
{- "results": {
- "14": {
- "total": 2,
- "liked": true,
- "canLike": true
}
}
}| recordId | integer Platform-wide record id — the addressing every shape that carries likes exposes as
- |
| model | string Class name of the record, when addressing it by model and primary key - |
| pk | integer Primary key of the record, when addressing it by model and primary key - |
{- "total": 0,
- "liked": true,
- "canLike": true
}Idempotent — unliking something that was never liked is a success.
-| recordId | integer Platform-wide record id — the addressing every shape that carries likes exposes as
- |
| model | string Class name of the record, when addressing it by model and primary key - |
| pk | integer Primary key of the record, when addressing it by model and primary key - |
{- "total": 0,
- "liked": true,
- "canLike": true
}Newest first. Readable by guests for content they can see.
-| recordId | integer Platform-wide record id — the addressing every shape that carries likes exposes as
- |
| model | string Class name of the record, when addressing it by model and primary key - |
| pk | integer Primary key of the record, when addressing it by model and primary key - |
| page | integer Page number, starting at 1 - |
| pageSize | integer Records per page (default 25, maximum 100) - |
{- "results": [
- {
- "id": 0,
- "guid": "string",
- "displayName": "string",
- "url": "string",
- "imageUrl": "string",
- "contentContainerId": 0,
- "online": true
}
], - "total": 0,
- "page": 0,
- "pageSize": 0,
- "pages": 0
}