Translation keys
Every error a built-in validator raises carries a translation_key naming the
exact sentence of its default message, and placeholders, the raw values that
sentence interpolates. Together they let a consumer render errors in its own
words or language without parsing strings; see
Custom error messages for the pattern.
The keys are public API: renaming or removing one is a breaking change, the
same as renaming a function. Where two validators produce the same sentence,
they share the key, so one translation covers both. A custom msg= on a
validator replaces the rendered text but keeps the key.
Templates are str.format style. The canonical source is the catalog in
probatio._messages; this table mirrors it. One entry is a fragment rather
than a sentence: did_you_mean is appended to a suggestion-carrying error’s
message, with the close matches also available raw on context["candidates"]
(see how suggestions compose).
| Key | English template |
|---|---|
allowed_at_most_one_of |
at most one of {keys} is allowed |
allowed_one_of |
exactly one of {keys} is allowed |
byte_length_out_of_bounds |
byte length out of bounds |
cannot_be_changed |
{field!r} cannot be changed |
cannot_convert_to_set |
cannot be converted to a set: {detail} |
contains_duplicate_items |
contains duplicate items: {items} |
contains_unhashable_elements |
contains unhashable elements: {detail} |
did_you_mean |
, did you mean {candidates}? |
does_not_match_pattern |
does not match the expected pattern |
element_not_valid |
item {position} ({item}) does not match any validator |
exclusive_group |
two or more values in the same group of exclusion {group!r} |
expected_alpha |
expected only ASCII letters |
expected_alphanumeric |
expected only ASCII letters and digits |
expected_ascii |
expected only ASCII characters |
expected_base64_string |
expected a Base64 string |
expected_boolean |
expected a boolean |
expected_cidr |
expected a CIDR network |
expected_collection |
expected a collection: {detail} |
expected_credit_card_number |
expected a credit card number |
expected_data_uri |
expected a data URI |
expected_discriminator |
expected {key} to be one of {values} |
expected_duration |
expected a duration |
expected_duration_detailed |
expected a duration like H:MM, H:MM:SS, an ISO 8601 duration like PT1H30M, or a number of seconds |
expected_email_address |
expected an email address |
expected_fqdn |
expected a fully-qualified domain name |
expected_hex_color |
expected a hex color like #rrggbb |
expected_hex_string |
expected a hex string |
expected_hexadecimal_integer |
expected a hexadecimal integer |
expected_hostname |
expected a hostname |
expected_iana_time_zone |
expected an IANA time zone |
expected_iban |
expected an IBAN |
expected_ip |
expected an IP address |
expected_ipv4 |
expected an IPv4 address |
expected_ipv6 |
expected an IPv6 address |
expected_iso_date |
expected an ISO 8601 date |
expected_iso_datetime |
expected an ISO 8601 datetime |
expected_iso_time |
expected an ISO 8601 time |
expected_json_string |
expected a JSON string |
expected_mac_address |
expected a MAC address |
expected_mapping |
expected a mapping |
expected_no_whitespace |
expected no whitespace |
expected_object |
expected a {cls!r} |
expected_percentage |
expected a percentage between 0 and 100 |
expected_phone_number |
expected a phone number |
expected_port |
expected a port number between 1 and 65535 |
expected_printable_ascii |
expected only printable ASCII characters |
expected_sequence |
expected a {expected} |
expected_sequence_of_items |
expected a sequence of {count} items |
expected_slug |
expected a slug |
expected_string |
expected a string |
expected_timezone_aware_datetime |
expected a timezone-aware datetime |
expected_type |
expected {expected} |
expected_type_or_one_of |
expected {expected} or one of {values} |
expected_ulid |
expected a ULID |
expected_unix_timestamp |
expected a Unix timestamp |
expected_url |
expected a URL |
expected_url_with_fqdn |
expected a URL with a fully-qualified domain name |
expected_utc_offset |
expected a UTC offset like +01:00, Z, or UTC |
expected_uuid |
expected a UUID |
expected_uuid_version |
expected a version {version} UUID |
expected_valid_regex |
expected a valid regular expression |
inclusive_group |
some but not all values in the same group of inclusion {group!r} |
invalid_credit_card_number |
invalid credit card number |
invalid_data_uri |
invalid data URI |
invalid_iban |
invalid IBAN |
invalid_json |
invalid JSON |
invalid_phone_number |
invalid phone number |
invalid_value |
invalid value |
invalid_value_or_type |
invalid value or type |
key_not_allowed |
key not allowed |
length_max |
length of value must be at most {max} |
length_min |
length of value must be at least {min} |
max_contains |
expected at most {max} matching item(s) |
min_contains |
expected at least {min} matching item(s) |
must_not_match_not_schema |
value must not match the 'not' schema |
no_valid_value |
no valid value found |
not_a_block_device |
not a block device |
not_a_collection |
value is not a collection |
not_a_directory |
not a directory |
not_a_fifo |
not a FIFO |
not_a_file |
not a file |
not_a_path |
not a path |
not_a_socket |
not a socket |
not_a_symlink |
not a symlink |
not_a_valid_option |
not a valid option |
not_a_valid_value |
not a valid value |
not_a_valid_value_detail |
not a valid value: {detail} |
path_does_not_exist |
path does not exist |
precision_must_equal |
precision must be equal to {precision} |
range_max |
value must be at most {max} |
range_max_exclusive |
value must be lower than {max} |
range_min |
value must be at least {min} |
range_min_exclusive |
value must be higher than {min} |
recursion_too_deep |
data is nested too deeply for this recursive schema |
required |
required key not provided |
required_any_of |
at least one of {keys} is required |
required_none_or_all_of |
either none or all of {keys} are required |
required_one_of |
exactly one of {keys} is required |
required_when_absent |
{key!r} is required when {triggers} is absent |
required_when_present |
{key!r} is required when {triggers} is present |
required_when_value |
{key!r} is required when {conditions} |
scale_must_equal |
scale must be equal to {scale} |
too_many_valid |
value matched {passed} alternatives, expected at most {max} |
value_does_not_match_format |
value does not match expected format {format} |
value_has_no_precision |
value has no precision |
value_multiple_of |
value must be a multiple of {factor} |
value_must_be_number_string |
value must be a number enclosed in a string |
value_must_contain |
value must contain {item!r} |
value_must_end_with |
value must end with {suffix!r} |
value_must_start_with |
value must start with {prefix!r} |
value_no_length |
value has no length |
value_not_allowed |
value is not allowed |
value_not_empty |
value must not be empty |
value_not_equal |
value is not equal to {target!r} |
value_not_one_of |
value must not be one of {values} |
value_not_sorted |
value is not sorted |
value_one_of |
value must be one of {values} |
value_was_not_false |
value was not false |
value_was_not_true |
value was not true |
write_once_already_set |
{field!r} is write-once and already set |
Three keys are JSON Schema-only: max_contains, min_contains, and
must_not_match_not_schema. They fire only from schemas built by
from_json_schema (see the JSON Schema guide); no
hand-written validator emits them.