{"record":{"id":"f498ceb160e738c7","repo":"AdguardTeam/AdGuardHome","slug":"validating-blocked-services-w","errorCode":null,"errorMessage":"validating blocked services: %w","messagePattern":"validating blocked services: %w","errorType":"validation","errorClass":null,"httpStatus":400,"severity":"error","filePath":"internal/home/clientshttp.go","lineNumber":289,"sourceCode":"\tprev *client.Persistent,\n) (svcs *filtering.BlockedServices, err error) {\n\tvar weekly *schedule.Weekly\n\tif sch != nil {\n\t\tweekly = sch.Clone()\n\t} else if prev != nil {\n\t\tweekly = prev.BlockedServices.Schedule.Clone()\n\t} else {\n\t\tweekly = schedule.EmptyWeekly()\n\t}\n\n\tsvcs = &filtering.BlockedServices{\n\t\tSchedule: weekly,\n\t\tIDs:      svcStrs,\n\t}\n\n\terr = svcs.Validate()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"validating blocked services: %w\", err)\n\t}\n\n\treturn svcs, nil\n}\n\n// clientToJSON converts persistent client object to JSON object.\nfunc clientToJSON(c *client.Persistent) (cj *clientJSON) {\n\t// TODO(d.kolyshev): Remove after cleaning the deprecated\n\t// [clientJSON.SafeSearchEnabled] field.\n\tcloneVal := c.SafeSearchConf\n\tsafeSearchConf := &cloneVal\n\n\treturn &clientJSON{\n\t\tName:                c.Name,\n\t\tIDs:                 c.Identifiers(),\n\t\tTags:                c.Tags,\n\t\tUseGlobalSettings:   !c.UseOwnSettings,\n\t\tFilteringEnabled:    c.FilteringEnabled,","sourceCodeStart":271,"sourceCodeEnd":307,"githubUrl":"https://github.com/AdguardTeam/AdGuardHome/blob/b41aefbe51c8dde65e2c50f093996afa0502edf9/internal/home/clientshttp.go#L271-L307","documentation":"copyBlockedServices could not validate the blocked-services set built from the request: unknown IDs or an invalid weekly schedule. This is the underlying validation behind client update errors.","triggerScenarios":"A blocked-services payload where svcs.Validate() fails: service IDs not in the known set, or schedule with invalid time ranges/days.","commonSituations":"Sending service IDs from a different AdGuard Home version, typos in IDs, or schedule JSON with hours outside 0-23 / malformed ranges.","solutions":["Use only IDs returned by the blocked-services list endpoint","Validate the schedule format (weekly ranges with valid start/end times) client-side","Re-check payloads after upgrading AdGuard Home since service sets change between versions"],"exampleFix":"// before: schedule hour 25\n{\"day\":0,\"start\":25,\"end\":26}\n// after\n{\"day\":0,\"start\":0,\"end\":1}","handlingStrategy":"validation","validationCode":"// Validate schedule ranges before sending\nfor _, r := range schedule {\n    if r.Start < 0 || r.End > 24*60 || r.Start >= r.End { return fmt.Errorf(\"bad range\") }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Mirror the server's weekly-schedule schema in client types","Re-fetch service ID lists after every server upgrade"],"tags":["blocked-services","validation","schedule"],"backgroundTag":"schema-validation-failed","analyzedSha":"b41aefbe51c8dde65e2c50f093996afa0502edf9","analyzedAt":"2026-08-27T04:57:55.097Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}