Remote Config conditional expression reference

This page contains reference information for building conditional expressions using Remote Config backend APIs or the Firebase console. For more information about setting up and using the backend APIs, see Modify Remote Config programmatically.

Elements used to create conditions

The Remote Config REST API supports the same elements that you can use to create conditions when configuring Remote Config using the Firebase Console:

Element Description
&&

Used to create a logical "and" of elements if using more than one element for a condition. If an element is used in REST syntax without the && , that element is treated as a condition.

Note: a space is required before and after the ampersands. For example: element1 && element2.

app.build

Evaluates to TRUE or FALSE based on the value of an app's build number.

Note: Only available on Apple and Android devices. For Apple, use the value of CFBundleVersion and for Android, use the value of versionCode.

app.version

Evaluates to TRUE or FALSE based on the value of an app's version number.

Note: For Android devices use the value of versionName, and for Apple devices use the value of CFBundleShortVersionString.

app.id An element based on the app's Firebase App ID
app.audiences An element that evaluates to TRUE or FALSE based on the user's presence or absence in one or more Firebase Analytics audience(s).
app.firstOpenTimestamp An element based on the first time the user launches an app, obtained from the Google Analytics first_open event. Uses ISO date format with the option to specify a fixed time zone; for example, app.firstOpenTimestamp >= ('2022-10-31T14:37:47', 'America/Los_Angeles'). If no time zone is specified, GMT is used.
app.userProperty An element that evaluates to TRUE or FALSE based on the numeric or string value of a Firebase Analytics User Property.
app.operatingSystemAndVersion

An element based on the operating system on which an app is running. Evaluates to TRUE when the OS and OS version matches the specified target.

Note: Only available for Web apps.

app.browserAndVersion

An element based on the browser on which an app is running. Evaluates to TRUE when the browser and browser version matches the specified target.

Note: Only available for Web apps.

app.firebaseInstallationId An element based on the IDs of specific device installations. Evaluates to TRUE when the installation ID matches one of specified installation IDs.
device.country An element based on the region/country that a device is located in, using the ISO 3166-1 alpha-2 standard (for example, US or UK). Evaluates to TRUE when a country matches an expected country code.
device.dateTime An element based on the time of the last fetch the device performs. Uses ISO date format with the option to specify a fixed time zone; for example, dateTime('2017-03-22T13:39:44', 'America/Los_Angeles').
device.language An element based on the language selected on a device. The language is represented using an IETF Language tag such as es-ES, pt-BR, or en-US. Evaluates to TRUE when a language matches an expected language code.
device.os An element based on the operating system used on a device (Apple or Android). Evaluates to TRUE when the device OS is the expected type.
percent Evaluates to TRUE based on a user's inclusion in a randomly assigned fractional percentage (with sample sizes as small as 0.000001%).

A single-element condition contains three fields:

  1. An arbitrarily-defined name (up to 100 characters)
  2. A conditional expression that evaluates to TRUE or FALSE, made up of the elements shown above.
  3. (Optional) The tagColor, which can be "BLUE", "BROWN", "CYAN", "DEEP_ORANGE", "GREEN", "INDIGO", "LIME", "ORANGE", "PINK", "PURPLE", or "TEAL". The color is case-insensitive, and only affects how conditions are displayed in the Firebase console.

Supported operators

For example, app.build.notContains([123, 456]) returns TRUE if the actual app build is 123 or 492, but returns FALSE if the actual app build is 999. For example, app.version.notContains([123, 456]) returns TRUE if the actual app version is 123 or 492, but returns FALSE if the actual app version is 999.
Element Supported operators Description
app.audiences .inAtLeastOne([...]) Returns TRUE if the actual audience matches at least one audience name in the list.
For example:

app.audiences.inAtLeastOne(['Audience 1', 'Audience 2'])
app.audiences .notInAtLeastOne([...]) Returns TRUE if the actual audience does not match at least one audience name in the list.
app.audiences .inAll([...]) Returns TRUE if the actual audience is a member of every audience name in the list.
app.audiences .notInAll([...]) Returns TRUE if the actual audience is not a member of any audience in the list.
app.firstOpenTimestamp <=, > Compares the time of the first_open event with the specified time in the condition and returns TRUE or FALSE based on the operator.
Sample usage:
app.firstOpenTimestamp >= ('2022-10-31T14:37:47', 'America/Los_Angeles').
To specify a range:
app.firstOpenTimestamp >= ('2022-11-01T00:00:00') && app.firstOpenTimestamp < ('2022-12-01T00:00:00') If no time zone is specified, GMT is used.
app.userProperty <, <=, ==, !=, >=, > Returns TRUE if the actual user property numerically compares to the value specified in a way that matches the operator.
app.userProperty .contains([...]) Returns TRUE if any of the target values is a substring of the actual user property.
app.userProperty .notContains([...]) Returns TRUE if none of the target values is a substring of the actual user property.
app.userProperty .exactlyMatches([...]) Returns TRUE if the actual user property exactly matches (case-sensitive) any of the target values in the list.
app.userProperty .matches([...]) Returns TRUE if any target regular expression in the list matches a substring of, or the entire, actual value. To force matching of the entire string, preface the regular expression with "^" and suffix it with "$". Uses RE2 syntax.
app.id == Returns TRUE if the value specified matches the app's App Id.
app.build <, <=, ==, !=, >=, > Returns TRUE if the actual app build numerically compares to the value specified in a way that matches the operator.
app.build .contains([...]) Returns TRUE if any of the target values is a substring of the actual app build—for example, "a" and "bc" are substrings of "abc".
app.build .notContains([...]) Returns TRUE if none of the target values is a substring of the actual app build.
app.build .exactlyMatches([...]) Returns TRUE if the actual app build exactly matches any of the target values in the list.
app.build .matches([...]) Returns TRUE if any target regular expression in the list matches a substring of, or the entire, actual value. To force matching of the entire string, preface the regular expression with "^" and suffix it with "$". Uses RE2 syntax.
app.version <, <=, ==, !=, >=, > Returns TRUE if the actual app version numerically compares to the value specified in a way that matches the operator.
app.version .contains([...]) Returns TRUE if any of the target values is a substring of the actual app version—for example, "a" and "bc" are substrings of "abc".
app.version .notContains([...]) Returns TRUE if none of the target values is a substring of the actual app version.
app.version .exactlyMatches([...]) Returns TRUE if the actual app version exactly matches any of the target values in the list.
app.version .matches([...]) Returns TRUE if any target regular expression in the list matches a substring of, or the entire, actual value. To force matching of the entire string, preface the regular expression with "^" and suffix it with "$". Uses RE2 syntax.
app.operatingSystemAndVersion .inOne([...]) Returns TRUE if the OS and version matches any of the target values in the list.
For example:

    app.operatingSystemAndVersion.inOne([operatingSystemName('Macintosh').version.==('10.15')])
    
app.browserAndVersion .inOne([...]) Returns TRUE if the browser and version matches any of the target values in the list.
For example:

    app.browserAndVersion.inOne([browserName('Chrome').anyVersion])
    
app.firebaseInstallationId in [...] Returns TRUE if the installation id matches any specified in the list. Sample usage: app.firebaseInstallationId in ['eyJhbGciOiJFUzI1N_iIs5', 'eapzYQai_g8flVQyfKoGs7']
device.country in [...] Returns TRUE if the device's country matches any specified in the list. Sample usage: device.country in ['gb', 'us']. The device country code is determined using the device's IP address in the request or the country code determined by Firebase Analytics (if Analytics data is shared with Firebase).
device.dateTime <=, > Compares the current time to the target time of the condition and evaluates to TRUE or FALSE based on the operator. Sample usage: dateTime < dateTime('2017-03-22T13:39:44').
device.language in [...] Returns TRUE if any of the app's languages match a language in the list. Sample usage: device.language in ['en-UK', 'en-US'].
device.os ==, != Returns TRUE if the device's operating system compares to the value in that field matching the operator.
percent <=, >, between Returns TRUE if the value in the percent field compares to the value that was randomly assigned matching the operator.

You can specify a seed to select a new randomly-assigned group of app instances for a given percentage range as described in Condition rule types.

To do this, provide the name of the seed before the operator, as in the following example:

percent('keyName') <= 10

To configure a specific range, you can use the between operator. To configure a range of users between 20 and 60 using the default seed:

percent between 20 and 60

To configure a range of users between 60 and 80 using a custom seed:

percent('seedName') between 60 and 80