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](https://firebase.google.com/docs/remote-config/automate-rc.md.txt).

## 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](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleversion) and for Android, use the value of [versionCode](https://developer.android.com/studio/publish/versioning#appversioning). |
| `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](https://developer.android.com/studio/publish/versioning#appversioning), and for Apple devices use the value of [CFBundleShortVersionString](https://developer.apple.com/documentation/bundleresources/information_property_list/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 audiences](https://support.google.com/firebase/answer/6317509). |
| `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 [Google Analytics User Property](https://firebase.google.com/docs/analytics/user-properties). |
| `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](https://firebase.google.com/docs/projects/manage-installations.md.txt#retrieve_client_identifiers) matches one of specified installation IDs. |
| `app.customSignal` | An element that evaluates to `TRUE` or `FALSE` based on the numeric, semantic, or string value of the [custom signal conditions](https://firebase.google.com/docs/remote-config/parameters.md.txt?template_type=client#custom_signal_conditions). |
| `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 in the preceding table.
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

| 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](https://github.com/google/re2/wiki/Syntax) 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. 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. |
| `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](https://github.com/google/re2/wiki/Syntax) syntax. |
| `app.version` | `<`, `<=`, `==`, `!=`, `>=`, `>` | Returns `TRUE` if the actual app version numerically compares to the value specified in a way that matches the operator. **Note:** Numeric comparison operators support only numeric semantic versions (such as `1.2.3`) and do not support pre-release suffixes or hyphens (such as `-beta` or `-rc`). For version strings containing non-numeric suffixes or hyphens, use string operators (such as `.matches` or `.contains`) instead. |
| `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. 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. |
| `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](https://github.com/google/re2/wiki/Syntax) 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']` |
| `app.customSignal` | `<`, `<=`, `==`, `!=`, `>=`, `>` | Returns `TRUE` if the custom signal condition numerically compares to the value specified in a way that matches the operator. |
| `app.customSignal` | `.contains([...])` | Returns `TRUE` if any of the target values is a substring of the actual custom signal condition. |
| `app.customSignal` | `.notContains([...])` | Returns `TRUE` if any of the target values is a substring of the actual custom signal condition. |
| `app.customSignal` | `.exactlyMatches([...])` | Returns `TRUE` if the actual custom signal condition exactly matches (case-sensitive) any of the target values in the list. |
| `app.customSignal` | `.matches([...])` | Returns `TRUE` if any target regular expression in the list matches a substring of, or the entire, actual custom signal condition. To force matching of the entire string, preface the regular expression with "\^" and suffix it with "$". Uses [RE2](https://github.com/google/re2/wiki/Syntax) syntax. |
| `version(app.customSignal)` | `<`, `<=`, `==`, `!=`, `>=`, `>` | Returns `TRUE` if the custom signal condition semantically compares to the value specified in a way that matches the operator. |
| `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](https://firebase.google.com/docs/remote-config/parameters.md.txt#random_percentage). 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](https://firebase.google.com/docs/remote-config/parameters.md.txt#random_percentage): ``` 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 ``` |