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
- Verify the message belongs to the room via Messages.findOneByRoomIdAndMessageId(rid, _id) before calling.
- 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
- Fetch message ids only from the room's own history.
- Don't reuse ids across rooms.
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.