[Constraint] Create a constraint.
Attach a new validation constraint to a column. The column is identified
by its UUID in the request body. The validation function can be referenced
either by its UUID or by its stable name (e.g. is_between).
https://api.wetransform.com/constraint
column_id
string
The UUID of the column to attach the constraint to.
Only required on creation.
"00000000-0000-0000-0000-000000000000"
Create
uuid
function
string
The validation function used by the constraint.
Accepts either the function UUID or its stable name (e.g. is_between).
Available validation functions:
| begin_by | Checks if begins by a given text | ?begin_by(Value to check,Required prefix) |
| is_between | Checks if a number is between A and B | ?is_between(Value to check,Low value,High value) |
| is_number | Checks if is a valid standard number | ?is_number(Value to check) |
| length_is_maximum | Checks if has a maximum length of | ?length_is_maximum(The value to check,The maximum length) |
| length_is_minimum | Checks if has a minimum length of | ?length_is_minimum(The value to check,The minimum length) |
| must_be_empty_if_other_empty | Must be empty if another value is empty | ?must_be_empty_if_other_empty(The value to check,The other column to check) |
| must_be_empty_if_other_filled | Must be empty if another value is filled | ?must_be_empty_if_other_filled(The value to check,The other column to check) |
| must_be_filled_if_other_empty | Must be filled if another value is empty | ?must_be_filled_if_other_empty(The value to check,The other column to check) |
| must_be_filled_if_other_filled | Must be filled if another value is filled | ?must_be_filled_if_other_filled(The value to check,The other column to check) |
| is_positive_number | Checks if a number is positive | ?is_positive_number(Value to check) |
| is_upper | Checks if is in uppercase | ?is_upper(Text to check) |
| matches_regex | Check if matches the regex | ?matches_regex(Text to validate,Regex pattern) |
| is_filled_if_other_value_in | Must be filled when @other_column is in list @values_to_check | ?is_filled_if_other_value_in(The value to check,The other column to check,The list of values to check separated by a comma) |
| is_valid_postal_code | Check if zip code is valid depending on country ISO2 code | ?is_valid_postal_code(Zip code to validate,Country code ISO 2 format) |
| contains | Checks if the value contains a given text | ?contains(Value to check,Text that must be present) |
| date_after_equals | Checks if a date is after or equal to another date | ?date_after_equals(Date to check,Minimum allowed date) |
| date_after | Checks if a date is after another date | ?date_after(Date to check,Minimum allowed date) |
| date_before_equals | Checks if a date is before or equal to another date | ?date_before_equals(Date to check,Maximum allowed date) |
| date_before | Checks if a date is before another date | ?date_before(Date to check,Maximum allowed date) |
| date_between | Checks if a date is between two values | ?date_between(Date to check,Minimum allowed date,Maximum allowed date) |
| ends_by | Checks if the value ends with a given text | ?ends_by(Value to check,Required suffix) |
| greater_or_equal_to | Checks if the value is greater than or equal to a limit | ?greater_or_equal_to(Value to check,Lower limit (included)) |
| greater_than | Checks if the value is strictly greater than a limit | ?greater_than(Value to check,Lower limit (excluded)) |
| is_lower | Checks if the value is lowercase | ?is_lower(Text to check) |
| length_between | Checks if the length of the text is between a minimum and a maximum value (inclusive) | ?length_between(Value to check,Minimum length,Maximum length) |
| length_equal_to | Checks if the length of the text is equal to the specified number | ?length_equal_to(Value to check,Expected length) |
| less_or_equal_to | Checks if the value is less than or equal to a limit | ?less_or_equal_to(Value to check,Upper limit (included)) |
| less_than | Checks if the value is strictly less than a limit | ?less_than(Value to check,Upper limit (excluded)) |
| match_pattern | Checks if the value matches a wildcard pattern using * and ? | ?match_pattern(Value to check,Pattern to match (supports * and ?)) |
| not_begin_by | Checks if value does not begin with a given text | ?not_begin_by(Value to check,Forbidden prefix) |
| not_contains | Checks if the value does not contain a given text | ?not_contains(Value to check,Text that must not be present) |
| not_ends_by | Checks if the value does not end with a given text | ?not_ends_by(Value to check,Forbidden suffix) |
| is_date_position | Check if date is in the future or in the past | ?is_date_position(Date to check,PAST or FUTURE) |
| no_line_breaks | Checks that the content does not contain any carriage returns or newlines | ?no_line_breaks(Value to check) |
| no_html_tags | Ensures the value contains no HTML tags except those explicitly allowed | ?no_html_tags(Value to check,Allowed tags (e.g. b/p/i)) |
| json_contains | Checks whether a JSON document contains a non-empty value at a given path | ?json_contains(JSON payload in which the value will be searched,Path of the value to check, starting with € at the root) |
| json_array_length_equals | Checks if a JSON array has exactly the expected number of items | ?json_array_length_equals(JSON payload containing the array,Expected number of items in the array,Path to the array to check, starting with € at the root (optional)) |
| equal_to | Checks if a value is exactly equal to another | ?equal_to(Value to check,Expected value) |
| is_unique_key | Combination of values must be unique across the dataset | ?is_unique_key(Column,First key column,Second key column,Third key column,Fourth key column,Fifth key column) |
| check_ean | Checks that the value is exactly 13 digits with a valid EAN-13 (GS1 modulo-10) check digit | ?check_ean(Value to check) |
| is_working_hour | Checks whether the server's current hour is within [start..end] (24h, 0-23). When start > end, the range is overnight. | ?is_working_hour(Column to check (ignored — time-of-day predicate),Start hour, 0-23,End hour, 0-23 (inclusive)) |
"is_between"
Create
length
label
*
string
The error message, rendered to senders when the constraint fails.
Ex: "This value must be between @low and @high"
"This value must be between @low and @high"
arguments
array
The validation function arguments (name => value pairs).
Ex: is_between expects a low and a high argument.
arguments[].name
string
The argument name.
Ex: "low", "high"
"low"
arguments[].value
*
string
The argument value.
"18"
* are nullable.
{
"column_id": "00000000-0000-0000-0000-000000000000",
"function": "is_between",
"label": "This value must be between @low and @high",
"arguments": [
{
"name": "low",
"value": "18"
},
{
"name": "high",
"value": "100"
}
]
}
Copy
success
boolean
Always true on successful responses.
true
payload
object
Payload of the requested resource.
payload.constraint_id
*
string
The constraint UUID.
"28130efd-f931-447c-9907-1b89357730f3"
payload.column_id
*
string
The UUID of the column the constraint is attached to.
"0a211315-69f6-49b2-aaee-911f232009bd"
payload.function
*
string
The stable name of the validation function backing the constraint.
Ex: is_between.
"is_between"
payload.label
*
string
The error message, rendered to senders when the constraint fails.
"This value must be between @low and @high"
payload.arguments
array
The validation function arguments (name => value pairs).
payload.arguments[].name
string
The argument name.
Ex: "low", "high"
"low"
payload.arguments[].value
*
string
The argument value.
"18"
product
*
object
A product needed.
Not null if user requires to buy a specific product (permission or limitation) in order to access a feature.
product.requirement
*
string
Whether the user requested a features s/he doesn't have access to,
or the user needs greater limits.
Possible values: permission, limitation
"permission"
product.permission
*
object
The required permission.
You will need to know which permission is needed in order to fill up search filters in the shop.
product.permission.description
*
string
A human-understandable name for the permission.
product.permission.name
string
A technical permission name (ex: ORGANISATION_UPDATE_SETTINGS).
Possible values depend on the context, check the domain's metadata endpoint.
"X_SOURCE_FORMAT_XML"
product.limitation_type
*
string
The limitation that needs to be increased (ex: number of columns).
product.limitation_needed_value
*
integer
The needed resource quantity (if receiver uses 9 columns in a template, this value is 9).
product.limitation_current_value
*
integer
The current value of the limitation (if receiver is allowed to use 10 columns, this value is 10).
product.limitation_object
*
object
The limitation type in a readable format, for example, "lines per file".
product.is_cta
*
boolean
Whether a Call To Action should be displayed.
It may not be displayed if:
- the limitation is on the membership role
- the limitation is on the customer role
- the user is a sender
template_handle
*
string
Handle of the template currently in context, if any.
Many endpoints (and frontend components) require a template_handle. It is
exposed here so consumers — most notably the AI agent — can reuse it
instead of having to ask the user for it again.
"new-hires"
source_id
*
string
UUID of the source currently in context, if any.
Many endpoints (and frontend components) require a source_id (the source
UUID, not its database id). It is exposed here so consumers — most notably
the AI agent — can reuse it instead of having to ask the user for it again.
"9e7060d4-9314-4783-883a-8702471ccd39"
debug
array
Debug information.
Contains logs about business logic explaining state of the response payload.
Provided in development & admin modes only.
* are nullable.
{
"success": true,
"payload": {
"constraint_id": "28130efd-f931-447c-9907-1b89357730f3",
"column_id": "0a211315-69f6-49b2-aaee-911f232009bd",
"function": "is_between",
"label": "This value must be between @low and @high",
"arguments": [
{
"name": "low",
"value": "18"
},
{
"name": "high",
"value": "100"
}
]
},
"product": {
"requirement": "permission",
"permission": {
"name": "X_SOURCE_FORMAT_XML",
"description": "Can import XML files"
},
"limitation_type": null,
"limitation_needed_value": null,
"limitation_current_value": null,
"limitation_object": null,
"is_cta": false
},
"template_handle": "new-hires",
"source_id": "9e7060d4-9314-4783-883a-8702471ccd39",
"debug": []
}
Copy
The client sent an unexpected request.
It happens if the client sent an invalid JSON payload, or if the JSON payload cannot be mapped to the expected request object.
success
boolean
Always false on error responses.
false
payload
object
Context about the error, if any.
product
*
object
A product needed.
Not null if user requires to buy a specific product (permission or limitation) in order to access a feature.
product.requirement
*
string
Whether the user requested a features s/he doesn't have access to,
or the user needs greater limits.
Possible values: permission, limitation
"permission"
product.permission
*
object
The required permission.
You will need to know which permission is needed in order to fill up search filters in the shop.
product.permission.description
*
string
A human-understandable name for the permission.
product.permission.name
string
A technical permission name (ex: ORGANISATION_UPDATE_SETTINGS).
Possible values depend on the context, check the domain's metadata endpoint.
"X_SOURCE_FORMAT_XML"
product.limitation_type
*
string
The limitation that needs to be increased (ex: number of columns).
product.limitation_needed_value
*
integer
The needed resource quantity (if receiver uses 9 columns in a template, this value is 9).
product.limitation_current_value
*
integer
The current value of the limitation (if receiver is allowed to use 10 columns, this value is 10).
product.limitation_object
*
object
The limitation type in a readable format, for example, "lines per file".
product.is_cta
*
boolean
Whether a Call To Action should be displayed.
It may not be displayed if:
- the limitation is on the membership role
- the limitation is on the customer role
- the user is a sender
template_handle
*
string
Handle of the template currently in context, if any.
Many endpoints (and frontend components) require a template_handle. It is
exposed here so consumers — most notably the AI agent — can reuse it
instead of having to ask the user for it again.
"new-hires"
source_id
*
string
UUID of the source currently in context, if any.
Many endpoints (and frontend components) require a source_id (the source
UUID, not its database id). It is exposed here so consumers — most notably
the AI agent — can reuse it instead of having to ask the user for it again.
"9e7060d4-9314-4783-883a-8702471ccd39"
debug
array
Debug information.
Contains logs about business logic explaining state of the response payload.
Provided in development & admin modes only.
* are nullable.
{
"success": false,
"payload": [],
"product": {
"requirement": "permission",
"permission": {
"name": "X_SOURCE_FORMAT_XML",
"description": "Can import XML files"
},
"limitation_type": null,
"limitation_needed_value": null,
"limitation_current_value": null,
"limitation_object": null,
"is_cta": false
},
"template_handle": "new-hires",
"source_id": "9e7060d4-9314-4783-883a-8702471ccd39",
"debug": []
}
Copy
User is well authenticated, but not authorized to access the resource.
It can happen if user is trying to use a feature that s/he didn't pay for, access someone else's resource, etc.
These issues are normally fixed by the frontend, which should render features and resources user has access to.
success
boolean
Always false on error responses.
false
payload
object
Context about the error, if any.
product
*
object
A product needed.
Not null if user requires to buy a specific product (permission or limitation) in order to access a feature.
product.requirement
*
string
Whether the user requested a features s/he doesn't have access to,
or the user needs greater limits.
Possible values: permission, limitation
"permission"
product.permission
*
object
The required permission.
You will need to know which permission is needed in order to fill up search filters in the shop.
product.permission.description
*
string
A human-understandable name for the permission.
product.permission.name
string
A technical permission name (ex: ORGANISATION_UPDATE_SETTINGS).
Possible values depend on the context, check the domain's metadata endpoint.
"X_SOURCE_FORMAT_XML"
product.limitation_type
*
string
The limitation that needs to be increased (ex: number of columns).
product.limitation_needed_value
*
integer
The needed resource quantity (if receiver uses 9 columns in a template, this value is 9).
product.limitation_current_value
*
integer
The current value of the limitation (if receiver is allowed to use 10 columns, this value is 10).
product.limitation_object
*
object
The limitation type in a readable format, for example, "lines per file".
product.is_cta
*
boolean
Whether a Call To Action should be displayed.
It may not be displayed if:
- the limitation is on the membership role
- the limitation is on the customer role
- the user is a sender
template_handle
*
string
Handle of the template currently in context, if any.
Many endpoints (and frontend components) require a template_handle. It is
exposed here so consumers — most notably the AI agent — can reuse it
instead of having to ask the user for it again.
"new-hires"
source_id
*
string
UUID of the source currently in context, if any.
Many endpoints (and frontend components) require a source_id (the source
UUID, not its database id). It is exposed here so consumers — most notably
the AI agent — can reuse it instead of having to ask the user for it again.
"9e7060d4-9314-4783-883a-8702471ccd39"
debug
array
Debug information.
Contains logs about business logic explaining state of the response payload.
Provided in development & admin modes only.
* are nullable.
{
"success": false,
"payload": [],
"product": {
"requirement": "permission",
"permission": {
"name": "X_SOURCE_FORMAT_XML",
"description": "Can import XML files"
},
"limitation_type": null,
"limitation_needed_value": null,
"limitation_current_value": null,
"limitation_object": null,
"is_cta": false
},
"template_handle": "new-hires",
"source_id": "9e7060d4-9314-4783-883a-8702471ccd39",
"debug": []
}
Copy
A violation happens when a property value does not respect the expected constraints.
If a user is making a mistake in a form and frontend is not able to detect it (because of the constraint being tied to some business logic for example), the API will return the invalid properties with the right error messages.
Note: examples are hardcoded in english (no access to the translator in a DTO).
success
boolean
Always false on error responses.
false
payload
object
Context about the error, if any.
payload.error
object
payload.error.code
string
A translation key for the given message.
"exception.violation"
payload.error.message
string
The translated version of the message.
Click on "Example" to get its translated value.
payload.violations
array
payload.violations[].property_path
string
Property having an invalid value.
"title"
payload.violations[].invalid_value
*
The invalid value.
""
payload.violations[].message
string
An error message describing the violation.
"This value should not be blank"
product
*
object
A product needed.
Not null if user requires to buy a specific product (permission or limitation) in order to access a feature.
product.requirement
*
string
Whether the user requested a features s/he doesn't have access to,
or the user needs greater limits.
Possible values: permission, limitation
"permission"
product.permission
*
object
The required permission.
You will need to know which permission is needed in order to fill up search filters in the shop.
product.permission.description
*
string
A human-understandable name for the permission.
product.permission.name
string
A technical permission name (ex: ORGANISATION_UPDATE_SETTINGS).
Possible values depend on the context, check the domain's metadata endpoint.
"X_SOURCE_FORMAT_XML"
product.limitation_type
*
string
The limitation that needs to be increased (ex: number of columns).
product.limitation_needed_value
*
integer
The needed resource quantity (if receiver uses 9 columns in a template, this value is 9).
product.limitation_current_value
*
integer
The current value of the limitation (if receiver is allowed to use 10 columns, this value is 10).
product.limitation_object
*
object
The limitation type in a readable format, for example, "lines per file".
product.is_cta
*
boolean
Whether a Call To Action should be displayed.
It may not be displayed if:
- the limitation is on the membership role
- the limitation is on the customer role
- the user is a sender
template_handle
*
string
Handle of the template currently in context, if any.
Many endpoints (and frontend components) require a template_handle. It is
exposed here so consumers — most notably the AI agent — can reuse it
instead of having to ask the user for it again.
"new-hires"
source_id
*
string
UUID of the source currently in context, if any.
Many endpoints (and frontend components) require a source_id (the source
UUID, not its database id). It is exposed here so consumers — most notably
the AI agent — can reuse it instead of having to ask the user for it again.
"9e7060d4-9314-4783-883a-8702471ccd39"
debug
array
Debug information.
Contains logs about business logic explaining state of the response payload.
Provided in development & admin modes only.
* are nullable.
{
"success": false,
"payload": {
"error": {
"code": "exception.violation",
"message": "The provided payload contains property violations."
},
"violations": [
{
"property_path": "title",
"invalid_value": "",
"message": "This value should not be blank"
},
{
"property_path": "price",
"invalid_value": -5,
"message": "The amount should be greater than 1"
}
]
},
"product": {
"requirement": "permission",
"permission": {
"name": "X_SOURCE_FORMAT_XML",
"description": "Can import XML files"
},
"limitation_type": null,
"limitation_needed_value": null,
"limitation_current_value": null,
"limitation_object": null,
"is_cta": false
},
"template_handle": "new-hires",
"source_id": "9e7060d4-9314-4783-883a-8702471ccd39",
"debug": []
}
Copy