n8n-io/n8n · error

SWITCH_WRONG_RULES_KEY

SWITCH_WRONG_RULES_KEY

Error message

${nodeRef} uses 'rules.rules' but the Switch node expects 'rules.values'. Rename the inner key from 'rules' to 'values'.

What it means

Error-level validator issue (code SWITCH_WRONG_RULES_KEY) emitted when a Switch node's parameters.rules object has a nested 'rules' key but no 'values' key. The Switch node expects rules.values[]; using rules.rules (a common LLM mistake) will be silently ignored at runtime, so the validator catches the misnaming explicitly.

Solutions

  1. Rename the inner key from 'rules' to 'values' inside parameters.rules.
  2. Confirm rules.values is an array of rule objects.
  3. Re-run the validator to confirm the error clears.

Example fix

// before
switchNode({ rules: { rules: [...] } })
// after
switchNode({ rules: { values: [...] } })
Defensive patterns

Strategy: validation

Validate before calling

const rules = params.rules;
if (rules && typeof rules === 'object' && 'rules' in rules && !('values' in rules)) {
  // error: rename inner 'rules' to 'values'
}

Prevention

When it happens

Trigger: Writing a Switch node with parameters: { rules: { rules: [...] } } instead of { rules: { values: [...] } }.

Common situations: LLM/code-generated switch config that mirrors the outer key name; copy-paste error; misunderstanding the Switch node schema.

Related errors


AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12). Data as JSON: /api/errors/a0adee84215beb93. Report an issue: GitHub.

Appendix: source

Thrown at packages/@n8n/workflow-sdk/src/workflow-builder/plugins/validators/filter-node-validator.ts:113

		// IF and Filter nodes: conditions is directly on params
		const conditions = params.conditions as Record<string, unknown> | undefined;
		if (
			conditions &&
			typeof conditions === 'object' &&
			('conditions' in conditions || 'options' in conditions || 'combinator' in conditions)
		) {
			issues.push(
				...validateFilterValue(conditions, nodeRef, 'conditions', displayName, origForWarning),
			);
		}

		// Switch node: conditions are nested inside rules.values[].conditions
		const rules = params.rules as Record<string, unknown> | undefined;
		if (rules && typeof rules === 'object') {
			// Check for wrong key name (common LLM mistake: rules.rules instead of rules.values)
			if ('rules' in rules && !('values' in rules)) {
				issues.push({
					code: 'SWITCH_WRONG_RULES_KEY',
					message: `${nodeRef} uses 'rules.rules' but the Switch node expects 'rules.values'. Rename the inner key from 'rules' to 'values'.`,
					severity: 'error',
					nodeName: displayName,
					originalName: origForWarning,
					parameterPath: 'rules',
				});
			}

			// Validate filter values inside each rule
			const values = (rules.values ?? rules.rules) as Array<Record<string, unknown>> | undefined;
			if (Array.isArray(values)) {
				for (let i = 0; i < values.length; i++) {
					const rule = values[i];
					const ruleConditions = rule?.conditions as Record<string, unknown> | undefined;
					if (
						ruleConditions &&
						typeof ruleConditions === 'object' &&
						'conditions' in ruleConditions

View on GitHub (pinned to 5ac6606e81)