How to Create Porting Records

Warning: Beta software This API is in beta stage and may be subject to change. Therefore, we do not recommend using this in production.

Interested in this feature? Please reach out to mobility-services-developer@cisco.com

CreatePortingRecords is a method that allows you to create one or more porting record for specific subscriber numbers.

This method is part of the Number Portability API.

Prerequisites

  1. An OAuth 2.0 client
  2. A client access token

Required Scope

  • number_portability.porting_record:write

Code Dependencies

<dependency>
  <groupId>com.wgtwo.api.v0.grpc</groupId>
  <artifactId>number_portability</artifactId>
  <version>0.3.0</version>
</dependency>

Code

The examples below demonstrate how to use the CreatePortingRecords function.

If targeting production, you would need to add authentication to the sample code.


#!/usr/bin/env bash
grpcurl \
  -d '
  {
      "records": [
          {
              "subscriberNumber": {
                "e164": "+46712345678"
              },
              "operatorCode": "A21",
              "routingCode": "006",
              "validFrom": "2024-04-01T00:00:00Z",
              "metadata": {
                "test_key": "test_value"
              }
          }
      ]
  }
  ' \
  sandbox.api.shamrock.wgtwo.com:443 \
  wgtwo.number_portability.v0.NumberPortabilityService/CreatePortingRecords

package com.example.numberPortability

import com.google.protobuf.Timestamp
import com.wgtwo.api.v0.number_portability.NumberPortabilityServiceGrpcKt
import com.wgtwo.api.v0.number_portability.createPortingRecordsRequest
import com.wgtwo.api.v0.number_portability.portingRecord
import com.wgtwo.api.v1.common.e164
import io.grpc.ManagedChannelBuilder
import io.grpc.Status
import io.grpc.StatusException
import kotlinx.coroutines.runBlocking

private val channel = ManagedChannelBuilder.forAddress("sandbox.api.shamrock.wgtwo.com", 443).build()
private val stub = NumberPortabilityServiceGrpcKt.NumberPortabilityServiceCoroutineStub(channel)

fun main() = runBlocking {
    val createPortingRecordsRequest = createPortingRecordsRequest {
        records += listOf(
            portingRecord {
                subscriberNumber = e164 { e164 = "+46700000001" }
                validFrom = Timestamp.newBuilder().setSeconds(System.currentTimeMillis() / 1000).build()
                operatorCode = "A21"
                routingCode = "010"
                metadata.put("test_key", "test_value")
            },
            portingRecord {
                subscriberNumber = e164 { e164 = "+46700000002" }
                validFrom = Timestamp.newBuilder().setSeconds(System.currentTimeMillis() / 1000).build()
                operatorCode = "C39"
                routingCode = "005"
                metadata.putAll(mapOf("test_key1" to "test_value", "test_key2" to "test_value2"))
            },
        )
    }
    println("createPortingRecordsRequest:
$createPortingRecordsRequest")

    val createPortingRecordsResponse = stub.createPortingRecords(createPortingRecordsRequest)
    println("createPortingRecordsResponse:
$createPortingRecordsResponse")

    val createPortingRecordsRequestWithInvalidSubscriberNumber = createPortingRecordsRequest {
        records += listOf(
            portingRecord {
                subscriberNumber = e164 { e164 = "invalid" }
                validFrom = Timestamp.newBuilder().setSeconds(System.currentTimeMillis() / 1000).build()
                operatorCode = "A21"
                routingCode = "010"
            },
        )
    }

    val errorResponse = runCatching {
        stub.createPortingRecords(createPortingRecordsRequestWithInvalidSubscriberNumber)
    }

    assert(errorResponse.isFailure) { "result is not a failure" }
    assert((errorResponse.exceptionOrNull() as? StatusException)?.status?.code == Status.INVALID_ARGUMENT.code) {
        "exception is not a StatusException with INVALID_ARGUMENT status code: ${errorResponse.exceptionOrNull()}"
    }
    println("Status code: ${(errorResponse.exceptionOrNull() as StatusException).status.code}")
    println("Status description: ${(errorResponse.exceptionOrNull() as StatusException).status.description}")
}

Example Results Success

{

}

Example Results Error

ERROR:
  Code: InvalidArgument
  Message: Invalid subscriber number
Status code: INVALID_ARGUMENT
Status description: Invalid subscriber number

Read More