GSMA Camara Project Connectivity Insights Subscriptions API

The Connectivity Insights API allows an application developer to ask the network the likelihood that an application's networking requirements can be met for a given end user session.

OpenAPI Specification

connectivity-insights-subscriptions-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Global System for Mobile Communications GSMA Camara Project Connectivity Insights Subscriptions API
  version: 0.4.0
  x-camara-commonalities: 0.4.0
  description: >-
    The Connectivity Insights API allows an application developer to ask the
    network the likelihood that an application's networking requirements can be
    met for a given end user session.
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
externalDocs:
  description: Product documentation at CAMARA.
  url: https://github.com/camaraproject/ConnectivityInsights
servers:
  - url: '{apiRoot}/connectivity-insights-subscriptions/v0.4/check-network-quality'
    variables:
      apiRoot:
        default: http://localhost:9091
        description: |
          API root, defined by service provider, e.g.
          `api.example.com` or `api.example.com/somepath`
tags:
  - name: Connectivity Insights Subscriptions
    description: |
      Create and manage a subscription to receive periodic connectivity
      insights
paths:
  /subscriptions:
    post:
      tags:
        - Connectivity Insights Subscriptions
      description: Create a Connectivity insights subscription for a device
      summary: Global System for Mobile Communications Create a Connectivity insights subscription for a device
      operationId: createSubscription
      parameters:
        - $ref: '#/components/parameters/x-correlator'
      security:
        - openId:
            - >-
              connectivity-insights-subscriptions:org.camaraproject.connectivity-insights-subscriptions.v0.network-quality:create
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubscriptionRequest'
        required: true
      callbacks:
        notifications:
          '{$request.body#/sink}':
            post:
              summary: Subscription notification callback
              description: |
                Important: this endpoint is to be implemented by the API
                consumer.The Connectivity Insights server will call this
                endpoint whenever a connectivity event occurs that changes
                the netowrk's ability to meet the application's demands for
                a given device.
              operationId: postNotification
              parameters:
                - $ref: '#/components/parameters/x-correlator'
              requestBody:
                required: true
                content:
                  'application/cloudevents+json:':
                    schema:
                      $ref: '#/components/schemas/CloudEvent'
              responses:
                '204':
                  description: Successful notification
                  headers:
                    x-correlator:
                      $ref: '#/components/headers/x-correlator'
                '400':
                  $ref: '#/components/responses/Generic400'
                '401':
                  $ref: '#/components/responses/Generic401'
                '403':
                  $ref: '#/components/responses/Generic403'
                '410':
                  $ref: '#/components/responses/Generic410'
                '429':
                  $ref: '#/components/responses/Generic429'
                '500':
                  $ref: '#/components/responses/Generic500'
                '503':
                  $ref: '#/components/responses/Generic503'
              security:
                - {}
                - notificationsBearerAuth: []
      responses:
        '201':
          description: Created
          headers:
            x-correlator:
              $ref: '#/components/headers/x-correlator'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subscription'
        '202':
          description: |
            Request accepted to be processed. It applies for async
            creation process.
          headers:
            x-correlator:
              $ref: '#/components/headers/x-correlator'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubscriptionAsync'
        '400':
          $ref: '#/components/responses/CreateSubscriptionBadRequest400'
        '401':
          $ref: '#/components/responses/Generic401'
        '403':
          $ref: '#/components/responses/SubscriptionPermissionDenied403'
        '409':
          $ref: '#/components/responses/Generic409'
        '415':
          $ref: '#/components/responses/Generic415'
        '422':
          $ref: '#/components/responses/CreateSubscriptionUnprocessableEntity422'
        '429':
          $ref: '#/components/responses/Generic429'
        '500':
          $ref: '#/components/responses/Generic500'
        '503':
          $ref: '#/components/responses/Generic503'
    get:
      tags:
        - Connectivity Insights Subscriptions
      summary: Global System for Mobile Communications Retrieve a list of apiName event subscription
      operationId: getSubscriptionList
      description: |
        Operation to list subscriptions authorized to be retrieved by the
        provided access token.
      parameters:
        - $ref: '#/components/parameters/x-correlator'
      security:
        - openId:
            - connectivity-insights-subscriptions:read
      responses:
        '200':
          description: List of event subscription details
          headers:
            x-correlator:
              $ref: '#/components/headers/x-correlator'
          content:
            application/json:
              schema:
                type: array
                minItems: 0
                items:
                  $ref: '#/components/schemas/Subscription'
        '400':
          $ref: '#/components/responses/Generic400'
        '401':
          $ref: '#/components/responses/Generic401'
        '403':
          $ref: '#/components/responses/Generic403'
        '500':
          $ref: '#/components/responses/Generic500'
        '503':
          $ref: '#/components/responses/Generic503'
  /subscriptions/{subscriptionId}:
    get:
      tags:
        - Connectivity Insights Subscriptions
      summary: Global System for Mobile Communications Operation to retrieve a subscription based on the provided ID
      operationId: getSubscription
      description: Retrieve a given subscription by ID
      security:
        - openId:
            - connectivity-insights-subscriptions:read
      parameters:
        - $ref: '#/components/parameters/SubscriptionId'
        - $ref: '#/components/parameters/x-correlator'
      responses:
        '200':
          description: OK
          headers:
            x-correlator:
              $ref: '#/components/headers/x-correlator'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subscription'
        '400':
          $ref: '#/components/responses/SubscriptionIdRequired'
        '401':
          $ref: '#/components/responses/Generic401'
        '403':
          $ref: '#/components/responses/Generic403'
        '404':
          $ref: '#/components/responses/Generic404'
        '500':
          $ref: '#/components/responses/Generic500'
        '503':
          $ref: '#/components/responses/Generic503'
    delete:
      tags:
        - Connectivity Insights Subscriptions
      summary: Global System for Mobile Communications Operation to delete a subscription
      operationId: deleteSubscription
      description: Delete a given subscription by ID
      security:
        - openId:
            - connectivity-insights-subscriptions:delete
      parameters:
        - $ref: '#/components/parameters/SubscriptionId'
        - $ref: '#/components/parameters/x-correlator'
      responses:
        '202':
          description: |
            Request accepted to be processed. It applies for async deletion
            process.
          headers:
            x-correlator:
              $ref: '#/components/headers/x-correlator'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubscriptionAsync'
        '204':
          description: apiName subscription deleted
          headers:
            x-correlator:
              $ref: '#/components/headers/x-correlator'
        '400':
          $ref: '#/components/responses/SubscriptionIdRequired'
        '401':
          $ref: '#/components/responses/Generic401'
        '403':
          $ref: '#/components/responses/Generic403'
        '404':
          $ref: '#/components/responses/Generic404'
        '500':
          $ref: '#/components/responses/Generic500'
        '503':
          $ref: '#/components/responses/Generic503'
components:
  securitySchemes:
    openId:
      description: OpenID Provider Configuration Information
      type: openIdConnect
      openIdConnectUrl: https://example.com/.well-known/openid-configuration
    notificationsBearerAuth:
      description: Bearer authorization for notifications
      type: http
      scheme: bearer
      bearerFormat: '{$request.body#/sinkCredential.credentialType}'
  parameters:
    SubscriptionId:
      name: subscriptionId
      in: path
      description: |
        Subscription identifier that was obtained from the create event
        subscription operation
      required: true
      schema:
        $ref: '#/components/schemas/SubscriptionId'
    x-correlator:
      name: x-correlator
      in: header
      description: Correlation id for the different services
      schema:
        type: string
  headers:
    x-correlator:
      description: Correlation id for the different services
      schema:
        type: string
  schemas:
    AdditionalKpis:
      description: additional information about connectivity quality
      type: object
      properties:
        signalStrength:
          description: |
            rough indication of the end user device radio signal conditions
          type: string
          enum:
            - excellent
            - good
            - fair
            - poor
            - no signal
        connectivityType:
          description: |
            the access technology connecting the user device to the operator
            network
          type: string
          enum:
            - 5G-SA
            - 5G-NSA
            - 4G
            - 3G
    Subscription:
      description: Represents a event-type subscription.
      type: object
      required:
        - sink
        - protocol
        - config
        - types
        - id
        - startsAt
      properties:
        protocol:
          $ref: '#/components/schemas/Protocol'
        sink:
          type: string
          format: url
          description: |
            The address to which events shall be delivered using the selected
            protocol.
          example: https://endpoint.example.com/sink
        sinkCredential:
          $ref: '#/components/schemas/SinkCredential'
        types:
          description: |
            Camara Event types eligible to be delivered by this subscription.
            Note: for the Commonalities meta-release v0.4 we enforce to have
            only event type per subscription then for following meta-release
            use of array MUST be decided at API project level.
          type: array
          items:
            type: string
        config:
          $ref: '#/components/schemas/Config'
        subscriptionId:
          type: string
          description: >
            The unique identifier of the subscription in the scope of the

            subscription manager. When this information is contained within

            an event notification, this concept SHALL be referred as

            `subscriptionId` as per

            [Commonalities Event Notification
            Model](https://github.com/camaraproject/Commonalities/blob/main/documentation/API-design-guidelines.md#122-event-notification).
          example: '1119920371'
        startsAt:
          type: string
          format: date-time
          description: Date when the event subscription will begin/began
        expiresAt:
          type: string
          format: date-time
          description: |
            Date when the event subscription will expire. Only provided when
            `subscriptionExpireTime` is indicated by API client or Telco
            Operator has specific policy about that.
        status:
          type: string
          description: |-
            Current status of the subscription - Management of Subscription
            State engine is not mandatory for now. Note not all statuses may
            be considered to be implemented. Details:
              - `ACTIVATION_REQUESTED`: Subscription creation (POST) is
              triggered but subscription creation process is not finished
              yet.
              - `ACTIVE`: Subscription creation process is completed.
              Subscription is fully operative.
              - `DEACTIVE`: Subscription is temporarily inactive, but its
              workflow logic is not deleted.
              - `EXPIRED`: Subscription is ended (no longer active).
              This status applies when subscription is ended due to
              `SUBSCRIPTION_EXPIRED` or `ACCESS_TOKEN_EXPIRED` event.
              - `DELETED`: Subscription is ended as deleted (no longer
              active). This status applies when subscription information is
              kept (i.e. subscription workflow is no longer active but its
              metainformation is kept).
          enum:
            - ACTIVATION_REQUESTED
            - ACTIVE
            - EXPIRED
            - DEACTIVE
            - DELETED
      discriminator:
        propertyName: protocol
        mapping:
          HTTP: '#/components/schemas/HTTPSubscriptionResponse'
          MQTT3: '#/components/schemas/MQTTSubscriptionResponse'
          MQTT5: '#/components/schemas/MQTTSubscriptionResponse'
          AMQP: '#/components/schemas/AMQPSubscriptionResponse'
          NATS: '#/components/schemas/NATSSubscriptionResponse'
          KAFKA: '#/components/schemas/ApacheKafkaSubscriptionResponse'
    SubscriptionAsync:
      description: |
        Response for a event-type subscription request managed asynchronously
        (Creation or Deletion)
      type: object
      properties:
        subscriptionId:
          $ref: '#/components/schemas/SubscriptionId'
    SubscriptionId:
      type: string
      description: >
        The unique identifier of the subscription in the scope of the

        subscription manager. When this information is contained within

        an event notification, this concept SHALL be referred as

        `subscriptionId` as per

        [Commonalities Event Notification
        Model](https://github.com/camaraproject/Commonalities/blob/main/documentation/API-design-guidelines.md#122-event-notification).
      example: qs15-h556-rt89-1298
    Device:
      description: |
        End-user equipment able to connect to a mobile network. Examples of
        devices include smartphones or IoT sensors/actuators.

        The developer can choose to provide the below specified device
        identifiers:

        * `ipv4Address`
        * `ipv6Address`
        * `phoneNumber`
        * `networkAccessIdentifier`

        NOTE1: the MNO might support only a subset of these options. The
        API invoker can provide multiple identifiers to be compatible across
        different MNOs. In this case the identifiers MUST belong to the same
        device.
        NOTE2: for the Commonalities release v0.4, we are enforcing that the
        networkAccessIdentifier is only part of the schema for future-proofing,
        and CAMARA does not currently allow its use. After the CAMARA
        meta-release work is concluded and the relevant issues are resolved,
        its use will need to be explicitly documented in the guidelines.
      type: object
      properties:
        phoneNumber:
          $ref: '#/components/schemas/PhoneNumber'
        networkAccessIdentifier:
          $ref: '#/components/schemas/NetworkAccessIdentifier'
        ipv4Address:
          $ref: '#/components/schemas/DeviceIpv4Addr'
        ipv6Address:
          $ref: '#/components/schemas/DeviceIpv6Address'
      minProperties: 1
    NetworkAccessIdentifier:
      description: |
        A public identifier addressing a subscription in a mobile network. In
        3GPP terminology, it corresponds to the GPSI formatted with the
        External Identifier ({Local Identifier}@{Domain Identifier}). Unlike
        the telephone number, the network access identifier is not subjected
        to portability ruling in force, and is individually managed by each
        operator.
      type: string
      example: [email protected]
    PhoneNumber:
      description: |
        A public identifier addressing a telephone subscription. In mobile
        networks it corresponds to the MSISDN (Mobile Station International
        Subscriber Directory Number). In order to be globally unique it has to
        be formatted in international format, according to E.164 standard,
        optionally prefixed with '+'.
      type: string
      pattern: ^\+?[0-9]{5,15}$
      example: '123456789'
    DeviceIpv4Addr:
      type: object
      description: |
        The device should be identified by either the public (observed) IP
        address and port as seen by the application server, or the private
        (local) and any public (observed) IP addresses in use by the device
        (this information can be obtained by various means, for example from
        some DNS servers).

        If the allocated and observed IP addresses are the same (i.e. NAT is
        not in use) then  the same address should be specified for both
        publicAddress and privateAddress.

        If NAT64 is in use, the device should be identified by its
        publicAddress and publicPort, or separately by its allocated IPv6
        address (field ipv6Address of the Device object)

        In all cases, publicAddress must be specified, along with at least one
        of either privateAddress or publicPort, dependent upon which is known.
        In general, mobile devices cannot be identified by their public IPv4
        address alone.
      properties:
        publicAddress:
          $ref: '#/components/schemas/SingleIpv4Addr'
        privateAddress:
          $ref: '#/components/schemas/SingleIpv4Addr'
        publicPort:
          $ref: '#/components/schemas/Port'
      anyOf:
        - required:
            - publicAddress
            - privateAddress
        - required:
            - publicAddress
            - publicPort
      example:
        publicAddress: 84.125.93.10
        publicPort: 59765
    SingleIpv4Addr:
      description: A single IPv4 address with no subnet mask
      type: string
      format: ipv4
      example: 84.125.93.10
    DeviceIpv6Address:
      description: |
        The device should be identified by the observed IPv6 address, or by any
        single IPv6 address from within the subnet allocated to the device
        (e.g. adding ::0 to the /64 prefix).

        The session shall apply to all IP flows between the device subnet and
        the specified application server, unless further restricted by the
        optional parameters devicePorts or applicationServerPorts.
      type: string
      format: ipv6
      example: 2001:db8:85a3:8d3:1319:8a2e:370:7344
    Port:
      description: TCP or UDP port number
      type: integer
      minimum: 0
      maximum: 65535
    PortsSpec:
      description: Specification of several TCP or UDP ports
      type: object
      minProperties: 1
      properties:
        ranges:
          description: Range of TCP or UDP ports
          type: array
          minItems: 1
          items:
            type: object
            required:
              - from
              - to
            properties:
              from:
                $ref: '#/components/schemas/Port'
              to:
                $ref: '#/components/schemas/Port'
        ports:
          description: Array of TCP or UDP ports
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/Port'
      example:
        ranges:
          - from: 5010
            to: 5020
        ports:
          - 5060
          - 5070
    Protocol:
      type: string
      enum:
        - HTTP
        - MQTT3
        - MQTT5
        - AMQP
        - NATS
        - KAFKA
      description: |
        Identifier of a delivery protocol. Only HTTP is allowed for now
      example: HTTP
    ApplicationServer:
      description: |
        A server hosting backend applications to deliver some business logic to
        clients.

        The developer can choose to provide the below specified device
        identifiers:

        * `ipv4Address`
        * `ipv6Address`

        The Operator will use this information to calculate the end to end
        network performance in scenarios where its feasible.
      type: object
      properties:
        ipv4Address:
          $ref: '#/components/schemas/ApplicationServerIpv4Address'
        ipv6Address:
          $ref: '#/components/schemas/ApplicationServerIpv6Address'
      minProperties: 1
    ApplicationServerIpv4Address:
      type: string
      example: 192.168.0.1/24
      description: |
        IPv4 address may be specified in form <address/mask> as:
          - address - an IPv4 number in dotted-quad form 1.2.3.4. Only this
          exact IP number will match the flow control rule.
          - address/mask - an IP number as above with a mask width of the
          form 1.2.3.4/24.
            In this case, all IP numbers from 1.2.3.0 to 1.2.3.255 will match.
            The bit width MUST be valid for the IP version.
    ApplicationServerIpv6Address:
      type: string
      example: 2001:db8:85a3:8d3:1319:8a2e:370:7344
      description: |
        IPv6 address may be specified in form <address/mask> as:
          - address - The /128 subnet is optional for single addresses:
            - 2001:db8:85a3:8d3:1319:8a2e:370:7344
            - 2001:db8:85a3:8d3:1319:8a2e:370:7344/128
          - address/mask - an IP v6 number with a mask:
            - 2001:db8:85a3:8d3::0/64
            - 2001:db8:85a3:8d3::/64
    Config:
      description: |
        Implementation-specific configuration parameters needed by the
        subscription manager for acquiring events.
        In CAMARA we have predefined attributes like `subscriptionExpireTime`,
        `subscriptionMaxEvents`, `initialEvent`
        Specific event type attributes must be defined in `subscriptionDetail`
        Note: if a request is performed for several event type, all subscribed
        event will use same `config` parameters.
      type: object
      required:
        - subscriptionDetail
      properties:
        subscriptionDetail:
          $ref: '#/components/schemas/CreateSubscriptionDetail'
        subscriptionExpireTime:
          type: string
          format: date-time
          example: '2023-01-17T13:18:23.682Z'
          description: |
            The subscription expiration time (in date-time format) requested by
            the API consumer. Up to API project decision to keep it.
        subscriptionMaxEvents:
          type: integer
          description: |
            Identifies the maximum number of event reports to be generated
            (>=1) requested by the API consumer - Once this number is reached,
            the subscription ends. Up to API project decision to keep it.
          minimum: 1
          example: 5
        initialEvent:
          type: boolean
          description: |
            Set to `true` by API consumer if consumer wants to get an event as
            soon as the subscription is created and current situation reflects
            event request.
            Example: Consumer request Roaming event. If consumer sets
            initialEvent to true and device is in roaming situation, an event
            is triggered Up to API project decision to keep it.
    SinkCredential:
      type: object
      description: |
        A sink credential provides authentication or authorization information
      properties:
        credentialType:
          type: string
          enum:
            - PLAIN
            - ACCESSTOKEN
            - REFRESHTOKEN
          description: The type of the credential.
      discriminator:
        propertyName: credentialType
        mapping:
          PLAIN: '#/components/schemas/PlainCredential'
          ACCESSTOKEN: '#/components/schemas/AccessTokenCredential'
          REFRESHTOKEN: '#/components/schemas/RefreshTokenCredential'
      required:
        - credentialType
    CreateSubscriptionDetail:
      description: The detail of the requested event subscription
      type: object
      properties:
        device:
          $ref: '#/components/schemas/Device'
        applicationServer:
          $ref: '#/components/schemas/ApplicationServer'
        applicationServerPorts:
          description: |
            A list of single ports or port ranges on the application server
          allOf:
            - $ref: '#/components/schemas/PortsSpec'
        applicationProfileId:
          $ref: '#/components/schemas/ApplicationProfileId'
      required:
        - device
        - applicationProfileId
    SubscriptionRequest:
      description: The request for creating a event-type event subscription
      type: object
      required:
        - sink
        - protocol
        - config
        - types
      properties:
        protocol:
          $ref: '#/components/schemas/Protocol'
        sink:
          type: string
          format: url
          description: |
            The address to which events shall be delivered using the selected
            protocol.
          example: https://endpoint.example.com/sink
        sinkCredential:
          $ref: '#/components/schemas/SinkCredential'
        types:
          description: |
            Camara Event types eligible to be delivered by this subscription.
            Note: for the Commonalities meta-release v0.4 we enforce to have
            only event type per subscription then for following meta-release
            use of array MUST be decided at API project level.
          type: array
          items:
            type: string
            example: >-
              org.camaraproject.connectivity-insights-subscriptions.v0.network-quality
        config:
          $ref: '#/components/schemas/Config'
    NetworkQualityInsight:
      type: object
      description: |
        the network's confidence level at being able to meet the network
        demands of a given policy for a given terminal device.
      properties:
        papplicationProfileId:
          $ref: '#/components/schemas/ApplicationProfileId'
        packetDelayBudget:
          $ref: '#/components/schemas/PolicyFulfillmentConfidence'
        targetMinDownstreamRate:
          $ref: '#/components/schemas/PolicyFulfillmentConfidence'
        targetMinUpstreamRate:
          $ref: '#/components/schemas/PolicyFulfillmentConfidence'
        packetlossErrorRate:
          $ref: '#/components/schemas/PolicyFulfillmentConfidence'
        jitter:
          $ref: '#/components/schemas/PolicyFulfillmentConfidence'
        additionalKpis:
          $ref: '#/components/schemas/AdditionalKpis'
    PolicyFulfillmentConfidence:
      type: string
      description: |
        a plain-language indicator of how confident the network is to meet a
        given network demand.
      enum:
        - meets the application requirements
        - unable to meet the application requirements
    ApplicationProfileId:
      description: Identifier for the Application Profile
      type: string
      format: uuid
    Source:
      type: string
      format: uri-reference
      minLength: 1
      description: |
        Identifies the context in which an event happened, as a non-empty
        `URI-reference` like:
        - URI with a DNS authority:
          * https://github.com/cloudevents
          * mailto:[email protected]
        - Universally-unique URN with a UUID:
          * urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66
        - Application-specific identifier:
          * /cloudevents/spec/pull/123
          * 1-555-123-4567
      example: https://notificationSendServer12.supertelco.com
    CloudEvent:
      description: The Cloud-Event used for the callback.
      required:
        - id
        - source
        - specversion
        - type
        - time
      properties:
        id:
          type: string
          description: |
            identifier of this event, that must be unique in the source context.
        source:
          $ref: '#/components/schemas/Source'
        type:
          $ref: '#/components/schemas/EventTypeNotification'
        specversion:
          type: string
          description: |
            Version of the specification to which this event conforms (must be
             1.0 if it conforms to cloudevents 1.0.2 version)
          enum:
            - '1.0'
        datacontenttype:
          type: string
          description: |
            'media-type that describes the event payload encoding,
            must be "application/json" for CAMARA APIs'
          enum:
            - application/json
        data:
          $ref: '#/components/schemas/NetworkQualityInsight'
        time:
          $ref: '#/components/schemas/DateTime'
      discriminator:
        propertyName: type
        mapping:
          org.camaraproject.connectivity-insights-subscriptions.v0.network-quality: '#/components/schemas/EventNetworkQuality'
          org.camaraproject.connectivityinsights.v0.eventSubscriptionEnds: '#/components/schemas/EventSubscriptionEnds'
    EventNetworkQuality:
      description: event structure for Network Quality
      allOf:
        - $ref: '#/components/schemas/CloudEvent'
        - type: object
          properties:
            data:
              $ref: '#/components/schemas/NetworkQualityInsight'
    EventSubscriptionEnds:
      description: event structure for event subscription ends
      allOf:
        - $ref: '#/components/schemas/CloudEvent'
        - type: object
          properties:
            data:
              $ref: '#/components/schemas/SubscriptionEnds'
    SubscriptionEnds:
      description: Event detail structure for SUBSCRIPTION_ENDS event
      type: object
      required:
        - terminationReason
        - subscriptionId
      properties:
        terminationReason:
          $ref: '#/components/schemas/TerminationReason'
        subscriptionId:
          $ref: '#/components/schemas/SubscriptionId'
        terminationDescription:
          type: string
    TerminationReason:
      type: string
      description: |
        - NETWORK_TERMINATED - API server stopped sending notification
        - SUBSCRIPTION_EXPIRED - Subscription expire time (optionally set by
        the requester) has been reached
        - MAX_EVENTS_REACHED - Maximum number of events (optionally set by the
        requester) has been reached
        - ACCESS_TOKEN_EXPIRED - Access Token sinkCredential (optionally set by
        the requester) expiration time has been reached
      enum:
        - MAX_EVENTS_REACHED
        - NETWORK_TERMINATED
        - SUBSCRIPTION_EXPIRED
        - ACCESS_TOKEN_EXPIRED
    DateTime:
      type: string
      format: date-time
      description: |
        Timestamp of when the occurrence happened. Must adhere to RFC 3339.
      example: '2018-04-05T17:31:00Z'
    EventTypeNotification:
      type: string
      description: |
        event-type - Event triggered when an event-type event occurred
        subscription-ends: Event triggered when the subscription ends
      enum:
        - >-
          org.camaraproject.connectivity-insights-subscriptions.v0.network-quality
        - >-
          org.camaraproject.connectivity-insights-subscriptions.v0.subscription-ends
    ErrorInfo:
      type: object
      description: Error information
      required:
        - status
        - code
        - message
      properties:
        status:
          type: integer
          description: HTTP status code returned along with this error response
        code:
          type: string
          description: Code given to this error
        message:
          type: string
          description: Detailed error description
  responses:
    CreateSubscriptionBadRequest400:
      description: Problem with the client request
      headers:


# --- truncated at 32 KB (43 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/global-system-for-mobile-communications/refs/heads/main/openapi/connectivity-insights-subscriptions-api-openapi.yml