> For the complete documentation index, see [llms.txt](https://docs.mulearn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.mulearn.org/api-reference/mucomics.md).

# Mucomics

## GET /api/v1/muComics/chapters/

> List all active (non-deleted) chapters for a comic. Supports status filter and search by title.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ChapterList":{"type":"object","description":"Lean serializer for listing chapters (e.g. comic chapter index).","properties":{"id":{"type":"string","readOnly":true},"comic":{"type":"string","readOnly":true},"title":{"type":"string","readOnly":true},"slug":{"type":"string","readOnly":true},"chapter_number":{"type":"string","format":"decimal","pattern":"^-?\\d{0,4}(?:\\.\\d{0,2})?$","readOnly":true},"cover_image_key":{"type":"string","readOnly":true,"nullable":true},"status":{"enum":["draft","published","archived"],"type":"string","description":"* `draft` - Draft\n* `published` - Published\n* `archived` - Archived","readOnly":true},"published_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"created_at":{"type":"string","format":"date-time","readOnly":true}},"required":["chapter_number","comic","cover_image_key","created_at","id","published_at","slug","status","title"]}}},"paths":{"/api/v1/muComics/chapters/":{"get":{"operationId":"muComics_chapters_list","description":"List all active (non-deleted) chapters for a comic. Supports status filter and search by title.","tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"type":"array","items":{"$ref":"#/components/schemas/ChapterList"}}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## POST /api/v1/muComics/chapters/

> Create a new chapter inside a comic. Only creator or editors of the comic can create.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ChapterWrite":{"type":"object","description":"Input serializer for POST /chapters/ and PATCH /chapters/<id>/.\nCaller never directly specifies slug, status, published_at, or audit fields.","properties":{"comic":{"type":"string"},"title":{"type":"string","maxLength":150},"description":{"type":"string","nullable":true},"chapter_number":{"type":"string","format":"decimal","pattern":"^-?\\d{0,4}(?:\\.\\d{0,2})?$"},"cover_image_key":{"type":"string","nullable":true,"maxLength":255}},"required":["chapter_number","comic","title"]},"ChapterDetail":{"type":"object","description":"Full serializer for chapter retrieval.","properties":{"id":{"type":"string","readOnly":true},"comic":{"type":"string","readOnly":true},"title":{"type":"string","readOnly":true},"slug":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true,"nullable":true},"chapter_number":{"type":"string","format":"decimal","pattern":"^-?\\d{0,4}(?:\\.\\d{0,2})?$","readOnly":true},"cover_image_key":{"type":"string","readOnly":true,"nullable":true},"status":{"enum":["draft","published","archived"],"type":"string","description":"* `draft` - Draft\n* `published` - Published\n* `archived` - Archived","readOnly":true},"published_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"pages":{"type":"string","readOnly":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/MinimalUser"}],"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_by":{"allOf":[{"$ref":"#/components/schemas/MinimalUser"}],"readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}},"required":["chapter_number","comic","cover_image_key","created_at","created_by","description","id","pages","published_at","slug","status","title","updated_at","updated_by"]},"MinimalUser":{"type":"object","properties":{"id":{"type":"string","maxLength":36},"full_name":{"type":"string","maxLength":150},"muid":{"type":"string","maxLength":100},"profile_pic":{"type":"string","readOnly":true}},"required":["full_name","muid","profile_pic"]}}},"paths":{"/api/v1/muComics/chapters/":{"post":{"operationId":"muComics_chapters_create","description":"Create a new chapter inside a comic. Only creator or editors of the comic can create.","tags":["Mucomics"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapterWrite"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ChapterWrite"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ChapterWrite"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ChapterDetail"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## GET /api/v1/muComics/chapters/{chapter\_id}/

> Retrieve full detail of a chapter including pages.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ChapterDetail":{"type":"object","description":"Full serializer for chapter retrieval.","properties":{"id":{"type":"string","readOnly":true},"comic":{"type":"string","readOnly":true},"title":{"type":"string","readOnly":true},"slug":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true,"nullable":true},"chapter_number":{"type":"string","format":"decimal","pattern":"^-?\\d{0,4}(?:\\.\\d{0,2})?$","readOnly":true},"cover_image_key":{"type":"string","readOnly":true,"nullable":true},"status":{"enum":["draft","published","archived"],"type":"string","description":"* `draft` - Draft\n* `published` - Published\n* `archived` - Archived","readOnly":true},"published_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"pages":{"type":"string","readOnly":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/MinimalUser"}],"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_by":{"allOf":[{"$ref":"#/components/schemas/MinimalUser"}],"readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}},"required":["chapter_number","comic","cover_image_key","created_at","created_by","description","id","pages","published_at","slug","status","title","updated_at","updated_by"]},"MinimalUser":{"type":"object","properties":{"id":{"type":"string","maxLength":36},"full_name":{"type":"string","maxLength":150},"muid":{"type":"string","maxLength":100},"profile_pic":{"type":"string","readOnly":true}},"required":["full_name","muid","profile_pic"]}}},"paths":{"/api/v1/muComics/chapters/{chapter_id}/":{"get":{"operationId":"muComics_chapters_retrieve","description":"Retrieve full detail of a chapter including pages.","parameters":[{"in":"path","name":"chapter_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ChapterDetail"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## DELETE /api/v1/muComics/chapters/{chapter\_id}/

> Soft delete a chapter. Only the comic creator can delete a chapter.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ChapterDeleteResponse":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}},"paths":{"/api/v1/muComics/chapters/{chapter_id}/":{"delete":{"operationId":"muComics_chapters_destroy","description":"Soft delete a chapter. Only the comic creator can delete a chapter.","parameters":[{"in":"path","name":"chapter_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ChapterDeleteResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## PATCH /api/v1/muComics/chapters/{chapter\_id}/

> Update chapter details. Requires comic creator or editor permissions. Archived chapters cannot be edited.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"PatchedChapterWrite":{"type":"object","description":"Input serializer for POST /chapters/ and PATCH /chapters/<id>/.\nCaller never directly specifies slug, status, published_at, or audit fields.","properties":{"comic":{"type":"string"},"title":{"type":"string","maxLength":150},"description":{"type":"string","nullable":true},"chapter_number":{"type":"string","format":"decimal","pattern":"^-?\\d{0,4}(?:\\.\\d{0,2})?$"},"cover_image_key":{"type":"string","nullable":true,"maxLength":255}}},"ChapterDetail":{"type":"object","description":"Full serializer for chapter retrieval.","properties":{"id":{"type":"string","readOnly":true},"comic":{"type":"string","readOnly":true},"title":{"type":"string","readOnly":true},"slug":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true,"nullable":true},"chapter_number":{"type":"string","format":"decimal","pattern":"^-?\\d{0,4}(?:\\.\\d{0,2})?$","readOnly":true},"cover_image_key":{"type":"string","readOnly":true,"nullable":true},"status":{"enum":["draft","published","archived"],"type":"string","description":"* `draft` - Draft\n* `published` - Published\n* `archived` - Archived","readOnly":true},"published_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"pages":{"type":"string","readOnly":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/MinimalUser"}],"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_by":{"allOf":[{"$ref":"#/components/schemas/MinimalUser"}],"readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}},"required":["chapter_number","comic","cover_image_key","created_at","created_by","description","id","pages","published_at","slug","status","title","updated_at","updated_by"]},"MinimalUser":{"type":"object","properties":{"id":{"type":"string","maxLength":36},"full_name":{"type":"string","maxLength":150},"muid":{"type":"string","maxLength":100},"profile_pic":{"type":"string","readOnly":true}},"required":["full_name","muid","profile_pic"]}}},"paths":{"/api/v1/muComics/chapters/{chapter_id}/":{"patch":{"operationId":"muComics_chapters_partial_update","description":"Update chapter details. Requires comic creator or editor permissions. Archived chapters cannot be edited.","parameters":[{"in":"path","name":"chapter_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedChapterWrite"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedChapterWrite"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedChapterWrite"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ChapterDetail"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## POST /api/v1/muComics/chapters/{chapter\_id}/archive/

> Archive a chapter. Comic creator only.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ChapterArchiveResponse":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"}},"required":["id","status"]}}},"paths":{"/api/v1/muComics/chapters/{chapter_id}/archive/":{"post":{"operationId":"muComics_chapters_archive_create","description":"Archive a chapter. Comic creator only.","parameters":[{"in":"path","name":"chapter_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ChapterArchiveResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## GET /api/v1/muComics/chapters/{chapter\_id}/pages/

> List all active pages of a chapter, ordered by page number.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ChapterPage":{"type":"object","description":"Serializer representing individual pages in a chapter.","properties":{"id":{"type":"string","readOnly":true},"chapter":{"type":"string"},"page_number":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"image_key":{"type":"string","maxLength":255},"created_at":{"type":"string","format":"date-time","readOnly":true}},"required":["chapter","created_at","id","image_key","page_number"]}}},"paths":{"/api/v1/muComics/chapters/{chapter_id}/pages/":{"get":{"operationId":"muComics_chapters_pages_list","description":"List all active pages of a chapter, ordered by page number.","parameters":[{"in":"path","name":"chapter_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"type":"array","items":{"$ref":"#/components/schemas/ChapterPage"}}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## POST /api/v1/muComics/chapters/{chapter\_id}/pages/

> Add a single page to a chapter. Comic creators or editors only.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ChapterPage":{"type":"object","description":"Serializer representing individual pages in a chapter.","properties":{"id":{"type":"string","readOnly":true},"chapter":{"type":"string"},"page_number":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"image_key":{"type":"string","maxLength":255},"created_at":{"type":"string","format":"date-time","readOnly":true}},"required":["chapter","created_at","id","image_key","page_number"]}}},"paths":{"/api/v1/muComics/chapters/{chapter_id}/pages/":{"post":{"operationId":"muComics_chapters_pages_create","description":"Add a single page to a chapter. Comic creators or editors only.","parameters":[{"in":"path","name":"chapter_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapterPage"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ChapterPage"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ChapterPage"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ChapterPage"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## POST /api/v1/muComics/chapters/{chapter\_id}/pages/register/

> Register multiple uploaded local media paths as sequential pages inside a chapter. Creator/editors only.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"RegisterImagesRequest":{"type":"object","properties":{"image_keys":{"type":"array","items":{"type":"string"}}},"required":["image_keys"]},"ChapterPage":{"type":"object","description":"Serializer representing individual pages in a chapter.","properties":{"id":{"type":"string","readOnly":true},"chapter":{"type":"string"},"page_number":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"image_key":{"type":"string","maxLength":255},"created_at":{"type":"string","format":"date-time","readOnly":true}},"required":["chapter","created_at","id","image_key","page_number"]}}},"paths":{"/api/v1/muComics/chapters/{chapter_id}/pages/register/":{"post":{"operationId":"muComics_chapters_pages_register_create","description":"Register multiple uploaded local media paths as sequential pages inside a chapter. Creator/editors only.","parameters":[{"in":"path","name":"chapter_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterImagesRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RegisterImagesRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RegisterImagesRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"type":"array","items":{"$ref":"#/components/schemas/ChapterPage"}}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## POST /api/v1/muComics/chapters/{chapter\_id}/pages/reorder/

> Bulk reorder page numbers in a chapter. Comic creators or editors only.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"PageReorderRequest":{"type":"object","properties":{"page_orders":{"type":"array","items":{"$ref":"#/components/schemas/PageOrderItem"}}},"required":["page_orders"]},"PageOrderItem":{"type":"object","properties":{"id":{"type":"string"},"page_number":{"type":"integer"}},"required":["id","page_number"]},"PageReorderResponse":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}}},"paths":{"/api/v1/muComics/chapters/{chapter_id}/pages/reorder/":{"post":{"operationId":"muComics_chapters_pages_reorder_create","description":"Bulk reorder page numbers in a chapter. Comic creators or editors only.","parameters":[{"in":"path","name":"chapter_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageReorderRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PageReorderRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PageReorderRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/PageReorderResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## POST /api/v1/muComics/chapters/{chapter\_id}/publish/

> Publish a chapter. Comic creator only.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ChapterPublishResponse":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"}},"required":["id","status"]}}},"paths":{"/api/v1/muComics/chapters/{chapter_id}/publish/":{"post":{"operationId":"muComics_chapters_publish_create","description":"Publish a chapter. Comic creator only.","parameters":[{"in":"path","name":"chapter_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ChapterPublishResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## DELETE /api/v1/muComics/chapters/pages/{page\_id}/

> Delete a page (soft delete). Comic creators or editors only.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"PageDeleteResponse":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}},"paths":{"/api/v1/muComics/chapters/pages/{page_id}/":{"delete":{"operationId":"muComics_chapters_pages_destroy","description":"Delete a page (soft delete). Comic creators or editors only.","parameters":[{"in":"path","name":"page_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/PageDeleteResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## PATCH /api/v1/muComics/chapters/pages/{page\_id}/

> Update page information (e.g. page\_number or image\_key). Comic creators or editors only.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"PatchedChapterPage":{"type":"object","description":"Serializer representing individual pages in a chapter.","properties":{"id":{"type":"string","readOnly":true},"chapter":{"type":"string"},"page_number":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"image_key":{"type":"string","maxLength":255},"created_at":{"type":"string","format":"date-time","readOnly":true}}},"ChapterPage":{"type":"object","description":"Serializer representing individual pages in a chapter.","properties":{"id":{"type":"string","readOnly":true},"chapter":{"type":"string"},"page_number":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"image_key":{"type":"string","maxLength":255},"created_at":{"type":"string","format":"date-time","readOnly":true}},"required":["chapter","created_at","id","image_key","page_number"]}}},"paths":{"/api/v1/muComics/chapters/pages/{page_id}/":{"patch":{"operationId":"muComics_chapters_pages_partial_update","description":"Update page information (e.g. page_number or image_key). Comic creators or editors only.","parameters":[{"in":"path","name":"page_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedChapterPage"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedChapterPage"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedChapterPage"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ChapterPage"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## POST /api/v1/muComics/chapters/upload-url/

> Upload a media file (Image or PDF) to local storage.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ChapterUploadRequest":{"type":"object","properties":{"file":{"type":"string","format":"uri"}},"required":["file"]},"UploadURLResponse":{"type":"object","properties":{"upload_url":{"type":"string"},"image_key":{"type":"string"}},"required":["image_key","upload_url"]}}},"paths":{"/api/v1/muComics/chapters/upload-url/":{"post":{"operationId":"muComics_chapters_upload_url_create","description":"Upload a media file (Image or PDF) to local storage.","tags":["Mucomics"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ChapterUploadRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/UploadURLResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## GET /api/v1/muComics/comics/

> List all active (non-deleted) comics. Supports search by title, status filter, and sort by created\_at or title.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ComicListItem":{"type":"object","properties":{"id":{"type":"string","maxLength":36},"title":{"type":"string","maxLength":150},"slug":{"type":"string","maxLength":75},"cover_image_key":{"type":"string","nullable":true,"maxLength":255},"status":{"enum":["draft","published","archived"],"type":"string","description":"* `draft` - Draft\n* `published` - Published\n* `archived` - Archived"},"like_count":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"comment_count":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"bookmark_count":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"published_at":{"type":"string","format":"date-time","nullable":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/MinimalUser"}],"readOnly":true},"created_at":{"type":"string","format":"date-time"},"genres":{"type":"string","readOnly":true}},"required":["created_at","created_by","genres","slug","title"]},"MinimalUser":{"type":"object","properties":{"id":{"type":"string","maxLength":36},"full_name":{"type":"string","maxLength":150},"muid":{"type":"string","maxLength":100},"profile_pic":{"type":"string","readOnly":true}},"required":["full_name","muid","profile_pic"]}}},"paths":{"/api/v1/muComics/comics/":{"get":{"operationId":"muComics_comics_list","description":"List all active (non-deleted) comics. Supports search by title, status filter, and sort by created_at or title.","tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"type":"array","items":{"$ref":"#/components/schemas/ComicListItem"}}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## POST /api/v1/muComics/comics/

> Create a new comic. Any authenticated user may create a comic. Returns the full comic detail on success.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ComicWrite":{"type":"object","description":"Input serializer for POST /comics/ and PATCH /comics/<id>/.\nThe caller never sends: slug, status, *_count, published_at, or audit fields.","properties":{"title":{"type":"string","maxLength":150},"description":{"type":"string","nullable":true},"cover_image_key":{"type":"string","nullable":true,"maxLength":255}},"required":["title"]},"ComicDetail":{"type":"object","properties":{"id":{"type":"string","maxLength":36},"title":{"type":"string","maxLength":150},"slug":{"type":"string","maxLength":75},"description":{"type":"string","nullable":true},"cover_image_key":{"type":"string","nullable":true,"maxLength":255},"status":{"enum":["draft","published","archived"],"type":"string","description":"* `draft` - Draft\n* `published` - Published\n* `archived` - Archived"},"like_count":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"comment_count":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"bookmark_count":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"published_at":{"type":"string","format":"date-time","nullable":true},"genres":{"type":"string","readOnly":true},"contributors":{"type":"string","readOnly":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/MinimalUser"}],"readOnly":true},"created_at":{"type":"string","format":"date-time"},"updated_by":{"allOf":[{"$ref":"#/components/schemas/MinimalUser"}],"readOnly":true},"updated_at":{"type":"string","format":"date-time"}},"required":["contributors","created_at","created_by","genres","slug","title","updated_at","updated_by"]},"MinimalUser":{"type":"object","properties":{"id":{"type":"string","maxLength":36},"full_name":{"type":"string","maxLength":150},"muid":{"type":"string","maxLength":100},"profile_pic":{"type":"string","readOnly":true}},"required":["full_name","muid","profile_pic"]}}},"paths":{"/api/v1/muComics/comics/":{"post":{"operationId":"muComics_comics_create","description":"Create a new comic. Any authenticated user may create a comic. Returns the full comic detail on success.","tags":["Mucomics"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComicWrite"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ComicWrite"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ComicWrite"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ComicDetail"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## GET /api/v1/muComics/comics/{comic\_id}/

> Retrieve full detail for a single active comic, including contributors and genres.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ComicDetail":{"type":"object","properties":{"id":{"type":"string","maxLength":36},"title":{"type":"string","maxLength":150},"slug":{"type":"string","maxLength":75},"description":{"type":"string","nullable":true},"cover_image_key":{"type":"string","nullable":true,"maxLength":255},"status":{"enum":["draft","published","archived"],"type":"string","description":"* `draft` - Draft\n* `published` - Published\n* `archived` - Archived"},"like_count":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"comment_count":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"bookmark_count":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"published_at":{"type":"string","format":"date-time","nullable":true},"genres":{"type":"string","readOnly":true},"contributors":{"type":"string","readOnly":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/MinimalUser"}],"readOnly":true},"created_at":{"type":"string","format":"date-time"},"updated_by":{"allOf":[{"$ref":"#/components/schemas/MinimalUser"}],"readOnly":true},"updated_at":{"type":"string","format":"date-time"}},"required":["contributors","created_at","created_by","genres","slug","title","updated_at","updated_by"]},"MinimalUser":{"type":"object","properties":{"id":{"type":"string","maxLength":36},"full_name":{"type":"string","maxLength":150},"muid":{"type":"string","maxLength":100},"profile_pic":{"type":"string","readOnly":true}},"required":["full_name","muid","profile_pic"]}}},"paths":{"/api/v1/muComics/comics/{comic_id}/":{"get":{"operationId":"muComics_comics_retrieve","description":"Retrieve full detail for a single active comic, including contributors and genres.","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ComicDetail"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## DELETE /api/v1/muComics/comics/{comic\_id}/

> Soft-delete a comic (sets deleted\_at). Only the original creator may delete. The comic is hidden from all list/detail responses after deletion.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ComicDeleteResponse":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}},"paths":{"/api/v1/muComics/comics/{comic_id}/":{"delete":{"operationId":"muComics_comics_destroy","description":"Soft-delete a comic (sets deleted_at). Only the original creator may delete. The comic is hidden from all list/detail responses after deletion.","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ComicDeleteResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## PATCH /api/v1/muComics/comics/{comic\_id}/

> Partially update a comic's title, description, or cover image. Only the creator or an assigned editor contributor may edit. Archived comics cannot be edited.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"PatchedComicWrite":{"type":"object","description":"Input serializer for POST /comics/ and PATCH /comics/<id>/.\nThe caller never sends: slug, status, *_count, published_at, or audit fields.","properties":{"title":{"type":"string","maxLength":150},"description":{"type":"string","nullable":true},"cover_image_key":{"type":"string","nullable":true,"maxLength":255}}},"ComicDetail":{"type":"object","properties":{"id":{"type":"string","maxLength":36},"title":{"type":"string","maxLength":150},"slug":{"type":"string","maxLength":75},"description":{"type":"string","nullable":true},"cover_image_key":{"type":"string","nullable":true,"maxLength":255},"status":{"enum":["draft","published","archived"],"type":"string","description":"* `draft` - Draft\n* `published` - Published\n* `archived` - Archived"},"like_count":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"comment_count":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"bookmark_count":{"type":"integer","maximum":4294967295,"minimum":0,"format":"int64"},"published_at":{"type":"string","format":"date-time","nullable":true},"genres":{"type":"string","readOnly":true},"contributors":{"type":"string","readOnly":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/MinimalUser"}],"readOnly":true},"created_at":{"type":"string","format":"date-time"},"updated_by":{"allOf":[{"$ref":"#/components/schemas/MinimalUser"}],"readOnly":true},"updated_at":{"type":"string","format":"date-time"}},"required":["contributors","created_at","created_by","genres","slug","title","updated_at","updated_by"]},"MinimalUser":{"type":"object","properties":{"id":{"type":"string","maxLength":36},"full_name":{"type":"string","maxLength":150},"muid":{"type":"string","maxLength":100},"profile_pic":{"type":"string","readOnly":true}},"required":["full_name","muid","profile_pic"]}}},"paths":{"/api/v1/muComics/comics/{comic_id}/":{"patch":{"operationId":"muComics_comics_partial_update","description":"Partially update a comic's title, description, or cover image. Only the creator or an assigned editor contributor may edit. Archived comics cannot be edited.","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedComicWrite"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedComicWrite"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedComicWrite"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ComicDetail"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## POST /api/v1/muComics/comics/{comic\_id}/archive/

> Archive a draft or published comic (draft/published → archived). Only the creator may archive. Already-archived comics are rejected.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ComicArchiveResponse":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"}},"required":["id","status"]}}},"paths":{"/api/v1/muComics/comics/{comic_id}/archive/":{"post":{"operationId":"muComics_comics_archive_create","description":"Archive a draft or published comic (draft/published → archived). Only the creator may archive. Already-archived comics are rejected.","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ComicArchiveResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## GET /api/v1/muComics/comics/{comic\_id}/contributors/

> List all contributors for a comic.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ContributorList":{"type":"object","description":"Output shape for GET /comics/{comicId}/contributors/.\nFlattens the ComicContributorLink → User / Comic relations.","properties":{"contributor_id":{"type":"string"},"user_id":{"type":"string"},"role":{"type":"string"},"name":{"type":"string"},"comic_name":{"type":"string"}},"required":["comic_name","contributor_id","name","role","user_id"]}}},"paths":{"/api/v1/muComics/comics/{comic_id}/contributors/":{"get":{"operationId":"muComics_comics_contributors_list","description":"List all contributors for a comic.","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"type":"array","items":{"$ref":"#/components/schemas/ContributorList"}}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## POST /api/v1/muComics/comics/{comic\_id}/contributors/

> Add a contributor to a comic by muid and role. Only the comic creator or an Admin may call this. The CREATOR role cannot be assigned via this endpoint.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ContributorWrite":{"type":"object","description":"Input for POST /comics/{comicId}/contributors/.\nResolves `muid` → User object during validation so create() receives a\nready-to-use User instance.","properties":{"muid":{"type":"string"},"role":{"enum":["writer","artist","colorist","editor"],"type":"string","description":"* `writer` - Writer\n* `artist` - Artist\n* `colorist` - Colorist\n* `editor` - Editor"}},"required":["muid","role"]},"ContributorAddResponse":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"paths":{"/api/v1/muComics/comics/{comic_id}/contributors/":{"post":{"operationId":"muComics_comics_contributors_create","description":"Add a contributor to a comic by muid and role. Only the comic creator or an Admin may call this. The CREATOR role cannot be assigned via this endpoint.","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributorWrite"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ContributorWrite"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ContributorWrite"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ContributorAddResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## DELETE /api/v1/muComics/comics/{comic\_id}/contributors/{contributor\_id}/

> Remove a contributor from a comic. Only the comic creator or an Admin may call this.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ContributorRemoveResponse":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"paths":{"/api/v1/muComics/comics/{comic_id}/contributors/{contributor_id}/":{"delete":{"operationId":"muComics_comics_contributors_destroy","description":"Remove a contributor from a comic. Only the comic creator or an Admin may call this.","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true},{"in":"path","name":"contributor_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ContributorRemoveResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## PATCH /api/v1/muComics/comics/{comic\_id}/contributors/{contributor\_id}/

> Update a contributor's role. Only the comic creator or an Admin may call this. The CREATOR role cannot be assigned.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"PatchedContributorRoleUpdate":{"type":"object","description":"Input for PATCH /comics/{comicId}/contributors/{contributorId}/.","properties":{"role":{"enum":["writer","artist","colorist","editor"],"type":"string","description":"* `writer` - Writer\n* `artist` - Artist\n* `colorist` - Colorist\n* `editor` - Editor"}}},"ContributorUpdateResponse":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"paths":{"/api/v1/muComics/comics/{comic_id}/contributors/{contributor_id}/":{"patch":{"operationId":"muComics_comics_contributors_partial_update","description":"Update a contributor's role. Only the comic creator or an Admin may call this. The CREATOR role cannot be assigned.","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true},{"in":"path","name":"contributor_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedContributorRoleUpdate"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedContributorRoleUpdate"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedContributorRoleUpdate"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ContributorUpdateResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## POST /api/v1/muComics/comics/{comic\_id}/genres/

> Assign a genre to a comic. Only the creator, an assigned editor, or an admin might perform this action.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ComicGenreAssign":{"type":"object","description":"Input serializer for POST /comics/{comicId}/genres/.\nValidates that:\n- The genre exists.\n- The genre is active (is_active=True).\n- The genre is not already assigned to this comic.","properties":{"genre_id":{"type":"string"}},"required":["genre_id"]},"ComicGenreAssignResponse":{"type":"object","properties":{"link_id":{"type":"string"},"genre":{"$ref":"#/components/schemas/GenreMinimalObj"}},"required":["genre","link_id"]},"GenreMinimalObj":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["id","name","slug"]}}},"paths":{"/api/v1/muComics/comics/{comic_id}/genres/":{"post":{"operationId":"muComics_comics_genres_create_2","description":"Assign a genre to a comic. Only the creator, an assigned editor, or an admin might perform this action.","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComicGenreAssign"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ComicGenreAssign"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ComicGenreAssign"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ComicGenreAssignResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## DELETE /api/v1/muComics/comics/{comic\_id}/genres/{link\_id}/

> Remove a genre from a comic. Only the creator, an assigned editor, or an admin might perform this action.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ComicGenreRemoveResponse":{"type":"object","properties":{"link_id":{"type":"string"}},"required":["link_id"]}}},"paths":{"/api/v1/muComics/comics/{comic_id}/genres/{link_id}/":{"delete":{"operationId":"muComics_comics_genres_destroy_2","description":"Remove a genre from a comic. Only the creator, an assigned editor, or an admin might perform this action.","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true},{"in":"path","name":"link_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ComicGenreRemoveResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## POST /api/v1/muComics/comics/{comic\_id}/publish/

> Publish a draft comic (draft → published). Only the creator may publish. Requires title and description to be present. Archived comics cannot be re-published.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"ComicPublishResponse":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"}},"required":["id","status"]}}},"paths":{"/api/v1/muComics/comics/{comic_id}/publish/":{"post":{"operationId":"muComics_comics_publish_create","description":"Publish a draft comic (draft → published). Only the creator may publish. Requires title and description to be present. Archived comics cannot be re-published.","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/ComicPublishResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## GET /api/v1/muComics/comics/genres/

> List genres. Non-admins see only active genres. Admins can filter with ?is\_active=true|false. Supports ?search= (by name) and ?sort=name|created\_at.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"GenreRead":{"type":"object","description":"Output shape for genre list / detail responses.","properties":{"id":{"type":"string","maxLength":36},"name":{"type":"string","maxLength":75},"slug":{"type":"string","maxLength":75},"is_active":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["created_at","name","slug","updated_at"]}}},"paths":{"/api/v1/muComics/comics/genres/":{"get":{"operationId":"muComics_comics_genres_list","description":"List genres. Non-admins see only active genres. Admins can filter with ?is_active=true|false. Supports ?search= (by name) and ?sort=name|created_at.","tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"type":"array","items":{"$ref":"#/components/schemas/GenreRead"}}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## POST /api/v1/muComics/comics/genres/

> Create a new genre. is\_active defaults to true. Admin only.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"GenreWrite":{"type":"object","description":"Input serializer for POST /comics/genres/ and PATCH /comics/genres/<id>/.\nCaller only sends `name`; slug and audit fields are set internally.","properties":{"name":{"type":"string","maxLength":75}},"required":["name"]},"GenreRead":{"type":"object","description":"Output shape for genre list / detail responses.","properties":{"id":{"type":"string","maxLength":36},"name":{"type":"string","maxLength":75},"slug":{"type":"string","maxLength":75},"is_active":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["created_at","name","slug","updated_at"]}}},"paths":{"/api/v1/muComics/comics/genres/":{"post":{"operationId":"muComics_comics_genres_create","description":"Create a new genre. is_active defaults to true. Admin only.","tags":["Mucomics"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenreWrite"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/GenreWrite"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/GenreWrite"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/GenreRead"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## GET /api/v1/muComics/comics/genres/{genre\_id}/

> Retrieve a genre. Non-admins only see active genres (inactive → 404). Admins can retrieve any genre regardless of is\_active status.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"GenreRead":{"type":"object","description":"Output shape for genre list / detail responses.","properties":{"id":{"type":"string","maxLength":36},"name":{"type":"string","maxLength":75},"slug":{"type":"string","maxLength":75},"is_active":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["created_at","name","slug","updated_at"]}}},"paths":{"/api/v1/muComics/comics/genres/{genre_id}/":{"get":{"operationId":"muComics_comics_genres_retrieve","description":"Retrieve a genre. Non-admins only see active genres (inactive → 404). Admins can retrieve any genre regardless of is_active status.","parameters":[{"in":"path","name":"genre_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/GenreRead"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## DELETE /api/v1/muComics/comics/genres/{genre\_id}/

> Soft-deactivate a genre (sets is\_active = False). The genre row and all comic\_genre\_link rows are preserved. Admin only.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"GenreDeactivateResponse":{"type":"object","properties":{"id":{"type":"string"},"is_active":{"type":"boolean"}},"required":["id","is_active"]}}},"paths":{"/api/v1/muComics/comics/genres/{genre_id}/":{"delete":{"operationId":"muComics_comics_genres_destroy","description":"Soft-deactivate a genre (sets is_active = False). The genre row and all comic_genre_link rows are preserved. Admin only.","parameters":[{"in":"path","name":"genre_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/GenreDeactivateResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## PATCH /api/v1/muComics/comics/genres/{genre\_id}/

> Update a genre's name (slug is regenerated automatically). Admin only.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"PatchedGenreWrite":{"type":"object","description":"Input serializer for POST /comics/genres/ and PATCH /comics/genres/<id>/.\nCaller only sends `name`; slug and audit fields are set internally.","properties":{"name":{"type":"string","maxLength":75}}},"GenreRead":{"type":"object","description":"Output shape for genre list / detail responses.","properties":{"id":{"type":"string","maxLength":36},"name":{"type":"string","maxLength":75},"slug":{"type":"string","maxLength":75},"is_active":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["created_at","name","slug","updated_at"]}}},"paths":{"/api/v1/muComics/comics/genres/{genre_id}/":{"patch":{"operationId":"muComics_comics_genres_partial_update","description":"Update a genre's name (slug is regenerated automatically). Admin only.","parameters":[{"in":"path","name":"genre_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedGenreWrite"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedGenreWrite"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedGenreWrite"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/GenreRead"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## POST /api/v1/muComics/comics/genres/{genre\_id}/reinstate/

> Reinstate (reactivate) a deactivated genre. Sets is\_active = True. Admin only.

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}},"schemas":{"GenreReinstateResponse":{"type":"object","properties":{"id":{"type":"string"},"is_active":{"type":"boolean"}},"required":["id","is_active"]}}},"paths":{"/api/v1/muComics/comics/genres/{genre_id}/reinstate/":{"post":{"operationId":"muComics_comics_genres_reinstate_create","description":"Reinstate (reactivate) a deactivated genre. Sets is_active = True. Admin only.","parameters":[{"in":"path","name":"genre_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"hasError":{"type":"boolean","default":false},"statusCode":{"type":"integer","default":200},"message":{"type":"object","properties":{"general":{"type":"array","items":{"type":"string"}}}},"response":{"$ref":"#/components/schemas/GenreReinstateResponse"}},"required":["hasError","statusCode","message","response"]}}},"description":""}}}}}}
```

## DELETE /api/v1/muComics/comments/{comment\_id}/

> PATCH  /comments/\<comment\_id>/  — edit own comment\
> DELETE /comments/\<comment\_id>/  — soft-delete own comment

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"cookieAuth":[]},{"basicAuth":[]},{"jwtAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"},"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/comments/{comment_id}/":{"delete":{"operationId":"muComics_comments_destroy","description":"PATCH  /comments/<comment_id>/  — edit own comment\nDELETE /comments/<comment_id>/  — soft-delete own comment","parameters":[{"in":"path","name":"comment_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"204":{"description":"No response body"}}}}}}
```

## PATCH /api/v1/muComics/comments/{comment\_id}/

> PATCH  /comments/\<comment\_id>/  — edit own comment\
> DELETE /comments/\<comment\_id>/  — soft-delete own comment

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"cookieAuth":[]},{"basicAuth":[]},{"jwtAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"},"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/comments/{comment_id}/":{"patch":{"operationId":"muComics_comments_partial_update","description":"PATCH  /comments/<comment_id>/  — edit own comment\nDELETE /comments/<comment_id>/  — soft-delete own comment","parameters":[{"in":"path","name":"comment_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"description":"No response body"}}}}}}
```

## GET /api/v1/muComics/comments/admin/

> GET /admin/comments/ — list all comments for moderation (flat list)

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"cookieAuth":[]},{"basicAuth":[]},{"jwtAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"},"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/comments/admin/":{"get":{"operationId":"muComics_comments_admin_retrieve","description":"GET /admin/comments/ — list all comments for moderation (flat list)","tags":["Mucomics"],"responses":{"200":{"description":"No response body"}}}}}}
```

## DELETE /api/v1/muComics/comments/admin/{comment\_id}/

> DELETE /admin/comments/\<comment\_id>/ — soft-delete any comment (moderator)

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"cookieAuth":[]},{"basicAuth":[]},{"jwtAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"},"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/comments/admin/{comment_id}/":{"delete":{"operationId":"muComics_comments_admin_destroy","description":"DELETE /admin/comments/<comment_id>/ — soft-delete any comment (moderator)","parameters":[{"in":"path","name":"comment_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"204":{"description":"No response body"}}}}}}
```

## POST /api/v1/muComics/comments/chapter/{chapter\_id}/create/

> POST /comments/chapter/\<chapter\_id>/create/  — create chapter comment

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"cookieAuth":[]},{"basicAuth":[]},{"jwtAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"},"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/comments/chapter/{chapter_id}/create/":{"post":{"operationId":"muComics_comments_chapter_create_create","description":"POST /comments/chapter/<chapter_id>/create/  — create chapter comment","parameters":[{"in":"path","name":"chapter_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"description":"No response body"}}}}}}
```

## GET /api/v1/muComics/comments/chapter/{chapter\_id}/list/

> GET  /comments/chapter/\<chapter\_id>/list/  — list chapter comments

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"cookieAuth":[]},{"basicAuth":[]},{"jwtAuth":[]},{}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"},"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/comments/chapter/{chapter_id}/list/":{"get":{"operationId":"muComics_comments_chapter_list_retrieve","description":"GET  /comments/chapter/<chapter_id>/list/  — list chapter comments","parameters":[{"in":"path","name":"chapter_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"description":"No response body"}}}}}}
```

## POST /api/v1/muComics/comments/comic/{comic\_id}/create/

> POST /comments/comic/\<comic\_id>/create/  — create a comment (top-level or reply)

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"cookieAuth":[]},{"basicAuth":[]},{"jwtAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"},"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/comments/comic/{comic_id}/create/":{"post":{"operationId":"muComics_comments_comic_create_create","description":"POST /comments/comic/<comic_id>/create/  — create a comment (top-level or reply)","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"description":"No response body"}}}}}}
```

## GET /api/v1/muComics/comments/comic/{comic\_id}/list/

> GET  /comments/comic/\<comic\_id>/list/  — list top-level comments with replies

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"cookieAuth":[]},{"basicAuth":[]},{"jwtAuth":[]},{}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"},"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/comments/comic/{comic_id}/list/":{"get":{"operationId":"muComics_comments_comic_list_retrieve","description":"GET  /comments/comic/<comic_id>/list/  — list top-level comments with replies","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"description":"No response body"}}}}}}
```

## POST /api/v1/muComics/reader/comics/{comic\_id}/bookmarks/

>

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/reader/comics/{comic_id}/bookmarks/":{"post":{"operationId":"muComics_reader_comics_bookmarks_create","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"description":"No response body"}}}}}}
```

## DELETE /api/v1/muComics/reader/comics/{comic\_id}/bookmarks/

>

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/reader/comics/{comic_id}/bookmarks/":{"delete":{"operationId":"muComics_reader_comics_bookmarks_destroy","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"204":{"description":"No response body"}}}}}}
```

## GET /api/v1/muComics/reader/comics/{comic\_id}/interaction-status/

>

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/reader/comics/{comic_id}/interaction-status/":{"get":{"operationId":"muComics_reader_comics_interaction_status_retrieve","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"description":"No response body"}}}}}}
```

## POST /api/v1/muComics/reader/comics/{comic\_id}/likes/

>

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/reader/comics/{comic_id}/likes/":{"post":{"operationId":"muComics_reader_comics_likes_create","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"description":"No response body"}}}}}}
```

## DELETE /api/v1/muComics/reader/comics/{comic\_id}/likes/

>

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/reader/comics/{comic_id}/likes/":{"delete":{"operationId":"muComics_reader_comics_likes_destroy","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"204":{"description":"No response body"}}}}}}
```

## GET /api/v1/muComics/reader/comics/{comic\_id}/progress/

>

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/reader/comics/{comic_id}/progress/":{"get":{"operationId":"muComics_reader_comics_progress_retrieve","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"description":"No response body"}}}}}}
```

## PUT /api/v1/muComics/reader/comics/{comic\_id}/progress/

>

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/reader/comics/{comic_id}/progress/":{"put":{"operationId":"muComics_reader_comics_progress_update","parameters":[{"in":"path","name":"comic_id","schema":{"type":"string"},"required":true}],"tags":["Mucomics"],"responses":{"200":{"description":"No response body"}}}}}}
```

## GET /api/v1/muComics/reader/me/

>

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/reader/me/":{"get":{"operationId":"muComics_reader_me_retrieve","tags":["Mucomics"],"responses":{"200":{"description":"No response body"}}}}}}
```

## GET /api/v1/muComics/reader/me/bookmarks/

>

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/reader/me/bookmarks/":{"get":{"operationId":"muComics_reader_me_bookmarks_retrieve","tags":["Mucomics"],"responses":{"200":{"description":"No response body"}}}}}}
```

## GET /api/v1/muComics/reader/me/progress/

>

```json
{"openapi":"3.0.3","info":{"title":"muLearn API","version":"1.0.0"},"security":[{"jwtAuth":[]},{}],"components":{"securitySchemes":{"jwtAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"JWT Token Authentication. Enter **\"Bearer <token>\"**"}}},"paths":{"/api/v1/muComics/reader/me/progress/":{"get":{"operationId":"muComics_reader_me_progress_retrieve","tags":["Mucomics"],"responses":{"200":{"description":"No response body"}}}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.mulearn.org/api-reference/mucomics.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
