RocketChat/Rocket.Chat · error · Error

invalid-message

Error message

invalid-message

What it means

Thrown by GET /livechat/message/:_id (message.ts:102-105) when Messages.findOneByRoomIdAndMessageId(rid, _id) returns null — no message with that `_id` exists in room `rid`. The lookup is scoped by room, so a messageId that exists in another room still yields null. Returns HTTP 400 { success:false, error:'invalid-message' }.

Source

Thrown at apps/meteor/server/api/v1/omnichannel/message.ts:104

	{ validateParams: { GET: isGETLivechatMessageIdParams, PUT: isPUTLivechatMessageIdParams, DELETE: isDELETELivechatMessageIdParams } },
	{
		async get() {
			const { token, rid } = this.queryParams;
			const { _id } = this.urlParams;

			const guest = await findGuest(token);
			if (!guest) {
				throw new Error('invalid-token');
			}

			const room = await findRoom(token, rid);
			if (!room) {
				throw new Error('invalid-room');
			}

			let message = await Messages.findOneByRoomIdAndMessageId(rid, _id);
			if (!message) {
				throw new Error('invalid-message');
			}

			if (message.file) {
				message = { ...(await normalizeMessageFileUpload(message)), ...{ _updatedAt: message._updatedAt } };
			}

			if (!message) {
				throw new Error('invalid-message');
			}

			return API.v1.success({ message });
		},

		async put() {
			const { token, rid } = this.bodyParams;
			const { _id } = this.urlParams;

			const guest = await findGuest(token);

View on GitHub (pinned to f9d3ec372b)

Solutions

  1. Verify the message belongs to the room via Messages.findOneByRoomIdAndMessageId(rid, _id) before calling.
  2. Use a messageId obtained from the room's own message history.

Example fix

// before
GET /livechat/message/:msgId?token&rid // invalid-message if not in rid

// after
const msg = await Messages.findOneByRoomIdAndMessageId(rid, msgId);
if (!msg) return notFound();
// proceed to GET
Defensive patterns

Strategy: validation

Validate before calling

const msg = await Messages.findOneByRoomIdAndMessageId(rid, _id);
if (!msg) throw new Error('message not in this room');
// safe to GET /livechat/message/:_id

Type guard

const messageInRoom = async (rid: string, msgId: string) =>
  !!(await Messages.findOneByRoomIdAndMessageId(rid, msgId, { projection: { _id: 1 } }));

Try / catch

try { await getMessage({ _id, token, rid }); }
catch (e) { if (e instanceof Error && e.message === 'invalid-message') { /* 404: wrong/removed message */ } else throw e; }

Prevention

When it happens

Trigger: GET /livechat/message/:_id with a messageId that does not exist in the given room (wrong id, or message from a different room, or deleted).

Common situations: Wrong message id; message belongs to a different room; message was deleted/edited-away.

Related errors


AI-assisted analysis of RocketChat/Rocket.Chat@f9d3ec372b (2026-08-12). Data as JSON: /api/errors/08f419c4bf1726f1. Report an issue: GitHub.