The MobileFuse SDK supports an SDK bidding implementation that can be used by mediation platforms. Our SDK Bidding solution uses a token generation and rendering mechanism.
The following formats are supported by bidding:
Banner
Medium Rectangle
Interstitial
Rewarded
No initialization
The SDK does not need to be initialized for our bidding adapter flows.
Bidding Token Generation
An SDK-generated token should be passed to the MobileFuse bidding endpoint for every bidding request. Our tokens are encoded strings and may be up to 4000 bytes in size, but are generally much smaller.
To generate a token, pass a token request object to the token provider class. Implementation differs for each platform as follows:
Android
Code Block | ||
---|---|---|
| ||
// Optionally pass in privacy preferences MobileFusePrivacyPreferences.Builder privacyBuilder = new MobileFusePrivacyPreferences.Builder(); privacyBuilder.setUsPrivacyConsentString(mediationPlatform.usPrivacyString); privacyBuilder.setIabConsentString(mediationPlatform.iabConsentString); privacyBuilder.setSubjectToCoppa(mediationPlatform.isAgeRestrictedUser); // Determine test mode boolean isTestModeEnabled = mediationPlatform.isTestModeEnabled; // Create our token request MobileFuseBiddingTokenRequest tokenRequest = MobileFuseBiddingTokenRequest( privacyBuilder.build(), isTesting ); // Generate a token - asynchronous: MobileFuseBiddingTokenProvider.getToken( tokenRequest, activity, new TokenGeneratorListener() { @Override public void onTokenGenerated(String token) { callback.onTokenCollected(token); } @Override public void onTokenGenerationFailed(String error) { callback.onTokenCollectionFailed(error); } } ); |
iOS
Code Block | ||
---|---|---|
| ||
// Optionally pass in privacy preferences MobileFusePrivacyPreferences *privacyPrefs = [[MobileFusePrivacyPreferences alloc] init]; [privacyPrefs setUsPrivacyConsentString: mediationPlatform.usPrivacyString]; [privacyPrefs setIabConsentString: mediationPlatform.iabConsentString]; [privacyPrefs setSubjectToCoppa: mediationPlatform.isAgeRestrictedUser]; // Determine test mode BOOL isTesting = mediationPlatform.isTestModeEnabled; // Create our token request MFBiddingTokenRequest* request = [[MFBiddingTokenRequest alloc] init]; request.privacyPreferences = privacyPrefs; request.isTestMode = isTesting; // Generate a token: NSString* token = [MFBiddingTokenProvider getTokenWithRequest: request]; [delegate didCollectSignal: token]; |
The returned token is a base-64 encoded string, for example:
Code Block | ||
---|---|---|
| ||
"H4sIAAAAAAAAAGWOTQrCMBBG7zLrsVhDVXoHTyBdpE0qgfyRxFAJubuTulJXA+/NfN8UUMbDeC8gVPSavwy3/CEDjGDWDfAHRxnyLvuOdcdDWAZambm1DRbgXlEWwwHPeJkqQlZCun+D4INLbnE6Ej0RZY3jdaqV5DN+4uSW2nBGCW+p9OZmpeVKmlp3mr9eqdSYZKSjvr4BZcS0rdkAAAA=" |
Our tokens do not contain any user PII, even in an encoded form. If we do implement PII into our bidding tokens, any data will:
Conform to any privacy preferences passed in - PII will not be passed for opted-out or do-no-track users.
Any PII will end-to-end encrypted between our SDK and the MobileFuse ad exchange.
The mediation platform does not need to do any validation on the token, just pass the value on to MobileFuse in the appropriate OpenRTB field.
Bidding
Our bidding endpoint is https://mfx.mobilefuse.com/openrtb?ssp=%%SSP_PARTNER_ID%%
You will be supplied an SSP partner ID that should be passed into our bidding endpoint. Both http and https are supported. You can find sample bid requests at the following page: https://mobilefuse.atlassian.net/wiki/spaces/SUPPLY/pages/426003/OpenRTB+Bid+Requests#Sample-Bid-Requests
The bidding token that was generated from our SDK must be passed in theuser.data.segment.signal
OpenRTB field. You can also set the test
field to 1
to ensure that you receive fill for valid placement IDs.Required fields:
- The endpoint should be populate with your SSP partner ID - we will send you this when we are integrating
- The
user.data.segment.signal
OpenRTB field must contain the token that was generated by the SDK - The
imp.tagid
must be set to the MobileFuse placement ID that users can supply in your mediation UI for this particular placement
Example request/responses:
On a successful bid, the seatbid.bid.signaldata
field will be populated with a signal token that should be passed back to our SDK for rendering when our bid wins (see Rendering an ad from a response token).
If our bid does not win, the Loss URL (seatbid.bid.lurl
) should be triggered with the relevant macros expanded.
An example bidding request/response
:is provided below. For more details of our bidding endpoint and other sample requests, please see OpenRTB Bid Requests
Request
POST https://mfx.mobilefuse.com/openrtb?ssp=partner_name
Code Block | ||
---|---|---|
| ||
{ "id": "ff71e4a7-2622-493d-bfb8-de446a4152ac", "user": { "data": { "segment": { "signal": "H4sIAAAAAAAAAGWOTQrCMBBG7zLrsVhDVXoHTyBdpE0qgfyRxFAJubuTulJXA+/NfN8UUMbDeC8gVPSavwy3/CEDjGDWDfAHRxnyLvuOdcdDWAZambm1DRbgXlEWwwHPeJkqQlZCun+D4INLbnE6Ej0RZY3jdaqV5DN+4uSW2nBGCW+p9OZmpeVKmlp3mr9eqdSYZKSjvr4BZcS0rdkAAAA=" } } }, "imp": [ { "id": "1", "tagid": "418545", "instl": 0, "banner": { "format": [ { "w": 320, "h": 50 } ] } } ], "device": { "geo": { "lat": 42.360, "lon": -71.057 }, "ua": "Mozilla/5.0 (Linux; Android 9; Pixel 3 XL Build/PD1A.180720.030; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 Mobile Safari/537.36", "ip": "140.241.0.100", "ifa": "01234567-1234-1234-1234-012345678901" }, "app": { "bundle": "com.test" } } |
Response
HTTP/1.1 200 OK
Code Block | ||
---|---|---|
| ||
{ "id": "ff71e4a7-2622-493d-bfb8-de446a4152ac", "bidid": "2daa3b63ca75c5d111318b2530d00b60", "seatbid": [ { "bid": [ { "id": "eea5560fddc6687b22b3b523c20a5106_banner", "adomain": [ "mobilefuse.com" ], "impid": "1", "crid": "test_js_banner", "h": 50, "price": 2.681, "w": 320, "lurl": "https://mfx-us-east-1.mobilefuse.com/lurl?reqid=eea5560fddc6687b22b3b523c20a5106&loss=${AUCTION_LOSS}&price=${AUCTION_PRICE}", "exp": 300, "signaldata": "H4sIAAAAAAAAA42QXWvCMBiF/8oIwytj89GkXVHHkF0IY4653RVKPt5ipV9rWnSI/32pwtjuvEo4OSfned8TUrZCCZo70xVtf+c6s0jRru9bl6RBGlT5EQ8Og3I9prOq0UUJ+eBgZpoqDfYOHzrVttA9dvBV2AWAEkKS3FojZRxpxjTXgnHDiBKUyBQt52lw7VqiqS9vKlXUHuD/1/7Je6zXe3B9tneZVnUNndfh2KKEEzJFO5QIf5RDV3rjrcyj/UbaSdk4t7g/PX2uPtab1+xls92eJ21XGPijvr2vV89nT1aBLVTWf7fgcX55L3aUsJmM6RT54mGc6DJbnkcUQhVhJhnD4QO3WOc6xhbCUKqQCqYMGjOubWoH1xCzSnEtuVGRMMJSSjmNNROcWEK0JD7gQPXjSnN/P/hlMXL+AYsE7eDoAQAA" } ], "seat": "mf" } ] } |
If the MobileFuse bid wins, the seatbid.bid.signaldata
field contains a token that should be passed back into the SDK for rendering. Otherwise our Loss URL (seatbid.bid.lurl
) should be triggered with the relevant macros expanded.
Rendering an ad from
aresponse
tokensignaldata
The signaldata
bid response field can be used to complete the entire lifecycle of ad creation and display.
This string should be passed directly to the loadAdFromBiddingToken
/ loadAdWithBiddingResponseToken
methods. The ad instance will then behave in the same was as documented in the standard SDK documentation: MobileFuse SDK
Android
Example: Interstitial ad
Code Block | ||
---|---|---|
| ||
myAdInstance// placementId should be configured in the mediation platform UI and passed back to this method: interstitialAd = new MobileFuseInterstitialAd(activity, placementId); interstitialAd.setListener(myMediationCallbackListener); // Register an ad listener interstitialAd.loadAdFromBiddingToken(bidResponse.seatbid.bid.signaldata);// Load the ad from signaldata |
iOS
Example: Interstitial ad:
Code Block | ||
---|---|---|
| ||
[myAdInstance// placementId should be configured in the mediation platform UI and passed back to this method: interstitial = [[MFInterstitialAd alloc] initWithPlacementId: placementId]; [interstitial registerAdCallbackReceiver: myMediationCallbackDelegate]; // Register an ad listener [interstitial loadAdWithBiddingResponseToken: bidResponse.seatbid.bid.signaldata]; // Load the ad from signaldata |