This article describes how publishers can independently collect and include secure signal values in ad requests, particularly for CTV inventory where using Google Publisher Tag Library (GPT) or Interactive Media Ads (IMA) SDKs may not always be viable. This type of implementation is also known as SDKless or server-to-server.
On this page:
Google Ad Manager collects and takes responsibility for sending secure signals on bid requests when using GPT or the IMA SDK. However, for publishers that can’t or choose not to use one of the supported SDKs, secure signal values can be collected independently and included the ad requests.
This particular use case and requirement is most common with CTV inventory, such as when using any server-to-server, or non-IMA SDK implementation.
When a publisher constructs their own ad request, they can still collect secure signals independently and include the signals on the ad requests.
Requirements
Publishers seeking to support secure signal integrations without an SDK can perform the following:
- The publisher constructs a
json
to represent all signal they would like to send in an ad request. While not required, publishers are encouraged to implement a caching mechanism to reduce the time it takes to send an ad request. - The publisher converts the
json
to a websafe base64 encoded string. - The publisher constructs the ad request to include the
SSJ
parameter with the encoded string as the value. - Once the signals are communicated to the buyer, the buyer is responsible for destroying the information received.
Technical information
JSON
, including two signals, one provided by a third-party signal provider named SOURCE1
, and a second signal which is a publisher custom secure signal named 123 after the publisher network code. DATA1
is obtained from a function supplied by the SOURCE1
signal provider, DATA2
is obtained from a function created by the publisher:{
"signals": [
{
"source": "SOURCE1",
"data": "DATA1",
"isPubCreated": false
},
{
"source": "123",
"data": "DATA2",
"isPubCreated": true
} ]
}
source
is the third-party IDP’ssource_id
(as shared by the provider during registration)data
is output of the signal provider’s libraryisPubCreated
is set tofalse
source
is the publisher’snetwork code
data
is the publisher created signal a bidder should be able to decodeisPubCreated
is set totrue
After JSON.stringify()
[]"signals":"{"source":"SOURCE1","data":"DATA1","isPubCreated":false},{"source":"123","data":"DATA2","isPubCreated":true}]]
eyJzaWduYWxzIjpbeyJzb3VyY2UiOiJTT1VSQ0UxIiwiZGF0YSI6IkRBVEExIiwiaXNQdWJDcmVhdGVkIjpmYWxzZX0seyJzb3VyY2UiOiIxMjMiLCJkYXRhIjoiREFUQTIiLCJpc1B1YkNyZWF0ZWQiOnRydWV9XX0=
eyJzaWduYWxzIjpbeyJzb3VyY2UiOiJTT1VSQ0UxIiwiZGF0YSI6IkRBVEExIiwiaXNQdWJDcmVhdGVkIjpmYWxzZX0seyJzb3VyY2UiOiIxMjMiLCJkYXRhIjoiREFUQTIiLCJpc1B1YkNyZWF0ZWQiOnRydWV9XX0%3D