openapi: 3.0.0
info:
  title: Vodafone Analytics Realtime Footfall
  description: "The Vodafone Analytics Realtime Footfall API is designed to support real-time footfall insights, allowing users to request and receive analytical data on footfall patterns within specified time ranges and destinations."
  version: 1.0.0
servers:
  - url: https://api-sandbox.vf-dmp.engineering.vodafone.com/vfAnalytics/realTimeFootfall/v1
    description: "Sandbox"

  #- url: https://api.vf-dmp.engineering.vodafone.com/vfAnalytics/realTimeFootfall/v1
  #  description: "Production"
x-backend-connection-prod: TBD
x-backend-connection-preprod: TBD
x-backend-connection-basepath: TBD
paths:
  /footfall:
    post:
      tags:
        - Vodafone Analytics Realtime Footfall
      summary: The resource provides the requested measures at the chosen locations(s).
      operationId: POST_REALTIME_FOOTFALL_MEASURES
      parameters:
        # - $ref: '#/components/parameters/Authorization'
        # - $ref: '#/components/parameters/Content-Type'
        # - $ref: '#/components/parameters/Accept'
        - $ref: '#/components/parameters/X-Correlator'
        - $ref: '#/components/parameters/vf-trace-transaction-id'
        - $ref: '#/components/parameters/vf_ext_bp_id'
        - $ref: '#/components/parameters/vf-country-code'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - measures
                - timeAggregation
              properties:
                startTime:
                  $ref: '#/components/schemas/startTime'
                endTime:
                  $ref: '#/components/schemas/endTime'
                timeAggregation:
                  $ref: '#/components/schemas/timeAggregation'
                measures:
                  type: array
                  description: An array of measures to analyse
                  items:
                    $ref: '#/components/schemas/measureName'
                attributes:
                  type: array
                  description: >-
                    An array of attributes to further breakdown the chosen
                    measure(s); An empty array represents no breakdown required
                  items:
                    $ref: '#/components/schemas/measureAttributeName'
                destination:
                  $ref: '#/components/schemas/destinationObject'
                destinationVirtual:
                  $ref: '#/components/schemas/virtualLocationType'
      responses:
        '200':
          description: The order has succesfully been received
          headers:
            vf-trace-transaction-id:
              $ref: '#/components/headers/vf-trace-transaction-id'
            Cache-Control:
              $ref: '#/components/headers/Cache-Control'
            Expires:
              $ref: '#/components/headers/Expires'
            Date:
              $ref: '#/components/headers/Date'
            Pragma:
              $ref: '#/components/headers/Pragma'
            Content-Type:
              $ref: '#/components/headers/Content-Type'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responseFootfall'
        '400':
          $ref: '#/components/responses/Generic400'
        '401':
          $ref: '#/components/responses/Generic401'
        '403':
          $ref: '#/components/responses/Generic403'
        '404':
          $ref: '#/components/responses/Generic404'
        '405':
          $ref: '#/components/responses/Generic405'
        '406':
          $ref: '#/components/responses/Generic406'
        '409':
          $ref: '#/components/responses/Generic409'
        '415':
          $ref: '#/components/responses/Generic415'
        '429':
          $ref: '#/components/responses/Generic429'
        '500':
          $ref: '#/components/responses/Generic500'
        '502':
          $ref: '#/components/responses/Generic502'
        '503':
          $ref: '#/components/responses/Generic503'
        '504':
          $ref: '#/components/responses/Generic504'
        default:
          description: >-
            APIX common errors as described:
          headers:
            vf-trace-transaction-id:
              description: "A unique transaction ID. If provided, the same value is\r\n returned, Otherwise a new transaction id is generated."
              schema:
                type: string
            Cache-Control:
              description: Cache control header.
              schema:
                type: string
            Expires:
              description: Expiration header token.
              schema:
                type: string
            Pragma:
              description: >-
                to be picked from the backend if available otherwise set as
                "no-cache".
              schema:
                type: string
            Content-Type:
              description: Always "application/json
              schema:
                type: string
          content:
            application/json;charset=utf-8:
              schema:
                $ref: '#/components/schemas/ErrorInfo'
      security:
        - apixClientCredentials:
            - VF_ANALYTICS_REALTIME_FOOTFALL_ALL
  /forecastFootfall:
    post:
      tags:
        - Vodafone Analytics Realtime Footfall
      summary: >-
        The resource provides the forecasted footfall measures at the chosen
        locations(s).
      operationId: POST_FORECASTED_FOOTFALL_MEASURES
      parameters:
        # - $ref: '#/components/parameters/Authorization'
        # - $ref: '#/components/parameters/Content-Type'
        # - $ref: '#/components/parameters/Accept'
        - $ref: '#/components/parameters/X-Correlator'
        - $ref: '#/components/parameters/vf-trace-transaction-id'
        - $ref: '#/components/parameters/vf_ext_bp_id'
        - $ref: '#/components/parameters/vf-country-code'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - measures
                - timeAggregation
              properties:
                startTime:
                  $ref: '#/components/schemas/startTime'
                endTime:
                  $ref: '#/components/schemas/endTime'
                timeAggregation:
                  $ref: '#/components/schemas/timeAggregation'
                measures:
                  type: array
                  description: An array of measures to analyse
                  items:
                    $ref: '#/components/schemas/measureName'
                attributes:
                  type: array
                  description: >-
                    An array of attributes to further breakdown the chosen
                    measure(s); An empty array represents no breakdown required
                  items:
                    $ref: '#/components/schemas/measureAttributeName'
                destination:
                  $ref: '#/components/schemas/destinationObject'
                destinationVirtual:
                  $ref: '#/components/schemas/virtualLocationType'
      responses:
        '200':
          description: The order has succesfully been received
          headers:
            vf-trace-transaction-id:
              $ref: '#/components/headers/vf-trace-transaction-id'
            Cache-Control:
              $ref: '#/components/headers/Cache-Control'
            Expires:
              $ref: '#/components/headers/Expires'
            Date:
              $ref: '#/components/headers/Date'
            Pragma:
              $ref: '#/components/headers/Pragma'
            Content-Type:
              $ref: '#/components/headers/Content-Type'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responseFootfall'
        '400':
          $ref: '#/components/responses/Generic400'
        '401':
          $ref: '#/components/responses/Generic401'
        '403':
          $ref: '#/components/responses/Generic403'
        '404':
          $ref: '#/components/responses/Generic404'
        '405':
          $ref: '#/components/responses/Generic405'
        '406':
          $ref: '#/components/responses/Generic406'
        '409':
          $ref: '#/components/responses/Generic409'
        '415':
          $ref: '#/components/responses/Generic415'
        '429':
          $ref: '#/components/responses/Generic429'
        '500':
          $ref: '#/components/responses/Generic500'
        '502':
          $ref: '#/components/responses/Generic502'
        '503':
          $ref: '#/components/responses/Generic503'
        '504':
          $ref: '#/components/responses/Generic504'
        default:
          description: >-
            APIX common errors as described:
          headers:
            vf-trace-transaction-id:
              description: "A unique transaction ID. If provided, the same value is\r\n returned, Otherwise a new transaction id is generated."
              schema:
                type: string
            Cache-Control:
              description: Cache control header.
              schema:
                type: string
            Expires:
              description: Expiration header token.
              schema:
                type: string
            Pragma:
              description: >-
                to be picked from the backend if available otherwise set as
                "no-cache".
              schema:
                type: string
            Content-Type:
              description: Always "application/json
              schema:
                type: string
          content:
            application/json;charset=utf-8:
              schema:
                $ref: '#/components/schemas/ErrorInfo'
      security:
        - apixClientCredentials:
            - VF_ANALYTICS_REALTIME_FOOTFALL_ALL
  /footfallMatrix:
    post:
      tags:
        - Vodafone Analytics Realtime Footfall
      summary: >-
        The resource provides the matrix movements from a place of interest to
        destinations of interest. Results can be broken down by attributes to
        provide a finer level of insight.
      operationId: POST_REALTIME_FOOTFALL_MATRIX
      parameters:
        # - $ref: '#/components/parameters/Authorization'
        # - $ref: '#/components/parameters/Content-Type'
        # - $ref: '#/components/parameters/Accept'
        - $ref: '#/components/parameters/X-Correlator'
        - $ref: '#/components/parameters/vf-trace-transaction-id'
        - $ref: '#/components/parameters/vf_ext_bp_id'
        - $ref: '#/components/parameters/vf-country-code'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - measures
                - timeAggregation
                - source
              properties:
                startTime:
                  $ref: '#/components/schemas/startTime'
                endTime:
                  $ref: '#/components/schemas/endTime'
                timeAggregation:
                  $ref: '#/components/schemas/timeAggregation'
                measures:
                  type: array
                  description: An array of measures to analyse
                  items:
                    $ref: '#/components/schemas/measureName'
                attributes:
                  type: array
                  description: >-
                    An array of attributes to further breakdown the chosen
                    measure(s); An empty array represents no breakdown required
                  items:
                    $ref: '#/components/schemas/measureAttributeName'
                source:
                  $ref: '#/components/schemas/sourceObject'
                destination:
                  $ref: '#/components/schemas/destinationObject'
                destinationVirtual:
                  $ref: '#/components/schemas/virtualLocationType'
      responses:
        '200':
          description: The order has succesfully been received
          headers:
            vf-trace-transaction-id:
              $ref: '#/components/headers/vf-trace-transaction-id'
            Cache-Control:
              $ref: '#/components/headers/Cache-Control'
            Expires:
              $ref: '#/components/headers/Expires'
            Date:
              $ref: '#/components/headers/Date'
            Pragma:
              $ref: '#/components/headers/Pragma'
            Content-Type:
              $ref: '#/components/headers/Content-Type'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responseFootfallMatrix'
        '400':
          $ref: '#/components/responses/Generic400'
        '401':
          $ref: '#/components/responses/Generic401'
        '403':
          $ref: '#/components/responses/Generic403'
        '404':
          $ref: '#/components/responses/Generic404'
        '405':
          $ref: '#/components/responses/Generic405'
        '406':
          $ref: '#/components/responses/Generic406'
        '409':
          $ref: '#/components/responses/Generic409'
        '415':
          $ref: '#/components/responses/Generic415'
        '429':
          $ref: '#/components/responses/Generic429'
        '500':
          $ref: '#/components/responses/Generic500'
        '502':
          $ref: '#/components/responses/Generic502'
        '503':
          $ref: '#/components/responses/Generic503'
        '504':
          $ref: '#/components/responses/Generic504'
        default:
          description: >-
            APIX common errors as described as
          headers:
            vf-trace-transaction-id:
              description: "A unique transaction ID. If provided, the same value is\r\n returned, Otherwise a new transaction id is generated."
              schema:
                type: string
            Cache-Control:
              description: Cache control header.
              schema:
                type: string
            Expires:
              description: Expiration header token.
              schema:
                type: string
            Pragma:
              description: >-
                to be picked from the backend if available otherwise set as
                "no-cache".
              schema:
                type: string
            Content-Type:
              description: Always "application/json
              schema:
                type: string
          content:
            application/json;charset=utf-8:
              schema:
                $ref: '#/components/schemas/ErrorInfo'
      security:
        - apixClientCredentials:
            - VF_ANALYTICS_REALTIME_FOOTFALL_ALL
  /forecastFootfallMatrix:
    post:
      tags:
        - Vodafone Analytics Realtime Footfall
      summary: >-
        The resource provides the forecasted matrix movements from a place of
        interest to destinations of interest. Results can be broken down by
        attributes to provide a finer level of insight.
      operationId: POST_FORECASTED_FOOTFALL_MATRIX
      parameters:
        # - $ref: '#/components/parameters/Authorization'
        # - $ref: '#/components/parameters/Content-Type'
        # - $ref: '#/components/parameters/Accept'
        - $ref: '#/components/parameters/X-Correlator'
        - $ref: '#/components/parameters/vf-trace-transaction-id'
        - $ref: '#/components/parameters/vf_ext_bp_id'
        - $ref: '#/components/parameters/vf-country-code'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - measures
                - timeAggregation
                - source
              properties:
                startTime:
                  $ref: '#/components/schemas/startTime'
                endTime:
                  $ref: '#/components/schemas/endTime'
                timeAggregation:
                  $ref: '#/components/schemas/timeAggregation'
                measures:
                  type: array
                  description: An array of measures to analyse
                  items:
                    $ref: '#/components/schemas/measureName'
                attributes:
                  type: array
                  description: >-
                    An array of attributes to further breakdown the chosen
                    measure(s); An empty array represents no breakdown required
                  items:
                    $ref: '#/components/schemas/measureAttributeName'
                source:
                  $ref: '#/components/schemas/sourceObject'
                destination:
                  $ref: '#/components/schemas/destinationObject'
                destinationVirtual:
                  $ref: '#/components/schemas/virtualLocationType'
      responses:
        '200':
          description: The order has succesfully been received
          headers:
            vf-trace-transaction-id:
              $ref: '#/components/headers/vf-trace-transaction-id'
            Cache-Control:
              $ref: '#/components/headers/Cache-Control'
            Expires:
              $ref: '#/components/headers/Expires'
            Date:
              $ref: '#/components/headers/Date'
            Pragma:
              $ref: '#/components/headers/Pragma'
            Content-Type:
              $ref: '#/components/headers/Content-Type'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responseFootfallMatrix'
        '400':
          $ref: '#/components/responses/Generic400'
        '401':
          $ref: '#/components/responses/Generic401'
        '403':
          $ref: '#/components/responses/Generic403'
        '404':
          $ref: '#/components/responses/Generic404'
        '405':
          $ref: '#/components/responses/Generic405'
        '406':
          $ref: '#/components/responses/Generic406'
        '409':
          $ref: '#/components/responses/Generic409'
        '415':
          $ref: '#/components/responses/Generic415'
        '429':
          $ref: '#/components/responses/Generic429'
        '500':
          $ref: '#/components/responses/Generic500'
        '502':
          $ref: '#/components/responses/Generic502'
        '503':
          $ref: '#/components/responses/Generic503'
        '504':
          $ref: '#/components/responses/Generic504'
        default:
          description: >-
            APIX common errors as described:
          headers:
            vf-trace-transaction-id:
              description: "A unique transaction ID. If provided, the same value is\r\n returned, Otherwise a new transaction id is generated."
              schema:
                type: string
            Cache-Control:
              description: Cache control header.
              schema:
                type: string
            Expires:
              description: Expiration header token.
              schema:
                type: string
            Pragma:
              description: >-
                to be picked from the backend if available otherwise set as
                "no-cache".
              schema:
                type: string
            Content-Type:
              description: Always "application/json
              schema:
                type: string
          content:
            application/json;charset=utf-8:
              schema:
                $ref: '#/components/schemas/ErrorInfo'
      security:
        - apixClientCredentials:
            - VF_ANALYTICS_REALTIME_FOOTFALL_ALL
  /ping:
    get:
      tags:
        - Monitoring
      summary: Check the upstream system is up and running.
      description: |-
        This API is to check the upstream system is up and running.

      security:
        - apixClientCredentials: []

      operationId: getPing

      parameters:
        - $ref: "#/components/parameters/vf-trace-transaction-id"

      responses:
        "200":
          description: "**OK**"
          content:
            application/json:
              examples:
                success_response:
                  value: {
                            "suffix": "/ping",
                            "client": "35.191.13.203",
                            "startTime": "2023-06-05T19:47:16.794Z",
                            "endTime": "2023-06-05T19:47:16.888Z",
                            "responseTime": 94,
                            "message": "PONG"
                          }
        '400':
          $ref: '#/components/responses/Generic400'
        '401':
          $ref: '#/components/responses/Generic401'

  /status:
    get:
      tags:
        - Monitoring
      summary: Check the downstream system is up and running.
      description: |-
        This API is to check the downstream system is up and running.

      security:
        - apixClientCredentials: []

      operationId: getStatus

      parameters:
        - $ref: "#/components/parameters/vf-trace-transaction-id"

      responses:
        "200":
          description: "**OK**"
          content:
            application/json:
              examples:
                success_response:
                  value: {
                            "status": "OK",

                          }
        '400':
          $ref: '#/components/responses/Generic400'
        '401':
          $ref: '#/components/responses/Generic401'
          
components:
  responses:
    Generic400:
      description: |
        **Bad Request**
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          examples:
            invalid argument:
              value:
                status: 400
                code: INVALID_ARGUMENT
                message: Client specified an invalid argument, request body or query param
    Generic401:
      description: |
        **Unauthorized**
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          examples:
            invalid creds:
              value:
                status: 401
                code: UNAUTHENTICATED
                message: Request not authenticated due to missing, invalid, or expired credentials
    Generic403:
      description: |
        **Forbidden**
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          examples:
            permission denied:
              value:
                status: 403
                code: PERMISSION_DENIED
                message: Client does not have sufficient permissions to perform this action
    Generic404:
      description: |
        **Not Found**
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          examples:

              NOT_FOUND:
                value: {
                          "status": 404,
                          "code" : "NOT_FOUND",
                          "message": "The specified resource is not found."
                        }

    Generic405:
      description: |
        **Method Not Allowed**
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          examples:
            METHOD_NOT_ALLOWED:
              value:
                status: 405
                code: METHOD_NOT_ALLOWED
                message: The requested method is not allowed/supported on
                      the target resource"
    Generic406:
      description: |
        **Not Acceptable**
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          examples:
            Not Acceptable:
              value:
                status: 406
                code: Not Acceptable
                message: The server cannot produce a response matching
                          the content requested by the client through Accept-* headers."
                          
    Generic409:
      description: |
        **Conflict**
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          examples:

              CONFLICT:
                value: {
                          "status": 409,
                          "code" : "CONFLICT",
                          "message": "The specified resource duplicate entry found."
                        }
              ALREADY_EXISTS:
                value: {
                          "status": 404,
                          "code" : "ALREADY_EXISTS",
                          "message": "The specified resource that client tried to create already exists."
                        }
    Generic415:
      description: |
        **Unsupported Media Type**
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          examples:
            UNSUPPORTED_MEDIA_TYPE:
              value:
                status: 415
                code: UNSUPPORTED_MEDIA_TYPE
                message: The server refuses to accept the request because
                      the payload format is in an unsupported format
                      
    Generic429:
      description: |
        **Too Many Requests**
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          examples:
              SpikeArrestViolation:
                value: {
                          "status": 429,
                          "code" : "TOO_MANY_REQUESTS",
                          "message": "Spike Arrest Violation."
                        }
              QuotaViolation:
                value: {
                          "status": 429,
                          "code" : "TOO_MANY_REQUESTS",
                          "message": "API/App/Country Quota limit reached."
                        }
                        
    Generic500:
      description: |
        **Internal Server Error**
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          examples:
            Internal_Server_Error:
              value:
                status: 500
                code: INTERNAL
                message: The server encountered an unexpected condition
                      that prevented it from fulfilling the request
    Generic502:
      description: |
        **Bad Gateway**
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          examples:
            Bad_Gateway:
              value:
                status: 502
                code: BAD_GATEWAY
                message: An upstream internal service cannot be reached

    Generic503:
      description: |
        **UNAVAILABLE**
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          examples:
            UNAVAILABLE:
              value:
                status: 503
                code: UNAVAILABLE
                message: Request timeout exceeded
    Generic504:
      description: |
        **Gateway Timeout**
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          examples:
            TIMEOUT:
              value:
                status: 504
                code: TIMEOUT
                message: Request timeout exceeded. 
            
   
   
####################################################################################################################   
   

  schemas:
          
    ErrorInfo:
      required:
        - status
        - code
        - message
      type: object
      properties:
        status:
          type: integer
          description: HTTP response status code
        code:
          type: string
          description: Code given to this error
        message:
          type: string
          description: Detailed error description
    startTime:
      type: string
      format: date-time
      example: '2022-07-15T00:00:00Z'
      description: The start date & time of the study period
    endTime:
      type: string
      format: date-time
      example: '2022-07-15T00:05:00Z'
      description: The end date & time of the study period
    timeAggregation:
      type: string
      enum:
        - 5M
        - 15M
        - HOURLY
        - DAILY
        - WEEKLY
      example: 5M
      description: Time aggregation of the output results
    unit:
      type: string
      enum:
        - QK14
        - QK15
        - QK16
        - QK17
        - QK18
        - QK19
        - LSOA
        - MSOA
        - LAD
        - REGION
        - COUNTRY
        - POSTCODE
        - MUNICIPALITY
        - PROVINCE
        - AUTONOMOUS_COMMUNITY
        - CUSTOM
        - COLLECTION
        - VIRTUAL
      example: QK17
      description: The geographical unit type (Quadkeys or in country census boundaries)
    measureName:
      type: string
      enum:
        - UNIQUE_VISITORS
        - VISITS
        - AVERAGE_NUM_VISITS
        - MEDIAN_NUM_VISITS
        - STDDEV_NUM_VISITS
        - AVERAGE_VISIT_DURATION
        - MEDIAN_VISIT_DURATION
        - STDDEV_VISIT_DURATION
      example: UNIQUE_VISITORS
      description: The measure to be applied at the destination location(s)
    measureAttributeName:
      type: string
      enum:
        - GENDER
        - AGE
        - VISITOR_PROFILE
        - TOURISM_PROFILE
        - AVG_VISIT_DURATION
        - MAX_VISIT_DURATION
        - NUM_VISITS
        - VISIT_DURATION
        - APP_USAGE
        - DEVICE_CATEGORY
        - DEVICE_MANUFACTURER
        - DEVICE_NAME
        - DEVICE_OS
        - DEVICE_RANK
        - DEVICE_AGE
        - WEALTH
      example: GENDER
      description: The attribute to be applied to the measure.
    sourceObject:
      type: object
      required:
        - sourcePoiName
        - sourceUnit
        - sourceIds
      description: >-
        Object to capture the source criteria for the matrix (type, unit and
        location IDs)
      properties:
        sourcePoiName:
          $ref: '#/components/schemas/poiNameType'
        sourceUnit:
          $ref: '#/components/schemas/unit'
        sourceIds:
          $ref: '#/components/schemas/locationIdsMatrix'
    destinationObject:
      type: object
      description: >-
        Destinations can be configured via a unit and array of location IDs
        and/or array of virtual locations
      properties:
        unit:
          $ref: '#/components/schemas/unit'
        ids:
          $ref: '#/components/schemas/locationIds'
        disaggregation:
          $ref: '#/components/schemas/unit'
    locationIds:
      type: array
      items:
        type: string
        minLength: 1
      example:
        - '12020020200000'
        - '12020020200001'
      description: >-
        An array of location IDs all of the same type. Note the keyword 'all'
        can be used to request all available IDs for that type in the country
        specified in the URI. Note wildcard characters '*' and '?' are not
        supported.
    locationIdsMatrix:
      type: array
      items:
        type: string
        minLength: 1
      example:
        - '12020020201003'
      description: >-
        An array of location IDs all of the same type. Note the keyword 'all'
        can be used to request all available IDs for that type in the country
        specified in the URI. Note wildcard characters '*' and '?' are not
        supported.
    poiNameType:
      type: string
      enum:
        - HOME
        - WORK
      example: HOME
      description: Specifies the place of origin for the source value in the matrix output
    virtualLocationType:
      type: array
      items:
        type: object
        description: >-
          Virtual location is a feature to enable grouping of multiple locations
          as one virtual entity.  A unique user defined ID (virtualId) is
          specified with a unit type and array of location IDs all of the same
          type. To merge locations of different types simply re-use the same
          'virtualId' across different types (e.g., merging qk17 and qk18 tiles
          together).
        properties:
          virtualId:
            type: string
            minLength: 1
            maxLength: 16
            example: U0123456789
            description: >-
              A user generated ID to collate virtual locations together (no
              whitespace characters permitted)
          unit:
            $ref: '#/components/schemas/unit'
          ids:
            $ref: '#/components/schemas/locationIds'
    responseFootfall:
      type: object
      description: >-
        Response object containing insight records that aligns to the standard
        footfall output specification.
      properties:
        startTime:
          type: string
          format: date-time
          example: '2022-07-15T00:00:00Z'
          description: The start date & time of the study period
        endTime:
          type: string
          format: date-time
          example: '2022-07-15T00:05:00Z'
          description: The end date & time of the study period
        results:
          type: array
          items:
            type: object
            description: >-
              Result data frame mirrors the standard footfall output
              specification; When you ask for attributes in the request then
              attributeName and attribute_value will be included.
            properties:
              dstId:
                type: string
                example: ['12020020200000'] 
              dstUnit:
                $ref: '#/components/schemas/unit'
              timeAggregation:
                type: string
                example: 5M
                description: field to indicate time segment
              measureName:
                $ref: '#/components/schemas/measureName'
              measureValue:
                type: number
                example: 86
                description: The measured value
              attributeName:
                $ref: '#/components/schemas/measureAttributeName'
              attributeLabel:
                type: string
                description: The attribute label to break down the measure
                example: MALE
            example:
             - dstId: "12020020200000"
               dstUnit: "QK17"
               timeAggregation: "5M"
               measureName: "UNIQUE_VISITORS"
               measureValue: 80
               attributeName: "GENDER"
               attributeLabel: "MALE"
             - dstId: "12020020200000"
               dstUnit: "QK17"
               timeAggregation: "5M"
               measureName: "UNIQUE_VISITORS"
               measureValue: 50
               attributeName: "GENDER"
               attributeLabel: "FEMALE"
             - dstId: "12020020200001"
               dstUnit: "QK17"
               timeAggregation: "5M"
               measureName: "UNIQUE_VISITORS"
               measureValue: 120
               attributeName: "GENDER"
               attributeLabel: "MALE"
             - dstId: "12020020200001"
               dstUnit: "QK17"
               timeAggregation: "5M"
               measureName: "UNIQUE_VISITORS"
               measureValue: 40
               attributeName: "GENDER"
               attributeLabel: "FEMALE"
             - dstId: "U0123456789"
               dstUnit: "VIRTUAL"
               timeAggregation: "5M"
               measureName: "UNIQUE_VISITORS"
               measureValue: 200
               attributeName: "GENDER"
               attributeLabel: "MALE"
             - dstId: "U0123456789"
               dstUnit: "VIRTUAL"
               timeAggregation: "5M"
               measureName: "UNIQUE_VISITORS"
               measureValue: 90
               attributeName: "GENDER"
               attributeLabel: "FEMALE"
            
    responseFootfallMatrix:
      type: object
      description: >-
        Response object containing insight records that aligns to the standard
        footfall output specification.
      properties:
        startTime:
          type: string
          format: date-time
          example: '2022-07-15T00:00:00Z'
          description: The start date & time of the study period
        endTime:
          type: string
          format: date-time
          example: '2022-07-15T00:05:00Z'
          description: The end date & time of the study period
        results:
          type: array
          items:
            type: object
            description: >-
              Result data frame mirrors the standard footfall output
              specification; When you ask for attributes in the request then
              attributeName and attribute_value will be included.
            properties:
              srcId:
                type: string
                example: '12020020201003'
                description: ID of source area for transition
              srcUnit:
                $ref: '#/components/schemas/unit'
              srcPoiName:
                $ref: '#/components/schemas/poiNameType'
              dstId:
                type: string
                example: '12020020200000'
              dstUnit:
                $ref: '#/components/schemas/unit'
              timeAggregation:
                type: string
                example: 5M
                description: field to indicate time segment
              measureName:
                $ref: '#/components/schemas/measureName'
              measureValue:
                type: number
                example: 86
                description: The measured value
              attributeName:
                $ref: '#/components/schemas/measureAttributeName'
              attributeLabel:
                type: string
                description: The attribute value to break down the measure
                example: MALE
            example:
             - srcId: "12020020201003"
               srcUnit: "QK17"
               srcPoiName: "HOME"
               dstId: "12020020200000"
               dstUnit: "QK17"
               timeAggregation: "5M"
               measureName: "UNIQUE_VISITORS"
               measureValue: 80
               attributeName: "GENDER"
               attributeLabel: "MALE"
             - srcId: "12020020201003"
               srcUnit: "QK17"
               srcPoiName: "HOME"
               dstId: "12020020200000"
               dstUnit: "QK17"
               timeAggregation: "5M"
               measureName: "UNIQUE_VISITORS"
               measureValue: 50
               attributeName: "GENDER"
               attributeLabel: "FEMALE"
             - srcId: "12020020201003"
               srcUnit: "QK17"
               srcPoiName: "HOME"
               dstId: "12020020200001"
               dstUnit: "QK17"
               timeAggregation: "5M"
               measureName: "UNIQUE_VISITORS"
               measureValue: 120
               attributeName: "GENDER"
               attributeLabel: "MALE"
             - srcId: "12020020201003"
               srcUnit: "QK17"
               srcPoiName: "HOME"
               dstId: "12020020200001"
               dstUnit: "QK17"
               timeAggregation: "5M"
               measureName: "UNIQUE_VISITORS"
               measureValue: 40
               attributeName: "GENDER"
               attributeLabel: "FEMALE"
             - srcId: "12020020201003"
               srcUnit: "QK17"
               srcPoiName: "HOME"
               dstId: "U0123456789"
               dstUnit: "VIRTUAL"
               timeAggregation: "5M"
               measureName: "UNIQUE_VISITORS"
               measureValue: 200
               attributeName: "GENDER"
               attributeLabel: "MALE"
             - srcId: "12020020201003"
               srcUnit: "QK17"
               srcPoiName: "HOME"
               dstId: "U0123456789"
               dstUnit: "VIRTUAL"
               timeAggregation: "5M"
               measureName: "UNIQUE_VISITORS"
               measureValue: 90
               attributeName: "GENDER"
               attributeLabel: "FEMALE"
  parameters:
    Authorization:
      in: header
      name: Authorization
      description: OAuth token created using OAuth2 Client Credentials Grant.
      schema:
        type: string
        example: application/json
      required: true
    Content-Type:
      in: header
      name: Content-Type
      description: >-
        application/json or a media type that can be casted into
        application/json (like application/json).
      required: true
      schema:
        type: string
        example: application/json
    Accept:
      in: header
      name: Accept
      required: false
      description: Either "application/json" or a media type denoting "application/json".
      schema:
        type: string
        example: application/json

    X-Correlator:
      in: header
      name: X-Correlator
      description: "Correlation UUID that will be included in the response to request."
      required: false
      schema:
        type: string
        example: 998c911a-92d4-11e7-abc4-cec278b6b50a
    vf-trace-transaction-id:
      in: header
      name: vf-trace-transaction-id
      description: "A unique transaction ID. If provided, the same value is\r\n returned, Otherwise a new transaction id is generated."
      required: false
      schema:
        type: string
        example: 688c911a-92d4-11e7-abc4-cec278b6b50a
    vf_ext_bp_id:
      description: A unique use case ID used for logging and end-to-end tracing.
      in: header
      name: vf_ext_bp_id
      required: false
      schema:
        type: string
    vf-country-code:
      description: ISO 3166-1 alpha-2 Country Code.
      in: header
      name: vf-country-code
      required: true
      schema:
        type: string
        minLength: 2
        maxLength: 2
        example: DE
  headers:
    X-Correlator:
      description: "Correlation UUID that will be included in the response to request."
      schema:
        type: string
    vf-trace-transaction-id:
      description: "A unique transaction ID. If provided, the same value is\r\n returned, Otherwise a new transaction id is generated and returned by APIX"
      schema:
        type: string
    Cache-Control:
      description: >-
        Must be forwarded from backend response. Otherwise set to default value
        "no-cache"
      schema:
        type: string
    Expires:
      description: >-
        ust be forwarded from backend response. Otherwise set to current date
        and time (such as "Sun, 06 Nov 1994 08:49:37 GM")
      schema:
        type: string
    Date:
      description: >-
        Must be forwarded from backend response. Otherwise set to current date
        and time e.g. Sun, 06 Nov 1994 08:49:37 GM
      schema:
        type: string
    Pragma:
      description: to be picked from the backend if available otherwise set as "no-cache"
      schema:
        type: string
    Content-Type:
      description: application/json
      schema:
        type: string
  securitySchemes:
    apixClientCredentials:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: /oauth2/v1/token
          scopes:
            VF_ANALYTICS_REALTIME_FOOTFALL_ALL: Allows a client to be able to access to all the resources