{"record":{"id":"b4d87d20d67f3f56","repo":"Radarr/Radarr","slug":"movieid-or-moviefileids-must-be-provided","errorCode":null,"errorMessage":"movieId or movieFileIds must be provided","messagePattern":"movieId or movieFileIds must be provided","errorType":"http","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"src/Radarr.Api.V3/MovieFiles/MovieFileController.cs","lineNumber":67,"sourceCode":"        }\n\n        protected override MovieFileResource GetResourceById(int id)\n        {\n            var movieFile = _mediaFileService.GetMovie(id);\n            var movie = _movieService.GetMovie(movieFile.MovieId);\n\n            var resource = movieFile.ToResource(movie, _upgradableSpecification, _formatCalculator);\n\n            return resource;\n        }\n\n        [HttpGet]\n        [Produces(\"application/json\")]\n        public List<MovieFileResource> GetMovieFiles([FromQuery(Name = \"movieId\")] List<int> movieIds, [FromQuery] List<int> movieFileIds)\n        {\n            if (!movieIds.Any() && !movieFileIds.Any())\n            {\n                throw new BadRequestException(\"movieId or movieFileIds must be provided\");\n            }\n\n            var movieFiles = movieIds.Any()\n                ? _mediaFileService.GetFilesByMovies(movieIds)\n                : _mediaFileService.GetMovies(movieFileIds);\n\n            if (movieFiles == null)\n            {\n                return new List<MovieFileResource>();\n            }\n\n            return movieFiles.GroupBy(e => e.MovieId)\n                .SelectMany(f => f.ToList()\n                    .ConvertAll(e => e.ToResource(_movieService.GetMovie(f.Key), _upgradableSpecification, _formatCalculator)))\n                .ToList();\n        }\n\n        [RestPutById]","sourceCodeStart":49,"sourceCodeEnd":85,"githubUrl":"https://github.com/Radarr/Radarr/blob/ca451608dc60c6cec754aba8d96bfa30e9468ed5/src/Radarr.Api.V3/MovieFiles/MovieFileController.cs#L49-L85","documentation":"Thrown by GET /api/v3/movieFile when neither the movieId nor the movieFileIds query parameter is supplied. The endpoint returns movie files either by movie or by file id, so at least one selector is mandatory; the guard rejects an ambiguous 'return everything' call.","triggerScenarios":"A GET /api/v3/movieFile with no query string, or with neither movieId nor movieFileIds present.","commonSituations":"A client/script that forgot to append a filter; a UI code path that calls the endpoint before a selection is made; a malformed query string where the parameter names don't match (movieId vs movieIds).","solutions":["Append at least one selector: ?movieId=1 or ?movieFileIds=10&movieFileIds=11.","Confirm you are using the exact query parameter names expected by the endpoint (movieId for movies, movieFileIds for files)."],"exampleFix":"// before\nGET /api/v3/movieFile\n// after\nGET /api/v3/movieFile?movieId=42","handlingStrategy":"validation","validationCode":"if (movieIds.Count == 0 && movieFileIds.Count == 0) {\n    return BadRequest(\"Provide movieId or movieFileIds.\");\n}","typeGuard":"static bool HasSelector(List<int> movieIds, List<int> movieFileIds)\n    => movieIds?.Any() == true || movieFileIds?.Any() == true;","tryCatchPattern":null,"preventionTips":["Always append a movieId or movieFileIds filter when calling the movie files endpoint.","Use the exact query parameter names the endpoint expects."],"tags":["api","validation","movie-files","bad-request","query-params"],"backgroundTag":null,"analyzedSha":"ca451608dc60c6cec754aba8d96bfa30e9468ed5","analyzedAt":"2026-08-13T17:21:54.115Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}