Skip to content
Alvo is pre-v0.1: the image runs from its edge tag, and no NuGet package or release is published yet.Pre-v0.1: no release yet.Roadmap and status

CEL functions

Every built-in CEL function, generated from the engine's catalog.

This page is generated from GET {management}/projects/{project}/cel/functions on a host with no AddCelFunction registrations, so it lists exactly the functions every Alvo host knows. A name with several overloads has one row per overload.

A ? after a parameter type means the function receives a null argument; without it, a null argument makes the whole call null and the function is not invoked. A ? after the return type means the call may yield null even when every argument is present.

Profiles are the descriptor slots a call compiles in: Condition (a hook condition) and Mutate (a before-hook mutate value). Rules, computed fields and access levels admit no function call.

See CEL in Alvo for the profiles and the language subset, and Custom CEL functions to register your own.

FunctionSignatureReturnsProfilesSummary
containscontains(text: String, search: String)BoolCondition, MutateWhether text holds search anywhere, comparing characters exactly; an empty search is always held.
endsWithendsWith(text: String, suffix: String)BoolCondition, MutateWhether text ends with suffix, comparing characters exactly; every text ends with an empty suffix.
intint(value: Decimal)IntCondition, MutateThe value as a whole number: a decimal cut toward zero (2.9 is 2), or a text of digits with an optional sign; anything else fails the write.
intint(value: String)IntCondition, MutateThe value as a whole number: a decimal cut toward zero (2.9 is 2), or a text of digits with an optional sign; anything else fails the write.
lowerAsciilowerAscii(text: String)StringCondition, MutateFolds A-Z to a-z and changes nothing else: accented and other non-ASCII letters stay as they are.
math.absmath.abs(x: Int)IntCondition, MutateThe absolute value of x, of the same numeric type.
math.absmath.abs(x: Decimal)DecimalCondition, MutateThe absolute value of x, of the same numeric type.
math.ceilmath.ceil(x: Int)IntCondition, MutateThe smallest whole number not below x (1.2 is 2, -1.5 is -1), of the same numeric type.
math.ceilmath.ceil(x: Decimal)DecimalCondition, MutateThe smallest whole number not below x (1.2 is 2, -1.5 is -1), of the same numeric type.
math.floormath.floor(x: Int)IntCondition, MutateThe largest whole number not above x (1.8 is 1, -1.2 is -2), of the same numeric type.
math.floormath.floor(x: Decimal)DecimalCondition, MutateThe largest whole number not above x (1.8 is 1, -1.2 is -2), of the same numeric type.
math.greatestmath.greatest(a: Int, b: Int)IntCondition, MutateThe larger of a and b; a when they are equal.
math.greatestmath.greatest(a: Decimal, b: Decimal)DecimalCondition, MutateThe larger of a and b; a when they are equal.
math.leastmath.least(a: Int, b: Int)IntCondition, MutateThe smaller of a and b; a when they are equal.
math.leastmath.least(a: Decimal, b: Decimal)DecimalCondition, MutateThe smaller of a and b; a when they are equal.
math.roundmath.round(x: Int)IntCondition, MutateRounds x to a whole number, halves away from zero (2.5 is 3, -2.5 is -3), of the same numeric type.
math.roundmath.round(x: Decimal)DecimalCondition, MutateRounds x to a whole number, halves away from zero (2.5 is 3, -2.5 is -3), of the same numeric type.
math.roundmath.round(x: Decimal, digits: Int)DecimalCondition, MutateRounds x to digits places after the point, halves away from zero (2.345 to 2 places is 2.35); digits is from 0 to 28.
nownow()TimestampMutateThe instant this write is stamped with — the same one its audit columns get, never a clock read.
replacereplace(text: String, search: String, replacement: String)StringCondition, MutateReplaces every occurrence of search in text with replacement, left to right, comparing characters exactly; an empty search changes nothing.
sizesize(text: String)IntCondition, MutateThe number of Unicode code points in text.
startsWithstartsWith(text: String, prefix: String)BoolCondition, MutateWhether text begins with prefix, comparing characters exactly; every text begins with an empty prefix.
stringstring(value: Int)StringCondition, MutateThe value as text: digits for a number (no trailing zeros), true or false, a lower-case id, or an RFC 3339 instant in UTC.
stringstring(value: Decimal)StringCondition, MutateThe value as text: digits for a number (no trailing zeros), true or false, a lower-case id, or an RFC 3339 instant in UTC.
stringstring(value: Bool)StringCondition, MutateThe value as text: digits for a number (no trailing zeros), true or false, a lower-case id, or an RFC 3339 instant in UTC.
stringstring(value: Uuid)StringCondition, MutateThe value as text: digits for a number (no trailing zeros), true or false, a lower-case id, or an RFC 3339 instant in UTC.
stringstring(value: Timestamp)StringCondition, MutateThe value as text: digits for a number (no trailing zeros), true or false, a lower-case id, or an RFC 3339 instant in UTC.
substringsubstring(text: String, start: Int)StringCondition, MutateThe code points of text from start (counted from 0) up to, not including, end — or to the end of text; a position outside text fails the write.
substringsubstring(text: String, start: Int, end: Int)StringCondition, MutateThe code points of text from start (counted from 0) up to, not including, end — or to the end of text; a position outside text fails the write.
timestamptimestamp(text: String)TimestampCondition, MutateThe text read as an RFC 3339 instant, such as 2026-10-05T12:00:00Z or 2026-10-05T14:00:00+02:00; anything else fails the write.
trimtrim(text: String)StringCondition, MutateRemoves spaces, tabs, line feeds and carriage returns from both ends of text; nothing else counts as whitespace.
upperAsciiupperAscii(text: String)StringCondition, MutateFolds a-z to A-Z and changes nothing else: accented and other non-ASCII letters stay as they are.