How to list porting records
WARNING
This API is in alpha and may be subject to change. Therefore, we do not recommend using this in production.
Interested in this feature? Please reach out to products@wgtwo.com
ListPortingRecords
is a method that allows you to list porting records by using one or more of the following filters: subscriber number prefix, operator code or valid from. This method is part of the Number Portability API.
Example code
The examples below demonstrate how to use the ListPortingRecords
function.
TIP
You can test our APIs without authorization by targetting sandbox.api.wgtwo.com
instead of api.wgtwo.com
and removing any authorization from the request/code sample.
Download proto definitions
curl -sL 'https://github.com/working-group-two/wgtwoapis/blob/master/image.bin?raw=true' -o wgtwo.bin
1
#!/usr/bin/env bash
export ACCESS_TOKEN="my_access_token"
grpcurl -protoset wgtwo.bin \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-d '
{
"subscriberNumberPrefix": "+467123",
"operatorCode": "A21",
"validFrom": "2020-01-01T00:00:00Z"
}
' \
api.wgtwo.com:443 \
wgtwo.number_portability.v0.NumberPortabilityService/ListPortingRecords
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
Example result
Success
{
"records": [
{
"subscriberNumber": "+46712345678",
"operatorCode": "A21",
"validFrom": "2024-04-01T00:00:00Z",
"metadata": {
"test_key": "test_value"
}
}
]
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
Error
ERROR:
Code: InvalidArgument
Message: Invalid subscriber number prefix
1
2
3
2
3
Install dependencies
Maven
<dependency>
<groupId>com.wgtwo.api.v0.grpc</groupId>
<artifactId>number_portability</artifactId>
<version>0.3.0</version>
</dependency>
package com.example.numberPortability
import com.google.protobuf.Timestamp
import com.wgtwo.api.v0.number_portability.NumberPortabilityServiceGrpcKt
import com.wgtwo.api.v0.number_portability.listPortingRecordsRequest
import com.wgtwo.auth.BearerTokenCallCredentials
import io.grpc.ManagedChannelBuilder
import io.grpc.Status
import io.grpc.StatusException
import kotlinx.coroutines.runBlocking
enum class EnvironmentForListPortingRecordsExample {
SANDBOX,
PRODUCTION,
}
/** Use the sandbox environment for testing without authentication */
private val environment = EnvironmentForListPortingRecordsExample.SANDBOX
private val endpoint = when (environment) {
EnvironmentForListPortingRecordsExample.SANDBOX -> "sandbox.api.wgtwo.com"
EnvironmentForListPortingRecordsExample.PRODUCTION -> "api.wgtwo.com"
}
private val channel = ManagedChannelBuilder.forAddress(endpoint, 443).build()
private val stub = NumberPortabilityServiceGrpcKt.NumberPortabilityServiceCoroutineStub(channel).run {
/**
* If you are not using the sandbox, you need to add credentials.
* The BearerTokenCallCredentials class can be found in our auth library.
*/
if (environment == EnvironmentForListPortingRecordsExample.PRODUCTION) {
withCallCredentials(BearerTokenCallCredentials { "MY_CLIENT_ACCESS_TOKEN" })
} else {
this
}
}
fun main() = runBlocking {
val listPortingRecordsRequest = listPortingRecordsRequest {
subscriberNumberPrefix = "+467000"
validFrom = Timestamp.newBuilder().setSeconds(System.currentTimeMillis() / 1000).build()
}
println("listPortingRecordsRequest:\n$listPortingRecordsRequest")
val listPortingRecordsResponse = stub.listPortingRecords(listPortingRecordsRequest)
println("listPortingRecordsResponse:\n$listPortingRecordsResponse")
val listPortingRecordsRequestWithInvalidSubscriberNumberPrefix = listPortingRecordsRequest {
subscriberNumberPrefix = "invalid"
}
val errorResponse = runCatching {
stub.listPortingRecords(listPortingRecordsRequestWithInvalidSubscriberNumberPrefix)
}
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}")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Example result
Success
records {
subscriber_number {
e164: "+46714991322"
}
operator_code: "A24"
routing_code: "039"
valid_from {
seconds: 1712570280
nanos: 209405000
}
metadata {
key: "test_key"
value: "test_val_2096299844"
}
}
records {
subscriber_number {
e164: "+46703322254"
}
operator_code: "C45"
routing_code: "021"
valid_from {
seconds: 1712566680
nanos: 218947000
}
metadata {
key: "test_key1"
value: "test_value"
}
metadata {
key: "test_key2"
value: "test_value2"
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Error
Status code: INVALID_ARGUMENT
Status description: Invalid subscriber number
1
2
2