RocketChat/Rocket.Chat · error · Error
The "start" and "end" query parameters must be less than 1 y
Error message
The "start" and "end" query parameters must be less than 1 year apart.
What it means
checkDates rejects dashboard report ranges whose day-level difference exceeds 1.01 years (moment(end).startOf('day').diff(moment(start).startOf('day'), 'year', true) > 1.01; the 1.01 tolerance absorbs leap days, per the code comment). These cached dashboard endpoints only serve windows of roughly one year.
Source
Thrown at apps/meteor/ee/server/api/v1/omnichannel/reports.ts:25
findAllConversationsByStatusCached,
findAllConversationsByDepartmentCached,
findAllConversationsByTagsCached,
findAllConversationsByAgentsCached,
} from './lib/dashboards';
import { API } from '../../../../../server/api';
import { restrictQuery } from '../../../lib/omnichannel/restrictQuery';
const checkDates = (start: Moment, end: Moment) => {
if (!start.isValid()) {
throw new Error('The "start" query parameter must be a valid date.');
}
if (!end.isValid()) {
throw new Error('The "end" query parameter must be a valid date.');
}
// Check dates are no more than 1 year apart using moment
// 1.01 === "we allow to pass year by some hours/days"
if (moment(end).startOf('day').diff(moment(start).startOf('day'), 'year', true) > 1.01) {
throw new Error('The "start" and "end" query parameters must be less than 1 year apart.');
}
if (start.isAfter(end)) {
throw new Error('The "start" query parameter must be before the "end" query parameter.');
}
};
API.v1.addRoute(
'livechat/analytics/dashboards/conversations-by-source',
{
authRequired: true,
permissionsRequired: ['view-livechat-reports'],
validateParams: isGETDashboardConversationsByType,
license: ['livechat-enterprise'],
},
{
async get() {
const { start, end } = this.queryParams;View on GitHub (pinned to b2c16d5842)
Solutions
- Split the request into consecutive windows of at most 1 year and merge results client-side.
- Clamp start to end minus 1 year when a rolling window is acceptable.
- Keep start/end within the same or adjacent years for the built-in dashboards.
Example fix
// before
const res = await api.get(url, { params: { start: '2021-01-01', end: '2024-01-01' } });
// after
const windows = splitByYear('2021-01-01', '2024-01-01'); // chunks of <= 1 year
const res = (await Promise.all(windows.map(({ start, end }) => api.get(url, { params: { start, end } }))))
.flatMap((r) => r.items ?? []); Defensive patterns
Strategy: validation
Validate before calling
const startM = moment(start).startOf('day');
const endM = moment(end).startOf('day');
if (endM.diff(startM, 'year', true) > 1.01) {
throw new Error('Range too wide: split into windows of at most 1 year');
}
await api.get(url, { params: { start, end } }); Prevention
- Mirror the server rule client-side: day-level diff in years must be <= 1.01.
- Build report clients that page through time in <= 1-year windows.
- Don't offer 'all time' options that map to a single request.
When it happens
Trigger: GET .../conversations-by-source?start=2020-01-01&end=2024-01-01 — any range longer than about one year plus a few days fails this check.
Common situations: Year-over-year or 'all time' dashboards feeding the endpoint directly; a default end=now() paired with a fixed historical start; annual reports requested in a single call.
Related errors
- The "start" query parameter must be a valid date.
- The "end" query parameter must be a valid date.
- The "start" query parameter must be before the "end" query p
- error-duplicate-priority-name
- error-room-does-not-exist
AI-assisted analysis of RocketChat/Rocket.Chat@b2c16d5842 (2026-08-18).
Data as JSON: /api/errors/ce60b865e140c358.
Report an issue: GitHub.