{"record":{"id":"1c172c2be3d1bc01","repo":"Jackett/Jackett","slug":"unexpected-response-content-from-indexer-request","errorCode":null,"errorMessage":"Unexpected response content from indexer request: {jsonResponse.Message ?? \"Check the logs for more information.\"}","messagePattern":"Unexpected response content from indexer request: (.+?)","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"src/Jackett.Common/Indexers/Definitions/MyAnonamouse.cs","lineNumber":288,"sourceCode":"            {\n                throw new Exception(response.ContentString);\n            }\n\n            try\n            {\n                var sitelink = new Uri(SiteLink);\n\n                var jsonResponse = JsonConvert.DeserializeObject<MyAnonamouseResponse>(response.ContentString);\n\n                var error = jsonResponse.Error;\n                if (error.IsNotNullOrWhiteSpace() && error.StartsWithIgnoreCase(\"Nothing returned, out of\"))\n                {\n                    return releases;\n                }\n\n                if (jsonResponse.Data == null)\n                {\n                    throw new Exception($\"Unexpected response content from indexer request: {jsonResponse.Message ?? \"Check the logs for more information.\"}\");\n                }\n\n                foreach (var item in jsonResponse.Data)\n                {\n                    var id = item.Id;\n                    var details = new Uri(sitelink, $\"/t/{id}\");\n\n                    var isFreeLeech = item.Free || item.PersonalFreeLeech;\n\n                    var release = new ReleaseInfo\n                    {\n                        Guid = details,\n                        Title = item.Title.Trim(),\n                        Description = item.Description.Trim(),\n                        Link = GetDownloadUrl(id),\n                        Details = details,\n                        Category = MapTrackerCatToNewznab(item.Category),\n                        PublishDate = DateTime.ParseExact(item.Added, \"yyyy-MM-dd HH:mm:ss\", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToLocalTime(),","sourceCodeStart":270,"sourceCodeEnd":306,"githubUrl":"https://github.com/Jackett/Jackett/blob/adff1941476d8057a430cf55360356c1d23e971e/src/Jackett.Common/Indexers/Definitions/MyAnonamouse.cs#L270-L306","documentation":"Thrown by MyAnonamouse.PerformQuery when the JSON deserialized successfully but jsonResponse.Data is null, and the response is not the benign 'Nothing returned, out of' sentinel (which returns an empty list normally). This is the structured application-error path: MyAnonamouse returned valid JSON with an error/rate-limit condition, surfacing jsonResponse.Message (or a fallback log hint) as the exception text.","triggerScenarios":"The search JSON parses into MyAnonamouseResponse, but Data is null while Error does not start with 'Nothing returned, out of'. The code throws with jsonResponse.Message if present, else a 'Check the logs' fallback. Typical of API rate-limit responses or permission errors returned as structured JSON.","commonSituations":"Rate-limit JSON response (Data null, Message describes the limit); account permission error; the search exceeded allowed pagination (the 'out of' case is handled, but other limit messages are not); API version returning a new error envelope.","solutions":["Read jsonResponse.Message in the exception — it states the API's reason (rate limit, permission, etc.).","If rate-limited, reduce Jackett query frequency and offset/limit parameters.","If permission-related, verify the account standing on MyAnonamouse.","Retry after the rate-limit window expires."],"exampleFix":"// before\nif (jsonResponse.Data == null)\n{\n    throw new Exception($\"Unexpected response content from indexer request: {jsonResponse.Message ?? \"Check the logs for more information.\"}\");\n}\n\n// after — distinguish rate-limit (retryable) from hard errors\nif (jsonResponse.Data == null)\n{\n    var msg = jsonResponse.Message ?? \"unknown\";\n    if (msg.ContainsIgnoreCase(\"rate\") || msg.ContainsIgnoreCase(\"limit\"))\n        throw new Exception($\"MyAnonamouse rate limit: {msg}\");\n    throw new Exception($\"Unexpected MyAnonamouse response: {msg}\");\n}","handlingStrategy":"try-catch","validationCode":"// Inspect jsonResponse fields before the null-Data throw\nif (jsonResponse.Data == null && jsonResponse.Message.IsNotNullOrWhiteSpace())\n    logger.Warn(\"MyAnonamouse returned structured message: {0}\", jsonResponse.Message);","typeGuard":"private static bool IsRateLimitMessage(string msg) =>\n    msg != null && (msg.ContainsIgnoreCase(\"rate\") || msg.ContainsIgnoreCase(\"limit\"));","tryCatchPattern":"if (jsonResponse.Data == null)\n{\n    if (IsRateLimitMessage(jsonResponse.Message))\n        throw new Exception($\"MyAnonamouse rate limit: {jsonResponse.Message}\"); // retryable upstream\n    throw new Exception($\"Unexpected MyAnonamouse response: {jsonResponse.Message ?? \"Check logs\"}\");\n}","preventionTips":["Read jsonResponse.Message to distinguish rate-limit from permission errors.","Back off search frequency when rate-limit messages appear.","Verify account permissions if non-rate-limit messages recur."],"tags":["myanonamouse","api-error","rate-limit","json-response","permissions"],"backgroundTag":null,"analyzedSha":"adff1941476d8057a430cf55360356c1d23e971e","analyzedAt":"2026-08-13T15:06:32.872Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}