> ## Documentation Index
> Fetch the complete documentation index at: https://confidence.spotify.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create Surface



## OpenAPI

````yaml /api/workflows/api/surface.openapi.json post /v1/surfaces
openapi: 3.1.0
info:
  title: Confidence Surface API
  version: 1.0.0
  description: API documentation for surface
servers: []
security: []
paths:
  /v1/surfaces:
    post:
      summary: Create Surface
      operationId: Surface.create
      parameters:
        - name: surfaceId
          in: query
          required: false
          description: >-
            The id to use for the surface. If not set, a random id will be
            generated.
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: >-
                    The identifier for the surface, for example,
                    `surfaces/ndcrhu0tzbin85xzpszv.
                displayName:
                  type: string
                  description: A human-readable name for the surface.
                description:
                  type: string
                  description: >-
                    A description for what the surface represents in the
                    application.
                labels:
                  type: array
                  items:
                    type: object
                    additionalProperties:
                      type: string
                  description: Custom labels for this surface.
                owner:
                  type: string
                  description: >-
                    The owner of the resource. If not set will default to the
                    creator.
                reviews:
                  type: object
                  properties:
                    mandatory:
                      type: boolean
                      description: |-
                        If reviews are mandatory for experiments that are
                         attached to the surface.
                    reviewers:
                      type: array
                      items:
                        type: string
                      description: >-
                        Identities (including users and groups) that can review
                        for the surface. If any of them of the
                         reviewers have approved the experiment, it is considered approved
                         for the surface. If any of them reject the experiment, it is
                         considered rejected for the surface, regardless if someone else
                         has approved the experiment.
                  description: Surface config for experiment reviews.
                metricConfig:
                  type: object
                  properties:
                    mandatoryMetrics:
                      type: array
                      items:
                        type: object
                        properties:
                          metric:
                            type: string
                            description: Name of the metric.
                          successMetric:
                            type: object
                            properties:
                              minimumDetectableEffect:
                                type: object
                                properties:
                                  value:
                                    type: string
                                    description: |-
                                      The decimal value, as a string.

                                       The string representation consists of an optional sign, `+` (`U+002B`)
                                       or `-` (`U+002D`), followed by a sequence of zero or more decimal digits
                                       ("the integer"), optionally followed by a fraction, optionally followed
                                       by an exponent.

                                       The fraction consists of a decimal point followed by zero or more decimal
                                       digits. The string must contain at least one digit in either the integer
                                       or the fraction. The number formed by the sign, the integer and the
                                       fraction is referred to as the significand.

                                       The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`)
                                       followed by one or more decimal digits.

                                       Services **should** normalize decimal values before storing them by:

                                         - Removing an explicitly-provided `+` sign (`+2.5` -{">"} `2.5`).
                                         - Replacing a zero-length integer value with `0` (`.5` -{">"} `0.5`).
                                         - Coercing the exponent character to lower-case (`2.5E8` -{">"} `2.5e8`).
                                         - Removing an explicitly-provided zero exponent (`2.5e0` -{">"} `2.5`).

                                       Services **may** perform additional normalization based on its own needs
                                       and the internal decimal implementation selected, such as shifting the
                                       decimal point and exponent value together (example: `2.5e-1` {"<"}-{">"} `0.25`).
                                       Additionally, services **may** preserve trailing zeroes in the fraction
                                       to indicate increased precision, but are not required to do so.

                                       Note that only the `.` character is supported to divide the integer
                                       and the fraction; `,` **should not** be supported regardless of locale.
                                       Additionally, thousand separators **should not** be supported. If a
                                       service does support them, values **must** be normalized.

                                       The ENBF grammar is:

                                           DecimalString =
                                             [Sign] Significand [Exponent];

                                           Sign = '+' | '-';

                                           Significand =
                                             Digits ['.'] [Digits] | [Digits] '.' Digits;

                                           Exponent = ('e' | 'E') [Sign] Digits;

                                           Digits = \{ '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' };

                                       Services **should** clearly document the range of supported values, the
                                       maximum supported precision (total number of digits), and, if applicable,
                                       the scale (number of digits after the decimal point), as well as how it
                                       behaves when receiving out-of-bounds values.

                                       Services **may** choose to accept values passed as input even when the
                                       value has a higher precision or scale than the service supports, and
                                       **should** round the value to fit the supported scale. Alternatively, the
                                       service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC)
                                       if precision would be lost.

                                       Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in
                                       gRPC) if the service receives a value outside of the supported range.
                                description: The minimum detectable effect for the metric.
                            description: >-
                              The metric is used to indicate if the experiment
                              is successful.
                          guardrailMetric:
                            type: object
                            properties:
                              nonInferiorityMargin:
                                type: object
                                properties:
                                  value:
                                    type: string
                                    description: |-
                                      The decimal value, as a string.

                                       The string representation consists of an optional sign, `+` (`U+002B`)
                                       or `-` (`U+002D`), followed by a sequence of zero or more decimal digits
                                       ("the integer"), optionally followed by a fraction, optionally followed
                                       by an exponent.

                                       The fraction consists of a decimal point followed by zero or more decimal
                                       digits. The string must contain at least one digit in either the integer
                                       or the fraction. The number formed by the sign, the integer and the
                                       fraction is referred to as the significand.

                                       The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`)
                                       followed by one or more decimal digits.

                                       Services **should** normalize decimal values before storing them by:

                                         - Removing an explicitly-provided `+` sign (`+2.5` -{">"} `2.5`).
                                         - Replacing a zero-length integer value with `0` (`.5` -{">"} `0.5`).
                                         - Coercing the exponent character to lower-case (`2.5E8` -{">"} `2.5e8`).
                                         - Removing an explicitly-provided zero exponent (`2.5e0` -{">"} `2.5`).

                                       Services **may** perform additional normalization based on its own needs
                                       and the internal decimal implementation selected, such as shifting the
                                       decimal point and exponent value together (example: `2.5e-1` {"<"}-{">"} `0.25`).
                                       Additionally, services **may** preserve trailing zeroes in the fraction
                                       to indicate increased precision, but are not required to do so.

                                       Note that only the `.` character is supported to divide the integer
                                       and the fraction; `,` **should not** be supported regardless of locale.
                                       Additionally, thousand separators **should not** be supported. If a
                                       service does support them, values **must** be normalized.

                                       The ENBF grammar is:

                                           DecimalString =
                                             [Sign] Significand [Exponent];

                                           Sign = '+' | '-';

                                           Significand =
                                             Digits ['.'] [Digits] | [Digits] '.' Digits;

                                           Exponent = ('e' | 'E') [Sign] Digits;

                                           Digits = \{ '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' };

                                       Services **should** clearly document the range of supported values, the
                                       maximum supported precision (total number of digits), and, if applicable,
                                       the scale (number of digits after the decimal point), as well as how it
                                       behaves when receiving out-of-bounds values.

                                       Services **may** choose to accept values passed as input even when the
                                       value has a higher precision or scale than the service supports, and
                                       **should** round the value to fit the supported scale. Alternatively, the
                                       service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC)
                                       if precision would be lost.

                                       Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in
                                       gRPC) if the service receives a value outside of the supported range.
                                description: The non-inferiority margin for the metric.
                            description: >-
                              The metric is used to indicate if the experiment
                              is harmful.
                          preferredDirection:
                            type: string
                            enum:
                              - PREFERRED_DIRECTION_UNSPECIFIED
                              - INCREASE
                              - DECREASE
                            description: The preferred direction for the metric.
                        required:
                          - metric
                          - preferredDirection
                      description: 'Deprecated: use metrics instead.'
                    associatedMetrics:
                      type: array
                      items:
                        type: object
                        properties:
                          metric:
                            type: string
                          successMetric:
                            type: object
                            properties:
                              minimumDetectableEffect:
                                type: object
                                properties:
                                  value:
                                    type: string
                                    description: |-
                                      The decimal value, as a string.

                                       The string representation consists of an optional sign, `+` (`U+002B`)
                                       or `-` (`U+002D`), followed by a sequence of zero or more decimal digits
                                       ("the integer"), optionally followed by a fraction, optionally followed
                                       by an exponent.

                                       The fraction consists of a decimal point followed by zero or more decimal
                                       digits. The string must contain at least one digit in either the integer
                                       or the fraction. The number formed by the sign, the integer and the
                                       fraction is referred to as the significand.

                                       The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`)
                                       followed by one or more decimal digits.

                                       Services **should** normalize decimal values before storing them by:

                                         - Removing an explicitly-provided `+` sign (`+2.5` -{">"} `2.5`).
                                         - Replacing a zero-length integer value with `0` (`.5` -{">"} `0.5`).
                                         - Coercing the exponent character to lower-case (`2.5E8` -{">"} `2.5e8`).
                                         - Removing an explicitly-provided zero exponent (`2.5e0` -{">"} `2.5`).

                                       Services **may** perform additional normalization based on its own needs
                                       and the internal decimal implementation selected, such as shifting the
                                       decimal point and exponent value together (example: `2.5e-1` {"<"}-{">"} `0.25`).
                                       Additionally, services **may** preserve trailing zeroes in the fraction
                                       to indicate increased precision, but are not required to do so.

                                       Note that only the `.` character is supported to divide the integer
                                       and the fraction; `,` **should not** be supported regardless of locale.
                                       Additionally, thousand separators **should not** be supported. If a
                                       service does support them, values **must** be normalized.

                                       The ENBF grammar is:

                                           DecimalString =
                                             [Sign] Significand [Exponent];

                                           Sign = '+' | '-';

                                           Significand =
                                             Digits ['.'] [Digits] | [Digits] '.' Digits;

                                           Exponent = ('e' | 'E') [Sign] Digits;

                                           Digits = \{ '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' };

                                       Services **should** clearly document the range of supported values, the
                                       maximum supported precision (total number of digits), and, if applicable,
                                       the scale (number of digits after the decimal point), as well as how it
                                       behaves when receiving out-of-bounds values.

                                       Services **may** choose to accept values passed as input even when the
                                       value has a higher precision or scale than the service supports, and
                                       **should** round the value to fit the supported scale. Alternatively, the
                                       service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC)
                                       if precision would be lost.

                                       Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in
                                       gRPC) if the service receives a value outside of the supported range.
                                description: The minimum detectable effect for the metric.
                            description: >-
                              The metric is used to indicate if the experiment
                              is successful.
                          guardrailMetric:
                            type: object
                            properties:
                              nonInferiorityMargin:
                                type: object
                                properties:
                                  value:
                                    type: string
                                    description: |-
                                      The decimal value, as a string.

                                       The string representation consists of an optional sign, `+` (`U+002B`)
                                       or `-` (`U+002D`), followed by a sequence of zero or more decimal digits
                                       ("the integer"), optionally followed by a fraction, optionally followed
                                       by an exponent.

                                       The fraction consists of a decimal point followed by zero or more decimal
                                       digits. The string must contain at least one digit in either the integer
                                       or the fraction. The number formed by the sign, the integer and the
                                       fraction is referred to as the significand.

                                       The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`)
                                       followed by one or more decimal digits.

                                       Services **should** normalize decimal values before storing them by:

                                         - Removing an explicitly-provided `+` sign (`+2.5` -{">"} `2.5`).
                                         - Replacing a zero-length integer value with `0` (`.5` -{">"} `0.5`).
                                         - Coercing the exponent character to lower-case (`2.5E8` -{">"} `2.5e8`).
                                         - Removing an explicitly-provided zero exponent (`2.5e0` -{">"} `2.5`).

                                       Services **may** perform additional normalization based on its own needs
                                       and the internal decimal implementation selected, such as shifting the
                                       decimal point and exponent value together (example: `2.5e-1` {"<"}-{">"} `0.25`).
                                       Additionally, services **may** preserve trailing zeroes in the fraction
                                       to indicate increased precision, but are not required to do so.

                                       Note that only the `.` character is supported to divide the integer
                                       and the fraction; `,` **should not** be supported regardless of locale.
                                       Additionally, thousand separators **should not** be supported. If a
                                       service does support them, values **must** be normalized.

                                       The ENBF grammar is:

                                           DecimalString =
                                             [Sign] Significand [Exponent];

                                           Sign = '+' | '-';

                                           Significand =
                                             Digits ['.'] [Digits] | [Digits] '.' Digits;

                                           Exponent = ('e' | 'E') [Sign] Digits;

                                           Digits = \{ '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' };

                                       Services **should** clearly document the range of supported values, the
                                       maximum supported precision (total number of digits), and, if applicable,
                                       the scale (number of digits after the decimal point), as well as how it
                                       behaves when receiving out-of-bounds values.

                                       Services **may** choose to accept values passed as input even when the
                                       value has a higher precision or scale than the service supports, and
                                       **should** round the value to fit the supported scale. Alternatively, the
                                       service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC)
                                       if precision would be lost.

                                       Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in
                                       gRPC) if the service receives a value outside of the supported range.
                                description: The non-inferiority margin for the metric.
                            description: >-
                              The metric is used to indicate if the experiment
                              is harmful.
                          preferredDirection:
                            type: string
                            enum:
                              - PREFERRED_DIRECTION_UNSPECIFIED
                              - INCREASE
                              - DECREASE
                            description: The preferred direction for the metric.
                        required:
                          - metric
                      description: 'Deprecated: use metrics instead.'
                    metrics:
                      type: array
                      items:
                        type: object
                        properties:
                          metric:
                            type: string
                          successMetric:
                            type: object
                            properties:
                              minimumDetectableEffect:
                                type: object
                                properties:
                                  value:
                                    type: string
                                    description: |-
                                      The decimal value, as a string.

                                       The string representation consists of an optional sign, `+` (`U+002B`)
                                       or `-` (`U+002D`), followed by a sequence of zero or more decimal digits
                                       ("the integer"), optionally followed by a fraction, optionally followed
                                       by an exponent.

                                       The fraction consists of a decimal point followed by zero or more decimal
                                       digits. The string must contain at least one digit in either the integer
                                       or the fraction. The number formed by the sign, the integer and the
                                       fraction is referred to as the significand.

                                       The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`)
                                       followed by one or more decimal digits.

                                       Services **should** normalize decimal values before storing them by:

                                         - Removing an explicitly-provided `+` sign (`+2.5` -{">"} `2.5`).
                                         - Replacing a zero-length integer value with `0` (`.5` -{">"} `0.5`).
                                         - Coercing the exponent character to lower-case (`2.5E8` -{">"} `2.5e8`).
                                         - Removing an explicitly-provided zero exponent (`2.5e0` -{">"} `2.5`).

                                       Services **may** perform additional normalization based on its own needs
                                       and the internal decimal implementation selected, such as shifting the
                                       decimal point and exponent value together (example: `2.5e-1` {"<"}-{">"} `0.25`).
                                       Additionally, services **may** preserve trailing zeroes in the fraction
                                       to indicate increased precision, but are not required to do so.

                                       Note that only the `.` character is supported to divide the integer
                                       and the fraction; `,` **should not** be supported regardless of locale.
                                       Additionally, thousand separators **should not** be supported. If a
                                       service does support them, values **must** be normalized.

                                       The ENBF grammar is:

                                           DecimalString =
                                             [Sign] Significand [Exponent];

                                           Sign = '+' | '-';

                                           Significand =
                                             Digits ['.'] [Digits] | [Digits] '.' Digits;

                                           Exponent = ('e' | 'E') [Sign] Digits;

                                           Digits = \{ '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' };

                                       Services **should** clearly document the range of supported values, the
                                       maximum supported precision (total number of digits), and, if applicable,
                                       the scale (number of digits after the decimal point), as well as how it
                                       behaves when receiving out-of-bounds values.

                                       Services **may** choose to accept values passed as input even when the
                                       value has a higher precision or scale than the service supports, and
                                       **should** round the value to fit the supported scale. Alternatively, the
                                       service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC)
                                       if precision would be lost.

                                       Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in
                                       gRPC) if the service receives a value outside of the supported range.
                                description: >-
                                  A representation of a decimal value, such as
                                  2.5. Clients may convert values
                                   into language-native decimal formats, such as Java's [BigDecimal][] or
                                   Python's [decimal.Decimal][].

                                   [BigDecimal]:
                                   https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html
                                   [decimal.Decimal]: https://docs.python.org/3/library/decimal.html
                          guardrailMetric:
                            type: object
                            properties:
                              nonInferiorityMargin:
                                type: object
                                properties:
                                  value:
                                    type: string
                                    description: |-
                                      The decimal value, as a string.

                                       The string representation consists of an optional sign, `+` (`U+002B`)
                                       or `-` (`U+002D`), followed by a sequence of zero or more decimal digits
                                       ("the integer"), optionally followed by a fraction, optionally followed
                                       by an exponent.

                                       The fraction consists of a decimal point followed by zero or more decimal
                                       digits. The string must contain at least one digit in either the integer
                                       or the fraction. The number formed by the sign, the integer and the
                                       fraction is referred to as the significand.

                                       The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`)
                                       followed by one or more decimal digits.

                                       Services **should** normalize decimal values before storing them by:

                                         - Removing an explicitly-provided `+` sign (`+2.5` -{">"} `2.5`).
                                         - Replacing a zero-length integer value with `0` (`.5` -{">"} `0.5`).
                                         - Coercing the exponent character to lower-case (`2.5E8` -{">"} `2.5e8`).
                                         - Removing an explicitly-provided zero exponent (`2.5e0` -{">"} `2.5`).

                                       Services **may** perform additional normalization based on its own needs
                                       and the internal decimal implementation selected, such as shifting the
                                       decimal point and exponent value together (example: `2.5e-1` {"<"}-{">"} `0.25`).
                                       Additionally, services **may** preserve trailing zeroes in the fraction
                                       to indicate increased precision, but are not required to do so.

                                       Note that only the `.` character is supported to divide the integer
                                       and the fraction; `,` **should not** be supported regardless of locale.
                                       Additionally, thousand separators **should not** be supported. If a
                                       service does support them, values **must** be normalized.

                                       The ENBF grammar is:

                                           DecimalString =
                                             [Sign] Significand [Exponent];

                                           Sign = '+' | '-';

                                           Significand =
                                             Digits ['.'] [Digits] | [Digits] '.' Digits;

                                           Exponent = ('e' | 'E') [Sign] Digits;

                                           Digits = \{ '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' };

                                       Services **should** clearly document the range of supported values, the
                                       maximum supported precision (total number of digits), and, if applicable,
                                       the scale (number of digits after the decimal point), as well as how it
                                       behaves when receiving out-of-bounds values.

                                       Services **may** choose to accept values passed as input even when the
                                       value has a higher precision or scale than the service supports, and
                                       **should** round the value to fit the supported scale. Alternatively, the
                                       service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC)
                                       if precision would be lost.

                                       Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in
                                       gRPC) if the service receives a value outside of the supported range.
                                description: >-
                                  A representation of a decimal value, such as
                                  2.5. Clients may convert values
                                   into language-native decimal formats, such as Java's [BigDecimal][] or
                                   Python's [decimal.Decimal][].

                                   [BigDecimal]:
                                   https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html
                                   [decimal.Decimal]: https://docs.python.org/3/library/decimal.html
                          preferredDirection:
                            type: string
                            enum:
                              - PREFERRED_DIRECTION_UNSPECIFIED
                              - INCREASE
                              - DECREASE
                          enforcementLevel:
                            type: string
                            enum:
                              - ENFORCEMENT_LEVEL_UNSPECIFIED
                              - SUGGESTED
                              - REQUIRED
                            description: |-
                              How this metric is enforced on experiments.
                               REQUIRED: always included, cannot be removed by the experimenter.
                               SUGGESTED: auto-added when creating an experiment, can be removed.
                               ENFORCEMENT_LEVEL_UNSPECIFIED: linked but not auto-added (associated).
                        required:
                          - metric
                      description: >-
                        All metrics configured on the surface, with enforcement
                        level.
                  description: Configuration for metrics the surface.
                automatedActions:
                  type: array
                  items:
                    type: object
                    properties:
                      trigger:
                        type: object
                        properties:
                          activityTrigger:
                            type: object
                            properties:
                              kind:
                                type: string
                              resource:
                                type: string
                          stateTrigger:
                            type: object
                            properties:
                              state:
                                type: string
                              resource:
                                type: string
                      action:
                        type: object
                        properties:
                          executeFunctionAction:
                            type: object
                            properties:
                              function:
                                type: string
                              parameters:
                                type: object
                                description: >-
                                  `Struct` represents a structured data value,
                                  consisting of fields
                                   which map to dynamically typed values. In some languages, `Struct`
                                   might be supported by a native representation. For example, in
                                   scripting languages like JS a struct is represented as an
                                   object. The details of that representation are described together
                                   with the proto support for the language.

                                   The JSON representation for `Struct` is JSON object.
                          pagerdutyAction:
                            type: object
                            properties:
                              pdKey:
                                type: string
                              title:
                                type: string
                              description:
                                type: string
                              severity:
                                type: string
                                enum:
                                  - critical
                                  - warning
                                  - info
                                  - error
                            required:
                              - pdKey
                              - severity
                          transitionAction:
                            type: object
                            properties:
                              action:
                                type: string
                              parameters:
                                type: object
                                description: >-
                                  `Struct` represents a structured data value,
                                  consisting of fields
                                   which map to dynamically typed values. In some languages, `Struct`
                                   might be supported by a native representation. For example, in
                                   scripting languages like JS a struct is represented as an
                                   object. The details of that representation are described together
                                   with the proto support for the language.

                                   The JSON representation for `Struct` is JSON object.
                  description: Actions to trigger once the metric starts tanking
                stakeholders:
                  type: array
                  items:
                    type: object
                    properties:
                      identity:
                        type: string
                        description: Reference to the identity who is the stakeholder.
                      role:
                        type: string
                        description: 'The role of the person: Product, Engineering, ...'
                    required:
                      - identity
                      - role
                  description: >-
                    People with specific roles or responsibilities for the
                    surface,
                     such as product or engineering leads.
              required:
                - displayName
        required: true
      responses:
        '200':
          description: Returns a [Surface](/api-reference/schemas/surface).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/confidence.workflow.v1.Surface'
      security:
        - admin: []
      servers:
        - url: https://workflow.eu.confidence.dev
        - url: https://workflow.us.confidence.dev
        - url: https://workflow.confidence.dev
components:
  schemas:
    confidence.workflow.v1.Surface:
      title: Surface
      type: object
      description: >-
        A surface that represents some area of an application that can be
        experimented on.
      properties:
        name:
          type: string
          description: >-
            The identifier for the surface, for example,
            `surfaces/ndcrhu0tzbin85xzpszv.
        displayName:
          type: string
          description: A human-readable name for the surface.
        description:
          type: string
          description: A description for what the surface represents in the application.
        labels:
          type: array
          items:
            type: object
            additionalProperties:
              type: string
          description: Custom labels for this surface.
        createTime:
          type: object
          description: Time when the surface was first created.
        updateTime:
          type: object
          description: Time when the surface was last updated.
        deleteTime:
          type: object
          description: If set, time when the surface was deleted.
        creator:
          type: string
          description: Reference to the identity that created this surface.
        updater:
          type: string
          description: Reference to the identity that last updated this surface.
        owner:
          type: string
          description: The owner of the resource. If not set will default to the creator.
        reviews:
          type: object
          properties:
            mandatory:
              type: boolean
              description: |-
                If reviews are mandatory for experiments that are
                 attached to the surface.
            reviewers:
              type: array
              items:
                type: string
              description: >-
                Identities (including users and groups) that can review for the
                surface. If any of them of the
                 reviewers have approved the experiment, it is considered approved
                 for the surface. If any of them reject the experiment, it is
                 considered rejected for the surface, regardless if someone else
                 has approved the experiment.
          description: Surface config for experiment reviews.
        metricConfig:
          type: object
          properties:
            mandatoryMetrics:
              type: array
              items:
                type: object
                properties:
                  metric:
                    type: string
                    description: Name of the metric.
                  successMetric:
                    type: object
                    properties:
                      minimumDetectableEffect:
                        type: object
                        properties:
                          value:
                            type: string
                            description: |-
                              The decimal value, as a string.

                               The string representation consists of an optional sign, `+` (`U+002B`)
                               or `-` (`U+002D`), followed by a sequence of zero or more decimal digits
                               ("the integer"), optionally followed by a fraction, optionally followed
                               by an exponent.

                               The fraction consists of a decimal point followed by zero or more decimal
                               digits. The string must contain at least one digit in either the integer
                               or the fraction. The number formed by the sign, the integer and the
                               fraction is referred to as the significand.

                               The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`)
                               followed by one or more decimal digits.

                               Services **should** normalize decimal values before storing them by:

                                 - Removing an explicitly-provided `+` sign (`+2.5` -{">"} `2.5`).
                                 - Replacing a zero-length integer value with `0` (`.5` -{">"} `0.5`).
                                 - Coercing the exponent character to lower-case (`2.5E8` -{">"} `2.5e8`).
                                 - Removing an explicitly-provided zero exponent (`2.5e0` -{">"} `2.5`).

                               Services **may** perform additional normalization based on its own needs
                               and the internal decimal implementation selected, such as shifting the
                               decimal point and exponent value together (example: `2.5e-1` {"<"}-{">"} `0.25`).
                               Additionally, services **may** preserve trailing zeroes in the fraction
                               to indicate increased precision, but are not required to do so.

                               Note that only the `.` character is supported to divide the integer
                               and the fraction; `,` **should not** be supported regardless of locale.
                               Additionally, thousand separators **should not** be supported. If a
                               service does support them, values **must** be normalized.

                               The ENBF grammar is:

                                   DecimalString =
                                     [Sign] Significand [Exponent];

                                   Sign = '+' | '-';

                                   Significand =
                                     Digits ['.'] [Digits] | [Digits] '.' Digits;

                                   Exponent = ('e' | 'E') [Sign] Digits;

                                   Digits = \{ '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' };

                               Services **should** clearly document the range of supported values, the
                               maximum supported precision (total number of digits), and, if applicable,
                               the scale (number of digits after the decimal point), as well as how it
                               behaves when receiving out-of-bounds values.

                               Services **may** choose to accept values passed as input even when the
                               value has a higher precision or scale than the service supports, and
                               **should** round the value to fit the supported scale. Alternatively, the
                               service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC)
                               if precision would be lost.

                               Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in
                               gRPC) if the service receives a value outside of the supported range.
                        description: The minimum detectable effect for the metric.
                    description: >-
                      The metric is used to indicate if the experiment is
                      successful.
                  guardrailMetric:
                    type: object
                    properties:
                      nonInferiorityMargin:
                        type: object
                        properties:
                          value:
                            type: string
                            description: |-
                              The decimal value, as a string.

                               The string representation consists of an optional sign, `+` (`U+002B`)
                               or `-` (`U+002D`), followed by a sequence of zero or more decimal digits
                               ("the integer"), optionally followed by a fraction, optionally followed
                               by an exponent.

                               The fraction consists of a decimal point followed by zero or more decimal
                               digits. The string must contain at least one digit in either the integer
                               or the fraction. The number formed by the sign, the integer and the
                               fraction is referred to as the significand.

                               The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`)
                               followed by one or more decimal digits.

                               Services **should** normalize decimal values before storing them by:

                                 - Removing an explicitly-provided `+` sign (`+2.5` -{">"} `2.5`).
                                 - Replacing a zero-length integer value with `0` (`.5` -{">"} `0.5`).
                                 - Coercing the exponent character to lower-case (`2.5E8` -{">"} `2.5e8`).
                                 - Removing an explicitly-provided zero exponent (`2.5e0` -{">"} `2.5`).

                               Services **may** perform additional normalization based on its own needs
                               and the internal decimal implementation selected, such as shifting the
                               decimal point and exponent value together (example: `2.5e-1` {"<"}-{">"} `0.25`).
                               Additionally, services **may** preserve trailing zeroes in the fraction
                               to indicate increased precision, but are not required to do so.

                               Note that only the `.` character is supported to divide the integer
                               and the fraction; `,` **should not** be supported regardless of locale.
                               Additionally, thousand separators **should not** be supported. If a
                               service does support them, values **must** be normalized.

                               The ENBF grammar is:

                                   DecimalString =
                                     [Sign] Significand [Exponent];

                                   Sign = '+' | '-';

                                   Significand =
                                     Digits ['.'] [Digits] | [Digits] '.' Digits;

                                   Exponent = ('e' | 'E') [Sign] Digits;

                                   Digits = \{ '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' };

                               Services **should** clearly document the range of supported values, the
                               maximum supported precision (total number of digits), and, if applicable,
                               the scale (number of digits after the decimal point), as well as how it
                               behaves when receiving out-of-bounds values.

                               Services **may** choose to accept values passed as input even when the
                               value has a higher precision or scale than the service supports, and
                               **should** round the value to fit the supported scale. Alternatively, the
                               service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC)
                               if precision would be lost.

                               Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in
                               gRPC) if the service receives a value outside of the supported range.
                        description: The non-inferiority margin for the metric.
                    description: >-
                      The metric is used to indicate if the experiment is
                      harmful.
                  preferredDirection:
                    type: string
                    enum:
                      - PREFERRED_DIRECTION_UNSPECIFIED
                      - INCREASE
                      - DECREASE
                    description: The preferred direction for the metric.
                required:
                  - metric
                  - preferredDirection
              description: 'Deprecated: use metrics instead.'
            associatedMetrics:
              type: array
              items:
                type: object
                properties:
                  metric:
                    type: string
                  successMetric:
                    type: object
                    properties:
                      minimumDetectableEffect:
                        type: object
                        properties:
                          value:
                            type: string
                            description: |-
                              The decimal value, as a string.

                               The string representation consists of an optional sign, `+` (`U+002B`)
                               or `-` (`U+002D`), followed by a sequence of zero or more decimal digits
                               ("the integer"), optionally followed by a fraction, optionally followed
                               by an exponent.

                               The fraction consists of a decimal point followed by zero or more decimal
                               digits. The string must contain at least one digit in either the integer
                               or the fraction. The number formed by the sign, the integer and the
                               fraction is referred to as the significand.

                               The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`)
                               followed by one or more decimal digits.

                               Services **should** normalize decimal values before storing them by:

                                 - Removing an explicitly-provided `+` sign (`+2.5` -{">"} `2.5`).
                                 - Replacing a zero-length integer value with `0` (`.5` -{">"} `0.5`).
                                 - Coercing the exponent character to lower-case (`2.5E8` -{">"} `2.5e8`).
                                 - Removing an explicitly-provided zero exponent (`2.5e0` -{">"} `2.5`).

                               Services **may** perform additional normalization based on its own needs
                               and the internal decimal implementation selected, such as shifting the
                               decimal point and exponent value together (example: `2.5e-1` {"<"}-{">"} `0.25`).
                               Additionally, services **may** preserve trailing zeroes in the fraction
                               to indicate increased precision, but are not required to do so.

                               Note that only the `.` character is supported to divide the integer
                               and the fraction; `,` **should not** be supported regardless of locale.
                               Additionally, thousand separators **should not** be supported. If a
                               service does support them, values **must** be normalized.

                               The ENBF grammar is:

                                   DecimalString =
                                     [Sign] Significand [Exponent];

                                   Sign = '+' | '-';

                                   Significand =
                                     Digits ['.'] [Digits] | [Digits] '.' Digits;

                                   Exponent = ('e' | 'E') [Sign] Digits;

                                   Digits = \{ '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' };

                               Services **should** clearly document the range of supported values, the
                               maximum supported precision (total number of digits), and, if applicable,
                               the scale (number of digits after the decimal point), as well as how it
                               behaves when receiving out-of-bounds values.

                               Services **may** choose to accept values passed as input even when the
                               value has a higher precision or scale than the service supports, and
                               **should** round the value to fit the supported scale. Alternatively, the
                               service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC)
                               if precision would be lost.

                               Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in
                               gRPC) if the service receives a value outside of the supported range.
                        description: The minimum detectable effect for the metric.
                    description: >-
                      The metric is used to indicate if the experiment is
                      successful.
                  guardrailMetric:
                    type: object
                    properties:
                      nonInferiorityMargin:
                        type: object
                        properties:
                          value:
                            type: string
                            description: |-
                              The decimal value, as a string.

                               The string representation consists of an optional sign, `+` (`U+002B`)
                               or `-` (`U+002D`), followed by a sequence of zero or more decimal digits
                               ("the integer"), optionally followed by a fraction, optionally followed
                               by an exponent.

                               The fraction consists of a decimal point followed by zero or more decimal
                               digits. The string must contain at least one digit in either the integer
                               or the fraction. The number formed by the sign, the integer and the
                               fraction is referred to as the significand.

                               The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`)
                               followed by one or more decimal digits.

                               Services **should** normalize decimal values before storing them by:

                                 - Removing an explicitly-provided `+` sign (`+2.5` -{">"} `2.5`).
                                 - Replacing a zero-length integer value with `0` (`.5` -{">"} `0.5`).
                                 - Coercing the exponent character to lower-case (`2.5E8` -{">"} `2.5e8`).
                                 - Removing an explicitly-provided zero exponent (`2.5e0` -{">"} `2.5`).

                               Services **may** perform additional normalization based on its own needs
                               and the internal decimal implementation selected, such as shifting the
                               decimal point and exponent value together (example: `2.5e-1` {"<"}-{">"} `0.25`).
                               Additionally, services **may** preserve trailing zeroes in the fraction
                               to indicate increased precision, but are not required to do so.

                               Note that only the `.` character is supported to divide the integer
                               and the fraction; `,` **should not** be supported regardless of locale.
                               Additionally, thousand separators **should not** be supported. If a
                               service does support them, values **must** be normalized.

                               The ENBF grammar is:

                                   DecimalString =
                                     [Sign] Significand [Exponent];

                                   Sign = '+' | '-';

                                   Significand =
                                     Digits ['.'] [Digits] | [Digits] '.' Digits;

                                   Exponent = ('e' | 'E') [Sign] Digits;

                                   Digits = \{ '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' };

                               Services **should** clearly document the range of supported values, the
                               maximum supported precision (total number of digits), and, if applicable,
                               the scale (number of digits after the decimal point), as well as how it
                               behaves when receiving out-of-bounds values.

                               Services **may** choose to accept values passed as input even when the
                               value has a higher precision or scale than the service supports, and
                               **should** round the value to fit the supported scale. Alternatively, the
                               service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC)
                               if precision would be lost.

                               Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in
                               gRPC) if the service receives a value outside of the supported range.
                        description: The non-inferiority margin for the metric.
                    description: >-
                      The metric is used to indicate if the experiment is
                      harmful.
                  preferredDirection:
                    type: string
                    enum:
                      - PREFERRED_DIRECTION_UNSPECIFIED
                      - INCREASE
                      - DECREASE
                    description: The preferred direction for the metric.
                required:
                  - metric
              description: 'Deprecated: use metrics instead.'
            metrics:
              type: array
              items:
                type: object
                properties:
                  metric:
                    type: string
                  successMetric:
                    type: object
                    properties:
                      minimumDetectableEffect:
                        type: object
                        properties:
                          value:
                            type: string
                            description: |-
                              The decimal value, as a string.

                               The string representation consists of an optional sign, `+` (`U+002B`)
                               or `-` (`U+002D`), followed by a sequence of zero or more decimal digits
                               ("the integer"), optionally followed by a fraction, optionally followed
                               by an exponent.

                               The fraction consists of a decimal point followed by zero or more decimal
                               digits. The string must contain at least one digit in either the integer
                               or the fraction. The number formed by the sign, the integer and the
                               fraction is referred to as the significand.

                               The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`)
                               followed by one or more decimal digits.

                               Services **should** normalize decimal values before storing them by:

                                 - Removing an explicitly-provided `+` sign (`+2.5` -{">"} `2.5`).
                                 - Replacing a zero-length integer value with `0` (`.5` -{">"} `0.5`).
                                 - Coercing the exponent character to lower-case (`2.5E8` -{">"} `2.5e8`).
                                 - Removing an explicitly-provided zero exponent (`2.5e0` -{">"} `2.5`).

                               Services **may** perform additional normalization based on its own needs
                               and the internal decimal implementation selected, such as shifting the
                               decimal point and exponent value together (example: `2.5e-1` {"<"}-{">"} `0.25`).
                               Additionally, services **may** preserve trailing zeroes in the fraction
                               to indicate increased precision, but are not required to do so.

                               Note that only the `.` character is supported to divide the integer
                               and the fraction; `,` **should not** be supported regardless of locale.
                               Additionally, thousand separators **should not** be supported. If a
                               service does support them, values **must** be normalized.

                               The ENBF grammar is:

                                   DecimalString =
                                     [Sign] Significand [Exponent];

                                   Sign = '+' | '-';

                                   Significand =
                                     Digits ['.'] [Digits] | [Digits] '.' Digits;

                                   Exponent = ('e' | 'E') [Sign] Digits;

                                   Digits = \{ '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' };

                               Services **should** clearly document the range of supported values, the
                               maximum supported precision (total number of digits), and, if applicable,
                               the scale (number of digits after the decimal point), as well as how it
                               behaves when receiving out-of-bounds values.

                               Services **may** choose to accept values passed as input even when the
                               value has a higher precision or scale than the service supports, and
                               **should** round the value to fit the supported scale. Alternatively, the
                               service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC)
                               if precision would be lost.

                               Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in
                               gRPC) if the service receives a value outside of the supported range.
                        description: >-
                          A representation of a decimal value, such as 2.5.
                          Clients may convert values
                           into language-native decimal formats, such as Java's [BigDecimal][] or
                           Python's [decimal.Decimal][].

                           [BigDecimal]:
                           https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html
                           [decimal.Decimal]: https://docs.python.org/3/library/decimal.html
                  guardrailMetric:
                    type: object
                    properties:
                      nonInferiorityMargin:
                        type: object
                        properties:
                          value:
                            type: string
                            description: |-
                              The decimal value, as a string.

                               The string representation consists of an optional sign, `+` (`U+002B`)
                               or `-` (`U+002D`), followed by a sequence of zero or more decimal digits
                               ("the integer"), optionally followed by a fraction, optionally followed
                               by an exponent.

                               The fraction consists of a decimal point followed by zero or more decimal
                               digits. The string must contain at least one digit in either the integer
                               or the fraction. The number formed by the sign, the integer and the
                               fraction is referred to as the significand.

                               The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`)
                               followed by one or more decimal digits.

                               Services **should** normalize decimal values before storing them by:

                                 - Removing an explicitly-provided `+` sign (`+2.5` -{">"} `2.5`).
                                 - Replacing a zero-length integer value with `0` (`.5` -{">"} `0.5`).
                                 - Coercing the exponent character to lower-case (`2.5E8` -{">"} `2.5e8`).
                                 - Removing an explicitly-provided zero exponent (`2.5e0` -{">"} `2.5`).

                               Services **may** perform additional normalization based on its own needs
                               and the internal decimal implementation selected, such as shifting the
                               decimal point and exponent value together (example: `2.5e-1` {"<"}-{">"} `0.25`).
                               Additionally, services **may** preserve trailing zeroes in the fraction
                               to indicate increased precision, but are not required to do so.

                               Note that only the `.` character is supported to divide the integer
                               and the fraction; `,` **should not** be supported regardless of locale.
                               Additionally, thousand separators **should not** be supported. If a
                               service does support them, values **must** be normalized.

                               The ENBF grammar is:

                                   DecimalString =
                                     [Sign] Significand [Exponent];

                                   Sign = '+' | '-';

                                   Significand =
                                     Digits ['.'] [Digits] | [Digits] '.' Digits;

                                   Exponent = ('e' | 'E') [Sign] Digits;

                                   Digits = \{ '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' };

                               Services **should** clearly document the range of supported values, the
                               maximum supported precision (total number of digits), and, if applicable,
                               the scale (number of digits after the decimal point), as well as how it
                               behaves when receiving out-of-bounds values.

                               Services **may** choose to accept values passed as input even when the
                               value has a higher precision or scale than the service supports, and
                               **should** round the value to fit the supported scale. Alternatively, the
                               service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC)
                               if precision would be lost.

                               Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in
                               gRPC) if the service receives a value outside of the supported range.
                        description: >-
                          A representation of a decimal value, such as 2.5.
                          Clients may convert values
                           into language-native decimal formats, such as Java's [BigDecimal][] or
                           Python's [decimal.Decimal][].

                           [BigDecimal]:
                           https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html
                           [decimal.Decimal]: https://docs.python.org/3/library/decimal.html
                  preferredDirection:
                    type: string
                    enum:
                      - PREFERRED_DIRECTION_UNSPECIFIED
                      - INCREASE
                      - DECREASE
                  enforcementLevel:
                    type: string
                    enum:
                      - ENFORCEMENT_LEVEL_UNSPECIFIED
                      - SUGGESTED
                      - REQUIRED
                    description: |-
                      How this metric is enforced on experiments.
                       REQUIRED: always included, cannot be removed by the experimenter.
                       SUGGESTED: auto-added when creating an experiment, can be removed.
                       ENFORCEMENT_LEVEL_UNSPECIFIED: linked but not auto-added (associated).
                required:
                  - metric
              description: All metrics configured on the surface, with enforcement level.
          description: Configuration for metrics the surface.
        automatedActions:
          type: array
          items:
            type: object
            properties:
              trigger:
                type: object
                properties:
                  activityTrigger:
                    type: object
                    properties:
                      kind:
                        type: string
                      resource:
                        type: string
                  stateTrigger:
                    type: object
                    properties:
                      state:
                        type: string
                      resource:
                        type: string
              action:
                type: object
                properties:
                  executeFunctionAction:
                    type: object
                    properties:
                      function:
                        type: string
                      parameters:
                        type: object
                        description: >-
                          `Struct` represents a structured data value,
                          consisting of fields
                           which map to dynamically typed values. In some languages, `Struct`
                           might be supported by a native representation. For example, in
                           scripting languages like JS a struct is represented as an
                           object. The details of that representation are described together
                           with the proto support for the language.

                           The JSON representation for `Struct` is JSON object.
                  pagerdutyAction:
                    type: object
                    properties:
                      pdKey:
                        type: string
                      title:
                        type: string
                      description:
                        type: string
                      severity:
                        type: string
                        enum:
                          - critical
                          - warning
                          - info
                          - error
                    required:
                      - pdKey
                      - severity
                  transitionAction:
                    type: object
                    properties:
                      action:
                        type: string
                      parameters:
                        type: object
                        description: >-
                          `Struct` represents a structured data value,
                          consisting of fields
                           which map to dynamically typed values. In some languages, `Struct`
                           might be supported by a native representation. For example, in
                           scripting languages like JS a struct is represented as an
                           object. The details of that representation are described together
                           with the proto support for the language.

                           The JSON representation for `Struct` is JSON object.
          description: Actions to trigger once the metric starts tanking
        stakeholders:
          type: array
          items:
            type: object
            properties:
              identity:
                type: string
                description: Reference to the identity who is the stakeholder.
              role:
                type: string
                description: 'The role of the person: Product, Engineering, ...'
            required:
              - identity
              - role
          description: |-
            People with specific roles or responsibilities for the surface,
             such as product or engineering leads.
      required:
        - displayName
        - createTime
        - updateTime
        - creator
        - updater
  securitySchemes:
    admin:
      type: http
      scheme: bearer

````