# Bulk Update Books Update multiple media items at once. **Endpoint**: `POST /api/books/bulk-update` **Auth**: Required **Content-Type**: `application/json` ## Request Body | Field | Type | Required | Description | |--------|------|-----------|-------------| | media_item_ids | array of UUID | Yes | Array of media item UUIDs to update | | updates | object | Yes | Fields to update (see below) | ### Update Fields | Field | Type | Required | Description | |--------|------|-----------|-------------| | tags | array of strings | No | New tags (will replace existing) | | contributors | array of strings | No | New contributors (will replace existing) | | add_tags | array of strings | No | Tags to add to existing | | remove_tags | array of strings | No | Tags to remove from existing | ### Example Request ```json { "media_item_ids": [ "550e8400-e29b-41d4-a716-446655440001", "660e8400-e29b-41d4-a716-446655440002" ], "updates": { "add_tags": ["science-fiction", "award-winner"], "contributors": ["Publisher Name"] } } ``` ## Response (200 OK) ```json { "message": "Books updated successfully", "updated_count": 2, "failed_count": 0, "normalized_tags": ["Science-Fiction", "Award-Winner"], "normalized_contributors": ["Publisher Name"] } ``` ## Tag and Contributor Normalization The backend automatically normalizes tags and contributors: - **Tags**: Titlecased, punctuation preserved, deduplicated - **Contributors**: Original casing preserved, punctuation preserved - **Search fields**: Lowercase, no punctuation, stored in `tags_search` and `contributors_search` ## Error Responses | Code | Description | |------|-------------| | 400 | Invalid request data | | 401 | Invalid or expired token | | 403 | User does not have permission | | 404 | One or more media items not found | ## Try It Out