RocketChat/Rocket.Chat · error · Error

Param " " must be an array if provided

Error message

Param "${params.members.key}" must be an array if provided

What it means

Validation error from POST channels.create: the optional members parameter was provided but is not an array. The API expects members to be a JSON array of usernames to invite on creation; sending a comma-separated string, a single string, or an object fails this check.

Solutions

  1. Send members as a JSON array of username strings: members: ["alice", "bob"]
  2. When accepting free-text input client-side, split and trim: input.split(',').map(s => s.trim()).filter(Boolean)
  3. Omit members entirely when there are none to invite — it is optional

Example fix

// before
{ "name": "dev-talk", "members": "alice,bob" }

// after
{ "name": "dev-talk", "members": ["alice", "bob"] }
Defensive patterns

Strategy: type-guard

Validate before calling

if (body.members !== undefined && !Array.isArray(body.members)) {
  body.members = String(body.members).split(',').map((s) => s.trim()).filter(Boolean);
}

Type guard

const isUsernameArray = (m: unknown): m is string[] =>
  Array.isArray(m) && m.every((x) => typeof x === 'string');

Try / catch

try { await POST('/api/v1/channels.create', body); } catch (e) {
  if (/must be an array if provided/.test(e.message)) { /* coerce members to array and retry */ }
}

Prevention

When it happens

Trigger: POST /api/v1/channels.create with members: "alice,bob", members: "alice", or members: {"0":"alice"} instead of members: ["alice","bob"].

Common situations: Joining a split string without .split(','); passing a single username for convenience; form data parsed as object instead of array; serialization library converting single-element arrays to scalars (common with PHP http_build_query or some XML->JSON paths).

Related errors


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

Appendix: source

Thrown at apps/meteor/server/api/v1/channels.ts:1023

	teams?: { key: string; value?: string[] };
	teamId?: { key: string; value?: string };
}) {
	const teamId = params.teamId?.value;

	const team = teamId && (await Team.getInfoById(teamId));
	if (
		(!teamId && !(await hasPermissionAsync(params.user.value, 'create-c'))) ||
		(teamId && team && !(await hasPermissionAsync(params.user.value, 'create-team-channel', team.roomId)))
	) {
		throw new Error('unauthorized');
	}

	if (!params.name?.value) {
		throw new Error(`Param "${params.name?.key}" is required`);
	}

	if (params.members?.value && !Array.isArray(params.members.value)) {
		throw new Error(`Param "${params.members.key}" must be an array if provided`);
	}

	if (params.customFields?.value && !(typeof params.customFields.value === 'object')) {
		throw new Error(`Param "${params.customFields.key}" must be an object if provided`);
	}

	if (params.teams?.value && !Array.isArray(params.teams.value)) {
		throw new Error(`Param ${params.teams.key} must be an array`);
	}
}

async function createChannel(
	userId: string,
	params: {
		name?: string;
		members?: string[];
		customFields?: Record<string, any>;
		extraData?: Record<string, any>;

View on GitHub (pinned to e4b8178b20)