{"record":{"id":"82e07b9d2ee8646f","repo":"n8n-io/n8n","slug":"filter-missing-options","errorCode":"FILTER_MISSING_OPTIONS","errorMessage":"${nodeRef} is missing 'options' in ${paramPath}. Add: options: { caseSensitive: false, leftValue: '', typeValidation: 'strict' }","messagePattern":"(.+?) is missing 'options' in (.+?)\\. Add: options: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/@n8n/workflow-sdk/src/workflow-builder/plugins/validators/filter-node-validator.ts","lineNumber":39,"sourceCode":"} from '../types';\n\nconst FILTER_NODE_TYPES = ['n8n-nodes-base.if', 'n8n-nodes-base.switch', 'n8n-nodes-base.filter'];\n\n/**\n * Check a single filter value object for missing required fields.\n */\nfunction validateFilterValue(\n\tfilterValue: Record<string, unknown>,\n\tnodeRef: string,\n\tparamPath: string,\n\tnodeName: string,\n\toriginalName: string | undefined,\n): ValidationIssue[] {\n\tconst issues: ValidationIssue[] = [];\n\n\tif (!filterValue.options || typeof filterValue.options !== 'object') {\n\t\tissues.push({\n\t\t\tcode: 'FILTER_MISSING_OPTIONS',\n\t\t\tmessage: `${nodeRef} is missing 'options' in ${paramPath}. Add: options: { caseSensitive: false, leftValue: '', typeValidation: 'strict' }`,\n\t\t\tseverity: 'error',\n\t\t\tnodeName,\n\t\t\toriginalName,\n\t\t\tparameterPath: `${paramPath}.options`,\n\t\t});\n\t}\n\n\tif (!Array.isArray(filterValue.conditions) || filterValue.conditions.length === 0) {\n\t\tissues.push({\n\t\t\tcode: 'FILTER_MISSING_CONDITIONS',\n\t\t\tmessage: `${nodeRef} is missing or has empty 'conditions' array in ${paramPath}. Add at least one condition with leftValue, operator, and rightValue.`,\n\t\t\tseverity: 'error',\n\t\t\tnodeName,\n\t\t\toriginalName,\n\t\t\tparameterPath: `${paramPath}.conditions`,\n\t\t});\n\t}","sourceCodeStart":21,"sourceCodeEnd":57,"githubUrl":"https://github.com/n8n-io/n8n/blob/5ac6606e81f67bb9534255570cd4e86fd8101eee/packages/@n8n/workflow-sdk/src/workflow-builder/plugins/validators/filter-node-validator.ts#L21-L57","documentation":"Error-level validator issue (code FILTER_MISSING_OPTIONS) emitted when a Filter node's filter value object is missing the 'options' key (or options is not an object). n8n's Filter node requires options (caseSensitive, leftValue, typeValidation) to evaluate conditions deterministically; the message suggests the canonical default object.","triggerScenarios":"Defining a Filter node with conditions but omitting the options object; passing options as a primitive or array.","commonSituations":"Hand-authoring filter config without the full schema; LLM-generated filter that omits options; minimal config that assumed defaults.","solutions":["Add options: { caseSensitive: false, leftValue: '', typeValidation: 'strict' } to the filter value.","Confirm options is an object literal, not a primitive.","Re-run the validator to confirm the error clears."],"exampleFix":"// before\nfilter({ conditions: [...] })\n// after\nfilter({\n  options: { caseSensitive: false, leftValue: '', typeValidation: 'strict' },\n  conditions: [...]\n})","handlingStrategy":"validation","validationCode":"function hasFilterOptions(fv: Record<string, unknown>): boolean {\n  return !!fv.options && typeof fv.options === 'object';\n}\nif (!hasFilterOptions(filterValue)) {\n  // error: add options object\n}","typeGuard":"function isFilterOptions(v: unknown): v is { caseSensitive: boolean; leftValue: string; typeValidation: string } {\n  return typeof v === 'object' && v !== null && 'typeValidation' in v;\n}","tryCatchPattern":null,"preventionTips":["Always include the options object on Filter node config.","Use the canonical defaults: { caseSensitive: false, leftValue: '', typeValidation: 'strict' }.","Run the filter validator before saving."],"tags":["filter","validator","options","node-config"],"backgroundTag":null,"analyzedSha":"5ac6606e81f67bb9534255570cd4e86fd8101eee","analyzedAt":"2026-08-12T05:26:35.080Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}