iOS 14 SKAdNetwork
iOS 14 SKAdNetwork Support for DSPs
Overview
With Apple’s announcement on June 24, 2020, DSPs must utilize Apple’s privacy-conscious SKAdNetwork framework for install and conversion tracking on iOS 14+ devices. Smaato adds support for SKAdNetwork attribution in its SDK, along with the required bid request and response signals.
For display, the following click redirect methods are supported:
<a href>, mraid.open(), window.open(), and window.location.
Redirects (e.g., HTTP status 3xx) will be followed in the above methods for Display, Native, and Video ad formats.
Important:
When you register for an SKAdNetwork ID, Apple provides an ID with capitalized letters.
You must pass this ID in lowercase to Smaato and use it consistently (e.g., when generating a click signature).
Apple requires a lowercased identifier to send a postback notifying you of an install conversion.
Steps for DSPs to Enable SKAdNetwork Attribution
- Register as an Ad Network with Apple’s SKAdNetwork API.
- Supply your public key to Apple and configure your postback URLs.
- Provide your SKAdNetwork ID to your Smaato Account Manager.
- Smaato will add your SKAdNetwork ID(s) to publishers’ Info.plist.
- DSPs must ingest the list of SKAdNetwork IDs, version, and source bundle ID from the
BidRequest.imp.ext.skadnobject in the bid request. - If responding with an SKAdNetwork-enabled campaign, include the SKAdNetwork ID and all relevant fields in the bid response.
- The advertiser app must register new users using
registerAppForAdNetworkAttribution(). - DSPs should operate an install tracking service to process install data and SKAdNetwork postback signatures.
SKAdNetwork Attribution Workflow
Bid Request
Object: BidRequest.imp.ext.skadn
This object will be populated if all of the following are true:
- The DSP has at least one SKAdNetwork ID registered in the publisher’s Info.plist
- The user’s device runs iOS 14+
- The application is integrated with a SKAdNetwork-supported Smaato SDK version
- The DSP uses OpenRTB 2.4 or higher
| Attribute | Description | Type | Example |
|---|---|---|---|
versions | Array of supported SKAdNetwork versions ("2.0" or higher) | array of strings | "versions": ["2.0", "2.1", "2.2", "3.0", "4.0"] |
version | Version of SKAdNetwork supported (deprecated in favor of versions) | string | "version": "2.0" |
sourceapp | ID of the publisher app in Apple’s App Store (matches app.bundle) | string | "sourceapp": "880047117" |
skadnetids | Subset of SKAdNetworkItem entries from the publisher app’s Info.plist (lowercase) | 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 flag (see Apple’s docs) | integer | "productpage": 1 |
ext | Exchange-specific extensions | object | "ext": {} |
Object: BidRequest.imp.ext.skadn.skadnetlist
| Attribute | Description | Type | Example |
|---|---|---|---|
max | Maximum entry ID for IABTL SKAdNetwork list | integer | "max": 306 |
excl | List of excluded IABTL registration IDs | array of integers | "excl": [44, 14, 18] |
addl | Additional SKAdNetwork IDs (not in shared list, lowercase) | array of strings | "addl": ["cdkw7geqsh.skadnetwork", "qyjfv329m4.skadnetwork"] |
ext | Exchange-specific extensions | object | "ext": {} |
Example Bid Request
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 grant tracking permission through the AppTrackingTransparency framework:
- IDFA will not be passed.
- IDFV and an exchange-generated device identifier will be provided (usable only for fraud prevention and frequency capping).
| Attribute | Description | Type | Example |
|---|---|---|---|
device.ifa | IDFA (only if user grants permission) | string | "ifa": "F52329FE-DAB6-11EA-87D0-0242AC130003" |
device.ext.ifv | Unique device ID for publisher use | string | "ifv": "A9F6BDD8-3343-4E6D-A283-F98986880335" |
device.ext.atts | App tracking authorization status (0–3) | integer | "atts": 3" |
user.id | Exchange-defined user ID (valid for 24h per app) | string | "id": "F4EE2B2D-1B0E-4BA9-8471-28E9ED8FB95C" |
Bid Response
Object: BidResponse.seatbid.bid.ext.skadn
When the bid request includes an SKAdNetwork extension object, DSPs must return a response with the following fields to enable SKAdNetwork install and conversion attribution.
| Attribute | Description | Type | Example |
|---|---|---|---|
version | Version of SKAdNetwork (must be "2.0+") | string | "4.0" |
network | SKAdNetwork ID (matches one in request) | string | "cdkw7geqsh.skadnetwork" |
sourceidentifier | Four-digit Source ID (SKAdNetwork 4.0+) | string | "4321" |
campaign | Campaign ID (1–100), used pre-4.0 | string | "45" |
itunesitem | Advertiser app ID | string | "123456789" |
productpageid | Custom Product Page ID | string | "45812c9b-c296-43d3-c6a0-c5a02f74bf6e" |
fidelities | Array of fidelity objects for SKAdNetwork 2.2+ | array of objects | see below |
nonce | Unique ID per ad response (deprecated in 2.2+) | string | "473b1a16-b4ef-43ad-9591-fcf3aefa82a7" |
sourceapp | Publisher app ID | string | "880047117" |
timestamp | Unix timestamp at signing (deprecated in 2.2+) | string | "1594406341232" |
signature | SKAdNetwork signature | string | "MEQCIEQlmZRNfYzK..." |
ext | Exchange-specific extensions | 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 | Attribution fidelity type | integer | "fidelity": 0 |
nonce | Unique ID per ad response | string | "473b1a16-b4ef-43ad-9591-fcf3aefa82a7" |
timestamp | Unix timestamp used for signature | string | "1594406341" |
signature | SKAdNetwork signature | string | "MEQCIEQlmZRNfYzK..." |
ext | Exchange-specific extensions | 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=="
}
}
}
]
}
]
}
Updated about 1 month ago
