{"record":{"id":"6583940c6666f748","repo":"SigNoz/signoz","slug":"public-dashboard-invalid-input","errorCode":"public_dashboard_invalid_input","errorMessage":"invalid startTime","messagePattern":"invalid startTime","errorType":"validation","errorClass":null,"httpStatus":400,"severity":"error","filePath":"pkg/types/dashboardtypes/public_dashboard.go","lineNumber":223,"sourceCode":"\nfunc (typ *PublicDashboard) Update(timeRangeEnabled bool, defaultTimeRange string) {\n\ttyp.TimeRangeEnabled = timeRangeEnabled\n\ttyp.DefaultTimeRange = defaultTimeRange\n\ttyp.UpdatedAt = time.Now()\n}\n\nfunc (typ *PublicDashboard) PublicPath() string {\n\treturn \"/public/dashboard/\" + typ.ID.StringValue()\n}\n\n// ResolveTimeRange returns the [start, end] window in epoch millis for a public\n// widget/panel query: the caller-supplied range when the dashboard allows it,\n// otherwise now minus the configured default range.\nfunc (typ *PublicDashboard) ResolveTimeRange(startTimeRaw, endTimeRaw string) (uint64, uint64, error) {\n\tif typ.TimeRangeEnabled {\n\t\tstartTime, err := strconv.ParseUint(startTimeRaw, 10, 64)\n\t\tif err != nil {\n\t\t\treturn 0, 0, errors.New(errors.TypeInvalidInput, ErrCodePublicDashboardInvalidInput, \"invalid startTime\")\n\t\t}\n\t\tendTime, err := strconv.ParseUint(endTimeRaw, 10, 64)\n\t\tif err != nil {\n\t\t\treturn 0, 0, errors.New(errors.TypeInvalidInput, ErrCodePublicDashboardInvalidInput, \"invalid endTime\")\n\t\t}\n\t\treturn startTime, endTime, nil\n\t}\n\n\ttimeRange, err := time.ParseDuration(typ.DefaultTimeRange)\n\tif err != nil {\n\t\treturn 0, 0, errors.WrapInternalf(err, errors.CodeInternal, \"stored defaultTimeRange %q is not a valid duration\", typ.DefaultTimeRange)\n\t}\n\tnow := time.Now()\n\treturn uint64(now.Add(-timeRange).UnixMilli()), uint64(now.UnixMilli()), nil\n}\n\nfunc (typ *PostablePublicDashboard) UnmarshalJSON(data []byte) error {\n\ttype alias PostablePublicDashboard","sourceCodeStart":205,"sourceCodeEnd":241,"githubUrl":"https://github.com/SigNoz/signoz/blob/5069bf80b08f1f00d7e014eccc09902f9871004f/pkg/types/dashboardtypes/public_dashboard.go#L205-L241","documentation":"PublicDashboard.ResolveTimeRange, when TimeRangeEnabled, parses startTimeRaw with strconv.ParseUint(base 10, 64-bit). A missing, non-numeric, negative, or overflowing start timestamp yields 'invalid startTime'. Values are epoch seconds as unsigned integers.","triggerScenarios":"Calling the public dashboard widget range API with startTime absent, a float (1712345678.5), an ISO date string, or a value > 2^64-1 while the dashboard has time range selection enabled.","commonSituations":"Frontends sending ISO 8601 or milliseconds where seconds are expected; URL encoding issues dropping the param; new public dashboards enabling time range after launch.","solutions":["Send startTime as epoch seconds in decimal (e.g. 1712345678)","Verify the query param name and that it's actually included in the URL","Convert ISO dates: Math.floor(Date.parse(iso)/1000)","Guard against NaN/negative values before building the URL"],"exampleFix":"// before\n?startTime=2024-04-05T00:00:00Z\n// after\n?startTime=1712275200\n","handlingStrategy":"validation","validationCode":"if (!/^\\d{1,19}$/.test(String(startTime))) throw new Error('startTime must be epoch seconds');","typeGuard":"function isEpochSeconds(v: string): boolean { return /^\\d{1,19}$/.test(v); }","tryCatchPattern":null,"preventionTips":["Always convert dates to epoch seconds","Centralize URL building for public dashboard queries"],"tags":["dashboard","public-dashboard","time-range","validation","go"],"backgroundTag":"invalid-timestamp-format","analyzedSha":"5069bf80b08f1f00d7e014eccc09902f9871004f","analyzedAt":"2026-08-28T06:22:12.824Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}