{"record":{"id":"992ce8435a8dc540","repo":"Sonarr/Sonarr","slug":"getting-release-from-indexer-failed-ex-message","errorCode":null,"errorMessage":"Getting release from indexer failed: {ex.Message}","messagePattern":"Getting release from indexer failed: (.+?)","errorType":"http","errorClass":"NzbDroneClientException","httpStatus":409,"severity":"error","filePath":"src/Sonarr.Api.V3/Indexers/ReleaseController.cs","lineNumber":165,"sourceCode":"                        var episode = _episodeService.GetEpisode(release.EpisodeId.Value);\n\n                        episodes = new List<Episode> { episode };\n                    }\n\n                    remoteEpisode.Episodes = episodes;\n                }\n\n                if (remoteEpisode.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                await _downloadService.DownloadReport(remoteEpisode, release.DownloadClientId);\n            }\n            catch (ReleaseDownloadException ex)\n            {\n                _logger.Error(ex, ex.Message);\n                throw new NzbDroneClientException(HttpStatusCode.Conflict, $\"Getting release from indexer failed: {ex.Message}\");\n            }\n\n            return release;\n        }\n\n        [HttpGet]\n        [Produces(\"application/json\")]\n        public async Task<List<ReleaseResource>> GetReleases(int? seriesId, int? episodeId, int? seasonNumber)\n        {\n            if (episodeId.HasValue)\n            {\n                return await GetEpisodeReleases(episodeId.Value);\n            }\n\n            if (seriesId.HasValue && seasonNumber.HasValue)\n            {\n                return await GetSeasonReleases(seriesId.Value, seasonNumber.Value);\n            }","sourceCodeStart":147,"sourceCodeEnd":183,"githubUrl":"https://github.com/Sonarr/Sonarr/blob/da2284d7eaab22ed9b2ca698af690148d691e967/src/Sonarr.Api.V3/Indexers/ReleaseController.cs#L147-L183","documentation":"Returned inside POST /api/v3/release when _downloadService.DownloadReport throws a ReleaseDownloadException — the indexer/download-client interaction itself failed after episode resolution succeeded. Sonarr catches it, logs at Error, and re-throws as NzbDroneClientException Conflict (409) with the original message interpolated. The {ex.Message} is replaced at runtime with the underlying cause.","triggerScenarios":"DownloadRelease gets past episode resolution but the actual download request to the indexer/client errors: indexer returns an error, the download client rejects the report, magnet/URL is invalid, or the indexer is offline.","commonSituations":"Indexer rate-limit or auth failure; download client connection lost; release URL expired or 404 on the indexer; unsupported protocol by the configured client.","solutions":["Read the interpolated ex.Message in the response body — it carries the root cause.","Verify the indexer is healthy and authenticated (Settings > Indexers).","Verify the download client is connected and has space (Settings > Download Clients).","Retry the search to get a fresh release and re-attempt the download."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  const res = await fetch('/api/v3/release', { method:'POST', body: JSON.stringify(release) });\n  if (res.status === 409) { const body = await res.json(); console.error('indexer error:', body.message); }\n} catch (e) { /* transport error */ }","preventionTips":["Surface the 409 body's message to the user — it names the indexer/client fault.","Keep indexers and download clients healthy and tested in Settings."],"tags":["api","release","download","indexer","conflict"],"backgroundTag":null,"analyzedSha":"da2284d7eaab22ed9b2ca698af690148d691e967","analyzedAt":"2026-08-13T15:53:02.562Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}