{"record":{"id":"d924d3a10c3ba033","repo":"Budibase/budibase","slug":"invalid-limit-query","errorCode":null,"errorMessage":"Invalid limit query","messagePattern":"Invalid limit query","errorType":"http","errorClass":"HTTPError","httpStatus":400,"severity":"warning","filePath":"packages/server/src/api/controllers/ai/agentLogs.ts","lineNumber":48,"sourceCode":"    throw new HTTPError(\"Invalid bookmark query\", 400)\n  }\n\n  const parsedBookmark = Number.parseInt(normalizedBookmark, 10)\n  if (!Number.isFinite(parsedBookmark) || parsedBookmark < 1) {\n    throw new HTTPError(\"Invalid bookmark query\", 400)\n  }\n\n  return String(parsedBookmark)\n}\n\nfunction sanitizeLimitQuery(limit?: string): number | undefined {\n  const normalizedLimit = limit?.trim()\n  if (!normalizedLimit) {\n    return undefined\n  }\n\n  if (!/^\\d+$/.test(normalizedLimit)) {\n    throw new HTTPError(\"Invalid limit query\", 400)\n  }\n\n  const parsedLimit = Number.parseInt(normalizedLimit, 10)\n  if (parsedLimit < 1 || parsedLimit > 100) {\n    throw new HTTPError(\"Limit query must be between 1 and 100\", 400)\n  }\n\n  return parsedLimit\n}\n\nfunction sanitizeDateQuery(\n  value: string | undefined,\n  queryName: \"startDate\" | \"endDate\"\n): string | undefined {\n  const normalizedValue = value?.trim()\n  if (!normalizedValue) {\n    return undefined\n  }","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/Budibase/budibase/blob/a81a902e9a8fe55b467d106765f6638f12e35c49/packages/server/src/api/controllers/ai/agentLogs.ts#L30-L66","documentation":"sanitizeLimitQuery rejects a limit query parameter that is not a pure digit string with HTTPError 400 \"Invalid limit query\". The limit controls page size for agent logs and must be a positive integer.","triggerScenarios":"GET agent logs with ?limit=ten, ?limit=1.5, ?limit=-5 or other non-plain-digit strings.","commonSituations":"Client formatting numbers with separators; passing floats; buggy serialization of numeric params.","solutions":["Send limit as a plain integer string (e.g. limit=50)","Coerce client-side number formatting to plain digits","Omit limit to use the default"],"exampleFix":"// before\nfetch(\"/api/ai/agent/logs?limit=1.5\")\n// after\nfetch(\"/api/ai/agent/logs?limit=50\")","handlingStrategy":"validation","validationCode":"const limit = rawLimit?.trim(); if (limit && !/^\\d+$/.test(limit)) throw new Error(\"limit must be a plain integer\")","typeGuard":"const isValidLimit = (v: unknown): v is string => typeof v === \"string\" && /^\\d+$/.test(v.trim())","tryCatchPattern":"try { await api.fetchAgentLogs({ limit }) } catch (e) { if (e.status === 400 && e.message === \"Invalid limit query\") { /* send integer or omit */ } else throw e }","preventionTips":["Serialize limits with String(parseInt(x, 10))","Avoid locale-aware number formatting in query params","Omit limit to use the server default"],"tags":["validation","pagination","http-400"],"backgroundTag":"invalid-query-parameter","analyzedSha":"a81a902e9a8fe55b467d106765f6638f12e35c49","analyzedAt":"2026-08-29T01:03:10.972Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}