RocketChat/Rocket.Chat · error · Error

The " .end" query parameter must be a valid date.

Error message

The "${property}.end" query parameter must be a valid date.

What it means

Thrown by GET /api/v1/livechat/rooms when the JSON-encoded date-range query parameter's end value fails Date.parse (NaN). Same mechanism as the .start variant, but for the upper bound of the created/closed range; the message names the failing property so .end failures are distinguishable from .start failures.

Solutions

  1. Compute end via toISOString() from a validated Date; omit end entirely for open-ended ranges instead of sending a sentinel
  2. Client-side guard: only include start/end keys whose Date.parse is finite
  3. URL-encode the whole JSON payload with encodeURIComponent

Example fix

// before
const range = { start: '2024-12-01', end: endDate ?? '' }; // '' → sent → NaN
const q = `closed=${JSON.stringify(range)}`;

// after
const range = { start: '2024-12-01' };
if (endDate instanceof Date && !Number.isNaN(endDate.getTime())) range.end = endDate.toISOString();
const q = `closed=${encodeURIComponent(JSON.stringify(range))}`;
Defensive patterns

Strategy: validation

Validate before calling

const range = { start: startISO };
if (endDate instanceof Date && !Number.isNaN(endDate.getTime())) {
  range.end = endDate.toISOString(); // omit entirely when unavailable
}
const q = `closed=${encodeURIComponent(JSON.stringify(range))}`;

Type guard

function isValidRangeValue(v) {
  return typeof v === 'string' && v.length > 0 && !Number.isNaN(Date.parse(v));
}

Prevention

When it happens

Trigger: created/closed object where end is an unparseable string ('2024-02-31', 'tomorrow', '2024-13-01T00:00:00Z'), end computed from an invalid client-side Date, or range JSON mangled by missing URL-encoding so the end value arrives truncated.

Common situations: Open-ended pickers defaulting end to '' or null that then gets stringified; timezone suffix typos; date pickers emitting locale order (mm/dd vs dd/mm confusion silently shifts or invalidates dates).

Related errors


AI-assisted analysis of RocketChat/Rocket.Chat@b2c16d5842 (2026-08-18). Data as JSON: /api/errors/5ca93d50f504d3d2. Report an issue: GitHub.

Appendix: source

Thrown at apps/meteor/server/api/v1/omnichannel/rooms.ts:19

import { LivechatRooms } from '@rocket.chat/models';
import { isGETLivechatRoomsParams } from '@rocket.chat/rest-typings';

import { API } from '../..';
import { findRooms } from './lib/rooms';
import { hasPermissionAsync } from '../../../lib/authorization/hasPermission';
import { getPaginationItems } from '../../lib/getPaginationItems';

const validateDateParams = (property: string, date?: string) => {
	let parsedDate: { start?: string; end?: string } | undefined = undefined;
	if (date) {
		parsedDate = JSON.parse(date) as { start?: string; end?: string };
	}

	if (parsedDate?.start && isNaN(Date.parse(parsedDate.start))) {
		throw new Error(`The "${property}.start" query parameter must be a valid date.`);
	}
	if (parsedDate?.end && isNaN(Date.parse(parsedDate.end))) {
		throw new Error(`The "${property}.end" query parameter must be a valid date.`);
	}
	return parsedDate;
};

const isBoolean = (value?: string | boolean): boolean => value === 'true' || value === 'false' || typeof value === 'boolean';

API.v1.addRoute(
	'livechat/rooms',
	{ authRequired: true, validateParams: isGETLivechatRoomsParams },
	{
		async get() {
			const { offset, count } = await getPaginationItems(this.queryParams);
			const { sort, fields, query } = await this.parseJsonQuery();
			const { agents, departmentId, open, tags, roomName, onhold, queued, units } = this.queryParams;
			const { createdAt, customFields, closedAt } = this.queryParams;

			const createdAtParam = validateDateParams('createdAt', createdAt);
			const closedAtParam = validateDateParams('closedAt', closedAt);

View on GitHub (pinned to b2c16d5842)