Index: ChapterX.API/Controllers/ReadingListItemsController.cs
===================================================================
--- ChapterX.API/Controllers/ReadingListItemsController.cs	(revision 877c13c3dd0934c1d31da7988d0d2c2c5925ed55)
+++ ChapterX.API/Controllers/ReadingListItemsController.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -1,4 +1,5 @@
 using ChapterX.Application.ReadingListItems.Commands;
 using ChapterX.Application.ReadingListItems.Queries;
+using ChapterX.Domain.Repositories;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
@@ -13,9 +14,11 @@
     {
         private readonly IMediator _mediator;
+        private readonly IReadingListItemsRepository _readingListItemsRepository;
         private readonly ILogger<ReadingListItemsController> _logger;
 
-        public ReadingListItemsController(IMediator mediator, ILogger<ReadingListItemsController> logger)
+        public ReadingListItemsController(IMediator mediator, IReadingListItemsRepository readingListItemsRepository, ILogger<ReadingListItemsController> logger)
         {
             _mediator = mediator;
+            _readingListItemsRepository = readingListItemsRepository;
             _logger = logger;
         }
@@ -70,4 +73,13 @@
             return Ok(response);
         }
+
+        [HttpDelete("{listId:int}/story/{storyId:int}")]
+        [Authorize]
+        public async Task<ActionResult> DeleteByListAndStory(int listId, int storyId)
+        {
+            _logger.LogInformation("Removing story {StoryId} from list {ListId}", storyId, listId);
+            var deleted = await _readingListItemsRepository.DeleteByListAndStoryAsync(listId, storyId);
+            return deleted ? Ok() : NotFound();
+        }
     }
 }
