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 Working Group Two 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.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
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
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
}
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.8.0</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)
}
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"
}
}
}
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