From 77f4b2ef3d6180aa47922b219ef396d2c808b136 Mon Sep 17 00:00:00 2001 From: Bryan Szekely Date: Thu, 8 Apr 2021 13:04:16 -0700 Subject: [PATCH 1/7] removed sizes from RP bid params --- dev-docs/bidders/rubicon.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/dev-docs/bidders/rubicon.md b/dev-docs/bidders/rubicon.md index 97446990e9..fd56a01c15 100644 --- a/dev-docs/bidders/rubicon.md +++ b/dev-docs/bidders/rubicon.md @@ -31,7 +31,6 @@ For both Prebid.js and Prebid Server, the Rubicon Project adapter requires setup | `accountId` | required | The publisher account ID | `4934` | `integer` | | `siteId` | required | The site ID | `13945` | `integer` | | `zoneId` | required | The zone ID | `23948` | `integer` | -| `sizes` | optional | Array of Rubicon Project size IDs. If not specified, the system will try to convert from the AdUnit's mediaTypes.banner.sizes. | `[15]` | `Array` | | `position` | optional | Set the page position. Valid values are "atf" and "btf". | `'atf'` | `string` | | `userId` | optional | Site-specific user ID may be reflected back in creatives for analysis. Note that userId needs to be the same for all slots. | `'12345abc'` | `string` | | `floor` | optional | Sets the global floor -- no bids will be made under this value. | `0.50` | `float` | @@ -50,8 +49,6 @@ The following video parameters are supported: {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |----------------|--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|-----------| -| `playerWidth` | optional | Video player width in pixels. If not specified, takes width set in mediaTypes.video.playerSize | `'640'` | `string` | -| `playerHeight` | optional | Video player height in pixels. If not specified, takes height set in mediaTypes.video.playerSize | `'360'` | `string` | | `size_id` | optional for Prebid.js, required for Prebid Server | Integer indicating the Rubicon Project video ad format ID. If not set, Prebid.js can infer from mediaTypes.video.context | `201` | `integer` | | `language` | recommended | Indicates the language of the content video, in ISO 639-1/alpha2. Highly recommended for successful monetization for pre-, mid-, and post-roll video ads. Not applicable for interstitial and outstream. | `'en'` | `string` | From b04eb09c14e357db8a33e26cdbef412b6303e786 Mon Sep 17 00:00:00 2001 From: Bryan Szekely Date: Fri, 9 Apr 2021 16:31:38 -0700 Subject: [PATCH 2/7] added interstitial page and config to adUnit --- _data/sidebar.yml | 8 ++++ dev-docs/adunit-reference.md | 25 +++++++++++- features/InterstitialAds.md | 78 ++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 features/InterstitialAds.md diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 8219b1f587..3f4ea8a868 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -506,6 +506,14 @@ sectionTitle: subgroup: 8 +- sbSecId: 1 + title: Interstitial Ads + link: /features/interstitialAds.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 8 + - sbSecId: 1 title: Timeouts link: /features/timeouts.html diff --git a/dev-docs/adunit-reference.md b/dev-docs/adunit-reference.md index 58c09d22ca..54acbd26b3 100644 --- a/dev-docs/adunit-reference.md +++ b/dev-docs/adunit-reference.md @@ -37,7 +37,7 @@ See the table below for the list of properties on the ad unit. For example ad u | `mediaTypes` | Optional | Object | Defines one or more media types that can serve into the ad unit. For a list of properties, see [`adUnit.mediaTypes`](#adUnit.mediaTypes) below. | | `labelAny` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | | `labelAll` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | -| `ortb2Imp` | Optional | Object | Similar to [global first party data configuration](/dev-docs/publisher-api-reference.html#setConfig-fpd), but specific to this adunit. Note that the setConfig data is global to the logical OpenRTB object, but AdUnit-specific data is defined in the scope of a particular imp object. | +| `ortb2Imp` | Optional | Object | ortb2Imp is used to signal OpenRTB Imp objects at the adUnit grain. Similar to the global ortb2 field used for [global first party data configuration](/dev-docs/publisher-api-reference.html#setConfig-fpd), but specific to this adunit. The ortb2Imp object currently supports [first party data](#adUnit-fpd-example) and the [insterstitial](#adUnit-interstitial-example) signal | @@ -547,6 +547,29 @@ Notes: - Only contextual data should be added on the AdUnit; user-related data goes in the [global first party data](/dev-docs/publisher-api-reference.html#setConfig-fpd) config. - For additional help with analytics and reporting you can use the [Prebid Ad Slot](/features/pbAdSlot.html), a special type of first party data. + + +### Interstitial Ads + +Example of an adunit-specific interstitial signal: + +{% highlight js %} +pbjs.addAdUnits({ + code: "test-div", + mediaTypes: { + banner: { + sizes: [[300,250]] + } + }, + ortb2Imp: { + instl:1 + }, + ... +}); +{% endhighlight %} + +For more information on Interstitial ads, reference the [Interstitial feature page](/dev-docs/InterstitialAds.html). + ## Related Topics + [Publisher API Reference]({{site.baseurl}}/dev-docs/publisher-api-reference.html) diff --git a/features/InterstitialAds.md b/features/InterstitialAds.md new file mode 100644 index 0000000000..21dacac876 --- /dev/null +++ b/features/InterstitialAds.md @@ -0,0 +1,78 @@ +--- +layout: page_v2 +title: Prebid.js Interstitial Ads +description: Interstitial Ads - Prebid.js +sidebarType: 1 +--- + +# Interstitial Ads - Prebid.js +{: .no_toc} + +* TOC +{:toc} + +Interstitails ads are high engagement ads often placed at natural transition points of the user's experince, such as moving from one page to the next. Interstitial ads are generally center aligned overlaying user content, where the user is forced to close the ad to progress in their user experience to view content. Because the ad interupts the user's flow, marketers often pay a premium for such ads. + +This document covers how to setup interstitial ad units. + +{: .alert.alert-warning :} +Please check with each of your bidders to ensure they're the interstitial flag from the standard Prebid location. Prebid web interstitials are available as of Prebid.js version x.xx. + + +## How It Works + +The intended flow for publishers is the following: +- Publisher traffics interstitial line item with appropriate size(s) ([GAM example](https://support.google.com/admanager/answer/9840201?hl=en)) +- Publisher defines ad server interstitial slot on the page ([GAM Example](https://developers.google.com/publisher-tag/samples/display-web-interstitial-ad)) +- Publisher defines the appropriate interstitial ad sizes within appriate adUnit.mediaType and supplies the adUnit Interstitial flag within the [AdUnit.ortb2Imp](/dev-docs/adunit-reference.html#adUnit-interstitial-example) config +- Prebid requests bids for interstitial adUnits and invokes the ad server call from the requestBids callback + +## Ad Sizes +Publishers are intended to set the desired size in the respective adUnit. + +The below sizes are specials sizes to indicate the ad will be full screen for mobile or tablet devices: +- 320x480: Fullscreen mobile phone portrait ad +- 480x320: Fullscreen mobile phone landscape ad +- 768x1024: Fullscreen tablet portrait ad +- 1024x768: Fullscreen tablet landscape ad + +## In-Page Example + +The Prebid Interstitial flag reflects the OpenRTB standard, specifying it at the imp level. + + +### Supplying Interstitial Flag + +If an attribute is specific to an AdUnit, it can be passed this way: + +{% highlight js %} +pbjs.addAdUnits({ + code: "test-div", + mediaTypes: { + banner: { + sizes: [[300,250]] + } + }, + ortb2Imp: { + intl:1 + }, + ... +}); +{% endhighlight %} + + + +## How Bid Adapters Should Read Interstitial Flag + +To access global data, a Prebid.js bid adapter needs only to retrive the interstitial flag from the adUnit like this: + +{% highlight js %} +utils.deepAccess(bidRequest.ortb2Imp, 'instl') +{% endhighlight %} + + +The assumption is that bid adapters will copy the values to the appropriate protocol location for their endpoint. + +## Related Topics + +- The [AdUnit Reference](/dev-docs/adunit-reference.html) From eb8c23c09de11c6cf8a0ed11aeaba96f4f1c1d75 Mon Sep 17 00:00:00 2001 From: Bryan Szekely Date: Mon, 12 Apr 2021 10:08:17 -0700 Subject: [PATCH 3/7] interstitial page corrections --- features/InterstitialAds.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/InterstitialAds.md b/features/InterstitialAds.md index 21dacac876..c371811a17 100644 --- a/features/InterstitialAds.md +++ b/features/InterstitialAds.md @@ -16,7 +16,7 @@ Interstitails ads are high engagement ads often placed at natural transition poi This document covers how to setup interstitial ad units. {: .alert.alert-warning :} -Please check with each of your bidders to ensure they're the interstitial flag from the standard Prebid location. Prebid web interstitials are available as of Prebid.js version x.xx. +Please check with each of your bidders to ensure they're reading the interstitial flag from the standard Prebid location. ## How It Works From f8c35922c836e913b700b9b2b3a25642487320e4 Mon Sep 17 00:00:00 2001 From: MartianTribe Date: Tue, 13 Apr 2021 10:16:38 -0400 Subject: [PATCH 4/7] Update InterstitialAds.md --- features/InterstitialAds.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/InterstitialAds.md b/features/InterstitialAds.md index c371811a17..d22441c0d9 100644 --- a/features/InterstitialAds.md +++ b/features/InterstitialAds.md @@ -11,7 +11,7 @@ sidebarType: 1 * TOC {:toc} -Interstitails ads are high engagement ads often placed at natural transition points of the user's experince, such as moving from one page to the next. Interstitial ads are generally center aligned overlaying user content, where the user is forced to close the ad to progress in their user experience to view content. Because the ad interupts the user's flow, marketers often pay a premium for such ads. +Interstitails ads often placed at natural transition points of the user's experince, such as moving from one page to the next. Interstitial ads are generally center aligned overlaying user content. This document covers how to setup interstitial ad units. From 669ee6a70bfbda3ac1d31a1f98047e36e8180cdd Mon Sep 17 00:00:00 2001 From: MartianTribe Date: Tue, 13 Apr 2021 10:17:30 -0400 Subject: [PATCH 5/7] Update InterstitialAds.md --- features/InterstitialAds.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/InterstitialAds.md b/features/InterstitialAds.md index d22441c0d9..3eda2187fa 100644 --- a/features/InterstitialAds.md +++ b/features/InterstitialAds.md @@ -11,7 +11,7 @@ sidebarType: 1 * TOC {:toc} -Interstitails ads often placed at natural transition points of the user's experince, such as moving from one page to the next. Interstitial ads are generally center aligned overlaying user content. +Interstitails ads are often placed at natural transition points of the user's experince, such as moving from one page to the next. These ads are generally center aligned overlaying user content. This document covers how to setup interstitial ad units. From 0ca3e8f737f4f5dd419fe8cd69cb7f032298fcde Mon Sep 17 00:00:00 2001 From: Bryan Szekely Date: Wed, 14 Apr 2021 09:25:45 -0700 Subject: [PATCH 6/7] modified sidebar link --- _data/sidebar.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 3f4ea8a868..be3c86341d 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -508,7 +508,7 @@ - sbSecId: 1 title: Interstitial Ads - link: /features/interstitialAds.html + link: /features/InterstitialAds.html isHeader: 0 isSectionHeader: 0 sectionTitle: From 0d11f126a12972962d8c924339cd5b63259451ce Mon Sep 17 00:00:00 2001 From: Bryan Szekely Date: Thu, 15 Apr 2021 16:43:02 -0700 Subject: [PATCH 7/7] Prebid Mobile: added User ID support --- _data/sidebar.yml | 8 - .../android/pbm-targeting-params-android.md | 145 ++++++++++++++++++ .../pbm-api/ios/pbm-targeting-ios.md | 143 +++++++++++++++++ 3 files changed, 288 insertions(+), 8 deletions(-) diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 3f4ea8a868..8219b1f587 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -506,14 +506,6 @@ sectionTitle: subgroup: 8 -- sbSecId: 1 - title: Interstitial Ads - link: /features/interstitialAds.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 8 - - sbSecId: 1 title: Timeouts link: /features/timeouts.html diff --git a/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md b/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md index f299f4ad67..2efb32c4d7 100755 --- a/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md +++ b/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md @@ -369,6 +369,151 @@ TargetingParams.setSubjectToCOPPA(true); ``` +## User Identity + +Prebid SDK supports two interfaces to pass / maintain User IDs and ID vendor details: +* Real-time in Prebid SDK's API field setExternalUserIds +* Store User Id(s) in local storage + +Any identity vendor's details in local storage will be sent over to Prebid Server as is, unadulterated. If data is sent in the API and entered into local storage, the API detail will prevail. + +### Prebid SDK API Access + +Prebid SDK supports passing an array of UserID(s) at auction time ing the field setExternalUserIds, that is globably scopped. It is sufficient enough to set the externalUserIdArray object once per user session, as these values would be used in all consecutive ad auctions in the same session. + + +```java +/** +* List containing objects that hold External UserId parameters for the current application user. * @param externalUserIds +*/ +public static void setExternalUserIds(List externalUserIds){ + PrebidMobile.externalUserIds = externalUserIds; +} +/** +* Returns the List that hold External UserId parameters for the current application user * @@return externalUserIds as Array. +*/ +public static List getExternalUserIds() { + return PrebidMobile.externalUserIds; +``` + + +*Exmaple*: + +Java +```java +// User Id from External Third Party Sources +ArrayList externalUserIdArray = new ArrayList<>(); +externalUserIdArray.add(new ExternalUserId("adserver.org", "111111111111", null, new HashMap() { + { + put ("rtiPartner", "TDID"); + } + +})); +externalUserIdArray.add(new ExternalUserId("netid.de", "999888777", null, null)); +externalUserIdArray.add(new ExternalUserId("criteo.com", "_fl7bV96WjZsbiUyQnJlQ3g4ckh5a1N", null, null)); +externalUserIdArray.add(new ExternalUserId("liveramp.com", "AjfowMv4ZHZQJFM8TpiUnYEyA81Vdgg", null, null)); +externalUserIdArray.add(new ExternalUserId("sharedid.org", "111111111111", 1, new HashMap() { + { + put("third", "01ERJWE5FS4RAZKG6SKQ3ZYSKV"); + } + +})); +//Set External User ID +PrebidMobile.setExternalUserIds(externalUserIdArray); +``` + + +### Local Storage + +Prebid SDK provides a local storage interface to set, retrieve or update an array of user IDs with associated identity vendor details. Prebid SDK will retrieve and pass User IDs and ID vendor details to PBS if values are present in local storage. The main difference between the Prebid API interface and the local storage interface is the persistence of storage of data. Local Storage data will persist across user sessions whereas the Prebid API interface (setExternalUserIds) persists only for the user session. If a vendor's details are passed both in local storage and the Prebid API at the same time, the Prebid API data (setExternalUserIds) will prevail. + +Prebid SDK Provides five functions to handle User ID details: +* storeExternalUserId +* fetchStoredExternalUserId +* fetchStoredExternalUserIds +* removeStoredExternalUserId +* removeStoredExternalUserIds + + +```java +/** +* Use this API for storing the externalUserId in the SharedPreference +* @param externalUserId the externalUserId instance to be stored in the SharedPreference +* */ +public static void storeExternalUserId(ExternalUserId externalUserId) { + if (externalUserId != null) { + StorageUtils.storeExternalUserId(externalUserId); + } + + else { + LogUtil.e("Targeting", "External User ID can't be set as null"); + } + +} + +/** +* Returns the stored (in the SharedPreference) ExternalUserId instance for a given source +* @param source +* */ +public static ExternalUserId fetchStoredExternalUserId(@NonNull String source) { + if (!TextUtils.isEmpty(source)) { + return StorageUtils.fetchStoredExternalUserId(source); + } + + return null; +} + +/** +* Returns the stored (in the SharedPreferences) External User Id list +* */ +public static List fetchStoredExternalUserIds() { + return StorageUtils.fetchStoredExternalUserIds(); +} + +/** +* Removes the stored (in the SharedPreference) ExternalUserId instance for a given source +* @param source +* */ +public static void removeStoredExternalUserId(@NonNull String source) { + if (!TextUtils.isEmpty(source)) { + StorageUtils.removeStoredExternalUserId(source); + } + +} + +/** +* Clear the Stored ExternalUserId list from the SharedPreference +* */ +public static void removeStoredExternalUserIds() { + StorageUtils.removeStoredExternalUserIds(); +} + +``` + +*Examples* + +```java +//Set External User ID +TargetingParams.storeExternalUserId(new ExternalUserId("sharedid.org", "111111111111", 1, new HashMap() { + { + put ("third", "01ERJWE5FS4RAZKG6SKQ3ZYSKV"); + } + +})); + +//Get External User ID +ExternalUserId externalUserId = TargetingParams.fetchStoredExternalUserId("sharedid.org"); + +//Get All External User IDs +List externalUserIdList = TargetingParams.fetchStoredExternalUserIds(); + +//Remove External UserID +TargetingParams.removeStoredExternalUserId("adserver.org"); + +//Remove All External UserID +TargetingParams.removeStoredExternalUserIds(); +``` + ## Further Reading - [Prebid Mobile API - Android]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-android.html) diff --git a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md index 334587b370..4343348fcb 100644 --- a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md +++ b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md @@ -493,6 +493,149 @@ Objective C Targeting.shared.subjectToCOPPA = true; ``` +## User Identity + +Prebid SDK supports two interfaces to pass / maintain User IDs and ID vendor details: +* Real-time in Prebid SDK's API field externalUserIdArray +* Store User Id(s) in local storage + +Any identity vendor's details in local storage will be sent over to Prebid Server as is, unadulterated. If data is sent in the API and entered into local storage, the API detail will prevail. + +### Prebid SDK API Access + +Prebid SDK supports passing an array of UserID(s) at auction time ing the field externalUserIdArray, that is globably scopped. It is sufficient enough to set the externalUserIdArray object once per user session, as these values would be used in all consecutive ad auctions in the same session. + + +```swift +public var externalUserIdArray = [ExternalUserId]() +``` + + +**Exmaples** + +SWIFT +```swift +// User Id from External Third Party Sources +var externalUserIdArray = [ExternalUserId]() +externalUserIdArray.append(ExternalUserId(source: "adserver.org", identifier: "111111111111", ext: ["rtiPartner" : "TDID"])) +externalUserIdArray.append(ExternalUserId(source: "netid.de", identifier: "999888777")) +externalUserIdArray.append(ExternalUserId(source: "criteo.com", identifier: "_fl7bV96WjZsbiUyQnJlQ3g4ckh5a1N")) +externalUserIdArray.append(ExternalUserId(source: "liveramp.com", identifier: "AjfowMv4ZHZQJFM8TpiUnYEyA81Vdgg")) +externalUserIdArray.append(ExternalUserId(source: "sharedid.org", identifier: "111111111111", atype: 1, ext: ["third" : "01ERJWE5FS4RAZKG6SKQ3ZYSKV"])) +Prebid.shared.externalUserIdArray = externalUserIdArray +``` + + +Objective-C +```objective_c +// User Id from External Third Party Sources +NSMutableArray *externalUserIdArray = [[NSMutableArray alloc] init]; +[externalUserIdArray addObject:[[ExternalUserId alloc]initWithSource:@"adserver.org" identifier:@"111111111111" atype:nil ext:@{@"rtiPartner" : @"TDID"}]]; +[externalUserIdArray addObject:[[ExternalUserId alloc]initWithSource:@"netid.de" identifier:@"999888777" atype: nil ext:nil]]; +[externalUserIdArray addObject:[[ExternalUserId alloc]initWithSource:@"criteo.com" identifier:@" _fl7bV96WjZsbiUyQnJlQ3g4ckh5a1N" atype:nil ext:nil]]; +[externalUserIdArray addObject:[[ExternalUserId alloc]initWithSource:@"liveramp.com" identifier:@" AjfowMv4ZHZQJFM8TpiUnYEyA81Vdgg" atype:nil ext:nil]]; +[externalUserIdArray addObject:[[ExternalUserId alloc]initWithSource:@"sharedid.org" identifier:@"111111111111" atype:[NSNumber numberWithInt:1] ext:@{@"third" : @"01ERJWE5FS4RAZKG6SKQ3ZYSKV"}]]; +Prebid.shared.externalUserIdArray = externalUserIdArray; +``` + +### Local Storage + +Prebid SDK provides a local storage interface to set, retrieve or update an array of user IDs with associated identity vendor details. Prebid SDK will retrieve and pass User IDs and ID vendor details to PBS if values are present in local storage. The main difference between the Prebid API interface and the local storage interface is the persistence of storage of data. Local Storage data will persist across user sessions whereas the Prebid API interface (externalUserIdArray) persists only for the user session. If a vendor's details are passed both in local storage and the Prebid API at the same time, the Prebid API data (externalUserIdArray) will prevail. + +Prebid SDK Provides five functions to handle User ID details: +* storeExternalUserId +* fetchStoredExternalUserIds +* fetchStoredExternalUserId +* removeStoredExternalUserId +* removeStoredExternalUserIds + + +```swift +/** +* This method allows to save External User Id in the User Defaults +*/ +public func storeExternalUserId(_ externalUserId: ExternalUserId) { + if let index = externalUserIds.firstIndex(where: { + $0.source == externalUserId.source + }) + + { + externalUserIds[index] = externalUserId + } + + else{ + externalUserIds.append(externalUserId) + } + + StorageUtils.setExternalUserIds(value: externalUserIds) +} +/** +* This method allows to get All External User Ids from User Defaults +*/ +public func fetchStoredExternalUserIds()->[ExternalUserId]? { + return StorageUtils.getExternalUserIds() +} +/** +* This method allows to get External User Id from User Defaults by passing respective 'source' string as +param */ +public func fetchStoredExternalUserId(_ source : String)->ExternalUserId? { + guard let array = StorageUtils.getExternalUserIds(), let externalUserId = array.first(where: { + $0.source + == source + }) + + else{ + return nil + } + + return externalUserId +} +/** +* This method allows to remove specific External User Id from User Defaults by passing respective 'source' +string as param +*/ +public func removeStoredExternalUserId(_ source : String) { + if let index = externalUserIds.firstIndex(where: { + $0.source == source + }) + + { + externalUserIds.remove(at: index) + StorageUtils.setExternalUserIds(value: externalUserIds) + } + +} +/** +* This method allows to remove all the External User Ids from User Defaults +*/ +public func removeStoredExternalUserIds() { + if var arrayExternalUserIds = StorageUtils.getExternalUserIds(){ + arrayExternalUserIds.removeAll() StorageUtils.setExternalUserIds(value: arrayExternalUserIds) + } + +} +``` + +**Examples** + +```swift +//Set External User ID +Targeting.shared.storeExternalUserId(ExternalUserId(source: "sharedid.org", identifier: "111111111111", atype: 1, ext: ["third" : "01ERJWE5FS4RAZKG6SKQ3ZYSKV"])) + +//Get External User ID +let externalUserIdSharedId = Targeting.shared.fetchStoredExternalUserId("sharedid.org") + +//Get All External User IDs +let externalUserIdsArray = Targeting.shared.fetchStoredExternalUserIds() + +//Remove External UserID +Targeting.shared.removeStoredExternalUserId("sharedid.org") + +//Remove All External UserID +Targeting.shared.removeStoredExternalUserIds() +``` + + ## Further Reading - [Prebid Mobile API - iOS](/prebid-mobile/pbm-api/ios/pbm-api-ios.html)