openapi: 3.0.3
info:
  title: SIM Swap
  description: >
    SIM Swap API provides the customer the ability to obtain information on any
    recent SIM pairing change related to the User's mobile account.


    This API derives from the GSMA Mobile Connect Account Takeover Protection
    specification [Mobile Connect Account Takeover
    Protection](https://www.gsma.com/identity/wp-content/uploads/2022/12/IDY.24-Mobile-Connect-Account-Takeover-Protection-Definition-and-Technical-Requirements-v2.0.pdf). 
    For more about Mobile Connect, please see [about Mobile
    Connect](https://mobileconnect.io/).


    The API provides 2 operations:


    - POST retrieve-date : Provides timestamp of latest SIM swap


    - POST check: Checks if SIM swap has been performed during a past period
    (defined in the request with 'maxAge' attribute).
  termsOfService: http://opgw.u.com.my/terms/
  contact:
    email: awsgsma@u.com.my
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
  version: 0.4.0
externalDocs:
  description: Product documentation at Camara
  url: https://github.com/camaraproject/
servers:
  - url: https://api-sandbox.opgw.u.com.my/sim-swap-service/sim-swap/v0
    description: Sandbox server (uses test data)
paths:
  /retrieve-date:
    post:
      security:
        - three_legged:
            - retrieve-sim-swap-date
      tags:
        - Retrieve SIM swap date
      description: >-
        Get timestamp of last MSISDN <-> IMSI pairing change for a mobile user
        account provided with MSIDN.
      operationId: retrieveSimSwapDate
      requestBody:
        description: |
          Create a SIM swap date request for a MSISDN identifier.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateSimSwapDate'
        required: true
      responses:
        '200':
          description: Contains information about SIM swap change
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SimSwapInfo'
        '400':
          $ref: '#/components/responses/Generic400'
        '401':
          $ref: '#/components/responses/Generic401'
        '403':
          $ref: '#/components/responses/Generic403'
        '404':
          $ref: '#/components/responses/Generic404'
        '409':
          $ref: '#/components/responses/Generic409'
        '500':
          $ref: '#/components/responses/Generic500'
        '503':
          $ref: '#/components/responses/Generic503'
        '504':
          $ref: '#/components/responses/Generic504'
  /check:
    post:
      security:
        - three_legged:
            - check-sim-swap
      tags:
        - Check SIM swap
      description: Check if SIM swap has been performed during a past period
      operationId: checkSimSwap
      requestBody:
        description: |
          Create a check SIM swap request for a MSISDN identifier.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateCheckSimSwap'
        required: true
      responses:
        '200':
          description: Returns whether a SIM swap has been performed during a past period
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CheckSimSwapInfo'
        '400':
          $ref: '#/components/responses/Generic400'
        '401':
          $ref: '#/components/responses/Generic401'
        '403':
          $ref: '#/components/responses/Generic403'
        '404':
          $ref: '#/components/responses/Generic404'
        '409':
          $ref: '#/components/responses/Generic409'
        '500':
          $ref: '#/components/responses/Generic500'
        '503':
          $ref: '#/components/responses/Generic503'
        '504':
          $ref: '#/components/responses/Generic504'
components:
  securitySchemes:
    three_legged:
      type: oauth2
      flows:
        authorizationCode:
          authorizationUrl: https://api-sandbox.opgw.u.com.my/authorize
          tokenUrl: https://api-sandbox.opgw.u.com.my/ac/auth-service/oauth/v1/token
          scopes:
            check-sim-swap: checkSimSwap operation
            retrieve-sim-swap-date: retrieveSimSwapDate operation
  schemas:
    SimSwapInfo:
      type: object
      properties:
        latestSimChange:
          type: string
          format: date-time
          description: Timestamp of latest SIM swap performed
    CheckSimSwapInfo:
      type: object
      properties:
        swapped:
          type: boolean
          description: >-
            Indicates whether the SIM card has been swapped during the period
            within the provided age.
    PhoneNumber:
      type: string
      pattern: ^\+?[0-9]{5,15}$
      example: '+60182222111'
      description: >-
        Subscriber number in E.164 format (starting with country code).
        Optionally prefixed with '+'.
    ErrorInfo:
      type: object
      required:
        - status
        - code
        - message
      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
    CreateCheckSimSwap:
      type: object
      required:
        - phoneNumber
      properties:
        phoneNumber:
          $ref: '#/components/schemas/PhoneNumber'
        maxAge:
          type: integer
          example: 240
          description: |
            Period in hours to be checked for SIM swap.
          format: int32
          minimum: 1
          maximum: 2400
          default: 240
    CreateSimSwapDate:
      type: object
      required:
        - phoneNumber
      properties:
        phoneNumber:
          $ref: '#/components/schemas/PhoneNumber'
  responses:
    Generic400:
      description: Problem with the client request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          example:
            status: 400
            code: INVALID_ARGUMENT
            message: Client specified an invalid argument, request body or query param
    Generic401:
      description: Authentication problem with the client request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          example:
            status: 401
            code: UNAUTHENTICATED
            message: >-
              Request not authenticated due to missing, invalid, or expired
              credentials
    Generic403:
      description: Client does not have sufficient permission
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          example:
            status: 403
            code: PERMISSION_DENIED
            message: Client does not have sufficient permissions to perform this action
    Generic404:
      description: Resource Not Found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          example:
            status: 404
            code: SIM_SWAP.UNKNOWN_PHONE_NUMBER
            message: SIM Swap can't be checked because the phone number is unknown.
    Generic409:
      description: Conflict
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          example:
            status: 409
            code: CONFLICT
            message: Another request is created for the same MSISDN
    Generic500:
      description: Server error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          example:
            status: 500
            code: INTERNAL
            message: Server error
    Generic503:
      description: Service unavailable. Typically the server is down
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          example:
            status: 503
            code: UNAVAILABLE
            message: Service unavailable
    Generic504:
      description: >-
        Request time exceeded. If it happens repeatedly, consider reducing the
        request complexity
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorInfo'
          example:
            status: 504
            code: TIMEOUT
            message: Request timeout exceeded. Try later
