> For the complete documentation index, see [llms.txt](https://aatkit.gitbook.io/android-integration/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://aatkit.gitbook.io/android-integration/advanced/advanced-listeners/impression-listener-ilrd.md).

# Impression Listener (ILRD)

Listen to placements' impressions events (Impression-Level Revenue Data)

### Impression Listener

[ImpressionListener](https://gravite-sdk-releases.s3.eu-central-1.amazonaws.com/aatkit/android/docs/-a-a-t-kit/com.intentsoftware.addapptr/-impression-listener/index.html) enables publishers to listen to impression events for all ad formats. Impression listener provides - amongst others - impression-level revenue data (ILRD) as an instance of [AATKitImpression](https://gravite-sdk-releases.s3.eu-central-1.amazonaws.com/aatkit/android/docs/-a-a-t-kit/com.intentsoftware.addapptr/-a-a-t-kit-impression/index.html) object, in case the mediation type is supported (see details below).

### Listen to Placement Impressions

To set the impression listener for a specific placement, use the following code:

{% tabs %}
{% tab title="Java" %}

```java
placement.setImpressionListener(this);
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
placement.impressionListener = this
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
If the ad network provides impression-level revenue data, AATKit will use this information during the AATKitImpression instantiation and pass it to ImpressionListener via the `didCountImpression` callback. Otherwise, AATKit will detect and collect the impression-level information internally and provide it to the impression delegate via the same `didCountImpression` callback. See the accuracy matrix below to learn how exact price information should be for given network and mediation type.
{% endhint %}

#### Google Impression-Level Revenue

AATKit uses impression-level revenue data provided by Google to report impressions. To ensure this functionality works correctly for Google ads, please enable the impression-level ad revenue feature in your account's UI:

* [Google AdMob](https://support.google.com/admob/answer/11322405)
* [Google AdManager](https://support.google.com/admanager/answer/13404416?hl=en\&sjid=18368642623406695169-EU)

#### Ad Network

Use the `getAdNetworkName()` method to get the string representation of the [AdNetwork](https://gravite-sdk-releases.s3.eu-central-1.amazonaws.com/aatkit/android/docs/-a-a-t-kit/com.intentsoftware.addapptr/-ad-network/index.html) enum.

#### Price Information

Use the `getPriceInfo` method to get the [object representing detailed impression price information](https://gravite-sdk-releases.s3.eu-central-1.amazonaws.com/aatkit/android/docs/-a-a-t-kit/com.intentsoftware.addapptr/-price-info/index.html) (if available), like price, currency and precision type

{% hint style="info" %}
The price value passed in the impression object is CPM price
{% endhint %}

### Accuracy matrix

The accuracy of price information and used currency varies between ad networks and mediation types. Please see the following table for more information.

| AdNetwork                     | Mediation type  | Accuracy                                | Currency                                |
| ----------------------------- | --------------- | --------------------------------------- | --------------------------------------- |
| AmazonHB                      | Any             | Exact                                   | USD                                     |
| AppNexus                      | Any             | Exact                                   | USD                                     |
| Criteo                        | Auction         | Exact                                   | USD                                     |
|                               | Waterfall, MAYO | Exact                                   | EUR                                     |
| GraviteRTB                    | Any             | Exact                                   | USD                                     |
| Google: AdMob, AdManager(DFP) | Any             | Depends on ad response from the network | USD                                     |
| Equativ (SmartAdServer)       | Auction         | Exact                                   | USD                                     |
|                               | MAYO            | Floor price                             | EUR                                     |
|                               | Waterfall       | No price information                    | No price information                    |
| YOC                           | Auction         | Exact                                   | USD                                     |
|                               | Waterfall, MAYO | Exact                                   | Depends on ad response from the network |
| All other networks            | Waterfall       | No price information                    | No price information                    |
|                               | MAYO            | Floor price                             | EUR                                     |

### Complete Code Example

{% hint style="info" %}
The below example can be applied to all types of placements.
{% endhint %}

{% tabs %}
{% tab title="Java" %}

```java
private void requestAd() {
    // Setting the impression delegate for the infeed-banner placement
    inFeedBannerPlacement.setImpressionListener(this);
    BannerRequest request = new BannerRequest(this);
    inFeedBannerPlacement.requestAd(request, (layout, error) -> {
        // Display the banner or handle the error
    });
}

@Override
public void didCountImpression(@NonNull Placement placement, @NonNull AATKitImpression impression) {
    Log.i("ImpressionInfo", "placement: " + placement + "impression: " + impression);
    Log.i("ImpressionInfo", "Banner Size: " + impression.getBannerSize());
    Log.i("ImpressionInfo", "Network Key: " + impression.getNetworkKey());
    Log.i("ImpressionInfo", "Ad Network: " + impression.getAdNetwork());
    Log.i("ImpressionInfo", "Direct Deal: " + impression.isDirectDeal());
    Log.i("ImpressionInfo", "Price: " + impression.getPriceInfo().getPrice());
    Log.i("ImpressionInfo", "Ad Network Name: " + impression.getAdNetworkName());
}
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
private fun requestAd() {
    // Setting the impression delegate for the infeed-banner placement
    inFeedBannerPlacement.impressionListener = this
    val request = BannerRequest(this)
    inFeedBannerPlacement.requestAd(request,
        object : BannerRequestCompletionListener {
            override fun onRequestCompleted(layout: BannerPlacementLayout?, error: BannerRequestError?) {
                // Display the banner or handle the error
            }
        })
}

override fun didCountImpression(placement: Placement, impression: AATKitImpression) {
    Log.i("ImpressionInfo", "placement: ${placement}impression: $impression")
    Log.i("ImpressionInfo", "Banner Size: ${impression.getBannerSize()}")
    Log.i("ImpressionInfo", "Network Key: ${impression.networkKey}")
    Log.i("ImpressionInfo", "Ad Network: ${impression.adNetwork}")
    Log.i("ImpressionInfo", "Direct Deal: ${impression.isDirectDeal}")
    Log.i("ImpressionInfo", "Price: ${impression.priceInfo.price}")
    Log.i("ImpressionInfo", "Ad Network Name: ${impression.adNetworkName}")
}
```

{% endtab %}
{% endtabs %}
