{"record":{"id":"0867dd10829f70c5","repo":"Sonarr/Sonarr","slug":"unable-to-find-matching-series-and-episodes-will-0867dd","errorCode":null,"errorMessage":"Unable to find matching series and episodes, will need to be manually provided","messagePattern":"Unable to find matching series and episodes, will need to be manually provided","errorType":"http","errorClass":"NzbDroneClientException","httpStatus":404,"severity":"error","filePath":"src/Sonarr.Api.V5/Release/ReleaseController.cs","lineNumber":157,"sourceCode":"                    remoteEpisode.Series = _seriesService.GetSeries(episode.SeriesId);\n                    remoteEpisode.Episodes = new List<Episode> { episode };\n                }\n                else if (release.SearchInfo?.SeriesId.HasValue == true)\n                {\n                    var series = _seriesService.GetSeries(release.SearchInfo.SeriesId.Value);\n                    var episodes = _parsingService.GetEpisodes(remoteEpisode.ParsedEpisodeInfo, series, true);\n\n                    if (episodes.Empty())\n                    {\n                        throw new NzbDroneClientException(HttpStatusCode.NotFound, \"Unable to parse episodes in the release, will need to be manually provided\");\n                    }\n\n                    remoteEpisode.Series = series;\n                    remoteEpisode.Episodes = episodes;\n                }\n                else\n                {\n                    throw new NzbDroneClientException(HttpStatusCode.NotFound, \"Unable to find matching series and episodes, will need to be manually provided\");\n                }\n            }\n            else if (remoteEpisode.Episodes.Empty())\n            {\n                var episodes = _parsingService.GetEpisodes(remoteEpisode.ParsedEpisodeInfo, remoteEpisode.Series, true);\n\n                if (episodes.Empty() && release.SearchInfo?.EpisodeId.HasValue == true)\n                {\n                    var episode = _episodeService.GetEpisode(release.SearchInfo.EpisodeId.Value);\n\n                    episodes = new List<Episode> { episode };\n                }\n\n                remoteEpisode.Episodes = episodes;\n            }\n\n            if (remoteEpisode.Episodes.Empty())\n            {","sourceCodeStart":139,"sourceCodeEnd":175,"githubUrl":"https://github.com/Sonarr/Sonarr/blob/da2284d7eaab22ed9b2ca698af690148d691e967/src/Sonarr.Api.V5/Release/ReleaseController.cs#L139-L175","documentation":"Returned as HTTP 404 (NzbDroneClientException NotFound) inside POST /api/v5/release when the cached RemoteEpisode has no Series and the request supplied neither SearchInfo.EpisodeId nor SearchInfo.SeriesId. Without one of those, Sonarr has no way to resolve which series/episodes the release belongs to, so it asks the caller to provide them manually.","triggerScenarios":"POST /api/v5/release for a cached release whose RemoteEpisode.Series is null, with no SearchInfo block (or SearchInfo lacking both EpisodeId and SeriesId).","commonSituations":"The release is unmatched (parser found no series) and the user attempts to grab without supplying override/search metadata. An automated client forwards a grab without enrichment.","solutions":["Include SearchInfo with at least EpisodeId or SeriesId in the grab request","Use the Override block to specify SeriesId (and preferably EpisodeIds)","If the series genuinely isn't in Sonarr, add it first, then re-search and grab"],"exampleFix":"// before — no series resolution metadata\n{ \"guid\": \"...\" }\n\n// after — supply search info\n{ \"guid\": \"...\", \"searchInfo\": { \"seriesId\": 5 } }","handlingStrategy":"validation","validationCode":"// ensure the grab carries enough metadata to resolve the series\nbool hasResolution = release.SearchInfo?.EpisodeId.HasValue == true\n                  || release.SearchInfo?.SeriesId.HasValue == true\n                  || release.Override?.SeriesId != null;\nif (!hasResolution)\n    throw new ArgumentException(\"Provide SearchInfo.EpisodeId or SeriesId (or Override.SeriesId) so the release can be resolved\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always include SearchInfo (EpisodeId or SeriesId) when grabbing an unmatched release","Use the Override block to specify the series explicitly","Add the series to Sonarr before grabbing if it isn't imported yet"],"tags":["release","http-404","override","series-matching","missing-data"],"backgroundTag":null,"analyzedSha":"da2284d7eaab22ed9b2ca698af690148d691e967","analyzedAt":"2026-08-13T15:53:02.562Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}