Sponsors: MoPub, Chartboost, PubMatic, Digital Turbine (formerly Fyber), Magnite (formerly Rubicon Project)
Document verison support: SKAdNetwork versions 2.0 to 4.0. Support for newer versions will be brought up for consideration within the IAB TL Programmatic working group subcommittee.
The IAB Tech Lab has introduced technical specifications aimed at adapting Apple’s SKAdNetwork, a method for validating advertiser app installations, for programmatic ad buying. The OpenRTB object extensions, APIs and file formats described in this document together enable the advertising ecosystem to communicate and manage the information needed to use the SKAdNetwork capabilities in iOS 14 and above.
The following are the updates provided in this document
- A SKAdNetwork extension to support programmatic buying
- Bid Request extension (
BidRequest.imp.ext.skadn
) - Bid Response extension (
BidResponse.seatbid.bid.ext.skadn
)
- Bid Request extension (
- A Device extension (
BidRequest.device.ext
) to support IDFV and authorization status - IABTL managed SKAdNetwork list
- Guidance for app developers to help manage their Info.plists and work with various SDKs.
The responsibilities of each participant when using the SKAdNetwork specifications are as follows.
- Organize SKAdNetwork IDs as well as define an automated self-serve registration process
- Will not validate the ID with Apple, but will verify that the domain matches the domain of the verified email address of the submitter. Will also provide an offline/non-automated process in case the email domain is different.
- IABTL will lowercase all received SKAdNetwork IDs upon appending to the master list
- Perform releases in batches at "x" cadence to ensure as many partners publishers have the most up-to-date lists
- List should be in both JSON and XML formats to allow publishers to build to the IABTL list as well as other lists
- Assign a permanent ID for each registered
SKAdNetwork ID
- Each registrant may have more than one
SKAdNetwork ID
. In this scenario, eachSKAdNetwork ID
will be assigned its own unique IABTL ID
- Each registrant may have more than one
- Provide a tool for publishers to build their
Info.plist
files and express IABTL signaling from various URLs and / or raw SKAdNetwork ID (Tool available at https://tools.iabtechlab.com/skadnetwork)
- Provide publishers with access to their buying entities SKAdNetwork IDs through a publicly hosted lists on their own business domain
- Support OpenRTB extension objects:
BidRequest.imp.ext.skadn
&BidResponse.imp.ext.skadn
- Provide signed ads to the source app by calling
loadProduct()
with the appropriate data returned on the bid response
- Provide SKAdNetwork IDs to each supply partner and register on the IAB Tech Lab list at https://tools.iabtechlab.com/skadnetwork
- Support OpenRTB extension objects:
BidRequest.imp.ext.skadn
&BidResponse.imp.ext.skadn
- Determine if their entity is eligible for attribution postbacks
- Return all necessary signed parameters to SSP/SDK to facilitate ad signatures and receive install validation postbacks at endpoint established during SKAdNetwork registration with Apple
- Add the ad network’s ID to its Info.plist in all lower case characters.
- Update Info.plist with new entries added to the IAB Tech Lab / SSP / SDK publicly hosted lists when publishing new app versions to the App Store
- Supply the supported
versions
, rawskadnetids
, IABTLmax
and / orexcl
to the SSP / SDK on the device at runtime
OpenRTB implementations will need to ensure compliance on every transaction with all applicable regional legislation.
If a DSP has at least one SKAdNetworkItem in the publisher app’s Info.plist
we would include a new object in the bid request that provides the necessary information to create a signature. Object would only be present if both the SSP SDK version and the OS version (iOS 14.0+) support SKAdNetwork.
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 |
skoverlay
|
SKOverlay support. If set, SKOverlay is supported. | integer | "skoverlay": 1 |
ext
|
Placeholder for exchange-specific extensions to OpenRTB. | object | "ext": {} |
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":{} |
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"
]
},
"skoverlay": 1
}
}
}
]
}
If the bid request included the BidRequest.imp.ext.skadn
object, then a DSP could choose to add the following object to their bid response. Please refer to Apple’s documentation for submitting the correctly formatted values. If the object is present in the response, then SSP would submit the click data and signature to loadProduct() for attribution.
Note: Due to breaking changes introduced by Apple in SKAdNetwork v2.2 to support View Through Attribution and fidelity-type, several structural changes to the bid response were required to support multiple fidelity types.
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…" |
skoverlay
|
SKOverlay support. | object | "skoverlay": {"delay": 5, "endcarddelay": 0, "dismissible": 0, "pos": 1} |
ext
|
Placeholder for exchange-specific extensions to OpenRTB. | object | "ext": {} |
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": {} |
Note: Apple also introduced adtype
, addescription
, and adpurchasername
for fidelity-type 0 in v2.2. Until more clarity is provided by Apple about their use, these APIs have been intentionally omitted from the SKAdNetwork Extension.
Presents an SKOverlay StoreKit Ad during an ad experience using the SKOverlay.AppConfiguration
Storekit API.
Attribute | Description | Type | Example |
delay
|
Delay before presenting the SKOverlay in seconds. If set to 0, the overlay will be shown immediately. If this field is not set, the overlay will not be shown. | integer | "delay": 0 |
endcarddelay
|
Delay before presenting the SKOverlay on an endcard in seconds. If set to 0, the overlay will be shown immediately. If this field is not set, the overlay will not be shown. | integer | "endcarddelay": 0 |
dismissible
|
Whether the overlay can be dismissed by the user, where 0 = no, 1 = yes | integer | "dismissible": 0 |
pos
|
Position of the Overlay. 0 = bottom, 1 = bottomRaised | integer | "pos": 1 |
ext
|
Placeholder for exchange-specific extensions to OpenRTB. | object | "ext": {} |
{
"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": "MEQCIEQlmZRNfYzKBSE8QnhLTIHZZZWCFgZpRqRxHss65KoFAiAJgJKjdrWdkLUOCCjuEx2RmFS7daRzSVZRVZ8RyMyUXg==",
"nonce": "473b1a16-b4ef-43ad-9591-fcf3aefa82a7",
"timestamp": "1594406341"
},
{
"fidelity": 1,
"signature": "GRlMDktMmE5Zi00ZGMzLWE0ZDEtNTQ0YzQwMmU5MDk1IiwKICAgICAgICAgICAgICAgICAgInRpbWVzdGTk0NDA2MzQyIg==",
"nonce": "e650de09-2a9f-4dc3-a4d1-544c402e9095",
"timestamp": "1594406342"
}
],
"skoverlay":{
"delay": 5,
"endcarddelay": 0,
"dismissible": 1,
"pos": 1
}
}
}
}
]
}
]
}
{
"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"
}
]
}
}
}
]
}
]
}
{
"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=="
}
}
}
]
}
]
}
Bid responses that contain invalid or malformed SKAdNetwork extensions may be rejected. This rejection can be communicated in loss notifications (lurl) using Loss Reason Code 214
.
Value | Definition |
214 | Creative Filtered - Invalid SKAdNetwork |
Flow diagram of SSP SDK’s SKAdNetwork support. Objects in blue have a change required to pre-iOS-14 ad flows.
- SSP SDK retrieves the SKAdNetworkItems from the publisher app’s Info.plist
- SDK makes ad request to ad server including SKAdNetworkItems
- SSP determines from Info.plist which DSPs have SKAdNetwork capabilities. Bid request to eligible DSPs includes the imp.ext.skadn object, defined above
- DSP responds, including
BidResponse.seatbid.bid.ext.skadn
if the campaign requires SKAdNetwork support - Ad response to SDK includes
skadn
object - If the impression is shown and the user clicks, SSP calls
loadProduct()
with the appropriate data, including the DSP-signed signature. If valid, Apple will consider the app for install attribution - Target app must register that user for SKAdNetwork attribution on app launch.
- (Optional). Target app can choose to provide an additional 6 bits of conversion value information.
- If SKAdNetwork determines that the DSP’s click led to the install, Apple will send a postback to the DSP’s registered endpoint with the ids of the source app, target app and campaign, and conversion value if provided by the target app.
If the IDFA is not available, DSPs require an alternative, limited-scope identifier in order to provide basic frequency capping functionality to advertisers. The IDFV is the same for apps from the same vendor but different across vendors. Please refer to Apple's Guidelines for further information about when it can be accessed and used.
DSPs may also want to understand what is the status of a user on iOS 14+. The atts
field will pass the AppTrackingTransparency Framework's authorization status.
Attribute | Description | Type | Example |
---|---|---|---|
atts |
(iOS 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 |
ifv | IDFV of the device in that publisher. Listed as ifv to match ifa field format. | string | "ifv": "336F2BC0-245B-4242-8029-83762AB47B15" |
{
"device": {
"ext": {
"atts": 2,
"ifv": "336F2BC0-245B-4242-8029-83762AB47B15"
}
}
}
(Pending iOS 14 Golden Master) For iOS 14 and above, the 'DNT' and 'LMT' parameters will be informed by the 'ATTS' status, where
- "DNT" or "LMT" = 1 when "ATTS" = 0, 1, 2
- "LMT" or "DNT" = 0 when "ATTS" = 3
The IABTL managed list of SKAdNetwork IDs is available at https://tools.iabtechlab.com/skadnetwork, and is intended to address the communication of large lists across complex programmatic supply chains where the use of skadnetids
is not feasible.
- IABTL SKAdNetwork ID List is used to transmit a range of IDs supported by an IAB Tech Lab SKAdNetwork ID List up to the max ID. This list would serve a similar purpose that the TCF 2.0 Global Vendor List serves to identify common IDs in a compact range. Primary use case is "intermediary" SSP to SSP to DSP integrations where sending a subset of IDs is not feasible.
"IABTL SKAdNetwork ID List" is a common list of networks, DSPs, Advertisers and others who support Apple’s SKAdNetwork API. This list would serve a similar purpose that the TCF 2.0 Global Vendor List serves to identify common IDs in a compact range. It can be used in addition to the distributed lists supplied by SSPs and Networks or in place of those.
In the IABTL list model, the total list of SKAdNetworks on a device should be the union of the IABTL list and raw SKAdNetworks IDs supplied in the bid stream minus those in the exclude list
This list would use the same format as the SKANetwork ID Lists for App Developers with the possible addition of an "id" field for the JSON metadata that would autoincrement for each added SKAdNetwork ID. The details of how this list would be maintained (pull requests / submission, who would check and approve etc) are yet to be determined. We would like to first get feedback on the need for (and arguments against) such a centralized list.
{
"company_name": "IAB Tech Lab",
"company_address": "116 East 27th Street, 7th Floor, New York, New York 10016",
"company_domain": "iabtechlab.com",
"skadnetwork_ids": [
{
"id": 1,
"entity_name": "DSP1",
"entity_domain": "DSP1.com",
"skadnetwork_id": "4fzdc2evr5.skadnetwork",
"creation_date": "2020-08-21T00:00:00Z"
},
{
"id": 2,
"entity_domain": "MMP1.com",
"skadnetwork_id": "v72qych5uu.skadnetwork",
"creation_date": "2020-08-25T00:00:00Z"
}
]
}
SKAdNetwork ID Lists is a list of SKAdNetwork IDs published by a hosting company (e.g. SSP/SDK). App developers who work with the hosting company should use this file when generating a consolidated list of SKAdNetwork IDs to include in their app’s Info.plist file. For convenience, the SKAdNetwork IDs are provided in both XML and JSON formats. See each format for details and use cases.
Hosting companies should publish the SKAdNetwork ID files at the following locations:
- domain.com/skadnetworkids.xml
- domain.com/skadnetworkids.json
If the server response indicates an HTTP/HTTPS redirect (301, 302, 307 status codes), entities should follow the redirect and consume the data as authoritative for the source of the redirect. Multiple redirects are valid.
The XML uses Apple’s Info.plist format. This provides developers with SKAdNetwork IDs in the exact SKAdNetworkItems array format for easy copy/paste into their Info.plist file.
All data in the file is serialized using XML (Extensible Markup Language)
Please refer to Apple documentation for details.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SKAdNetworkItems</key>
<array>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>4dzt52r2t5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>bvpn9ufa9b.skadnetwork</string>
</dict>
</array>
</dict>
</plist>
The JSON provides developers with additional metadata about the SKAdNetwork IDs that they will add to the Info.plist SKAdNetworkItems array. Helpful data like the entity name will ensure app developers know who the owners of each SKAdNetwork ID.
All data in the file is serialized using JSON (JavaScript Object Notation)
Attribute | Description | Type | Example |
company_name
|
Name describing the hosting company | string (recommended) | SSP |
company_address
|
The business address of the hosting company | string | SSP, 1234 Advertising Lane, San Francisco, CA 94121 |
company_domain
|
The business website of the hosting company | string (required) | company.com |
skadnetwork_ids
|
List of SKAdNetwork IDs | object array (required) | [{ "entity_name": "DSP1", "entity_domain": "DSP1.com", "skadnetwork_id": "4fzdc2evr5.skadnetwork", "creation_date": "2020-08-21T00:00:00Z" }] |
Attribute | Description | Type | Example |
entity_name
|
Name of entity with SKAdNetwork ID | string (recommended) | DSP Name |
entity_domain
|
Domain of the entity with SKAdNetwork ID. For joint SKAdNetwork ID, entity owning Apple Developer account should be listed (this field may not be unique) | string (recommended) | DSP.com |
skadnetwork_id
|
SKAdNetwork ad network ID (this field should be unique) | string (required) | 4gwi8v3kwu.skadnetwork |
creation_date
|
Date entity(s) added to JSON file | String in ISO 8601 (YYYY-MM-DDThh:mm:ssZ) | 2020-08-21T00:00:00Z |
{
"company_name": "SSP",
"company_address": "SSP, address, country",
"company_domain": "company.com",
"skadnetwork_ids": [
{
"entity_name": "DSP1",
"entity_domain": "DSP1.com",
"skadnetwork_id": "4fzdc2evr5.skadnetwork",
"creation_date": "2020-08-21T00:00:00Z"
},
{
"entity_name": "MMP1",
"entity_domain": "MMP1.com",
"skadnetwork_id": "v72qych5uu.skadnetwork",
"creation_date": "2020-08-25T00:00:00Z"
}
]
}
SDKs and/or app developers are encouraged to develop scripts to automate the process of retrieving the SKAdNetwork IDs from each SDK partner by parsing either the XML or JSON files to generate a complete list of IDs for their app’s Info.plist file. To aid in that process of ID retrieval from each SDK partner, include a file in your SDK named SKAdNetworks (with no extension), with each line in the file pointing to a publicly available SKAdNetworks.xml or SKAdNetworks.json.
https://domain.com/skadnetworks.xml
https://domain.com/skadnetworks.json
- [11/11/2023]
- Added support for SKOverlay in the Bid Request and Bid Response.
- [11/16/2022]
- Updated for v4.0
- Added
sourceidentifier
string to support SKAdNetwork 4.0 in the Bid Response. - Deprecated
campaign
, usesourceidentifier
in 4.0 - Added updated examples for 4.0 in Bid Request and Bid Response examples.
- [10/19/2022]
- Added
productpage
for Bid Requests andproductpageid
for Bid Responses to support Apple's Custom Product Page
- Added
- [03/01/2021]
- Updated for v2.2
- Added
fidelities
object array to support multiple fidelity types in the Bid Response. signature
,nonce
andtimestamp
moved tofidelities
and deprecated rootskadn
versions of the values.- Added
fidelity
withinfidelities
- Removed Version Compatibility since IABTL approved of that proposal.
- [02/01/2021]
- Updated for v2.1
- Added
versions
for Bid Requests and deprecatedversion
- Add guidance for lowercasing values based on Apple clarifications
- [11/02/2020]
- Added
skadnetlist
- Added
- [09/16/2020]
- Original release for public comment