Sonarr/Sonarr · error · NzbDroneClientException

Unable to find matching series and episodes, will need to be

Error message

Unable to find matching series and episodes, will need to be manually provided

What it means

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.

Source

Thrown at src/Sonarr.Api.V5/Release/ReleaseController.cs:157

                    remoteEpisode.Series = _seriesService.GetSeries(episode.SeriesId);
                    remoteEpisode.Episodes = new List<Episode> { episode };
                }
                else if (release.SearchInfo?.SeriesId.HasValue == true)
                {
                    var series = _seriesService.GetSeries(release.SearchInfo.SeriesId.Value);
                    var episodes = _parsingService.GetEpisodes(remoteEpisode.ParsedEpisodeInfo, series, true);

                    if (episodes.Empty())
                    {
                        throw new NzbDroneClientException(HttpStatusCode.NotFound, "Unable to parse episodes in the release, will need to be manually provided");
                    }

                    remoteEpisode.Series = series;
                    remoteEpisode.Episodes = episodes;
                }
                else
                {
                    throw new NzbDroneClientException(HttpStatusCode.NotFound, "Unable to find matching series and episodes, will need to be manually provided");
                }
            }
            else if (remoteEpisode.Episodes.Empty())
            {
                var episodes = _parsingService.GetEpisodes(remoteEpisode.ParsedEpisodeInfo, remoteEpisode.Series, true);

                if (episodes.Empty() && release.SearchInfo?.EpisodeId.HasValue == true)
                {
                    var episode = _episodeService.GetEpisode(release.SearchInfo.EpisodeId.Value);

                    episodes = new List<Episode> { episode };
                }

                remoteEpisode.Episodes = episodes;
            }

            if (remoteEpisode.Episodes.Empty())
            {

View on GitHub (pinned to da2284d7ea)

Solutions

  1. Include SearchInfo with at least EpisodeId or SeriesId in the grab request
  2. Use the Override block to specify SeriesId (and preferably EpisodeIds)
  3. If the series genuinely isn't in Sonarr, add it first, then re-search and grab

Example fix

// before — no series resolution metadata
{ "guid": "..." }

// after — supply search info
{ "guid": "...", "searchInfo": { "seriesId": 5 } }
Defensive patterns

Strategy: validation

Validate before calling

// ensure the grab carries enough metadata to resolve the series
bool hasResolution = release.SearchInfo?.EpisodeId.HasValue == true
                  || release.SearchInfo?.SeriesId.HasValue == true
                  || release.Override?.SeriesId != null;
if (!hasResolution)
    throw new ArgumentException("Provide SearchInfo.EpisodeId or SeriesId (or Override.SeriesId) so the release can be resolved");

Prevention

When it happens

Trigger: POST /api/v5/release for a cached release whose RemoteEpisode.Series is null, with no SearchInfo block (or SearchInfo lacking both EpisodeId and SeriesId).

Common situations: 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.

Related errors


AI-assisted analysis of Sonarr/Sonarr@da2284d7ea (2026-08-13). Data as JSON: /api/errors/0867dd10829f70c5. Report an issue: GitHub.