Skip to content

Validation Rules ​

Kanun provides a single validation rule system. This page documents the full rule set and syntax.

Rule Syntax ​

Use either a pipe-delimited string:

ts
const rules = {
  email: 'required|email|max:255',
};

Or an array:

ts
const rules = {
  email: ['required', 'email', 'max:255'],
};

Nested and Wildcard Paths ​

ts
const rules = {
  'user.name.first': 'required|min:2',
  'users.*.email': 'required|email',
};

Available Validation Rules ​

Use this index to jump directly to each rule description.

Rule Index ​

Booleans ​

Strings ​

Numbers and Size ​

Arrays and Objects ​

Dates ​

Database ​

Utilities and Cross-field ​

Runtime ​

accepted ​

The field must be accepted (yes, on, 1, true).

accepted_if:field,value,... ​

The field must be accepted when another field matches one of the provided values.

after:date ​

The field must be a date after the provided date or field value.

after_or_equal:date ​

The field must be a date after or equal to the provided date or field value.

alpha ​

The field must contain alphabetic characters only.

alpha_dash ​

The field may contain letters, numbers, dashes, and underscores.

alpha_num ​

The field must contain letters and numbers only.

array ​

The field must be an array.

array_unique ​

All values in the array must be unique.

bail ​

Stop running validation rules on the field after the first failure.

before:date ​

The field must be a date before the provided date or field value.

before_or_equal:date ​

The field must be a date before or equal to the provided date or field value.

between:min,max ​

The field’s size or numeric value must be between min and max.

boolean ​

The field must be a boolean-like value (true, false, 1, 0, '1', '0').

confirmed ​

The field must match field_confirmation or fieldConfirmation.

date ​

The field must be a valid date.

date_equals:date ​

The field must equal the provided date or date field.

declined ​

The field must be declined (no, off, 0, false).

declined_if:field,value,... ​

The field must be declined when another field matches one of the provided values.

different:field ​

The field must have a different value than the given field.

digits:value ​

The field must be numeric and contain exactly value digits.

digits_between:min,max ​

The field must be numeric and contain between min and max digits.

email ​

The field must be a valid email address.

email:rfc,dns,strict,spoof,filter ​

The email rule also accepts comma-separated options:

ts
const rules = {
  email: 'email:rfc,strict,dns,spoof,filter',
};

Supported options:

  • rfc: enables the standard email format check
  • filter: enables the default lightweight filter-style email validation
  • strict: rejects malformed local parts and invalid hostname labels
  • dns: requires a domain that passes strict hostname validation and IDNA normalization
  • spoof: adds normalization and control-character safety checks

You can use a single option or combine several.

ends_with:value,... ​

The field must end with one of the provided values.

filled ​

If the field is present, it must not be empty. Missing fields still pass.

exists:table,column ​

The field value must exist in the provided database table and column.

gt:field ​

The field must be greater than another field or comparison value.

gte:field ​

The field must be greater than or equal to another field or comparison value.

in:value,... ​

The field must be one of the provided values.

integer ​

The field must be an integer.

ip ​

The field must be a valid IPv4 or IPv6 address.

ipv4 ​

The field must be a valid IPv4 address.

ipv6 ​

The field must be a valid IPv6 address.

json ​

The field must be valid JSON.

mac_address ​

The field must be a valid MAC address in colon-separated or hyphen-separated form.

lt:field ​

The field must be less than another field or comparison value.

lte:field ​

The field must be less than or equal to another field or comparison value.

max:value ​

The field must not be greater than the provided maximum size or value.

min:value ​

The field must be at least the provided minimum size or value.

multiple_of:value ​

The numeric field must be an exact multiple of the provided value.

This also supports decimals such as multiple_of:0.1.

not_in:value,... ​

The field must not be one of the provided values.

not_regex:pattern ​

The field must not match the given regular expression.

nullable ​

Allow null values for non-implicit validations.

numeric ​

The field must be numeric.

object ​

The field must be a plain object.

distinct ​

The field values must be unique.

This is most useful with wildcard rules:

ts
const rules = {
  'users.*.email': 'distinct',
};

Options:

  • distinct:strict: compare values using strict equality
  • distinct:ignore_case: compare strings case-insensitively

present ​

The field key must exist in the input data, even if empty.

presentsame ​

Alias of present. The field key must exist in the input data, even if empty.

prohibited ​

The field must be missing or empty.

prohibited_unless:field,value,... ​

The field must be missing or empty unless another field matches one of the provided values.

prohibits:field,... ​

If the field is present and not empty, the listed fields must be missing or empty.

regex:pattern ​

The field must match the given regular expression.

exclude ​

Exclude the field from validated output.

This is useful when a field may be accepted as input but should not appear in the result returned by validate() or validated().

required ​

The field must be present and not empty.

required_if:field,value,... ​

The field is required when another field matches one of the provided values.

required_unless:field,value,... ​

The field is required unless another field matches one of the provided values.

required_with:field,... ​

The field is required when any of the listed fields are present.

required_with_all:field,... ​

The field is required when all listed fields are present.

required_without:field,... ​

The field is required when any listed field is missing.

required_without_all:field,... ​

The field is required when all listed fields are missing.

same:field ​

The field must match the given field exactly.

size:value ​

The field must have the exact size or value.

sometimes ​

Only apply validation if the field key exists in input data.

starts_with:value,... ​

The field must start with one of the provided values.

strict ​

Enables strict type checks for supported rules (for example numeric, integer, and boolean).

string ​

The field must be a string.

timezone ​

The field must be a valid IANA timezone identifier such as UTC or Europe/Paris.

unique:table,column,except,idColumn ​

The field value must be unique in the given table/column. Optionally pass except and idColumn when validating updates.

url ​

The field must be a valid URL.

Runtime-registered rules ​

Kanun also supports additional runtime rules (for example hex, includes, not_includes, datetime, or app-specific rules) via custom registration:

ts
register('my_rule', (value) => value === 'ok');

Fail-fast Mode ​

ts
const validator = new Validator(data, rules).stopOnFirstFailure();

Rule Message Keys ​

Custom messages can be set per field/rule:

ts
const messages = {
  'email.required': 'Email is required.',
  'email.email': 'Email must be a valid address.',
};

Next: Custom Rules and Error Handling.