openapi: 3.1.0
info:
  title: Admin Analytic Filters
  description: |-
    Filters which support data analysis of banking data by financial institution analysis by allowing analysts to work with subsets of data according to boolean conditions and combinations of those boolean conditions.

    A _Filter Type_ defines a class of filters, with the following fields:

      * The filter type's _name_; this specifies the data source(s) the filter type applies to; the data is called a _measure_.
      * The _operators_ allowed with that filter type
      * A schema for the data values the analyst may use with the filter type: the data type of the measure and
        any constraints for specifying a filter, such as minimum and maximum values, or a fixed list of choices
        to use.


    For example, to analyze data for customers in the age range 35 to 49 years of age, an analyst may use the `customerAge` filter type. That filter type defines a set of operators such as `lessThan`, `greaterThan`, `equals`, `between`, etc. The `dataType` for the `customerAge` filter is `integer`, meaning the comparable data values in the measure are _integer_ (whole) numbers. The filter type's constraints may define a minimum and maximum value for reasonable queries, for example the minimum value for the `customerAge` filter type may be 2 and the maximum value may be 130. (The financial institution may set alter the constraints on each filter type.)

    A _filter instance_  (or just _filter_) consists of a specific filter type (by name and ID), a operator from that filter type's list of allowed operators, and optional values to compare against the measurements named by the filter type. This sample filter mentioned above uses the operator `between` and the constants `35` and `49`.

    Subsetting customers by one or more filters is also referred to as _customer segmentation_, although filters may apply to other data measures, such as account or transaction measures.

    Simple binary filters compare the measure to a single value, such as

      * Customer type is "retail"
      * Customer age less than 25
      * Account balance greater than $100,000

    Range or "between" filters use two data values, such as

      * Customer age is between 35 and 49
      * Average balance is between 10,000 and 50,000

    Ranges are inclusive of the endpoints.

    Set inclusion filters are defined with two or more multiple values, for example

      * Customer primary address state in the set "NC", "SC", "GA", "FL"
      * Customer zip code in a list of 15 target zip codes _z1_, _z2_, _z3_, _z4_, _z5_, _z6_, _z7_, _z8_.

    All constant values used in filter types and filters are encoded as strings, including numbers such as "100", currency values such as "125.50" (U.S. dollars), boolean values such as "true", and dates such as "2023-05-01".

    Operators are drawn from the following list:

      * relational operators: `equals`, `notEquals`, `lessThan`, `lessThanOrEqualTo`, `greaterThan`, `greaterThanOrEqualTo`.
        (If the measure represents a data, the relational operators are before and after).
      * range comparison operation: `between`, `notBetween`
      * set inclusion: `in`, `notIn`.
      * date values: `before`, `after` (dates are inclusive of the given filter constant values).

    This API provides an operation to [list analytic filter types](#op-listAnalyticFilterTypes) and an operation [get an analytic filter type`](#op-getAnalyticFilterType).
  version: 0.4.2
  contact:
    name: Apiture
    url: https://developer.apiture.com/help/support/
    email: api@apiture.com
  termsOfService: https://developer.apiture.com/docs/Apiture-API-License-Agreement.pdf
  license:
    name: Apiture API License
    url: https://developer.apiture.com/docs/Apiture-API-License-Agreement.pdf
x-apiture-namespace: bankingAdminAnalyticFilters
servers:
  - url: /bankingAdmin
tags:
  - name: Analytic Filter Types
    description: Banking Admin Analytic Filters
paths:
  /analyticFilterTypes:
    get:
      summary: Return a collection of analytic filter types
      description: Return a list of analytic filter types definitions supported by the financial institution. If the `Accept-Language` header is passed, the returned `label` values will match the requested language, if available. If no localized labels are available the US English labels are returned.
      operationId: listAnalyticFilterTypes
      x-apiture-api: bankingAdminAnalyticFilters
      x-apiture-group: analyticFilterTypes
      tags:
        - Analytic Filter Types
      x-apiture-todo: Add filters, i.e. by category to list the enabled customer filters? (Client can fetch all)
      parameters:
        - name: state
          description: Return only filter types whose state matches this value.
          in: query
          schema:
            $ref: '#/components/schemas/analyticFilterTypeState'
        - $ref: '#/components/parameters/acceptLanguageHeaderParam'
        - $ref: '#/components/parameters/ifNoneMatchHeaderParam'
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/analyticFilterTypes'
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
        '304':
          $ref: '#/components/responses/304'
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '403':
          $ref: '#/components/responses/403'
        '422':
          description: Unprocessable Entity. The request body and/or query parameters were well formed but otherwise invalid.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/problemResponse'
            application/json:
              schema:
                $ref: '#/components/schemas/problemResponse'
        '429':
          $ref: '#/components/responses/429'
        4XX:
          $ref: '#/components/responses/4XX'
        5XX:
          $ref: '#/components/responses/5XX'
      security:
        - accessToken:
            - adminData/read
      x-apiture-permission: listAnalyticFilterTypes
  /analyticFilterTypes/{analyticFilterTypeId}:
    parameters:
      - $ref: '#/components/parameters/analyticFilterTypeIdPathParam'
    get:
      summary: Fetch a representation of this analytic filter type
      description: Return the JSON representation of this analytic filter type resource.
      operationId: getAnalyticFilterType
      x-apiture-api: bankingAdminAnalyticFilters
      parameters:
        - $ref: '#/components/parameters/acceptLanguageHeaderParam'
        - $ref: '#/components/parameters/ifNoneMatchHeaderParam'
      x-apiture-group: analyticFilterTypes
      tags:
        - Analytic Filter Types
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/analyticFilterType'
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
        '304':
          $ref: '#/components/responses/304'
        '401':
          $ref: '#/components/responses/401'
        '403':
          $ref: '#/components/responses/403'
        '404':
          $ref: '#/components/responses/404AnalyticFilterType'
        '429':
          $ref: '#/components/responses/429'
        4XX:
          $ref: '#/components/responses/4XX'
        5XX:
          $ref: '#/components/responses/5XX'
      security:
        - accessToken:
            - adminData/read
      x-apiture-permission: getAnalyticFilterType
components:
  securitySchemes:
    accessToken:
      type: openIdConnect
      description: OpenId Connect (OIDC) authentication/authorization. The client uses the `authorization_endpoint` and `token_endpoint` to obtain an access token to pass in the `Authorization` header. Those endpoints are available via the OIDC Configuration URL. The actual URL may vary with each financial institution. See details at [Secure Access](https://dx.apiture.com/docs/api/concepts/api-keys/).
      openIdConnectUrl: https://auth.apiture.com/oidc/.well-known/openid-configuration
      x-resolved-from: ../../common/openapi.yaml#/components/securitySchemes/accessToken
  parameters:
    analyticFilterTypeIdPathParam:
      name: analyticFilterTypeId
      description: The unique identifier of this analytic filter type. This is an opaque string.
      in: path
      schema:
        $ref: '#/components/schemas/resourceId'
      required: true
    acceptLanguageHeaderParam:
      name: Accept-Language
      in: header
      schema:
        type: string
        format: text
        maxLength: 128
      description: The weighted language tags which indicate the user's preferred natural language for the localized labels in the response, as per [RFC 7231](https://tools.ietf.org/html/rfc7231#section-5.3.5). If no localized data is available that matches the requested language tag, the default US English data is returned.
      x-resolved-from: ../../common/openapi.yaml#/components/parameters/acceptLanguageHeaderParam
    ifNoneMatchHeaderParam:
      name: If-None-Match
      description: The entity tag that was returned in the `ETag` response header of a previous call. If the resource's current entity tag value matches this header value, the `GET` will return 304 (Not Modified) and no response body, else the current resource representation and updated `ETag` is returned.
      in: header
      schema:
        type: string
        pattern: ^\P{Cc}{1,512}$
        maxLength: 512
      x-resolved-from: ../../common/openapi.yaml#/components/parameters/ifNoneMatchHeaderParam
  responses:
    '304':
      description: Not Modified. The resource has not been modified since it was last fetched.
      x-resolved-from: ../../common/openapi.yaml#/components/responses/304
    '400':
      description: |
        Bad Request. The request body, request headers, and/or query parameters are not well-formed.

        This error response may have one of the following `type` values:
        * [`https://static.api.apiture.com/errors/badRequest/v1.0.0`](https://static.api.apiture.com/errors/badRequest/v1.0.0)<br>
          The request body and/or parameters was not well-formed.
          Remediation: Correct any syntax or schema errors in the request body or parameters.
      x-apiture-errors:
        - $ref: '#/components/x-apiture-errors/badRequest'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/problemResponse'
            example:
              id: 3fbad566-be86-4b22-9ba6-3ca99fdc0799
              type: https://static.api.apiture.com/errors/badRequest/v1.0.0
              title: Bad Request
              status: 400
              occurredAt: '2022-04-25T12:42:21.375Z'
              detail: Input did not parse as JSON
              instance: https://static.api.apiture.com/banking/transfers/bb709151-575041fcd617
        application/json:
          schema:
            $ref: '#/components/schemas/problemResponse'
            example:
              id: 3fbad566-be86-4b22-9ba6-3ca99fdc0799
              type: https://static.api.apiture.com/errors/badRequest/v1.0.0
              title: Bad Request
              status: 400
              occurredAt: '2022-04-25T12:42:21.375Z'
              detail: Input did not parse as JSON
              instance: https://static.api.apiture.com/banking/transfers/bb709151-575041fcd617
      x-resolved-from: ../../common/openapi.yaml#/components/responses/400
    '401':
      description: |
        Unauthorized. The operation requires authentication but no authentication or insufficient authentication was given.

        This error response may have one of the following `type` values:
        * [`https://static.api.apiture.com/errors/unauthorized/v1.0.0`](https://static.api.apiture.com/errors/unauthorized/v1.0.0)<br>
          The request lacks valid authentication credentials for the target resource or operation.
          Remediation: Authenticate the user and pass the required authorization with the request.
      x-apiture-errors:
        - $ref: '#/components/x-apiture-errors/unauthorized'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/problemResponse'
            example:
              id: 3fbad566-be86-4b22-9ba6-3ca99fdc0799
              type: https://static.api.apiture.com/errors/unauthorized/v1.0.0
              title: Unauthorized
              status: 401
              occurredAt: '2022-04-25T12:42:21.375Z'
              detail: The request lacks valid authentication credentials
              instance: https://static.api.apiture.com/banking/transfers/bb709151-575041fcd617
        application/json:
          schema:
            $ref: '#/components/schemas/problemResponse'
            example:
              id: 3fbad566-be86-4b22-9ba6-3ca99fdc0799
              type: https://static.api.apiture.com/errors/unauthorized/v1.0.0
              title: Unauthorized
              status: 401
              occurredAt: '2022-04-25T12:42:21.375Z'
              detail: The request lacks valid authentication credentials
              instance: https://static.api.apiture.com/banking/transfers/bb709151-575041fcd617
      x-resolved-from: ../../common/openapi.yaml#/components/responses/401
    '403':
      description: |
        Forbidden. The authenticated caller is not authorized to perform the requested operation.

        This error response may have one of the following `type` values:
        * [`https://static.api.apiture.com/errors/forbidden/v1.0.0`](https://static.api.apiture.com/errors/forbidden/v1.0.0)<br>
          The user or agent is not allowed to perform this operation; authentication credentials were provided in the request, but the server considers them insufficient to grant access.
          Remediation: Check the user's permissions and entitlements before attempting the operation.

        * [`https://static.api.apiture.com/errors/customerDisabled/v1.0.0`](https://static.api.apiture.com/errors/customerDisabled/v1.0.0)<br>
          The customer is disabled.
          Remediation: Have the customer contact the financial institution for support.

        * [`https://static.api.apiture.com/errors/antiMalwareRequired/v1.0.0`](https://static.api.apiture.com/errors/antiMalwareRequired/v1.0.0)<br>
          The financial institution requires the customer to have anti-malware software installed.
          Remediation: Direct the user to the software requirements guide to install the correct anti-malware software.

        * [`https://static.api.apiture.com/errors/modificationForbidden/v1.0.0`](https://static.api.apiture.com/errors/modificationForbidden/v1.0.0)<br>
          The customer is properly authenticated but not authorized to create, modify, or delete resources.
          Remediation: Avoid modification operation for customers with read-only authorization.

        * [`https://static.api.apiture.com/errors/challengeRequired/v1.0.0`](https://static.api.apiture.com/errors/challengeRequired/v1.0.0)<br>
          The operation requires the customer to complete an identity challenge.
          Remediation: Complete the challenge as per the problem response, and add an additional `Challenge` header to the call.
        The `attributes` object in the error may have the properties defined by the [`requiredIdentityChallenge` schema](#schema-requiredIdentityChallenge).
        * [`https://static.api.apiture.com/errors/challengeBlocked/v1.0.0`](https://static.api.apiture.com/errors/challengeBlocked/v1.0.0)<br>
          The user has failed challenges too many times and is blocked from attempting more or performing operations which require additional authentication.
          Remediation: Have the user end their login session and login again.

        * [`https://static.api.apiture.com/errors/noIdentityChallengeFactors/v1.0.0`](https://static.api.apiture.com/errors/noIdentityChallengeFactors/v1.0.0)<br>
          This operation requires an identity challenge, but the user does not have the necessary registered authentication factors.
          Remediation: Have the user register one or more challenge security code delivery factors.

        * [`https://static.api.apiture.com/errors/invalidIdentityChallengeHeader/v1.0.0`](https://static.api.apiture.com/errors/invalidIdentityChallengeHeader/v1.0.0)<br>
          The additional on-time `Challenge` header in this request is expired, already used, or otherwise invalid.
          Remediation: Supply a valid, unexpired, unclaimed `Challenge` header in the request.
      x-apiture-errors:
        - $ref: '#/components/x-apiture-errors/forbidden'
        - $ref: '#/components/x-apiture-errors/customerDisabled'
        - $ref: '#/components/x-apiture-errors/antiMalwareRequired'
        - $ref: '#/components/x-apiture-errors/modificationForbidden'
        - $ref: '#/components/x-apiture-errors/challengeRequired'
        - $ref: '#/components/x-apiture-errors/challengeBlocked'
        - $ref: '#/components/x-apiture-errors/noIdentityChallengeFactors'
        - $ref: '#/components/x-apiture-errors/invalidIdentityChallengeHeader'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/problemResponse'
            example:
              id: 3fbad566-be86-4b22-9ba6-3ca99fdc0799
              type: https://static.api.apiture.com/errors/forbidden/v1.0.0
              title: Forbidden
              status: 403
              occurredAt: '2022-04-25T12:42:21.375Z'
              detail: The request has valid authentication, but the authenticated agent is forbidden from accessing this resource or operation
              instance: https://static.api.apiture.com/banking/transfers/bb709151-575041fcd617
        application/json:
          schema:
            $ref: '#/components/schemas/problemResponse'
            example:
              id: 3fbad566-be86-4b22-9ba6-3ca99fdc0799
              type: https://static.api.apiture.com/errors/forbidden/v1.0.0
              title: Forbidden
              status: 403
              occurredAt: '2022-04-25T12:42:21.375Z'
              detail: The request has valid authentication, but the authenticated agent is forbidden from accessing this resource or operation
              instance: https://static.api.apiture.com/banking/transfers/bb709151-575041fcd617
      x-resolved-from: ../../common/openapi.yaml#/components/responses/403
    '429':
      description: |
        Too Many Requests. The client has sent too many requests in a given amount of time.

        This error response may have one of the following `type` values:
        * [`https://static.api.apiture.com/errors/tooManyRequests/v1.0.0`](https://static.api.apiture.com/errors/tooManyRequests/v1.0.0)<br>
          The client has sent too many requests in a given amount of time, exceeding rate limiting.
          Remediation: Slow down the rate of API calls.
      x-apiture-errors:
        - $ref: '#/components/x-apiture-errors/tooManyRequests'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/problemResponse'
            example:
              id: 3fbad566-be86-4b22-9ba6-3ca99fdc0799
              type: https://static.api.apiture.com/errors/tooManyRequests/v1.0.0
              title: Too Many Requests
              status: 429
              occurredAt: '2022-04-25T12:42:21.375Z'
              detail: The user has sent too many requests in a given amount of time.
              instance: https://static.api.apiture.com/banking/transfers/bb709151-575041fcd617
        application/json:
          schema:
            $ref: '#/components/schemas/problemResponse'
            example:
              id: 3fbad566-be86-4b22-9ba6-3ca99fdc0799
              type: https://static.api.apiture.com/errors/tooManyRequests/v1.0.0
              title: Too Many Requests
              status: 429
              occurredAt: '2022-04-25T12:42:21.375Z'
              detail: The user has sent too many requests in a given amount of time.
              instance: https://static.api.apiture.com/banking/transfers/bb709151-575041fcd617
      x-resolved-from: ../../common/openapi.yaml#/components/responses/429
    404AnalyticFilterType:
      description: Not Found. There is no such analytic filter type resource at the specified `{analyticFilterTypeId}`.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/problemResponse'
        application/json:
          schema:
            $ref: '#/components/schemas/problemResponse'
    4XX:
      description: Client Request Problem. The client request had a problem not listed under another specific 400-level HTTP response code. View the `detail` in the problem response for additional details.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/problemResponse'
            example:
              id: 3fbad566-be86-4b22-9ba6-3ca99fdc0799
              type: https://static.api.apiture.com/errors/methodNotAllowed/v1.0.0
              title: Method Not Allowed
              status: 405
              occurredAt: '2022-04-25T12:42:21.375Z'
              detail: This HTTP method is not allowed for the given resource URL.
              instance: https://static.api.apiture.com/banking/transfers/bb709151-575041fcd617
        application/json:
          schema:
            $ref: '#/components/schemas/problemResponse'
            example:
              id: 3fbad566-be86-4b22-9ba6-3ca99fdc0799
              type: https://static.api.apiture.com/errors/methodNotAllowed/v1.0.0
              title: Method Not Allowed
              status: 405
              occurredAt: '2022-04-25T12:42:21.375Z'
              detail: This HTTP method is not allowed for the given resource URL.
              instance: https://static.api.apiture.com/banking/transfers/bb709151-575041fcd617
      x-resolved-from: ../../common/openapi.yaml#/components/responses/4XX
    5XX:
      description: Server Problem. The server encountered a problem not listed under another specific 500-level HTTP response code. View the `detail` in the problem response for additional details.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/problemResponse'
            example:
              id: 3fbad566-be86-4b22-9ba6-3ca99fdc0799
              type: https://static.api.apiture.com/errors/gatewayTimeout/v1.0.0
              title: Insufficient Storage
              status: 507
              occurredAt: '2022-04-25T12:42:21.375Z'
              detail: The server is unable to store the representation needed to successfully complete the request.
              instance: https://static.api.apiture.com/banking/transfers/bb709151-575041fcd617
        application/json:
          schema:
            $ref: '#/components/schemas/problemResponse'
            example:
              id: 3fbad566-be86-4b22-9ba6-3ca99fdc0799
              type: https://static.api.apiture.com/errors/gatewayTimeout/v1.0.0
              title: Insufficient Storage
              status: 507
              occurredAt: '2022-04-25T12:42:21.375Z'
              detail: The server is unable to store the representation needed to successfully complete the request.
              instance: https://static.api.apiture.com/banking/transfers/bb709151-575041fcd617
      x-resolved-from: ../../common/openapi.yaml#/components/responses/5XX
  schemas:
    analyticFilterOperatorType:
      title: Analytic Filter Operator Type (v1.0.0)
      description: |+
        Indicates the type of the comparison operator used by an analytic filter.

        <strong><code>analyticFilterOperatorType</code></strong> strings may have one of the following
        [enumerated values](https://developer.apiture.com/docs/concepts/label-groups#enumerations):

        <table>
        <tr>
          <th>Value</th><th>Description</th>
        </tr>

        <tr>
            <td><strong><code>equals</code></strong></td><td>Equals: <p>The measure is equal to a value. A filter using this operator requires exactly 1 value.</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>notEquals</code></strong></td><td>Not Equals: <p>The measure not equal to a value. A filter using this operator requires exactly 1 value.</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>lessThan</code></strong></td><td>Less Than: <p>The measurement less than a value. A filter using this operator requires exactly 1 value.</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>lessThanOrEqualTo</code></strong></td><td>Less Than or Equal To: <p>The measure less than or equal a value. A filter using this operator requires exactly 1 value.</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>greaterThan</code></strong></td><td>Greater Than: <p>The measure is greater than a value. A filter using this operator requires exactly 1 value.</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>greaterThanOrEqualTo</code></strong></td><td>Greater Than or Equal To: <p>The measure greater than or equal to a value. A filter using this operator requires exactly 1 value.</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>between</code></strong></td><td>Between: <p>The measure is Between a minimum and maximum value. A filter using this operator requires exactly 2 values.</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>notBetween</code></strong></td><td>Not Between: <p>Measure not between a minimum and maximum value. A filter using this operator requires exactly 2 values.</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>before</code></strong></td><td>Before: <p>Date measure before or on a value. A filter using this operator requires exactly 1 value.</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>after</code></strong></td><td>After: <p>Date measure on or after a value. A filter using this operator requires exactly 1 value.</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>in</code></strong></td><td>In: <p>The measure is in a set of values. A filter using this operator requires at least 2 values.</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>notIn</code></strong></td><td>Not In: <p>The measure is not in a set of values. A filter using this operator requires exactly 2 values.</p>
        </td>
            </tr>
        </table>

      type: string
      x-apiture-enum: analyticFilterOperatorType
      enum:
        - equals
        - notEquals
        - lessThan
        - lessThanOrEqualTo
        - greaterThan
        - greaterThanOrEqualTo
        - before
        - after
        - between
        - notBetween
        - in
        - notIn
      x-apiture-version: 1.0.0
    analyticFilterValueType:
      title: Analytic Filter Value Type (v1.0.0)
      description: Indicates the type of data value the analyst provides when using this filter type and operator.
      type: string
      enum:
        - string
        - integer
        - number
        - boolean
        - date
      x-apiture-version: 1.0.0
    analyticFilterTypeReference:
      x-apiture-version: 1.0.2
      title: Analytic Filter Type Reference (v1.0.2)
      description: An object that reference and Analytic Filter Type by its `id` and `name`.
      type: object
      required:
        - id
      properties:
        id:
          description: The unique identifier for this analytic filter type resource. This is an immutable opaque string.
          $ref: '#/components/schemas/resourceId'
        name:
          description: The name of the filter type. This is for informational purposes only.
          $ref: '#/components/schemas/analyticFilterTypeName'
      example:
        id: 3752cfec9b06fae15c9e
        name: customerAge
    analyticFilterValue:
      title: Analytic Filter Value (v1.0.0)
      description: A constant value used in a filter, such as `25` in a filter `{ customerAge greater than 25 }`. This value is compared to the measure defined by the filter.
      type: string
      maxLength: 200
      format: text
      example: 25-to-49
      x-apiture-version: 1.0.0
    analyticFilterNumberConstraints:
      title: Analytic Filter Number Constraints (v1.0.0)
      description: Constraints for a filter type whose `dataType` is `number` or `currency`. All properties are optional.
      type: object
      properties:
        minimum:
          description: The user must enter a value that is greater than or equal to this value.
          type: number
        maximum:
          description: The user must enter a value that is less than or equal to this value.
          type: number
        precision:
          description: For filter types with `dataType` of `number`, this is the maximum number of decimal digits allowed after the decimal point. Scientific notation is not allowed.
          type: integer
          format: int32
          minimum: 1
          maximum: 20
      example:
        minimum: 0
        maximum: 999.99
        precision: 2
      x-apiture-version: 1.0.0
    analyticFilterIntegerConstraints:
      title: Analytic Filter Integer Constraints (v1.0.0)
      description: Constraints for a filter type whose `dataType` is `integer`. All properties are optional.
      type: object
      properties:
        minimum:
          description: The user must enter a value that is greater than or equal to this value.
          type: integer
          format: int32
          minimum: -2147483648
          maximum: 2147483647
        maximum:
          description: The user must enter a value that is less than or equal to this value.
          type: integer
          format: int32
          minimum: -2147483648
          maximum: 2147483647
      example:
        minimum: 0
        maximum: 99
      x-apiture-version: 1.0.0
    analyticFilterStringConstraints:
      title: Analytic Filter String Constraints (v1.0.0)
      description: Constraints for a filter type whose `dataType` is `string`. All properties are optional.
      type: object
      properties:
        minimumLength:
          description: The user must enter a value that has at least this number of characters.
          type: integer
          format: int32
          minimum: 0
          maximum: 200
        maximumLength:
          description: The user must enter a value that has no more than this number of characters.
          type: integer
          format: int32
          minimum: 1
          maximum: 200
      example:
        minimumLength: 0
        maximumLength: 20
      x-apiture-version: 1.0.0
    analyticFilterDateConstraints:
      title: Analytic Filter Date Constraints (v1.0.0)
      description: Constraints for a filter type whose `dataType` is `date`. Dates are expressed in [RFC 3339](https://tools.ietf.org/html/rfc3339) `YYYY-MM-DD` `date` format. A value may also be `today` rather than a fixed date.
      type: object
      properties:
        minimumDate:
          description: The user must enter a date value that falls on or after this date.
          type: string
          pattern: ^(today|\d{4}-\d{2}-\d{2})$
          maxLength: 10
        maximumDate:
          description: The user must enter a date value that falls on or before this date.
          type: string
          pattern: ^(today|\d{4}-\d{2}-\d{2})$
          maxLength: 10
      example:
        minimumDate: today
      x-apiture-version: 1.0.0
    analyticFilterListConstraintFields:
      title: Analytic Filter List Constraint Fields (v1.0.0)
      description: Fields used in analytic filter list constraints.
      type: object
      x-apiture-fragment: true
      properties:
        minimumValues:
          description: The minimum number of values the analyst must select when using a filter of this filter type.
          type: integer
          format: int32
          minimum: 1
          maximum: 1000
        maximumValues:
          description: The maximum number of values the analyst must select when using a filter of this filter type. The maximum of 1 indicates the filter type is for single selection filters (`equals` and `notEquals` operators), and more than 1 is for multiple-selection filters (`in` and `notIn` operators)
          type: integer
          format: int32
          minimum: 1
          maximum: 1000
      x-apiture-version: 1.0.0
    analyticFilterListConstraints:
      title: Analytic Filter List Constraints (v1.0.0)
      description: Constraints for a flat analytic filter selection list.
      allOf:
        - $ref: '#/components/schemas/analyticFilterListConstraintFields'
        - type: object
          properties:
            values:
              description: A list of fixed values the user may choose from.
              type: array
              minItems: 1
              maxItems: 10000
              items:
                $ref: '#/components/schemas/analyticFilterListValue'
      example:
        minimumValues: 1
        maximumValues: 1
        values:
          - value: lessThan25
            label: Less than 25
            range:
              - '0'
              - '24'
          - value: 25to34
            label: 25 to 34
            range:
              - '25'
              - '34'
          - value: 35to44
            label: 35 to 44
            range:
              - '35'
              - '44'
          - value: 45to54
            label: 45 to 54
            range:
              - '45'
              - '54'
          - value: 55to64
            label: 55 to 64
            range:
              - '55'
              - '64'
          - value: 65orOlder
            label: 65 or older
            range:
              - '65'
              - '130'
      x-apiture-version: 1.0.0
    analyticFilterNestedConstraints:
      title: Analytic Filter Nested Constraints (v1.0.0)
      description: A list of fixed values organized into a nesting of primary values, each with a nested list of secondary values. For example, US counties are listed by a primary value of the state and secondary value of counties within the state.
      allOf:
        - $ref: '#/components/schemas/analyticFilterListConstraintFields'
        - type: object
          properties:
            items:
              description: The top level of the hierarchy; each of these items contains a nested list of values.
              type: array
              minItems: 1
              maxItems: 200
              items:
                $ref: '#/components/schemas/analyticFilterNestedValues'
      example:
        minimumValues: 1
        maximumValues: 1
        items:
          - label: Alabama
            values:
              - value: '01001'
                label: Autauga
              - value: '01003'
                label: Baldwin
              - value: '01005'
                label: Barbour
              - value: '01007'
                label: Bibb
              - value: '01009'
                label: Blount
              - value: '01011'
                label: Bullock
              - value: ...
                label: ...
              - value: '01113'
                label: Winston
          - label: Arkansas
            values:
              - value: '05000'
                label: Arkansas
              - value: '05003'
                label: Ashley
              - value: '05005'
                label: Baxter
              - value: '05007'
                label: Benton
              - value: '05009'
                label: Boone
              - value: ...
                label: ...
              - value: '05149'
                label: Yell
      x-apiture-version: 1.0.0
    analyticFilterOperatorConstraints:
      x-apiture-version: 1.0.1
      title: Analytic Filter Operator Constraints (v1.0.1)
      description: |-
        Optional constraints that apply to the values attached to a filter instance based on this filter type.

        All of these properties are optional.
      type: object
      properties:
        number:
          $ref: '#/components/schemas/analyticFilterNumberConstraints'
        integer:
          $ref: '#/components/schemas/analyticFilterIntegerConstraints'
        string:
          $ref: '#/components/schemas/analyticFilterStringConstraints'
        date:
          $ref: '#/components/schemas/analyticFilterDateConstraints'
        list:
          $ref: '#/components/schemas/analyticFilterListConstraints'
        nestedList:
          $ref: '#/components/schemas/analyticFilterNestedConstraints'
      examples:
        - list:
            minimumValues: 1
            maximumValues: 1
            values:
              - value: lessThan25
                label: Less than 25
                range:
                  - '0'
                  - '24'
              - value: 25to34
                label: 25 to 34
                range:
                  - '25'
                  - '34'
              - value: 35to44
                label: 35 to 44
                range:
                  - '35'
                  - '44'
              - value: 45to54
                label: 45 to 54
                range:
                  - '45'
                  - '54'
              - value: 55to64
                label: 55 to 64
                range:
                  - '55'
                  - '64'
              - value: 65orOlder
                label: 65 or older
                range:
                  - '65'
                  - '130'
        - nestedList:
            minimumValues: 1
            maximumValues: 1
            items:
              - label: Alabama
                values:
                  - value: '01001'
                    label: Autauga
                  - value: '01003'
                    label: Baldwin
                  - value: '01005'
                    label: Barbour
                  - value: '01007'
                    label: Bibb
                  - value: '01009'
                    label: Blount
                  - value: '01011'
                    label: Bullock
                  - value: ...
                    label: ...
                  - value: '01113'
                    label: Winston
              - label: Arkansas
                values:
                  - value: '05000'
                    label: Arkansas
                  - value: '05003'
                    label: Ashley
                  - value: '05005'
                    label: Baxter
                  - value: '05007'
                    label: Benton
                  - value: '05009'
                    label: Boone
                  - value: ...
                    label: ...
                  - value: '05149'
                    label: Yell
    analyticFilterListValue:
      title: Analytic Filter List Value (v1.0.0)
      description: |-
        An value in a list of allowed values in a filter type's `list` constraint. For example, if the filter type is a list of customer age groups, each item represents the age range with two `values` and a label that describes the range, such as:
        ``` {
          "id": "25-to-35",
          "label": "25 to 35",
          "range": [ "25", "35" ]
        } ```
        The `label` allows a natural, formatted presentation of the range while the `values` conveying the range values. The `values` used in a filter must be the corresponding `id` value from this object. For example, if the user selected the item with the label "25 to 35", the client should put the corresponding `value` (`"25-to-35"`) in the filter's `values`.
      type: object
      required:
        - value
        - label
      properties:
        value:
          description: The value to use for this item when defining a filter. This is a programmatic identifier for this value which does not change with locales.
          type: string
          pattern: ^[-_a-zA-Z0-9]{1,48}$
          minLength: 1
          maxLength: 48
        label:
          description: An optional text label that describes this item. This is suitable for presenting the option in a user interface selection list (either single selection or multiple selection, based on the filter types, `maximumValues`). This may differ from the `value`, specifically if the client requests localized labels.
          type: string
          maxLength: 100
          format: text
        range:
          description: The optional string representation of the raw value range that bounds this item.
          type: array
          maxItems: 400
          items:
            $ref: '#/components/schemas/analyticFilterValue'
      example:
        value: 25-to-35
        label: 25 to 35
        range:
          - '25'
          - '35'
      x-apiture-version: 1.0.0
    analyticFilterNestedValue:
      title: Analytic Filter Nested Value (v1.0.0)
      description: A single value constraint within the second-level values of a nested analytic filter type.
      type: object
      required:
        - value
      properties:
        value:
          description: The unique ID of the nested constraint value. The client should use this property as one of the `values` in a filter when the analyst selects this item. For example, if selecting counties within states, the `value` for each county may be its [FIPS code](https://transition.fcc.gov/oet/info/maps/census/fips/fips.txt).
          type: string
          format: text
          minLength: 1
          maxLength: 100
        label:
          description: An optional text label that describes this secondary level item. This is suitable for presenting the option in a user interface selection list. This may differ from the `value`, specifically if the client requests localized labels.
          type: string
          format: text
          minLength: 1
          maxLength: 100
      example:
        value: '01003'
        label: Baldwin
      x-apiture-version: 1.0.0
    analyticFilterNestedValues:
      title: Analytic Filter Nested Values (v1.0.0)
      description: Defines an item in a nested filter array of top-level items, such as a state and the list of counties within that state.
      type: object
      required:
        - label
        - values
      properties:
        label:
          description: The text label that describes this primary level. This is suitable for presenting the option in a user interface selection list This may differ from the `id`, specifically if the client requests localized labels.
          type: string
          minLength: 1
          maxLength: 100
          format: text
        values:
          description: The list of selectable items under the primary item.
          type: array
          maxItems: 400
          items:
            $ref: '#/components/schemas/analyticFilterNestedValue'
      example:
        label: Alabama
        values:
          - value: '01001'
            label: Autauga
          - value: '01003'
            label: Baldwin
          - value: '01005'
            label: Barbour
          - value: '01007'
            label: Bibb
          - value: '01009'
            label: Blount
          - value: '01011'
            label: Bullock
          - value: ...
            label: ...
          - value: '01113'
            label: Winston
      x-apiture-version: 1.0.0
    analyticFilterTypeState:
      title: Analytic Filter State (v1.0.0)
      description: The state of a filter type.
      type: string
      enum:
        - active
        - inactive
      x-apiture-version: 1.0.0
    analyticFilterTypeName:
      x-apiture-version: 1.0.2
      title: Analytic Filter Type Name (v1.0.2)
      description: The name of an analytic filter type.
      type: string
      format: text
      minLength: 2
      maxLength: 100
    analyticFilterOperator:
      title: Analytic Filter Operator (v1.0.0)
      description: An operator in a filter type and its label.
      type: object
      properties:
        operator:
          $ref: '#/components/schemas/analyticFilterOperatorType'
        label:
          description: The label for an operator in an analytic filter type.
          type: string
          format: text
          maxLength: 40
          minLength: 2
      example:
        operator: equals
        label: Is
      x-apiture-version: 1.0.0
    analyticFilterTypeFields:
      x-apiture-version: 1.2.2
      title: Analytic Filter Type Fields (v1.2.2)
      description: Common fields of the analytic filter type resource used to build other model schemas.
      type: object
      x-apiture-fragment: true
      properties:
        name:
          description: The name of this filter. Names are durable and do not change over time.
          $ref: '#/components/schemas/analyticFilterTypeName'
        label:
          description: A text label for this filter type, suitable for use in selection lists.
          type: string
          format: text
          maxLength: 80
          minLength: 6
        description:
          description: Text which describes the filter. This text may use Markdown for text styling.
          type: string
          format: markdown
          maxLength: 500
        dataType:
          $ref: '#/components/schemas/analyticFilterValueType'
        state:
          description: The state of this filter type.
          $ref: '#/components/schemas/analyticFilterTypeState'
        category:
          description: The category of the filter. Categories are durable and do not change over time.
          type: string
          pattern: ^[-a-zA-Z0-9$_]{6,48}$
          minLength: 6
          maxLength: 48
        operators:
          description: The ordered list of allowed operators to use when creating a filter from this filter type.
          type: array
          minItems: 1
          maxItems: 16
          items:
            $ref: '#/components/schemas/analyticFilterOperator'
        defaultOperator:
          description: The name of one of the `operators` that is the default operator.
          $ref: '#/components/schemas/analyticFilterOperatorType'
        categoryOrdinal:
          description: An integer that indicates this category's importance, relative to other categories, to allow the client to sort filter types by category importance. This is independent of the `category` name.
          type: integer
          format: int32
          minimum: 0
          maximum: 10000
          default: 0
        filterOrdinal:
          description: An integer that indicates this filter type's importance, relative to other filter types, to allow the client to sort filter types by importance. This is independent of this filter type's `name`.
          type: integer
          format: int32
          minimum: 0
          maximum: 10000
          default: 0
      example:
        name: customerAge
        label: Customer Age
        category: retailCustomers
        state: active
        operators:
          - operator: equals
            label: Equal To
          - operator: notEquals
            label: Not Equal To
          - operator: lessThan
            label: Younger Than
          - operator: greaterThan
            label: Older Than
          - operator: between
            label: Between
          - operator: notBetween
            label: Not Between
        defaultOperator: between
        categoryOrdinal: 120
        filterOrdinal: 75
    compositeFilterOperator:
      title: Composite Filter Operator (v1.0.0)
      description: |+
        An operator for combining filters in a composite filter.

        <strong><code>compositeFilterOperator</code></strong> strings may have one of the following
        [enumerated values](https://developer.apiture.com/docs/concepts/label-groups#enumerations):

        <table>
        <tr>
          <th>Value</th><th>Description</th>
        </tr>

        <tr>
            <td><strong><code>and</code></strong></td><td>And: <p>A filter is true if all the nested filters evaluate to true.</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>or</code></strong></td><td>Or: <p>A filter is true if any one or more of the nested filters evaluate to true.</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>not</code></strong></td><td>Not: <p>A filter is true if none of the nested filters evaluate to true.</p>
        </td>
            </tr>
        </table>

      type: string
      x-apiture-enum: compositeFilterOperator
      enum:
        - and
        - or
        - not
      x-apiture-version: 1.0.0
    analyticFilterTypeItem:
      x-apiture-version: 1.2.2
      title: Analytic Filter Type Item (v1.2.2)
      description: Summary representation of an analytic filter type resource in analytic filter types collections. To fetch the full representation of this analytic filter type, use the [`getAnalyticFilterType`](#op-getAnalyticFilterType) operation, passing this item's `id` field as the `analyticFilterTypeId` path parameter.
      allOf:
        - $ref: '#/components/schemas/abstractBody'
        - $ref: '#/components/schemas/analyticFilterTypeFields'
        - type: object
          required:
            - id
            - name
            - label
            - dataType
            - state
            - category
            - description
          properties:
            id:
              description: The unique identifier for this analytic filter type resource. This is an immutable opaque string.
              $ref: '#/components/schemas/readOnlyResourceId'
      example:
        id: 0399abed-fd3d
        name: customerAge
        label: Customer Age
        description: Filter by customer age ranges
        category: retailCustomers
        state: active
        dataType: integer
        operators:
          - operator: equals
            label: Equal To
          - operator: notEquals
            label: Not Equal To
          - operator: lessThan
            label: Younger Than
          - operator: greaterThan
            label: Older Than
          - operator: between
            label: Between
          - operator: notBetween
            label: Not Between
        defaultOperator: between
        categoryOrdinal: 120
        filterOrdinal: 75
    analyticFilterType:
      x-apiture-version: 1.2.2
      title: Analytic Filter Type (v1.2.2)
      description: |-
        Representation of Analytic Filter Type resources. Filter Type provide definition of a class of filters, including the name, description. Filter types also provide metadata to define how the filter type is instantiated for a concrete filter:

          * the list of allowed operators to use in the filter instance
          * optional labels for each of the operators
          * the data types for the values an analyst supplies for a specific filter instance
          * constraints on the values in filters based on this type, such as cardinality, minimum and maximum values,
            or selection lists.
      required:
        - operators
        - defaultOperator
      allOf:
        - $ref: '#/components/schemas/abstractBody'
        - $ref: '#/components/schemas/analyticFilterTypeItem'
        - type: object
          properties:
            constraints:
              $ref: '#/components/schemas/analyticFilterOperatorConstraints'
      example:
        id: 0399abed-fd3d
        name: customerAge
        label: Customer Age
        description: Filter by customer age ranges
        category: retailCustomers
        state: active
        dataType: integer
        operators:
          - operator: equals
            label: Equal To
          - operator: notEquals
            label: Not Equal To
          - operator: lessThan
            label: Younger Than
          - operator: greaterThan
            label: Older Than
          - operator: between
            label: Between
          - operator: notBetween
            label: Not Between
        defaultOperator: between
        categoryOrdinal: 120
        filterOrdinal: 75
        constraints:
          list:
            minimumValues: 1
            maximumValues: 1
            values:
              - value: lessThan25
                label: Less than 25
                range:
                  - '0'
                  - '24'
              - value: 25to34
                label: 25 to 34
                range:
                  - '25'
                  - '34'
              - value: 35to44
                label: 35 to 44
                range:
                  - '35'
                  - '44'
              - value: 45to54
                label: 45 to 54
                range:
                  - '45'
                  - '54'
              - value: 55to64
                label: 55 to 64
                range:
                  - '55'
                  - '64'
              - value: 65orOlder
                label: 65 or older
                range:
                  - '65'
                  - '130'
    analyticFilterTypes:
      x-apiture-version: 1.2.2
      title: Analytic Filter Type Collection (v1.2.2)
      description: Collection of analytic filter types. The items in the collection are ordered in the `items` array.
      allOf:
        - type: object
          required:
            - items
          properties:
            items:
              description: An array containing analytic filter type items.
              type: array
              maxItems: 1000
              items:
                $ref: '#/components/schemas/analyticFilterTypeItem'
      example:
        items:
          - id: 4dfe77dac089f3d15b7c
            name: customerType
            label: Customer Type
            description: Filter by either retail or business customers
            dataType: string
            category: customers
            state: active
            operators:
              - operator: equals
                label: Is
              - operator: notEquals
                label: Is Not
            defaultOperator: equals
            categoryOrdinal: 120
            filterOrdinal: 75
          - id: d62c070183f9
            name: customerAge
            label: Customer Age
            category: retailCustomers
            description: Filter that selects only retail customers
            dataType: integer
            state: active
            operators:
              - operator: equals
                label: Equal To
              - operator: notEquals
                label: Not Equal To
              - operator: lessThan
                label: Younger Than
              - operator: greaterThan
                label: Older Than
              - operator: between
                label: Between
              - operator: notBetween
                label: Not Between
            defaultOperator: between
            categoryOrdinal: 160
            filterOrdinal: 40
            constraints:
              integers:
                minimum: 2
                maximum: 130
    primitiveAnalyticFilter:
      x-apiture-version: 1.0.2
      title: Primitive Analytic Filter (v1.0.2)
      description: A primitive analytic filter that compares constant values to a data measurement within an audience data measure and returns a boolean value.
      type: object
      required:
        - filterType
        - operator
        - values
      properties:
        filterType:
          description: The name and `id` of the filter type that this filter is an instance of.
          $ref: '#/components/schemas/analyticFilterTypeReference'
        operator:
          description: The name of the filter operator to apply to the measure associated with the filter type and the optional filter `values`. This is one of the `operators` in the corresponding filter type.
          $ref: '#/components/schemas/analyticFilterOperatorType'
        values:
          description: The constant values to compare the measure to. The number of values in this array must be within the `minimumValues` and `maximumValues` constraints in the named filter type. Thus array is required but may be an empty array `[]` if the corresponding analytic filter's `minimumValues` is `0`.
          type: array
          maxItems: 1000
          items:
            $ref: '#/components/schemas/analyticFilterValue'
      example:
        filterType:
          id: 6b3927745edec398ad74
          name: customerAge
        operator: between
        values:
          - '35'
          - '49'
    compositeAnalyticFilter:
      x-apiture-version: 1.0.2
      title: Composite Analytic Filter (v1.0.2)
      description: |-
        A composite of analytic filter that are combined with a logical operator (`and`, `or`, `not`). For example, if `primitiveFilters` contains 3 filters `p1`, `p2` and `p2` and `compositeFilters` contains 2 filters `c1`, `c2` and `operator` is `and`, the filter represents the expression `( p1 and p2 and p3 and c1 and c2 )`. The example is equivalent to
        ``` ( { customerType equals "retail" }
          or
          { customerAge between ["35", "49"] }
          or
          (
            { customerRegion in [ "NC", "SC", "GA", "FL" ]}
            and
            { balance greaterThan "250000.00" }
          )
        ) ```

        Note: there must be at least one item either the `primitiveFilters` array or the `compositeFilters` array.
      type: object
      properties:
        operator:
          description: The logical operator (and, or, not) used to combine the contained filters.
          $ref: '#/components/schemas/compositeFilterOperator'
        primitiveFilters:
          description: An array of 0 or more primitive filters to be combined via the `operator` with each other and the `compositeFilters`.
          type: array
          maxItems: 100
          items:
            $ref: '#/components/schemas/primitiveAnalyticFilter'
        compositeFilters:
          description: An array of 0 or more composite filters to be combined via the `operator` with each other and the `primitiveFilters`.
          type: array
          maxItems: 100
          items:
            $ref: '#/components/schemas/compositeAnalyticFilter'
      example:
        operator: or
        primitiveFilters:
          - filterType:
              id: 215eaed841368ce154d5
              name: customerType
            operator: equals
            values:
              - retail
          - filterType:
              id: 6b3927745edec398ad74
              name: customerAge
            operator: between
            values:
              - '35'
              - '49'
        compositeFilters:
          - operator: and
            primitiveFilters:
              - filterType:
                  name: customerRegion
                  id: 01888d58e2424bf1c676
                operator: in
                values:
                  - NC
                  - SC
                  - GA
                  - FL
              - filterType:
                  name: accountBalance
                  id: 023cd8af6a9d46eec506
                operator: greaterThan
                values:
                  - '250000.00'
    problemResponse:
      title: Problem Response (v0.4.1)
      x-apiture-version: 0.4.1
      description: API problem or error response, as per [RFC 9457 application/problem+json](https://tools.ietf.org/html/rfc9457).
      type: object
      allOf:
        - $ref: '#/components/schemas/abstractBody'
        - $ref: '#/components/schemas/apiProblem'
      example:
        id: 3fbad566-be86-4b22-9ba6-3ca99fdc0799
        type: https://static.api.apiture.com/errors/noSuchAccount/v1.0.0
        title: Account Not Found
        status: 422
        occurredAt: '2022-04-25T12:42:21.375Z'
        detail: No account exists for the given account reference
        instance: https://static.api.apiture.com/banking/transfers/bb709151-575041fcd617
      x-resolved-from: ../../common/openapi.yaml#/components/schemas/problemResponse
    resourceId:
      x-apiture-version: 1.0.1
      title: Resource Identifier (v1.0.1)
      description: The unique, opaque system identifier for a resource. This case-sensitive ID is also used as path parameters in URLs or in other properties or parameters that reference a resource by ID rather than URL.
      type: string
      pattern: ^[-_:.~$a-zA-Z0-9]{6,48}$
      minLength: 6
      maxLength: 48
      x-resolved-from: ../../common/openapi.yaml#/components/schemas/resourceId
    abstractBody:
      title: Abstract Body (v0.2.0)
      x-apiture-version: 0.2.0
      description: An abstract schema used to define other request and response body model schemas.
      x-apiture-fragment: true
      type: object
      properties: {}
      x-resolved-from: ../../common/openapi.yaml#/components/schemas/abstractBody
    readOnlyResourceId:
      x-apiture-version: 1.0.1
      title: Read-only Resource Identifier (v1.0.1)
      description: The unique, opaque system-assigned identifier for a resource. This case-sensitive ID is also used in URLs as path parameters or in other properties or parameters that reference a resource by ID rather than URL. Resource IDs are immutable.
      readOnly: true
      allOf:
        - $ref: '#/components/schemas/resourceId'
      x-resolved-from: ../../common/openapi.yaml#/components/schemas/readOnlyResourceId
    apiProblem:
      x-apiture-version: 1.2.1
      title: API Problem (v1.2.1)
      description: API problem or error, as per [RFC 7807 application/problem+json](https://tools.ietf.org/html/rfc7807).
      type: object
      properties:
        type:
          type: string
          format: uri-reference
          description: |
            A [URI reference (RFC3986)](https://tools.ietf.org/html/rfc3986) that identifies the problem type. If present, this is the URL of human-readable HTML documentation for the problem type. When this member is not present, its value is assumed to be `"about:blank"`.
          example: https://static.api.apiture.com/errors/forbidden/v1.0.0
          maxLength: 2048
        title:
          type: string
          description: |
            A short, human-readable summary of the problem type. The title is usually the same for all problem with the same `type`.
          maxLength: 120
          format: text
          example: User is not authorized to perform the requested action or access the requested resource.
        status:
          type: integer
          format: int32
          description: |
            The [HTTP status code](https://datatracker.ietf.org/doc/html/rfc7231#section-6) for this occurrence of the problem.
          minimum: 100
          maximum: 599
          example: 403
        detail:
          type: string
          description: |
            A human-readable explanation specific to this occurrence of the problem.
          maxLength: 256
          format: text
          example: User is not authorized to perform this operation.
        instance:
          type: string
          format: uri-reference
          description: |
            A URI reference that identifies the specific occurrence of the problem. This is the URI of an API resource that the problem is related to, with a unique error correlation ID URI fragment
          example: https://prduction.api.apiture.com/banking/accounts/ad80fc3e722q5402a#189c13ff-c54c-45f7-b8e0-c88984ba724d
          maxLength: 2048
        id:
          description: The unique identifier for this problem. This is an immutable opaque string.
          $ref: '#/components/schemas/readOnlyResourceId'
        occurredAt:
          description: The timestamp when the problem occurred, in [RFC 3339](https://tools.ietf.org/html/rfc3339) date-time `YYYY-MM-DDThh:mm:ss.sssZ` format, UTC.
          $ref: '#/components/schemas/readOnlyTimestamp'
        problems:
          description: Optional root-causes if there are multiple problems in the request or API call processing.
          type: array
          maxItems: 128
          items:
            $ref: '#/components/schemas/apiProblem'
        attributes:
          type: object
          description: Additional optional attributes related to the problem. This data conforms to the schema associated with the error type.
      example:
        id: 3fbad566-be86-4b22-9ba6-3ca99fdc0799
        type: https://static.api.apiture.com/errors/accountNotFound/v1.0.0
        title: Account Not Found
        status: 422
        occurredAt: '2022-04-25T12:42:21.375Z'
        detail: No account exists at the given account_url
        instance: https://static.api.apiture.com/banking/transfers/bb709151-575041fcd617
      x-resolved-from: ../../common/openapi.yaml#/components/schemas/apiProblem
    readOnlyTimestamp:
      title: Read-Only Timestamp (v1.0.0)
      description: 'A readonly or derived timestamp (an instant in time) formatted in [RFC 3339](https://tools.ietf.org/html/rfc3339) `date-time` UTC format: `YYYY-MM-DDThh:mm:ss.sssZ`.'
      type: string
      minLength: 20
      maxLength: 30
      format: date-time
      readOnly: true
      example: '2021-10-30T19:06:04.250Z'
      x-apiture-since: 0.4.0
      x-resolved-from: ../../common/openapi.yaml#/components/schemas/readOnlyTimestamp
      x-apiture-version: 1.0.0
    requiredIdentityChallenge:
      x-apiture-version: 1.2.3
      title: Required Challenge (v1.2.3)
      description: A request from the service for the user to verify their identity. This contains a challenge ID, the corresponding operation ID, and a list of challenge factors for identity verification. The user must complete one of these challenge factors to satisfy the challenge. This schema defines the attributes in the 401 [Unauthorized problem response](#schema-apiProblem) when the 401 problem type name is `challengeRequired`. See the "Challenge API" for details.
      type: object
      required:
        - operationId
        - challengeId
        - factors
      properties:
        operationId:
          $ref: '#/components/schemas/challengeOperationId'
        challengeId:
          description: The unique ID of this challenge instance. This is an opaque string. This is passed when starting a challenge factor or when validating the identity challenge responses.
          $ref: '#/components/schemas/readOnlyResourceId'
        factors:
          description: 'A list of challenge factors. The user must complete one of these challenge factors. The `labels` in each factor identify one or more channels the user may use, such as a list of email addresses the system may use to send a one-time passcode to the user. ***Note**: The same channel may be used by multiple factors in the array of factors. For example, the user''s primary mobile phone number may be used for both an `sms` factor and a `voice` factor.'
          type: array
          minItems: 1
          maxItems: 8
          items:
            $ref: '#/components/schemas/challengeFactor'
      example:
        operationId: createTransfer
        challengeId: 0504076c566a3cf7009c
        factors:
          - type: sms
            labels:
              - '9876'
            id: 85c0ee5753fcd0b0953f
          - type: voice
            labels:
              - '9876'
            id: d089e10a80a8627df37b
          - type: voice
            labels:
              - '6754'
            id: 10506ecf9d1c2ee00403
          - type: email
            labels:
              - an****nk@example.com
              - an****98@example.com
            id: e917d671cb2f030b56f1
          - type: authenticatorToken
            labels:
              - Acme fob
            id: fe6c452d7da0bbb4e407
          - type: securityQuestions
            securityQuestions:
              questions:
                - id: q1
                  prompt: What is your mother's maiden name?
                - id: q4
                  prompt: What is your high school's name?
                - id: q9
                  prompt: What is the name of your first pet?
            id: df33c6f88a37d6b3f0a6
      x-resolved-from: ../../common/openapi.yaml#/components/schemas/requiredIdentityChallenge
    challengeOperationId:
      x-apiture-version: 1.0.1
      title: Challenge Operation ID (v1.0.1)
      description: The ID of an operation/action for which the user must verify their identity via an identity challenge. This is passed when starting a challenge factor or when validating the identity challenge responses.
      type: string
      pattern: ^[-a-zA-Z0-9$_]{6,48}$
      minLength: 6
      maxLength: 48
      x-resolved-from: ../../common/openapi.yaml#/components/schemas/challengeOperationId
    challengeFactor:
      x-apiture-version: 1.2.1
      title: Challenge Factor (v1.2.1)
      description: An challenge factor. See [`requiredIdentityChallenge`](#schema-requiredIdentityChallenge) for multiple examples.
      type: object
      required:
        - type
      properties:
        id:
          description: |-
            The ID of an a challenge factor. This ID is unique within the challenge factors associated with a challenge. The client should pass this `id` value as the `factorId` when starting or verifying a challenge factor.

            *Note*: The `id` will become `required` in a future update to this schema.
          $ref: '#/components/schemas/challengeFactorId'
        type:
          $ref: '#/components/schemas/challengeFactorType'
        labels:
          description: A list of text label which identifies the channel(s) through which the user completes the challenge. For an `sms` or `voice` challenge, the only label item is the last four digits of the corresponding phone number. For an `email` challenge, each label is the masked email address.
          type: array
          minItems: 1
          maxItems: 4
          items:
            type: string
            maxLength: 300
            format: text
        securityQuestions:
          $ref: '#/components/schemas/challengeSecurityQuestions'
      example:
        type: sms
        labels:
          - '9876'
      x-resolved-from: ../../common/openapi.yaml#/components/schemas/challengeFactor
    challengeFactorId:
      title: Challenge Factor ID (v1.0.0)
      description: The ID of an a challenge factor. This ID is unique within the factors offered with a challenge.
      type: string
      pattern: ^[-a-zA-Z0-9$_]{3,48}$
      minLength: 3
      maxLength: 48
      x-resolved-from: ../../common/openapi.yaml#/components/schemas/challengeFactorId
      x-apiture-version: 1.0.0
    challengeFactorType:
      title: Challenge Factor Type (v1.0.0)
      description: |+
        The name of challenge factor.

        <strong><code>challengeFactorType</code></strong> strings may have one of the following
        [enumerated values](https://developer.apiture.com/docs/concepts/label-groups#enumerations):

        <table>
        <tr>
          <th>Value</th><th>Description</th>
        </tr>

        <tr>
            <td><strong><code>sms</code></strong></td><td>SMS: <p>One-time passcode sent to the primary mobile phone number</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>email</code></strong></td><td>Email: <p>One-time passcode sent to the primary email address</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>voice</code></strong></td><td>Voice: <p>One-time passcode communicated via automated voice phone call</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>authenticatorToken</code></strong></td><td>authenticator Token: <p>One-time passcode issued by a pre-registered hardware device, such as a token key fob, or an authenticator app</p>
        </td>
            </tr>
        <tr>
            <td><strong><code>securityQuestions</code></strong></td><td>Security Questions: <p>Prompt with the user&#39;s security questions registered with their security profile</p>
        </td>
            </tr>
        </table>

      type: string
      x-apiture-enum: challengeFactorType
      enum:
        - sms
        - email
        - voice
        - securityQuestions
        - authenticatorToken
      x-resolved-from: ../../common/openapi.yaml#/components/schemas/challengeFactorType
      x-apiture-version: 1.0.0
    challengeSecurityQuestions:
      x-apiture-version: 1.0.1
      title: Challenge Security Questions (v1.0.1)
      description: Describes a `securityQuestions` challenge. This is omitted if the challenge `type` is not `securityQuestions`.
      type: object
      required:
        - questions
      properties:
        questions:
          description: The array of security questions.
          type: array
          minItems: 1
          maxItems: 8
          items:
            $ref: '#/components/schemas/challengeSecurityQuestion'
      example:
        questions:
          - id: q1
            prompt: What is your mother's maiden name?
          - id: q4
            prompt: What is your high school's name?
          - id: q9
            prompt: What is the name of your first pet?
      x-resolved-from: ../../common/openapi.yaml#/components/schemas/challengeSecurityQuestions
    challengeSecurityQuestion:
      x-apiture-version: 1.0.1
      title: Challenge Security Question (v1.0.1)
      description: A single security question within the `questions` array of the [`challengeSecurityQuestions`](#schema-challengeSecurityQuestions)
      type: object
      required:
        - id
        - prompt
      properties:
        id:
          description: The unique ID of security question prompt. This should be included in the [`challengeVerification`](#schema-challengeVerification) response as the `promptId`.
          $ref: '#/components/schemas/challengePromptId'
        prompt:
          description: The text prompt of this security question.
          type: string
          format: text
          maxLength: 80
      example:
        id: 74699fa628911e762ea5
        prompt: What is your mother's maiden name?
      x-resolved-from: ../../common/openapi.yaml#/components/schemas/challengeSecurityQuestion
    challengePromptId:
      title: Challenge Prompt ID (v1.0.0)
      description: The unique ID of a prompt (such as a security question) in a challenge factor.
      type: string
      pattern: ^[-_:.~$a-zA-Z0-9]+$
      minLength: 1
      maxLength: 48
      x-resolved-from: ../../common/openapi.yaml#/components/schemas/challengePromptId
      x-apiture-version: 1.0.0
  headers:
    ETag:
      description: The value of this resource's _entity tag_, to be passed with `If-Match` and `If-None-Match` request headers in other conditional API calls for this resource.
      schema:
        type: string
        pattern: ^\P{Cc}{1,512}$
        maxLength: 512
      x-resolved-from: ../../common/openapi.yaml#/components/headers/ETag
  x-apiture-errors:
    badRequest:
      description: The request body and/or parameters was not well-formed.
      remediation: Correct any syntax or schema errors in the request body or parameters.
      x-resolved-from: ../../common/openapi.yaml#/components/x-apiture-errors/badRequest
    unauthorized:
      description: The request lacks valid authentication credentials for the target resource or operation.
      remediation: Authenticate the user and pass the required authorization with the request.
      x-resolved-from: ../../common/openapi.yaml#/components/x-apiture-errors/unauthorized
    forbidden:
      description: The user or agent is not allowed to perform this operation; authentication credentials were provided in the request, but the server considers them insufficient to grant access.
      remediation: Check the user's permissions and entitlements before attempting the operation.
      x-resolved-from: ../../common/openapi.yaml#/components/x-apiture-errors/forbidden
    customerDisabled:
      description: The customer is disabled.
      remediation: Have the customer contact the financial institution for support.
      x-resolved-from: ../../common/openapi.yaml#/components/x-apiture-errors/customerDisabled
    antiMalwareRequired:
      description: The financial institution requires the customer to have anti-malware software installed.
      remediation: Direct the user to the software requirements guide to install the correct anti-malware software.
      x-resolved-from: ../../common/openapi.yaml#/components/x-apiture-errors/antiMalwareRequired
    modificationForbidden:
      description: The customer is properly authenticated but not authorized to create, modify, or delete resources.
      remediation: Avoid modification operation for customers with read-only authorization.
      x-resolved-from: ../../common/openapi.yaml#/components/x-apiture-errors/modificationForbidden
    challengeRequired:
      description: The operation requires the customer to complete an identity challenge.
      remediation: Complete the challenge as per the problem response, and add an additional `Challenge` header to the call.
      attributes:
        $ref: '#/components/schemas/requiredIdentityChallenge'
      x-resolved-from: ../../common/openapi.yaml#/components/x-apiture-errors/challengeRequired
    challengeBlocked:
      description: The user has failed challenges too many times and is blocked from attempting more or performing operations which require additional authentication.
      remediation: Have the user end their login session and login again.
      x-resolved-from: ../../common/openapi.yaml#/components/x-apiture-errors/challengeBlocked
    noIdentityChallengeFactors:
      description: This operation requires an identity challenge, but the user does not have the necessary registered authentication factors.
      remediation: Have the user register one or more challenge security code delivery factors.
      x-resolved-from: ../../common/openapi.yaml#/components/x-apiture-errors/noIdentityChallengeFactors
    invalidIdentityChallengeHeader:
      description: The additional on-time `Challenge` header in this request is expired, already used, or otherwise invalid.
      remediation: Supply a valid, unexpired, unclaimed `Challenge` header in the request.
      x-resolved-from: ../../common/openapi.yaml#/components/x-apiture-errors/invalidIdentityChallengeHeader
    tooManyRequests:
      description: The client has sent too many requests in a given amount of time, exceeding rate limiting.
      remediation: Slow down the rate of API calls.
      x-resolved-from: ../../common/openapi.yaml#/components/x-apiture-errors/tooManyRequests
x-apiture-traits:
  - resource:
      name: analytic filter type
      immutable: true
      cursorPaged: false
      excludeMethods:
        - put
        - post
        - delete
  - security:
      baseScope: adminData
x-resolved-from: ../../adminAnalyticFilters/status-codes-openapi.yaml
x-resolved-at: '2024-03-08T14:58:55.185Z'
x-apiture-annotated-at: '2024-03-08T14:58:55.415Z'
