API V3 Health wikiUrl returns string instead of HttpUri object #5484

Closed
opened 2026-02-20 06:13:42 -05:00 by deekerman · 1 comment
Owner

Originally created by @edoren on GitHub (Mar 31, 2025).

Is there an existing issue for this?

  • I have searched the existing open and closed issues

Current Behavior

When calling the api/v3/health the values of the wikiUrl is supposed to be a object of type HttpUri, but instead it returns a string:

[
    {
        "source": "DownloadClientCheck",
        "type": "error",
        "message": "Unable to communicate with qBittorrent. Connection refused (localhost:5080)",
        "wikiUrl": "https://wiki.servarr.com/sonarr/system#unable-to-communicate-with-download-client"
    },
    {
        "source": "DownloadClientStatusCheck",
        "type": "error",
        "message": "All download clients are unavailable due to failures",
        "wikiUrl": "https://wiki.servarr.com/sonarr/system#download-clients-are-unavailable-due-to-failures"
    }
]

Expected Behavior

[
    {
        "source": "DownloadClientCheck",
        "type": "error",
        "message": "Unable to communicate with qBittorrent. Connection refused (localhost:5080)",
        "wikiUrl": {
            "fullUri": "https://wiki.servarr.com/sonarr/system#unable-to-communicate-with-download-client",
            "scheme": "https",
            "host": "wiki.servarr.com",
            "port": 443,
            "path": "sonarr/system",
            "query": "",
            "fragment": "#unable-to-communicate-with-download-client"
        }
    },
    {
        "source": "DownloadClientStatusCheck",
        "type": "error",
        "message": "All download clients are unavailable due to failures",
        "wikiUrl": {
            "fullUri": "https://wiki.servarr.com/sonarr/system#download-clients-are-unavailable-due-to-failures",
            "scheme": "https",
            "host": "wiki.servarr.com",
            "port": 443,
            "path": "sonarr/system",
            "query": "",
            "fragment": "#download-clients-are-unavailable-due-to-failures"
        }
    }
]

Or better change the wikiUrl to be:

"wikiUrl": {
    "type": "string",
    "nullable": true
} 

I can do this change as it seems to be an easier one but I want to discuss it first.

Steps To Reproduce

  1. Setup a Sonarr instance with a Torrent client
  2. Stop the Torrent client -> This should trigger the Health error
  3. GET the api/v3/health

Environment

- OS: Ubuntu 22.04
- Sonarr: 4.0.14
- Docker Install: Yes
- Using Reverse Proxy: Yes
- Browser: All
- Database: Sqlite

What branch are you running?

Main

Trace Logs?

2025-04-01 00:53:00.5|Trace|HealthCheckService|Check health <- ServerSideNotificationService
2025-04-01 00:53:00.5|Trace|HealthCheckService|Check health -> ApiKeyValidationCheck
2025-04-01 00:53:00.5|Trace|HealthCheckService|Check health <- ApiKeyValidationCheck
2025-04-01 00:53:00.5|Trace|HealthCheckService|Check health -> AppDataLocationCheck
2025-04-01 00:53:00.5|Trace|HealthCheckService|Check health <- AppDataLocationCheck
2025-04-01 00:53:00.5|Trace|HealthCheckService|Check health -> DownloadClientCheck
2025-04-01 00:53:00.5|Trace|HttpClient|Req: [GET] http://localhost:5080/api/v2/app/webapiVersion
2025-04-01 00:53:00.5|Trace|ConfigService|Using default config value for 'proxyenabled' defaultValue:'False'
2025-04-01 00:53:00.5|Debug|DownloadClientCheck|Unable to communicate with qBittorrent

[v4.0.14.2939] System.Net.Http.HttpRequestException: Connection refused (localhost:5080)
 ---> System.Net.Sockets.SocketException (111): Connection refused
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
   at System.Net.Sockets.Socket.<ConnectAsync>g__WaitForConnectWithCancellation|277_0(AwaitableSocketAsyncEventArgs saea, ValueTask connectTask, CancellationToken cancellationToken)
   at NzbDrone.Common.Http.Dispatchers.ManagedHttpDispatcher.attemptConnection(AddressFamily addressFamily, SocketsHttpConnectionContext context, CancellationToken cancellationToken) in ./Sonarr.Common/Http/Dispatchers/ManagedHttpDispatcher.cs:line 327
   at NzbDrone.Common.Http.Dispatchers.ManagedHttpDispatcher.onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken) in ./Sonarr.Common/Http/Dispatchers/ManagedHttpDispatcher.cs:line 313
   at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(HttpRequestMessage request)
   at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.GetHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.AuthenticationHelper.SendWithAuthAsync(HttpRequestMessage request, Uri authUri, Boolean async, ICredentials credentials, Boolean preAuthenticate, Boolean isProxyAuth, Boolean doRequestAuth, HttpConnectionPool pool, CancellationToken cancellationToken)
   at System.Net.Http.DecompressionHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
   at NzbDrone.Common.Http.Dispatchers.ManagedHttpDispatcher.GetResponseAsync(HttpRequest request, CookieContainer cookies) in ./Sonarr.Common/Http/Dispatchers/ManagedHttpDispatcher.cs:line 115
   at NzbDrone.Common.Http.HttpClient.ExecuteRequestAsync(HttpRequest request, CookieContainer cookieContainer) in ./Sonarr.Common/Http/HttpClient.cs:line 157
   at NzbDrone.Common.Http.HttpClient.ExecuteAsync(HttpRequest request) in ./Sonarr.Common/Http/HttpClient.cs:line 70
   at NzbDrone.Common.Http.HttpClient.Execute(HttpRequest request) in ./Sonarr.Common/Http/HttpClient.cs:line 128
   at NzbDrone.Core.Download.Clients.QBittorrent.QBittorrentProxyV2.IsApiSupported(QBittorrentSettings settings) in ./Sonarr.Core/Download/Clients/QBittorrent/QBittorrentProxyV2.cs:line 36
   at NzbDrone.Core.Download.Clients.QBittorrent.QBittorrentProxySelector.FetchProxy(QBittorrentSettings settings) in ./Sonarr.Core/Download/Clients/QBittorrent/QBittorrentProxySelector.cs:line 82
   at NzbDrone.Core.Download.Clients.QBittorrent.QBittorrentProxySelector.<>c__DisplayClass7_0.<GetProxyCache>b__0() in ./Sonarr.Core/Download/Clients/QBittorrent/QBittorrentProxySelector.cs:line 77
   at NzbDrone.Common.Cache.Cached`1.Get(String key, Func`1 function, Nullable`1 lifeTime) in ./Sonarr.Common/Cache/Cached.cs:line 98
   at NzbDrone.Core.Download.Clients.QBittorrent.QBittorrentProxySelector.GetProxyCache(QBittorrentSettings settings, Boolean force) in ./Sonarr.Core/Download/Clients/QBittorrent/QBittorrentProxySelector.cs:line 77
   at NzbDrone.Core.Download.Clients.QBittorrent.QBittorrentProxySelector.GetProxy(QBittorrentSettings settings, Boolean force) in ./Sonarr.Core/Download/Clients/QBittorrent/QBittorrentProxySelector.cs:line 60
   at NzbDrone.Core.Download.Clients.QBittorrent.QBittorrent.GetItems() in ./Sonarr.Core/Download/Clients/QBittorrent/QBittorrent.cs:line 220
   at NzbDrone.Core.HealthCheck.Checks.DownloadClientCheck.Check() in ./Sonarr.Core/HealthCheck/Checks/DownloadClientCheck.cs:line 40

2025-04-01 00:53:00.5|Trace|ConfigService|Using default config value for 'uilanguage' defaultValue:'1'
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- DownloadClientCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> DownloadClientRemovesCompletedDownloadsCheck
2025-04-01 00:53:00.6|Debug|DownloadClientProvider|Temporarily ignoring client qBittorrent till 04/01/2025 01:04:49 due to recent failures.
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- DownloadClientRemovesCompletedDownloadsCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> DownloadClientRootFolderCheck
2025-04-01 00:53:00.6|Debug|DownloadClientProvider|Temporarily ignoring client qBittorrent till 04/01/2025 01:04:49 due to recent failures.
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- DownloadClientRootFolderCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> DownloadClientSortingCheck
2025-04-01 00:53:00.6|Debug|DownloadClientProvider|Temporarily ignoring client qBittorrent till 04/01/2025 01:04:49 due to recent failures.
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- DownloadClientSortingCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> DownloadClientStatusCheck
2025-04-01 00:53:00.6|Trace|ConfigService|Using default config value for 'uilanguage' defaultValue:'1'
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- DownloadClientStatusCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> ImportListRootFolderCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- ImportListRootFolderCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> ImportListStatusCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- ImportListStatusCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> ImportMechanismCheck
2025-04-01 00:53:00.6|Trace|HttpClient|Req: [GET] http://localhost:5080/api/v2/app/webapiVersion
2025-04-01 00:53:00.6|Trace|ConfigService|Using default config value for 'proxyenabled' defaultValue:'False'
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- ImportMechanismCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> IndexerDownloadClientCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- IndexerDownloadClientCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> IndexerJackettAllCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- IndexerJackettAllCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> IndexerLongTermStatusCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- IndexerLongTermStatusCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> IndexerRssCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- IndexerRssCheck
2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> IndexerSearchCheck
2025-04-01 00:53:00.7|Trace|HealthCheckService|Check health <- IndexerSearchCheck
2025-04-01 00:53:00.7|Trace|HealthCheckService|Check health -> IndexerStatusCheck
2025-04-01 00:53:00.7|Trace|HealthCheckService|Check health <- IndexerStatusCheck
2025-04-01 00:53:00.7|Trace|HealthCheckService|Check health -> MetadataCheck
2025-04-01 00:53:00.7|Trace|ConfigService|Using default config value for 'uilanguage' defaultValue:'1'
2025-04-01 00:53:00.7|Trace|HealthCheckService|Check health <- MetadataCheck
2025-04-01 00:53:00.7|Trace|HealthCheckService|Check health -> MountCheck
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- MountCheck
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> NotificationStatusCheck
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- NotificationStatusCheck
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> PackageGlobalMessageCheck
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- PackageGlobalMessageCheck
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> ProxyCheck
2025-04-01 00:53:00.8|Trace|ConfigService|Using default config value for 'proxyenabled' defaultValue:'False'
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- ProxyCheck
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> RecyclingBinCheck
2025-04-01 00:53:00.8|Trace|ConfigService|Using default config value for 'recyclebin' defaultValue:''
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- RecyclingBinCheck
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> RemotePathMappingCheck
2025-04-01 00:53:00.8|Debug|DownloadClientProvider|Temporarily ignoring client qBittorrent till 04/01/2025 01:04:49 due to recent failures.
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- RemotePathMappingCheck
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> RemovedSeriesCheck
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- RemovedSeriesCheck
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> RootFolderCheck
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- RootFolderCheck
2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> SystemTimeCheck
2025-04-01 00:53:00.8|Trace|HttpClient|Req: [GET] https://services.sonarr.tv/v1/time
2025-04-01 00:53:00.8|Trace|ConfigService|Using default config value for 'proxyenabled' defaultValue:'False'
2025-04-01 00:53:00.8|Trace|Http|Res: 9 [GET] /api/v3/series/?apikey=(removed) 200.OK (425 ms)
2025-04-01 00:53:00.8|Debug|Api|[GET] /api/v3/series/?apikey=(removed) 200.OK (425 ms)
2025-04-01 00:53:00.9|Trace|HttpClient|Res: HTTP/2.0 [GET] https://services.sonarr.tv/v1/time: 200.OK (46 bytes) (44 ms)
2025-04-01 00:53:00.9|Trace|HealthCheckService|Check health <- SystemTimeCheck
2025-04-01 00:53:00.9|Trace|HealthCheckService|Check health -> UpdateCheck
2025-04-01 00:53:00.9|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: API was successfully authenticated.
2025-04-01 00:53:00.9|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: API was successfully authenticated.
2025-04-01 00:53:00.9|Trace|HttpClient|Req: [GET] https://services.sonarr.tv/v1/update/main?version=4.0.14.2939&os=linuxmusl&arch=X64&runtime=netcore&runtimeVer=6.0.13&dbType=SQLite&includeMajorVersion=True&active=true
2025-04-01 00:53:00.9|Trace|ConfigService|Using default config value for 'proxyenabled' defaultValue:'False'
2025-04-01 00:53:01.0|Trace|CustomFormatCalculationService|Using scene name for release title: The.Magicians.2015.S02E01.1080p.Bluray.x265-HiQVE
2025-04-01 00:53:01.0|Trace|HttpClient|Res: HTTP/2.0 [GET] https://services.sonarr.tv/v1/update/main?version=4.0.14.2939&os=linuxmusl&arch=X64&runtime=netcore&runtimeVer=6.0.13&dbType=SQLite&includeMajorVersion=True&active=true: 200.OK (19 bytes) (42 ms)
2025-04-01 00:53:01.0|Trace|HealthCheckService|Check health <- UpdateCheck
2025-04-01 00:53:01.0|Trace|EventAggregator|Publishing HealthCheckFailedEvent
2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckFailedEvent -> NotificationService
2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckFailedEvent <- NotificationService
2025-04-01 00:53:01.0|Trace|EventAggregator|Publishing HealthCheckFailedEvent
2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckFailedEvent -> NotificationService
2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckFailedEvent <- NotificationService
2025-04-01 00:53:01.0|Trace|EventAggregator|Publishing HealthCheckCompleteEvent
2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckCompleteEvent -> HealthController
2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckCompleteEvent <- HealthController
2025-04-01 00:53:01.0|Trace|EventAggregator|ApplicationStartedEvent <~ HealthCheckService
2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckCompleteEvent ~> NotificationService
2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckCompleteEvent <~ NotificationService
2025-04-01 00:53:01.3|Trace|Http|Req: 12 [POST] /signalr/messages/negotiate?access_token=(removed)&negotiateVersion=1 (from 172.20.0.1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36)
2025-04-01 00:53:01.3|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: SignalR was successfully authenticated.
2025-04-01 00:53:01.3|Trace|Http|Res: 12 [POST] /signalr/messages/negotiate?access_token=(removed)&negotiateVersion=1: 200.OK (1 ms)
2025-04-01 00:53:01.3|Trace|Http|Req: 13 [GET] /signalr/messages?access_token=(removed)&id=q-IOrCzoaIlxalGLORj-dw (from 172.20.0.1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36)
2025-04-01 00:53:01.3|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: SignalR was successfully authenticated.
2025-04-01 00:53:01.3|Trace|Http|Req: 14 [GET] /api/v3/series (from 172.20.0.1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36)
2025-04-01 00:53:01.3|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: API was successfully authenticated.
2025-04-01 00:53:01.3|Trace|Http|Req: 15 [GET] /api/v3/command (from 172.20.0.1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36)
2025-04-01 00:53:01.3|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: API was successfully authenticated.
2025-04-01 00:53:01.3|Trace|Http|Req: 16 [GET] /api/v3/queue/status (from 172.20.0.1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36)
2025-04-01 00:53:01.3|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: API was successfully authenticated.
2025-04-01 00:53:01.3|Trace|Http|Req: 17 [GET] /api/v3/health (from 172.20.0.1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36)
2025-04-01 00:53:01.3|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: API was successfully authenticated.
2025-04-01 00:53:01.3|Trace|CommandQueueManager|Getting all commands
2025-04-01 00:53:01.3|Trace|Http|Res: 17 [GET] /api/v3/health: 200.OK (8 ms)
2025-04-01 00:53:01.3|Debug|Api|[GET] /api/v3/health: 200.OK (8 ms)

Anything else?

No response

Originally created by @edoren on GitHub (Mar 31, 2025). ### Is there an existing issue for this? - [x] I have searched the existing open and closed issues ### Current Behavior When calling the [api/v3/health](https://sonarr.tv/docs/api/#/Health/get_api_v3_health) the values of the wikiUrl is supposed to be a object of type HttpUri, but instead it returns a string: ```json [ { "source": "DownloadClientCheck", "type": "error", "message": "Unable to communicate with qBittorrent. Connection refused (localhost:5080)", "wikiUrl": "https://wiki.servarr.com/sonarr/system#unable-to-communicate-with-download-client" }, { "source": "DownloadClientStatusCheck", "type": "error", "message": "All download clients are unavailable due to failures", "wikiUrl": "https://wiki.servarr.com/sonarr/system#download-clients-are-unavailable-due-to-failures" } ] ``` ### Expected Behavior ```json [ { "source": "DownloadClientCheck", "type": "error", "message": "Unable to communicate with qBittorrent. Connection refused (localhost:5080)", "wikiUrl": { "fullUri": "https://wiki.servarr.com/sonarr/system#unable-to-communicate-with-download-client", "scheme": "https", "host": "wiki.servarr.com", "port": 443, "path": "sonarr/system", "query": "", "fragment": "#unable-to-communicate-with-download-client" } }, { "source": "DownloadClientStatusCheck", "type": "error", "message": "All download clients are unavailable due to failures", "wikiUrl": { "fullUri": "https://wiki.servarr.com/sonarr/system#download-clients-are-unavailable-due-to-failures", "scheme": "https", "host": "wiki.servarr.com", "port": 443, "path": "sonarr/system", "query": "", "fragment": "#download-clients-are-unavailable-due-to-failures" } } ] ``` Or better change the [wikiUrl](https://github.com/Sonarr/Sonarr/blob/640e3e5d441b0f363d3b993f36dae3d22691608c/src/Sonarr.Api.V3/openapi.json#L8865-L8867) to be: ```json "wikiUrl": { "type": "string", "nullable": true } ``` I can do this change as it seems to be an easier one but I want to discuss it first. ### Steps To Reproduce 1. Setup a Sonarr instance with a Torrent client 2. Stop the Torrent client -> This should trigger the Health error 3. GET the `api/v3/health` ### Environment ```markdown - OS: Ubuntu 22.04 - Sonarr: 4.0.14 - Docker Install: Yes - Using Reverse Proxy: Yes - Browser: All - Database: Sqlite ``` ### What branch are you running? Main ### Trace Logs? ``` 2025-04-01 00:53:00.5|Trace|HealthCheckService|Check health <- ServerSideNotificationService 2025-04-01 00:53:00.5|Trace|HealthCheckService|Check health -> ApiKeyValidationCheck 2025-04-01 00:53:00.5|Trace|HealthCheckService|Check health <- ApiKeyValidationCheck 2025-04-01 00:53:00.5|Trace|HealthCheckService|Check health -> AppDataLocationCheck 2025-04-01 00:53:00.5|Trace|HealthCheckService|Check health <- AppDataLocationCheck 2025-04-01 00:53:00.5|Trace|HealthCheckService|Check health -> DownloadClientCheck 2025-04-01 00:53:00.5|Trace|HttpClient|Req: [GET] http://localhost:5080/api/v2/app/webapiVersion 2025-04-01 00:53:00.5|Trace|ConfigService|Using default config value for 'proxyenabled' defaultValue:'False' 2025-04-01 00:53:00.5|Debug|DownloadClientCheck|Unable to communicate with qBittorrent [v4.0.14.2939] System.Net.Http.HttpRequestException: Connection refused (localhost:5080) ---> System.Net.Sockets.SocketException (111): Connection refused at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken) at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token) at System.Net.Sockets.Socket.<ConnectAsync>g__WaitForConnectWithCancellation|277_0(AwaitableSocketAsyncEventArgs saea, ValueTask connectTask, CancellationToken cancellationToken) at NzbDrone.Common.Http.Dispatchers.ManagedHttpDispatcher.attemptConnection(AddressFamily addressFamily, SocketsHttpConnectionContext context, CancellationToken cancellationToken) in ./Sonarr.Common/Http/Dispatchers/ManagedHttpDispatcher.cs:line 327 at NzbDrone.Common.Http.Dispatchers.ManagedHttpDispatcher.onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken) in ./Sonarr.Common/Http/Dispatchers/ManagedHttpDispatcher.cs:line 313 at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken) --- End of inner exception stack trace --- at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(HttpRequestMessage request) at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.GetHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken) at System.Net.Http.AuthenticationHelper.SendWithAuthAsync(HttpRequestMessage request, Uri authUri, Boolean async, ICredentials credentials, Boolean preAuthenticate, Boolean isProxyAuth, Boolean doRequestAuth, HttpConnectionPool pool, CancellationToken cancellationToken) at System.Net.Http.DecompressionHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken) at NzbDrone.Common.Http.Dispatchers.ManagedHttpDispatcher.GetResponseAsync(HttpRequest request, CookieContainer cookies) in ./Sonarr.Common/Http/Dispatchers/ManagedHttpDispatcher.cs:line 115 at NzbDrone.Common.Http.HttpClient.ExecuteRequestAsync(HttpRequest request, CookieContainer cookieContainer) in ./Sonarr.Common/Http/HttpClient.cs:line 157 at NzbDrone.Common.Http.HttpClient.ExecuteAsync(HttpRequest request) in ./Sonarr.Common/Http/HttpClient.cs:line 70 at NzbDrone.Common.Http.HttpClient.Execute(HttpRequest request) in ./Sonarr.Common/Http/HttpClient.cs:line 128 at NzbDrone.Core.Download.Clients.QBittorrent.QBittorrentProxyV2.IsApiSupported(QBittorrentSettings settings) in ./Sonarr.Core/Download/Clients/QBittorrent/QBittorrentProxyV2.cs:line 36 at NzbDrone.Core.Download.Clients.QBittorrent.QBittorrentProxySelector.FetchProxy(QBittorrentSettings settings) in ./Sonarr.Core/Download/Clients/QBittorrent/QBittorrentProxySelector.cs:line 82 at NzbDrone.Core.Download.Clients.QBittorrent.QBittorrentProxySelector.<>c__DisplayClass7_0.<GetProxyCache>b__0() in ./Sonarr.Core/Download/Clients/QBittorrent/QBittorrentProxySelector.cs:line 77 at NzbDrone.Common.Cache.Cached`1.Get(String key, Func`1 function, Nullable`1 lifeTime) in ./Sonarr.Common/Cache/Cached.cs:line 98 at NzbDrone.Core.Download.Clients.QBittorrent.QBittorrentProxySelector.GetProxyCache(QBittorrentSettings settings, Boolean force) in ./Sonarr.Core/Download/Clients/QBittorrent/QBittorrentProxySelector.cs:line 77 at NzbDrone.Core.Download.Clients.QBittorrent.QBittorrentProxySelector.GetProxy(QBittorrentSettings settings, Boolean force) in ./Sonarr.Core/Download/Clients/QBittorrent/QBittorrentProxySelector.cs:line 60 at NzbDrone.Core.Download.Clients.QBittorrent.QBittorrent.GetItems() in ./Sonarr.Core/Download/Clients/QBittorrent/QBittorrent.cs:line 220 at NzbDrone.Core.HealthCheck.Checks.DownloadClientCheck.Check() in ./Sonarr.Core/HealthCheck/Checks/DownloadClientCheck.cs:line 40 2025-04-01 00:53:00.5|Trace|ConfigService|Using default config value for 'uilanguage' defaultValue:'1' 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- DownloadClientCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> DownloadClientRemovesCompletedDownloadsCheck 2025-04-01 00:53:00.6|Debug|DownloadClientProvider|Temporarily ignoring client qBittorrent till 04/01/2025 01:04:49 due to recent failures. 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- DownloadClientRemovesCompletedDownloadsCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> DownloadClientRootFolderCheck 2025-04-01 00:53:00.6|Debug|DownloadClientProvider|Temporarily ignoring client qBittorrent till 04/01/2025 01:04:49 due to recent failures. 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- DownloadClientRootFolderCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> DownloadClientSortingCheck 2025-04-01 00:53:00.6|Debug|DownloadClientProvider|Temporarily ignoring client qBittorrent till 04/01/2025 01:04:49 due to recent failures. 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- DownloadClientSortingCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> DownloadClientStatusCheck 2025-04-01 00:53:00.6|Trace|ConfigService|Using default config value for 'uilanguage' defaultValue:'1' 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- DownloadClientStatusCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> ImportListRootFolderCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- ImportListRootFolderCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> ImportListStatusCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- ImportListStatusCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> ImportMechanismCheck 2025-04-01 00:53:00.6|Trace|HttpClient|Req: [GET] http://localhost:5080/api/v2/app/webapiVersion 2025-04-01 00:53:00.6|Trace|ConfigService|Using default config value for 'proxyenabled' defaultValue:'False' 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- ImportMechanismCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> IndexerDownloadClientCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- IndexerDownloadClientCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> IndexerJackettAllCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- IndexerJackettAllCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> IndexerLongTermStatusCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- IndexerLongTermStatusCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> IndexerRssCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health <- IndexerRssCheck 2025-04-01 00:53:00.6|Trace|HealthCheckService|Check health -> IndexerSearchCheck 2025-04-01 00:53:00.7|Trace|HealthCheckService|Check health <- IndexerSearchCheck 2025-04-01 00:53:00.7|Trace|HealthCheckService|Check health -> IndexerStatusCheck 2025-04-01 00:53:00.7|Trace|HealthCheckService|Check health <- IndexerStatusCheck 2025-04-01 00:53:00.7|Trace|HealthCheckService|Check health -> MetadataCheck 2025-04-01 00:53:00.7|Trace|ConfigService|Using default config value for 'uilanguage' defaultValue:'1' 2025-04-01 00:53:00.7|Trace|HealthCheckService|Check health <- MetadataCheck 2025-04-01 00:53:00.7|Trace|HealthCheckService|Check health -> MountCheck 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- MountCheck 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> NotificationStatusCheck 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- NotificationStatusCheck 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> PackageGlobalMessageCheck 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- PackageGlobalMessageCheck 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> ProxyCheck 2025-04-01 00:53:00.8|Trace|ConfigService|Using default config value for 'proxyenabled' defaultValue:'False' 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- ProxyCheck 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> RecyclingBinCheck 2025-04-01 00:53:00.8|Trace|ConfigService|Using default config value for 'recyclebin' defaultValue:'' 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- RecyclingBinCheck 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> RemotePathMappingCheck 2025-04-01 00:53:00.8|Debug|DownloadClientProvider|Temporarily ignoring client qBittorrent till 04/01/2025 01:04:49 due to recent failures. 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- RemotePathMappingCheck 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> RemovedSeriesCheck 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- RemovedSeriesCheck 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> RootFolderCheck 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health <- RootFolderCheck 2025-04-01 00:53:00.8|Trace|HealthCheckService|Check health -> SystemTimeCheck 2025-04-01 00:53:00.8|Trace|HttpClient|Req: [GET] https://services.sonarr.tv/v1/time 2025-04-01 00:53:00.8|Trace|ConfigService|Using default config value for 'proxyenabled' defaultValue:'False' 2025-04-01 00:53:00.8|Trace|Http|Res: 9 [GET] /api/v3/series/?apikey=(removed) 200.OK (425 ms) 2025-04-01 00:53:00.8|Debug|Api|[GET] /api/v3/series/?apikey=(removed) 200.OK (425 ms) 2025-04-01 00:53:00.9|Trace|HttpClient|Res: HTTP/2.0 [GET] https://services.sonarr.tv/v1/time: 200.OK (46 bytes) (44 ms) 2025-04-01 00:53:00.9|Trace|HealthCheckService|Check health <- SystemTimeCheck 2025-04-01 00:53:00.9|Trace|HealthCheckService|Check health -> UpdateCheck 2025-04-01 00:53:00.9|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: API was successfully authenticated. 2025-04-01 00:53:00.9|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: API was successfully authenticated. 2025-04-01 00:53:00.9|Trace|HttpClient|Req: [GET] https://services.sonarr.tv/v1/update/main?version=4.0.14.2939&os=linuxmusl&arch=X64&runtime=netcore&runtimeVer=6.0.13&dbType=SQLite&includeMajorVersion=True&active=true 2025-04-01 00:53:00.9|Trace|ConfigService|Using default config value for 'proxyenabled' defaultValue:'False' 2025-04-01 00:53:01.0|Trace|CustomFormatCalculationService|Using scene name for release title: The.Magicians.2015.S02E01.1080p.Bluray.x265-HiQVE 2025-04-01 00:53:01.0|Trace|HttpClient|Res: HTTP/2.0 [GET] https://services.sonarr.tv/v1/update/main?version=4.0.14.2939&os=linuxmusl&arch=X64&runtime=netcore&runtimeVer=6.0.13&dbType=SQLite&includeMajorVersion=True&active=true: 200.OK (19 bytes) (42 ms) 2025-04-01 00:53:01.0|Trace|HealthCheckService|Check health <- UpdateCheck 2025-04-01 00:53:01.0|Trace|EventAggregator|Publishing HealthCheckFailedEvent 2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckFailedEvent -> NotificationService 2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckFailedEvent <- NotificationService 2025-04-01 00:53:01.0|Trace|EventAggregator|Publishing HealthCheckFailedEvent 2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckFailedEvent -> NotificationService 2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckFailedEvent <- NotificationService 2025-04-01 00:53:01.0|Trace|EventAggregator|Publishing HealthCheckCompleteEvent 2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckCompleteEvent -> HealthController 2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckCompleteEvent <- HealthController 2025-04-01 00:53:01.0|Trace|EventAggregator|ApplicationStartedEvent <~ HealthCheckService 2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckCompleteEvent ~> NotificationService 2025-04-01 00:53:01.0|Trace|EventAggregator|HealthCheckCompleteEvent <~ NotificationService 2025-04-01 00:53:01.3|Trace|Http|Req: 12 [POST] /signalr/messages/negotiate?access_token=(removed)&negotiateVersion=1 (from 172.20.0.1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36) 2025-04-01 00:53:01.3|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: SignalR was successfully authenticated. 2025-04-01 00:53:01.3|Trace|Http|Res: 12 [POST] /signalr/messages/negotiate?access_token=(removed)&negotiateVersion=1: 200.OK (1 ms) 2025-04-01 00:53:01.3|Trace|Http|Req: 13 [GET] /signalr/messages?access_token=(removed)&id=q-IOrCzoaIlxalGLORj-dw (from 172.20.0.1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36) 2025-04-01 00:53:01.3|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: SignalR was successfully authenticated. 2025-04-01 00:53:01.3|Trace|Http|Req: 14 [GET] /api/v3/series (from 172.20.0.1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36) 2025-04-01 00:53:01.3|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: API was successfully authenticated. 2025-04-01 00:53:01.3|Trace|Http|Req: 15 [GET] /api/v3/command (from 172.20.0.1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36) 2025-04-01 00:53:01.3|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: API was successfully authenticated. 2025-04-01 00:53:01.3|Trace|Http|Req: 16 [GET] /api/v3/queue/status (from 172.20.0.1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36) 2025-04-01 00:53:01.3|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: API was successfully authenticated. 2025-04-01 00:53:01.3|Trace|Http|Req: 17 [GET] /api/v3/health (from 172.20.0.1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36) 2025-04-01 00:53:01.3|Debug|Sonarr.Http.Authentication.ApiKeyAuthenticationHandler|AuthenticationScheme: API was successfully authenticated. 2025-04-01 00:53:01.3|Trace|CommandQueueManager|Getting all commands 2025-04-01 00:53:01.3|Trace|Http|Res: 17 [GET] /api/v3/health: 200.OK (8 ms) 2025-04-01 00:53:01.3|Debug|Api|[GET] /api/v3/health: 200.OK (8 ms) ``` ### Anything else? _No response_
deekerman 2026-02-20 06:13:42 -05:00
  • closed this issue
  • added the
    docs
    label
Author
Owner

@markus101 commented on GitHub (Mar 31, 2025):

The API docs are incorrect in this case, wikiUrl should be a string.

@markus101 commented on GitHub (Mar 31, 2025): The API docs are incorrect in this case, `wikiUrl` should be a string.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/Sonarr#5484
No description provided.