# Update Media Item Update media item metadata (Admin only). **Endpoint**: `PUT /api/media-items/{media_id}` **Auth**: Required (Admin only) **Content-Type**: `application/json` ## Path Parameters | Parameter | Type | Required | Description | | --------- | ------ | -------- | --------------- | | media_id | string | Yes | Media item UUID | ## Request Body | Field | Type | Required | Description | | ------------- | --------------- | -------- | -------------------------------------- | | title | string | No | Updated title | | author | string | No | Updated author | | description | string | No | Updated description | | series | string | No | Series name | | series_number | integer | No | Number in series | | tags | array of string | No | Updated tags (auto-normalized) | | contributors | array of string | No | Updated contributors (auto-normalized) | **Tag/Contributor Normalization:** - Tags are titlecased and deduplicated (case-insensitive) - Contributors preserve original casing and punctuation - Punctuation-preferred deduplication (keeps "ACME CORP." over "acme corp") - Search fields auto-generated for case-insensitive search ### Example Request ```json { "title": "Updated Title", "author": "Updated Author", "description": "Updated description", "series": "Series", "series_number": 2 } ``` ## Response (200 OK) ```json { "id": "uuid", "title": "Updated Title", "author": "Updated Author", "description": "Updated description", "series": "Series", "series_number": 2, "updated_at": "2026-01-31T10:00:00Z" } ``` ## Error Responses | Code | Description | | ---- | ------------------------ | | 400 | Invalid input data | | 401 | Invalid or expired token | | 403 | User is not an admin | | 404 | Media item not found |