Get consent events

Consent events are events triggered by granting, updating or revoking consents for your product, either for a single user or for an operator. The events can originate from

  • Bundling of your product for a subscriber
  • Preview consent added by Cisco on your behalf
  • Operator consent covering all subscribers for an operator
  • Subscriber signing up to your product

Prerequisites

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

Required scope

None

Code

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
export ACCESS_TOKEN="my_client_access_token"
grpcurl -protoset wgtwo.bin \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '
  {
    "stream_configuration": {
      "regular": {},
      "disable_explicit_ack": {}
    }
  }
  ' \
  api.wgtwo.com:443 \
  wgtwo.consents.v1.ConsentEventService/StreamConsentChangeEvents
1
2
3
4
5
6
7
8
9
10
11
12
13
About stream_configuration

For testing purposes, we include the config:

"stream_configuration": {
  "regular": {},              Reading position will not be stored in the server and load is not spread between your clients 
  "disable_explicit_ack": {}  Let events be automatically acked
}
1
2
3
4

By default, load will automatically be spread between all connections using the same OAuth 2.0 client and you will need to reply with a ack once your service has handled the message. This is also what we would recommend for real production usage.

See configuring event streaming for details.

Example result

{
"metadata": {
  "timestamp": "2022-08-09T12:22:57.110Z",
  "identifier": {
    "subscriptionIdentifier": {
      "value": "490e6f4a2cccd6067741b8a2a4bb14b2a1b2756c523c6c818e7eaee651b07743e69383304f45b3f6970b8bd01d16f845bc999d1ff036a5e605fec314d8aed99e"
    }
  },
  "ackInfo": {
    "value": "$JS.ACK.consent_stream.H5yg2gnj.1.9.1.1660047797010497111.0"
  }
},
"consentChangeEvent": {
  "added": {
    "scopes": [ "sms.text:send_to_subscriber" ]
  },
  "number": {
    "e164": "+46724452050"
  }
}
}

{
"metadata": {
  "timestamp": "2022-08-09T12:23:17.010Z",
  "identifier": {
    "subscriptionIdentifier": {
      "value": "490e6f4a2cccd6067741b8a2a4bb14b2a1b2756c523c6c818e7eaee651b07743e69383304f45b3f6970b8bd01d16f845bc999d1ff036a5e605fec314d8aed99e"
    }
  },
  "ackInfo": {
    "value": "$JS.ACK.consent_stream.H5yg2gnj.1.9.1.1660047797010497633.0"
  }
},
"consentChangeEvent": {
  "revoked": {

  },
  "number": {
    "e164": "+46724452050"
  }
}
}

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
Install dependencies

Maven

<dependency>
  <groupId>com.wgtwo.api.v1.grpc</groupId>
  <artifactId>consent-events</artifactId>
  <version>1.10.1</version>
</dependency>

search.maven.org/search?q=g:com.wgtwo.api.v1.grpcopen in new window

package com.example.consents

import com.wgtwo.api.v1.consent.ConsentEventServiceGrpc
import com.wgtwo.api.v1.consent.ConsentEventsProto.AckConsentChangeEventRequest
import com.wgtwo.api.v1.consent.ConsentEventsProto.StreamConsentChangeEventsRequest
import com.wgtwo.api.v1.consent.ConsentEventsProto.StreamConsentChangeEventsResponse
import com.wgtwo.auth.BearerTokenCallCredentials
import io.grpc.ManagedChannelBuilder
import io.grpc.StatusRuntimeException
import java.util.concurrent.TimeUnit

/** Use the sandbox environment for testing without authentication */
private val environment = Environment.SANDBOX

private val endpoint = when (environment) {
    Environment.SANDBOX -> "sandbox.api.wgtwo.com"
    Environment.PRODUCTION -> "api.wgtwo.com"
}
private val channel = ManagedChannelBuilder.forAddress(endpoint, 443)
    .keepAliveWithoutCalls(true)
    .keepAliveTime(1, TimeUnit.MINUTES)
    .keepAliveTimeout(10, TimeUnit.SECONDS)
    .idleTimeout(1, TimeUnit.HOURS)
    .build()
private val stub = ConsentEventServiceGrpc.newBlockingStub(channel).apply {
    /**
     * If you are not using the sandbox, you need to add credentials.
     * The BearerTokenCallCredentials class can be found in our auth library.
     */
    if (environment == Environment.PRODUCTION) {
        this.withCallCredentials(BearerTokenCallCredentials { "MY_CLIENT_ACCESS_TOKEN" })
    }
}

fun main() {
    while (!channel.isShutdown) {
        try {
            subscribe()
        } catch (e: StatusRuntimeException) {
            println("Got exception: ${e.status} - Reconnecting in 1 second")
            Thread.sleep(1000)
        }
    }
}

fun subscribe() {
    println("Starting subscription")
    val request = StreamConsentChangeEventsRequest.newBuilder().build()

    stub.streamConsentChangeEvents(request).forEach { response ->
        handleResponse(response)
        ack(response)
    }
}

fun handleResponse(response: StreamConsentChangeEventsResponse) {
    println("Got response:\n$response")
}

fun ack(response: StreamConsentChangeEventsResponse) {
    val ackInfo = response.metadata.ackInfo
    val request = AckConsentChangeEventRequest.newBuilder().setAckInfo(ackInfo).build()
    stub.ackConsentChangeEvent(request)
}
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
62
63
64

Example result

{
"metadata": {
  "timestamp": "2022-08-09T12:22:57.110Z",
  "identifier": {
    "subscriptionIdentifier": {
      "value": "490e6f4a2cccd6067741b8a2a4bb14b2a1b2756c523c6c818e7eaee651b07743e69383304f45b3f6970b8bd01d16f845bc999d1ff036a5e605fec314d8aed99e"
    }
  },
  "ackInfo": {
    "value": "$JS.ACK.consent_stream.H5yg2gnj.1.9.1.1660047797010497111.0"
  }
},
"consentChangeEvent": {
  "added": {
    "scopes": [ "sms.text:send_to_subscriber" ]
  },
  "number": {
    "e164": "+46724452050"
  }
}
}

{
"metadata": {
  "timestamp": "2022-08-09T12:23:17.010Z",
  "identifier": {
    "subscriptionIdentifier": {
      "value": "490e6f4a2cccd6067741b8a2a4bb14b2a1b2756c523c6c818e7eaee651b07743e69383304f45b3f6970b8bd01d16f845bc999d1ff036a5e605fec314d8aed99e"
    }
  },
  "ackInfo": {
    "value": "$JS.ACK.consent_stream.H5yg2gnj.1.9.1.1660047797010497633.0"
  }
},
"consentChangeEvent": {
  "revoked": {

  },
  "number": {
    "e164": "+46724452050"
  }
}
}

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

Read more