iOS 14 SKAdNetwork Support for DSPs
With Apple’s announcement on 24th June 2020, DSPs will need to start utilizing Apple’s privacy conscious SKAdNetwork framework for install and conversion tracking on iOS14+ devices. Smaato is adding support for SKAdNetwork attribution into its SDK along with necessary bid request/response signals. For display, we support <a href>
, mraid.open()
, window.open()
& window.location
click redirect methods. The click redirects (ex, HTTP status 3xx) will be followed in the methods mentioned above for display, native and video Ad formats.
What should DSPs do to enable SKAdNetwork attribution with Smaato?
- DSPs should register as an Ad Network to Apple’s SKAdNetwork API. Click here to register.
- Supply your public key to Apple and set your postback urls.
- Provide your SKAdNetwork ID to your Smaato Account Manager.
- Smaato will get your SKAdNetwork ID(s) added to publishers’ info.plist.
- DSPs should be able to ingest the list of SKAdNetwork ID(s), version, and source bundle ID information in BidRequest.imp.ext.skadn object of the bid request.
- If the DSP is responding with a SKAdNetwork enabled campaign, it should respond with SKAdNetwork ID and all relevant fields in the bid response.
- Advertiser app should be registering its new users to SkAdNetwork via
registerAppForAdNetworkAttribution()
- DSPs should have an install tracking service to handle install data and signature from the SKAdNetwork postback.
SKAdNetwork Attribution Workflow
Bid Request
Object: BidRequest.imp.ext.skadn
This object will be populated if all conditions below are met:
- The DSP has at least one SKAdNetwork ID registered in the publisher’s info.plist
- The user’s device is operating on iOS14 or above.
- The Application is integrated with Smaato via a SKAdNetwork supported version.
- The DSP is on Smaato’s OpenRTB 2.4 and above spec.
Attribute | Description | Type | Example |
versions
|
Array of strings containing the supported skadnetwork versions. Always “2.0” or higher. Dependent on both the OS version and the SDK version. | array of strings | “versions”: [“2.0”, “2.1”, “2.2”, “3.0”, “4.0”] |
---|---|---|---|
version
|
Version of skadnetwork supported. Always “2.0” or higher. Dependent on both the OS version and the SDK version. Note: With the release of SKAdNetwork 2.1, this field is deprecated in favor of the BidRequest.imp.ext.skadn.versions
to support an array of version numbers.
|
string | “version”: “2.0” |
sourceapp
|
ID of publisher app in Apple’s App Store. Should match
app.bundle
in OpenRTB 2.x and
app.storeid
in AdCOM 1.x
|
string | “sourceapp”: “880047117” |
skadnetids
|
A subset of SKAdNetworkItem entries in the publisher app’s Info.plist,
expressed as lowercase strings, that are relevant to the bid request. Recommended that this list not exceed 10. Note: BidRequest.imp.ext.skadn.skadnetlist.addl
is the preferred method to express raw SKAdNetwork IDs.
|
array of strings | “skadnetids”: [“cdkw7geqsh.skadnetwork”, “qyjfv329m4.skadnetwork”] |
skadnetlist
|
Object containing the IABTL list definition | object | “skadnetlist”: { “max”:306, “excl”:[2,8,10,55] } |
productpage
|
Custom Product Page support. See Apple’s Custom Product Page doc for details. | integer | “productpage”: 1 |
ext
|
Placeholder for exchange-specific extensions to OpenRTB. | object | “ext”: {} |
Object:
BidRequest.imp.ext.skadn.skadnetlist
IABTL skadnetwork object list attributes.
Attribute | Description | Type | Example |
max
|
IABTL list containing the max entry ID of SKAdNetwork ID. Format will be: “max entity ID” where 306 in the example on the right will be all SKAdNetwork IDs entry number 306 and below. | integer | “max”:306 |
excl
|
Comma separated list of integer IABTL registration IDs to be excluded from IABTL shared list. | array of integers | “excl”: [44,14,18] |
addl
|
Comma separated list of string SKAdNetwork IDs,
expressed as lowercase strings, not included in the IABTL shared list. The intention of addl is to be the permanent home for raw SKAdNetwork IDs, migrating away from
BidRequest.imp.ext.skadn.skadnetids . Recommended that this list not exceed 10.
|
array of strings | “addl”: [“cdkw7geqsh.skadnetwork”, “qyjfv329m4.skadnetwork”] |
ext
|
Placeholder for exchange-specific extensions to OpenRTB. | object | “ext”:{} |
Example
Used for direct SSP to DSP connections where a DSP wants to only consume their own relevant SKAdNetwork IDs.
{
"imp": [
{
"ext": {
"skadn": {
"versions": ["2.0", "2.1", "2.2", "3.0", "4.0"],
"sourceapp": "880047117",
"productpage": 1,
"skadnetlist":{
"max":306,
"excl":[2,8,10,55],
"addl": [
"cdkw7geqsh.skadnetwork",
"qyJfv329m4.skadnetwork"
]
}
}
}
}
]
}
Changes in Bid Request Device Object
If the user does not give permission through the AppTrackingTransparency framework for targeting, IDFA field will not be passed. Smaato will offer IDFV and an exchange based device identifier. These two identifiers can be used for fraud prevention and frequency capping, not for targeted advertising or advertising measurement purposes.
Attribute
|
Description
|
Type
|
Example
|
---|---|---|---|
BidRequest.device.ifa | IDFA will only be passed if the user gives the permission through the AppTrackingTransparency framework. | string | “ifa”:”F52329FE-DAB6-11EA-87D0-0242AC130003” |
BidRequest.device.ext.ifv | An alphanumeric string that uniquely identifies a device to the publisher. | string | “ifv”:”A9F6BDD8-3343-4E6D-A283-F98986880335” |
BidRequest.device.ext.atts | (iOS 14+ only) An integer passed to represent the app’s app tracking authorization status, where 0 = not determined 1 = restricted 2 = denied 3 = authorized |
integer | “atts”:3 |
BidRequest.user.id | Exchange defined user identifier which will be consistent up to 24 hours within the same application. | string | “id”:”F4EE2B2D-1B0E-4BA9-8471-28E9ED8FB95C” |
Bid Response
Object: BidResponse.seatbid.bid.ext.skadn
For bid requests with SKAdnetwork extension object, the DSP can return a bid response which includes the following fields to enable SKAdNetwork install and conversion attribution. Smaato will validate SKAdNetwork ID, bundle ID fields in the response, and call loadProduct() with appropriate values.
Attribute | Description | Type | Example |
version
|
Version of SKAdNetwork desired. Must be 2.0 or above. | string | “version”: “4.0” |
---|---|---|---|
network
|
Ad network identifier used in signature. Should match one of the items in the skadnetids array in the request | string | “network”: “cdkw7geqsh.skadnetwork” |
sourceidentifier
|
A four-digit integer that ad networks define to represent the ad campaign. Used in SKAdNetwork 4.0+, replaces Campaign ID `campaign`. DSPs must generate signatures in 4.0+ using the Source Identifier. Please refer to the SKAdNetwork 4 release notes for more details. | string | “sourceidentifier”: “4321” |
campaign
|
Campaign ID compatible with Apple’s spec. As of 2.0, should be an integer between 1 and 100, expressed as a string. Note: Used in SKAdNetwork 3.0 and below. Replaced by Source Identifier sourceidentifier
in 4.0 and above
|
string | “campaign”: “45” |
itunesitem
|
ID of advertiser’s app in Apple’s app store. Should match
BidResponse.seatbid.bid.bundle
|
string | “itunesitem”: “123456789” |
productpageid
|
Custom Product Page ID (UUID) | string | “productpageid”: “45812c9b-c296-43d3-c6a0-c5a02f74bf6e” |
fidelities
|
Supports multiple fidelity types introduced in SKAdNetwork v2.2 | object array | “fidelities”: [ { “fidelity”: 0, “signature”: “MEQCIEQlmZRNfYzK…”, “nonce”: “473b1a16…”, “timestamp”: “1594406341” } ] |
nonce
|
An id unique to each ad response. Refer to Apple’s documentation for the
proper UUID format requirements
Note: With the release of SKAdNetwork v2.2, this field is deprecated in favor of the BidResponse.seatbid.bid.ext.skadn.fidelities.nonce
to support multiple fidelity-types.
|
string | “nonce”: “473b1a16-b4ef-43ad-9591-fcf3aefa82a7” |
sourceapp
|
ID of publisher’s app in Apple’s app store. Should match
BidRequest.imp.ext.skad.sourceapp
|
string | “sourceapp”: “880047117” |
timestamp
|
Unix time in millis string used at the time of signature Note: With the release of SKAdNetwork 2.2, this field is deprecated in favor of the BidResponse.seatbid.bid.ext.skadn.fidelities.timestamp
to support multiple fidelity-types.
|
string | “timestamp”: “1594406341232” |
signature
|
SKAdNetwork signature as specified by Apple Note: Apple requires that both the ad network nonce and ad network identifier be lowercase when signing for either fidelity type (impressions or clicks), as per SKAdNetwork specifications. Note: With the release of SKAdNetwork 2.2, this field is deprecated in favor of the BidResponse.seatbid.bid.ext.skadn.fidelities.signature
to support multiple fidelity-types.
|
string | “signature”: “MEQCIEQlmZRNfYzK…” |
ext
|
Placeholder for exchange-specific extensions to OpenRTB. | object | “ext”: {} |
Object:
BidResponse.seatbid.bid.ext.skadn.fidelities
Fields that should have different values for the different fidelity types (e.g.
fidelity
,
nonce
,
signature
) are wrapped into an array of objects.
Note:
Adding
timestamp
to this list allows bidders to parallelize the cryptography portions of creating their bid response when supporting multiple fidelities. The same timestamp can be used across fidelities if desired but this move provides bidders with greater implementation flexiblity.
Attribute | Description | Type | Example |
fidelity
|
The fidelity-type of the attribution to track | integer | “fidelity”: 0 |
---|---|---|---|
nonce
|
An id unique to each ad response. Refer to Apple’s documentation for the proper UUID format requirements | string | “nonce”: “473b1a16-b4ef-43ad-9591-fcf3aefa82a7” |
timestamp
|
Unix time in millis string used at the time of signature | string | “timestamp”: “1594406341” |
signature
|
SKAdNetwork signature as specified by Apple | string | “signature”: “MEQCIEQlmZRNfYzK…” |
ext
|
Placeholder for exchange-specific extensions to OpenRTB. | object | “ext”: {} |
Example v4.0
{
"seatbid": [
{
"bid": [
{
"ext": {
"skadn": {
"version": "4.0",
"network": "cdkw7geqsh.skadnetwork",
"sourceidentifier": "4321",
"itunesitem": "123456789",
"sourceapp": "880047117",
"productpageid": "45812c9b-c296-43d3-c6a0-c5a02f74bf6e",
"fidelities": [
{
"fidelity": 0,
"signature": "TUVRQ0lFUWxtWlJOZll6S0JTRThRbmhMVElIWlpaV0NGZ1pwUnFSeEhzczY1S29GQWlBSmdKS2pkcldka0xVT0NDanVFeDJS==",
"nonce": "473b1a16-b4ef-43ad-9591-fcf3aefa82a7",
"timestamp": "1594406341"
},
{
"fidelity": 1,
"signature": "VFVWUlEwbEZVV3h0V2xKT1psbDZTMEpUUlRoUmJtaE1WRWxJV2xwYVYwTkdaMXB3VW5GU2VFaHpjelkxUzI5R1FXbEJTbDBG==",
"nonce": "e650de09-2a9f-4dc3-a4d1-544c402e9095",
"timestamp": "1594406342"
}
]
}
}
}
]
}
]
}
Example v2.2
{
"seatbid": [
{
"bid": [
{
"ext": {
"skadn": {
"version": "2.2",
"network": "cdkw7geqsh.skadnetwork",
"campaign": "45",
"itunesitem": "123456789",
"sourceapp": "880047117",
"productpageid": "45812c9b-c296-43d3-c6a0-c5a02f74bf6e",
"fidelities": [
{
"fidelity": 0,
"signature": "MEQCIEQlmZRNfYzKBSE8QnhLTIHZZZWCFgZpRqRxHss65KoFAiAJgJKjdrWdkLUOCCjuEx2RmFS7daRzSVZRVZ8RyMyUXg==",
"nonce": "473b1a16-b4ef-43ad-9591-fcf3aefa82a7",
"timestamp": "1594406341"
},
{
"fidelity": 1,
"signature": "GRlMDktMmE5Zi00ZGMzLWE0ZDEtNTQ0YzQwMmU5MDk1IiwKICAgICAgICAgICAgICAgICAgInRpbWVzdGTk0NDA2MzQyIg==",
"nonce": "e650de09-2a9f-4dc3-a4d1-544c402e9095",
"timestamp": "1594406342"
}
]
}
}
}
]
}
]
}
Example v2.0
{
"seatbid": [
{
"bid": [
{
"ext": {
"skadn": {
"version": "2.0",
"network": "cdkw7geqsh.skadnetwork",
"campaign": "45",
"itunesitem": "123456789",
"nonce": "473b1a16-b4ef-43ad-9591-fcf3aefa82a7",
"sourceapp": "880047117",
"timestamp": "1594406341232",
"signature": "MEQCIEQlmZRNfYzKBSE8QnhLTIHZZZWCFgZpRqRxHss65KoFAiAJgJKjdrWdkLUOCCjuEx2RmFS7daRzSVZRVZ8RyMyUXg=="
}
}
}
]
}
]
}
Last Modified: April 21, 2023 at 4:13 pm