DT FairBid enables you to access detailed information for each impression through the impressions callback APIs. The information includes, for example, which demand source served the ad and its expected or exact revenue.
You can call two different APIs that refer to different stages in the impression's lifetime:
-
(OnShow)
: When the ad appears. -
(OnAvailable)
: Before the ad appears, once a Fill becomes available.
The following table describes Impression Level Data attributes.
Property Name | Description |
---|---|
advertiserDomain |
A unique identifier for a set of campaigns for the same advertiser. |
campaignId |
A unique identifier that represents a Campaign. |
countryCode |
Identifier of the country of the ad impression (in ISO country code). |
creativeId |
A unique identifier that represents the creative in the bid response. This can be useful when a particular creative causes user experience issues. |
currency |
Currency of the payout. |
demandSource |
Identifies the demand source name of the buy-side/demand-side entity that purchased the impression:
|
impressionDepth |
The number of impressions in the current session for the given Placement Type. |
impressionId |
A unique identifier for a specific impression. |
requestId |
Unique ID of the bid request. |
jsonString |
A JSON representation of the data serialized to a String. |
netPayout |
Net payout for an impression. The value accuracy is returned in the priceAccuracy field. The value is provided in units returned in the currency field. |
networkInstanceId |
The mediated ad network's original Placement/Zone/Location/Ad Unit ID that you created in their dashboard. For ads shown by the DT Exchange, the networkInstanceId is the Placement ID you created in the DT Console. |
placementType |
Defines the format and location of ads:
|
priceAccuracy |
Accuracy of the netPayout value:
|
renderingSDK |
Name of the SDK in charge of rendering the ad. |
renderingSDKVersion |
The version of the SDK rendering the ad. When AdMob renders an impression, the renderingSDKVersion shows the Google Play Services version. |
variantId |
A unique identifier that represents the variant delivered to the device. |
Impression Data Upon Showing the Ad
All ad formats, Banners, Interstitials, and Rewarded, provide you access to the ImpressionData
object through their callback APIs:
Interstitial.setInterstitialListener(object : InterstitialListener {
override fun onShow(placementId: String, impressionData: ImpressionData) {
val netPayout = impressionData.netPayout
val currency = impressionData.currency
val priceAccuracy = impressionData.priceAccuracy
val impressionDepth = impressionData.impressionDepth
val message = "Placement $placementId has been shown with a " +
"net payout of $netPayout $currency " +
"with accuracy: $priceAccuracy " +
"and impression depth: $impressionDepth"
Log.d(TAG, message)
}
})
val placementId = "12345"
if (Interstitial.isAvailable(placementId)) {
Interstitial.show(placementId, context)
}
Expected log output:
Placement 12345 has been shown with a
net payout of 4.000000 USD
with accuracy: PREDICTED and
impression depth: 1
Java
Interstitial.setInterstitialListener(new InterstitialListener() {
@Override
public void onShow(@NonNull String placementId, @NonNull ImpressionData impressionData) {
double netPayout = impressionData.getNetPayout();
String currency = impressionData.getCurrency();
ImpressionData.PriceAccuracy priceAccuracy = impressionData.getPriceAccuracy();
int impressionDepth = impressionData.getImpressionDepth();
String message = String.format("Placement %s has been shown with a net payout of %f %s " +
"with accuracy: %s and impression depth: %d",
placementId, netPayout, currency, priceAccuracy, impressionDepth);
Log.d(TAG, message);
}
});
String placementId = "12345";
if (Interstitial.isAvailable(placementId)) {
Interstitial.show(placementId, context);
}
Expected log output:
Placement 12345 has been shown with a
net payout of 4.000000 USD
with accuracy: PREDICTED and
impression depth: 1
Interstitial
Swiftoptional func interstitialDidShow(
_ placementId: String,
impressionData: FYBImpressionData
)
optional func interstitialDidFail(
toShow placementId: String,
withError error: Error,
impressionData: FYBImpressionData
)
Objective-C
- (void)interstitialDidShow:
(nonnull NSString *)placementId
impressionData:(nonnull FYBImpressionData *)impressionData;
- (void)interstitialDidFailToShow:
(nonnull NSString *)placementId
withError:(nonnull NSError *)error
impressionData:(nonnull FYBImpressionData *)impressionData;
Rewarded
Swiftoptional func rewardedDidShow(
_ placementId: String,
impressionData: FYBImpressionData
)
optional func rewardedDidFail(
toShow placementId: String,
withError error: Error,
impressionData: FYBImpressionData
)
Objective-C
- (void)rewardedDidShow:
(nonnull NSString *)placementId
impressionData:(nonnull FYBImpressionData *)impressionData;
- (void)rewardedDidFailToShow:
(nonnull NSString *)placementId
withError:(nonnull NSError *)error
impressionData:(nonnull FYBImpressionData *)impressionData;
Banner
Swiftoptional func bannerDidShow(
_ banner: FYBBannerAdView,
impressionData: FYBImpressionData
)
Objective-C
- (void)bannerDidShow:
(FYBBannerAdView *)banner
impressionData:(nonnull FYBImpressionData *)impressionData;
The example below showcases how to access these data on an Interstitial integration. The integration for Rewarded and Banners is similar.
func interstitialDidShow(
_ placementId: String,
impressionData: FYBImpressionData
) {
let currency = impressionData.currency ?? "(nil)"
let payout = impressionData.netPayout?.doubleValue ?? 0
let accuracy = impressionData.priceAccuracy
let impressionDepth = impressionData.impressionDepth
print("Placement \(placementId) has been shown with a " +
"net payout of \(payout) \(currency) " +
"with accuracy: \(accuracy) " +
"and impression depth: \(impressionDepth)")
}
- (void)interstitialDidShow:
(NSString *)placementId
impressionData:(FYBImpressionData *)impressionData {
NSLog(@"Placement %@ has been shown with a net payout of %@ %@ "
"with accuracy: %d and impression depth: %i",
placementId, impressionData.netPayout,
impressionData.currency,
impressionData.priceAccuracy,
impressionData.impressionDepth);
}
Expected log output:
Placement 12345 has been shown with a
net payout of 4.000000 USD
with accuracy: PREDICTED and
impression depth: 1
All ad formats provide access to the ImpressionData
object through their callback APIs:
void OnShow(string placementId, ImpressionData impressionData);
void OnShowFailure(string placementId, ImpressionData impressionData);
Example: C#
Interstitial.SetInterstitialListener(new MyInterstitialListener());
class MyInterstitialListener : InterstitialListener {
public void OnShow(string placementId, ImpressionData impressionData) {
string netPayout = impressionData.netPayout;
string currency = impressionData.currency;
int impressionDepth = impressionData.impressionDepth;
ImpressionData.PriceAccuracy priceAccuracy = impressionData.priceAccuracy;
Debug.Log($"Placement {placementId} has been shown with a " +
$"net payout of {netPayout} {currency} " +
$"with accuracy: {priceAccuracy} " +
$"and impression depth: {impressionDepth}");
}
}
string placementId = "12345";
if (Interstitial.IsAvailable(placementId)) {
Interstitial.Show(placementId);
}
Expected log output:
Placement 12345 has been shown with a
net payout of 4.000000 USD
with accuracy: PREDICTED and
impression depth: 1
Impression Data Before Showing the Ad
You can also access the same information before showing the ad. This information will be available once you have a fill for that placement. If the placement for which you request the impression data does not have a fill, the API will return nil
.
Important
Calling this API at different moments may result in different values for the impression depth field since impression depth is counted for the ad type, regardless of placement. For more information, see Impression Depth.
Banner
Use this query in conjunction with loading a banner. For more information, see Loading a Banner.
Kotlinval bannerView = BannerView(requireContext(), placementId)
val impressionData = bannerView.impressionData
Interstitial
override fun onAvailable(placementId: String) {
val impressionData = Interstitial.getImpressionData(placementId)
}
Java
@Override
public void onAvailable(String placementId) {
ImpressionData impressionData = Interstitial.getImpressionData(placementId);
}
func interstitialIsAvailable(_ placementId: String) {
let impressionData = FYBInterstitial.impressionData(placementId)
}
Objective-C
- (void)interstitialIsAvailable:(NSString *)placementId {
FYBImpressionData *impressionData = [FYBInterstitial impressionData:placementId];
}
public void OnAvailable(string placementId) {
ImpressionData impressionData = Interstitial.GetImpressionData(placementId);
}
Rewarded
override fun onAvailable(placementId: String) {
val impressionData = Rewarded.getImpressionData(placementId)
}
Java
@Override
public void onAvailable(String placementId) {
ImpressionData impressionData = Rewarded.getImpressionData(placementId);
}
func interstitialIsAvailable(_ placementId: String) {
let impressionData = FYBInterstitial.impressionData(placementId)
}
Objective-C
- (void)rewardedIsAvailable:(NSString *)placementId {
FYBImpressionData *impressionData = [FYBRewarded impressionData:placementId];
}
public void OnAvailable(string placementId) {
ImpressionData impressionData = Rewarded.GetImpressionData(placementId);
}
Impression Depth
Impression depth represents the number of impressions in a given session per ad format. Impression depth is accessible directly from each ad format class, which you can find in the following example. Alternatively, it can be accessed through the ImpressionLevelData
object, as described in Impression Data Upon Showing the Ad.
The impression depth for each ad format increases throughout the session as more ads are displayed. It is reset only when:
- The session ends (the app is killed).
- The SDK considers the session has timed out.
Session Timeout
Session timeout or session background timeout
represents the amount of time the user needs to spend with the app in the background before we consider them back to user engagement levels similar to a fresh new session. At this point, for all ad formats, the impression depth is reset to 0
.
The Session timeout value is 30 minutes by default.
Example
The example below illustrates how you can access the impressionDepth
value for all ad formats.
val impressionDepth = Interstitial.getImpressionDepth()
val impressionDepth = Banner.getImpressionDepth()
val impressionDepth = Rewarded.getImpressionDepth()
Java
int impressionDepth = Interstitial.getImpressionDepth();
int impressionDepth = Banner.getImpressionDepth();
int impressionDepth = Rewarded.getImpressionDepth();
let impressionDepth = FYBBanner.impressionDepth
let impressionDepth = FYBInterstitial.impressionDepth
let impressionDepth = FYBRewarded.impressionDepth
Objective-C
NSUInteger impressionDepth = FYBRewarded.impressionDepth;
NSUInteger impressionDepth = FYBInterstitial.impressionDepth;
NSUInteger impressionDepth = FYBBanner.impressionDepth;
int impressionDepth = Banner.GetImpressionDepth();
int impressionDepth = Interstitial.GetImpressionDepth();
int impressionDepth = Rewarded.GetImpressionDepth();