SKAdNetwork
How SKAdNetwork attribution flows through CloudX for demand partners
SKAdNetwork is Apple’s privacy-preserving framework for attributing app installs to ads. For buyer endpoints configured to receive the extension, CloudX supports this IAB SKAdNetwork OpenRTB flow:
- The bid request tells you the source app’s SKAdNetwork capabilities.
- Your bid response carries the signed impression data for the advertised app.
- When the user taps the ad, the CloudX SDK passes your signed data to StoreKit while presenting the advertised app’s product page. Valid data makes the interaction eligible; Apple decides whether attribution is awarded.
Bid request: app capabilities
When delivered on an eligible iOS impression, imp.ext.skadn describes what the source app supports:
| Field | Type | Notes |
|---|---|---|
version | string | SKAdNetwork version supported by the app (for example, "4.0"). |
versions | string array | All SKAdNetwork versions the app supports. |
sourceapp | string | ID of the app showing the ad: normally its numeric App Store ID. A bundle ID can appear as a fallback; that request is not eligible for SKAdNetwork attribution. |
skadnetids | string array | Ad network IDs from the publisher’s Info.plist SKAdNetworkItems. Your network ID must appear here for attribution to work. |
Only send SKAdNetwork-signed bids when skadnetids contains your ad network ID and sourceapp contains only digits. If sourceapp is a bundle ID, bid normally without bid.ext.skadn; do not echo the bundle ID or sign with a different identifier.
Bid response: signed impression data
To serve a SKAdNetwork-attributed ad, return the bid.ext.skadn object on your bid:
| Field | Type | Notes |
|---|---|---|
version | string | SKAdNetwork version the impression data was generated for. Must be one of the versions advertised in the request. |
network | string | Your ad network ID, as used to generate the signature. |
campaign | string | Campaign ID, per Apple’s specification. On SKAdNetwork 4.0 and later, use sourceidentifier instead. |
sourceidentifier | string | Four-digit ad impression identifier, SKAdNetwork 4.0 and later. |
itunesitem | string | Numeric App Store ID of the advertised app. |
sourceapp | string | Numeric App Store ID of the app showing the ad. Echo the request’s numeric imp.ext.skadn.sourceapp exactly; it is used in StoreKit signature parameters on iOS 14 and later. |
productpageid | string | Optional iOS 15+ custom product page ID. It can accompany SKAdNetwork data but is not itself tied to SKAdNetwork 2.2 signing. |
nonce | string | Unique UUID for each ad impression. |
timestamp | string | Unix time in milliseconds when the signature was generated. |
signature | string | Apple’s SKAdNetwork signature for the impression. |
fidelities | object array | SKAdNetwork 2.2 and later. Include a complete click-through entry with fidelity: 1, nonce, timestamp, and signature. |
The iOS SDK prefers the fidelity: 1 entry and resolves nonce, timestamp, and signature independently. For compatibility, if the entry is absent or omits a field, that field falls back to its top-level counterpart. Do not mix the two shapes: for SKAdNetwork 2.2 and later, send one complete fidelity: 1 entry; for earlier versions, send nonce, timestamp, and signature as one complete top-level set. The SDK does not register view-through (fidelity: 0) signatures.
CloudX does not modify bid.ext.skadn — the object on the winning bid reaches the device as sent.
These fields are the buyer contract. CloudX performs structural checks, including UUID syntax and the core parameter set, before calling StoreKit. CloudX does not validate Apple’s cryptographic signature; invalid or mismatched values can fail attribution.
Example
{
"id": "request-123",
"seatbid": [
{
"bid": [
{
"id": "1",
"impid": "imp-1",
"price": 2.5,
"adm": "<html>...</html>",
"crid": "creative-123",
"adomain": ["advertiser.example"],
"ext": {
"skadn": {
"version": "4.0",
"network": "abc123def4.skadnetwork",
"sourceidentifier": "5239",
"itunesitem": "987654321",
"sourceapp": "123456789",
"fidelities": [
{
"fidelity": 1,
"nonce": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"timestamp": "1697044800000",
"signature": "MEQCIEqm..."
}
]
}
}
}
]
}
],
"cur": "USD"
}What happens on-device
- When the user taps the ad, the SDK presents the advertised app’s App Store product page using the signed data from the
fidelity: 1entry. This makes the interaction eligible for click-through attribution; Apple determines the result. - Custom product pages (
productpageid) are supported on iOS 15 and later. - This works for each CloudX-rendered creative type enabled for your endpoint — see the Creative Specification.
Further reading
- Apple SKAdNetwork documentation — signature generation and postback behavior.
- IAB SKAdNetwork extension — canonical field definitions for
imp.ext.skadnandbid.ext.skadn. - Creative Specification — creative types and rendering behavior for CloudX-rendered demand.