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
Required scope
None
Code
TIP
You can test our APIs without authorization by targetting sandbox.api.shamrock.wgtwo.com
instead of api.{region}.wgtwo.com
and removing any authorization from the request/code sample.
Download proto definitions
curl -sL https://github.com/working-group-two/wgtwoapis/releases/latest/download/mobility.binpb --output mobility.binpb
#!/usr/bin/env bash
grpcurl \
--protoset mobility.binpb \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-d '
{
"stream_configuration": {
"regular": {},
"disable_explicit_ack": {}
}
}
' \
sandbox.api.shamrock.wgtwo.com:443 \
wgtwo.consents.v1.ConsentEventService/StreamConsentChangeEvents
2
3
4
5
6
7
8
9
10
11
12
13
14
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
}
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"
}
}
}
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.shamrock.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).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 == Environment.PRODUCTION) {
withCallCredentials(BearerTokenCallCredentials { "MY_CLIENT_ACCESS_TOKEN" })
} else {
this
}
}
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)
}
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
65
66
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"
}
}
}
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