---
metadata:
  - name: generator
    content: Diplodoc Platform v5.52.0
alternate:
  - https://ads.yandex.com/helpcenter/en/dev/android/release/8-0-0-migration.md
  - https://ads.yandex.com/helpcenter/ru/dev/android/release/8-0-0-migration.md
  - https://ads.yandex.com/helpcenter/zh/dev/android/release/8-0-0-migration.md
  - href: en/dev/android/release/8-0-0-migration.md
    type: text/markdown
    title: Markdown version
  - href: ../llms.txt
    type: text/markdown
    title: llms.txt
---
> **Documentation Index:** Fetch the complete configuration index at https://ads.yandex.com/helpcenter/en/llms.txt

<!--
Используется в Boost: boost/ru/ad-monetization/dev/android
-->

# Guide for migrating to version 8

Version 8 of the Yandex Mobile Ads SDK introduces multiple API changes aimed at improving the developer experience.

{% note tip "Migration using AI tools" %}

To speed up the transition from SDK 7.x to 8.x, use the ready-made migration skill for AI assistants — see the [Migration using AI tools](#ai) section for details.

{% endnote %}

## Key changes

### 1. Changes to AdRequest

The `AdRequestConfiguration` and `NativeAdRequestConfiguration` classes have been removed. Use `AdRequest` for all ad formats.

#|
|| **Class** | **Status** ||
|| `AdRequestConfiguration` | Removed. Use `AdRequest` ||
|| `NativeAdRequestConfiguration` | Removed. Use `AdRequest` and `NativeAdOptions`. ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  // Fullscreen & Native Ads, e.g. InterstitialAdLoader
  val loader = InterstitialAdLoader(this)
  val config = AdRequestConfiguration.Builder("R-M-XXXXX-YY").build()
  loader.loadAd(config)

  // Banner ads
  val bannerView = findViewById<R.id.view_banner>(BannerAdView)
  bannerView.setAdUnitId("R-M-XXXXX-YY")
  val request = AdRequest.Builder().build()
  bannerView.loadAd(request)
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  // Fullscreen & Native Ads, e.g. InterstitialAdLoader
  val loader = InterstitialAdLoader(this)
  val request = AdRequest.Builder("R-M-XXXXX-YY").build()
  loader.loadAd(adRequest, listener)

  // Banner ads
  val bannerView = findViewById<R.id.view_banner>(BannerAdView)
  val request = AdRequest.Builder("R-M-XXXXX-YY").build()
  bannerView.loadAd(request)
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadAd() {
      // Fullscreen & Native Ads, e.g. InterstitialAdLoader
      InterstitialAdLoader loader = new InterstitialAdLoader(this);
      AdRequestConfiguration config = new AdRequestConfiguration.Builder("R-M-XXXXX-YY")
              .build();
      loader.loadAd(config);

      // Banner ads
      BannerAdView bannerView = findViewById(R.id.view_banner);
      bannerView.setAdUnitId("R-M-XXXXX-YY");
      AdRequest request = AdRequest.Builder().build();
      bannerView.loadAd(request);
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadAd() {
      // Fullscreen & Native Ads, e.g. InterstitialAdLoader
      InterstitialAdLoader loader = new InterstitialAdLoader(this);
      AdRequest request = new AdRequest.Builder("R-M-XXXXX-YY")
              .build();
      loader.loadAd(request, listener);

      // Banner ads
      BannerAdView bannerView = findViewById(R.id.view_banner);
      AdRequest request = new AdRequest.Builder("R-M-XXXXX-YY").build();
      bannerView.loadAd(request);
  }
  ```
  ||
  |#

{% endlist %}

### 2. Changes to the Targeting API

- The fields `age`, `gender`, `location`, `contextQuery`, and `contextTags` have been removed from `AdRequest.Builder`.
- To manage the targeting parameters, use the new `AdTargeting` class.

#|
|| **Class** | **Status** ||
|| `AdTargeting` | Added ||
|| `AdTargeting.Builder` | Added ||
|#

#|
|| **Class** | **Method** | **Status** ||
|| `AdRequest.Builder` | `setAge(String)` | Removed. Use `AdTargeting.Builder.setAge(String)` and `AdRequest.Builder.setTargeting(AdTargeting)`. ||
|| ^ | `setGender(String)` | Removed. Use `AdTargeting.Builder.setGender(String)` and `AdRequest.Builder.setTargeting(AdTargeting)`. ||
|| ^ | `setLocation(Location)` | Removed. Use `AdTargeting.Builder.setLocation(Location)` and `AdRequest.Builder.setTargeting(AdTargeting)`. ||
|| ^ | `setContextQuery(String)` | Removed. Use `AdTargeting.Builder.setContextQuery(String)` and `AdRequest.Builder.setTargeting(AdTargeting)`. ||
|| ^ | `setContextTags(List<String>)` | Removed. Use `AdTargeting.Builder.setContextTags(List<String>)` and `AdRequest.Builder.setTargeting(AdTargeting)`. ||
|| ^ | `setTargeting(AdTargeting)` | Added ||
|| `AdTargeting.Builder` | `setAge(String)` | Added ||
|| ^ | `setGender(String)` | Added ||
|| ^ | `setLocation(Location)` | Added ||
|| ^ | `setContextQuery(String)` | Added ||
|| ^ | `setContextTags(List<String>)` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  val adRequest = AdRequest.Builder()
      .setAge("25")
      .setGender(Gender.MALE)
      .setContextTags(listOf("news"))
      .build()
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  val targeting = AdTargeting.Builder()
      .setAge("25")
      .setGender(Gender.MALE)
      .setContextTags(listOf("news"))
      .build()

  val adRequest = AdRequest.Builder(adUnitId)
      .setTargeting(targeting)
      .build()
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadAd() {
      AdRequest adRequest = AdRequest.Builder()
              .setAge("25")
              .setGender(Gender.MALE)
              .setContextTags(listOf("news"))
              .build();
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadAd() {
      AdTargeting targeting = new AdTargeting.Builder()
              .setAge("25")
              .setGender(Gender.MALE)
              .setContextTags(listOf("news"))
              .build();

      AdRequest adRequest = new AdRequest.Builder(adUnitId)
              .setTargeting(targeting)
              .build();
  }
  ```
  ||
  |#

{% endlist %}

### 3. Changes to the ad loading API

The methods for registering callback and ad load listeners have been updated.

#|
|| **Class** | **Method** | **Status** ||
|| InterstitialAdLoader | `setAdLoadListener(InterstitialAdLoadListener)` | Removed. Pass `InterstitialAdLoadListener` to the `loadAd` method. ||
|| ^ | `loadAd(AdRequestConfiguration)` | Removed. Use `loadAd(AdRequest, InterstitialAdLoadListener)`. ||
|| ^ | `loadAd(AdRequest, InterstitialAdLoadListener)` | Added ||
|| RewardedAdLoader | `setAdLoadListener(RewardedAdLoadListener)` | Removed. Pass `RewardedAdLoadListener` to the `loadAd` method. ||
|| ^ | `loadAd(AdRequestConfiguration)` | Removed. Use `loadAd(AdRequest, RewardedAdLoadListener)`. ||
|| ^ | `loadAd(AdRequest, RewardedAdLoadListener)` | Added ||
|| AppOpenAdLoader | `setAdLoadListener(AppOpenAdLoadListener)` | Removed. Pass the `AppOpenAdLoadListener` to the `loadAd` method. ||
|| ^ | `loadAd(AdRequestConfiguration)` | Removed. Use `loadAd(AdRequest, AppOpenAdLoadListener)`. ||
|| ^ | `loadAd(AdRequest, AppOpenAdLoadListener)` | Added ||
|| NativeAdLoader | `setNativeAdLoadListener(NativeAdLoadListener)` | Removed. Pass `NativeAdLoadListener` to the `loadAd` method. ||
|| ^ | `loadAd(NativeAdRequestConfiguration)` | Removed. Use `loadAd(AdRequest, NativeAdLoadListener)`. ||
|| ^ | `loadAd(AdRequest, NativeAdOptions, NativeAdLoadListener)` | Added ||
|| ^ | `loadAd(AdRequest, NativeAdLoadListener)` | Added ||
|| SliderAdLoader | `setSliderAdLoadListener(SliderAdLoadListener)` | Removed. Pass `SliderAdLoadListener` to the `loadAd` method. ||
|| ^ | `loadSlider(NativeAdRequestConfiguration)` | Removed. Use `loadAd(AdRequest, SliderAdLoadListener)`. ||
|| ^ | `loadSlider(AdRequest, NativeAdOptions, SliderAdLoadListener)` | Added ||
|| ^ | `loadAd(AdRequest, NativeAdLoadListener)` | Added ||
|| NativeBulkAdLoader | `setNativeBulkAdLoadListener(NativeBulkAdLoadListener)` | Removed. Pass `NativeBulkAdLoadListener` to the `loadAd` method. ||
|| ^ | `loadAds(NativeAdRequestConfiguration, Int)` | Removed. Use `loadAd(AdRequest, NativeAdLoadListener)`. ||
|| ^ | `loadAds(AdRequest, NativeAdOptions, NativeBulkAdLoadListener)` | Added ||
|| ^ | `loadAds(AdRequest, NativeBulkAdLoadListener)` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  // Interstitial Ads
  val interstitialAdLoader = InterstitialAdLoader(this)
  interstitialAdLoader.setAdLoadListener(object : InterstitialAdLoadListener { /* ... */ })
  interstitialAdLoader.loadAd(AdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

  // Rewarded Ads
  val rewardedAdLoader = RewardedAdLoader(this)
  rewardedAdLoader.setAdLoadListener(object : RewardedAdLoadListener { /* ... */ })
  rewardedAdLoader.loadAd(AdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

  // AppOpen Ads
  val appOpenAdLoader = AppOpenAdLoader(this)
  appOpenAdLoader.setAdLoadListener(object : AppOpenAdLoadListener { /* ... */ })
  appOpenAdLoader.loadAd(AdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

  // Native Ads
  val nativeAdLoader = NativeAdLoader(this)
  nativeAdLoader.setNativeAdLoadListener(object : NativeAdLoadListener { /* ... */ })
  nativeAdLoader.loadAd(NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

  // Slider Ads
  val sliderAdLoader = SliderAdLoader(this)
  sliderAdLoader.setSliderAdLoadListener(object : SliderAdLoadListener { /* ... */ })
  sliderAdLoader.loadSlider(NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

  // Native bulk ads
  val nativeBulkAdLoader = NativeBulkAdLoader(this)
  nativeBulkAdLoader.setNativeBulkAdLoadListener(object : NativeBulkAdLoadListener { /* ... */ })
  nativeBulkAdLoader.loadAds(NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build(), 1)
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  // Interstitial Ads
  val interstitialAdLoader = InterstitialAdLoader(this)
  interstitialAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : InterstitialAdLoadListener { /* ... */ })

  // Rewarded Ads
  val rewardedAdLoader = RewardedAdLoader(this)
  rewardedAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : RewardedAdLoadListener { /* ... */ })

  // AppOpen Ads
  val appOpenAdLoader = AppOpenAdLoader(this)
  appOpenAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : AppOpenAdLoadListener { /* ... */ })

  // Native Ads
  val nativeAdLoader = NativeAdLoader(this)
  nativeAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : NativeAdLoadListener { /* ... */ })
  // Or with NativeAdOptions
  nativeAdLoader.loadAd(
      AdRequest.Builder("R-M-XXXXX-YY").build(),
      NativeAdOptions.Builder().build(),
      object : NativeAdLoadListener { /* ... */ })

  // Slider Ads
  val sliderAdLoader = SliderAdLoader(this)
  sliderAdLoader.loadSlider(AdRequest.Builder("R-M-XXXXX-YY").build(), object : SliderAdLoadListener { /* ... */ })
  // Or with NativeAdOptions
  sliderAdLoader.loadSlider(
      AdRequest.Builder("R-M-XXXXX-YY").build(),
      NativeAdOptions.Builder().build(),
      object : SliderAdLoadListener { /* ... */ })

  // Native Bulk Ads
  val nativeBulkAdLoader = NativeBulkAdLoader(this)
  nativeBulkAdLoader.loadAds(
      AdRequest.Builder("R-M-XXXXX-YY").build(),
      1,
      object : NativeBulkAdLoadListener { /* ... */ }
  )
  // Or with NativeAdOptions
  nativeBulkAdLoader.loadAds(
      AdRequest.Builder("R-M-XXXXX-YY").build(),
      1,
      NativeAdOptions.Builder().build(),
      object : NativeBulkAdLoadListener { /* ... */ }
  )
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadAd() {
      // Interstitial Ads
      InterstitialAdLoader interstitialAdLoader = new InterstitialAdLoader(this);
      interstitialAdLoader.setAdLoadListener(new InterstitialAdLoadListener() { /* ... */ });
      interstitialAdLoader.loadAd(new AdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

      // Rewarded Ads
      RewardedAdLoader rewardedAdLoader = new RewardedAdLoader(this);
      rewardedAdLoader.setAdLoadListener(new RewardedAdLoadListener() { /* ... */ });
      rewardedAdLoader.loadAd(new AdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

      // AppOpen Ads
      AppOpenAdLoader appOpenAdLoader = new AppOpenAdLoader(this);
      appOpenAdLoader.setAdLoadListener(new AppOpenAdLoadListener() { /* ... */ });
      appOpenAdLoader.loadAd(new AdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

      // Native Ads
      NativeAdLoader nativeAdLoader = new NativeAdLoader(this);
      nativeAdLoader.setNativeAdLoadListener(new NativeAdLoadListener() { /* ... */ });
      nativeAdLoader.loadAd(new NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

      // Slider Ads
      SliderAdLoader sliderAdLoader = new SliderAdLoader(this);
      sliderAdLoader.setSliderAdLoadListener(new SliderAdLoadListener() { /* ... */ });
      sliderAdLoader.loadSlider(new NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

      // Native Bulk Ads
      NativeBulkAdLoader nativeBulkAdLoader = new NativeBulkAdLoader(this);
      nativeBulkAdLoader.setNativeBulkAdLoadListener(new NativeBulkAdLoadListener() { /* ... */ });
      nativeBulkAdLoader.loadAds(new NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build(), 1);
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadAd() {
      // Interstitial Ads
      InterstitialAdLoader interstitialAdLoader = new InterstitialAdLoader(this);
      interstitialAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
              new InterstitialAdLoadListener() { /* ... */ }
      );

      // Rewarded Ads
      RewardedAdLoader rewardedAdLoader = new RewardedAdLoader(this);
      rewardedAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
              new RewardedAdLoadListener() { /* ... */ }
      );

      // AppOpen Ads
      AppOpenAdLoader appOpenAdLoader = new AppOpenAdLoader(this);
      appOpenAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
              new AppOpenAdLoadListener() { /* ... */ }
      );

      // Native Ads
      NativeAdLoader nativeAdLoader = new NativeAdLoader(this);
      nativeAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
              new NativeAdLoadListener() { /* ... */ }
      );
      // Or with NativeAdOptions
      nativeAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
              new NativeAdOptions.Builder().build(),
              new NativeAdLoadListener() { /* ... */ }
      );

      // Slider Ads
      SliderAdLoader sliderAdLoader = new SliderAdLoader(this);
      sliderAdLoader.loadSlider(new AdRequest.Builder("R-M-XXXXX-YY").build(),
              new SliderAdLoadListener() { /* ... */ }
      );
      // Or with NativeAdOptions
      sliderAdLoader.loadSlider(new AdRequest.Builder("R-M-XXXXX-YY").build(),
              new NativeAdOptions.Builder().build(),
              new SliderAdLoadListener() { /* ... */ }
      );

      // Native Bulk Ads
      NativeBulkAdLoader nativeBulkAdLoader = new NativeBulkAdLoader(this);
      nativeBulkAdLoader.loadAds(new AdRequest.Builder("R-M-XXXXX-YY").build(),
              1,
              new NativeBulkAdLoadListener() { /* ... */ }
      );
      // Or with NativeAdOptions
      nativeBulkAdLoader.loadAds(new AdRequest.Builder("R-M-XXXXX-YY").build(),
              1,
              new NativeAdOptions.Builder().build(),
              new NativeBulkAdLoadListener() { /* ... */ }
      );
  }
  ```
  ||
  |#

{% endlist %}

### 3.1 Support for Kotlin Coroutines

The API now includes `suspend` overloads for ad loading methods:

#|
|| **Class** | **Method** | **Status** ||
|| InterstitialAdLoader | `suspend fun loadAd(AdRequest): InterstitialAdLoadResult` | Added ||
|| RewardedAdLoader | `suspend fun loadAd(AdRequest): RewardedAdLoadResult` | Added ||
|| AppOpenAdLoader | `suspend fun loadAd(AdRequest): AppOpenAdLoadResult` | Added ||
|| NativeAdLoader | `suspend fun loadAd(AdRequest, NativeAdOptions): NativeAdLoadResult` | Added ||
|| ^ | `suspend fun loadAd(AdRequest): NativeAdLoadResult` | Added ||
|| SliderAdLoader | `suspend fun loadAd(AdRequest): SliderAdLoadResult` | Added ||
|| ^ | `suspend fun loadAd(AdRequest, NativeAdOptions): SliderAdLoadResult` | Added ||
|| NativeBulkAdLoader | `suspend fun loadAds(AdRequest, Int): NativeBulkAdLoadResult` | Added ||
|| ^ | `suspend fun loadAds(AdRequest, Int, NativeAdOptions): NativeBulkAdLoadResult` | Added ||
|#

#### Examples

```kotlin
lifecycleScope.launch {
    // Interstitial Ads
    val interstitialAdLoader = InterstitialAdLoader(applicationContext)
    when(val result = interstitialAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())) {
        is InterstitialAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is InterstitialAdLoadResult.Success -> TODO("Show interstitial ad: ${result.ad}")
    }

    // Rewarded Ads
    val rewardedAdLoader = RewardedAdLoader(applicationContext)
    when(val result = rewardedAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())) {
        is RewardedAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is RewardedAdLoadResult.Success -> TODO("Show rewarded ad: ${result.ad}")
    }

    // AppOpen Ads
    val appOpenAdLoader = AppOpenAdLoader(applicationContext)
    when(val result = appOpenAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())) {
        is AppOpenAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is AppOpenAdLoadResult.Success -> TODO("Show appOpen ad: ${result.ad}")
    }

    // Native Ads
    val nativeAdLoader = NativeAdLoader(applicationContext)
    val nativeAdRequest = AdRequest.Builder("R-M-XXXXX-YY").build()
    when(val result = nativeAdLoader.loadAd(nativeAdRequest)) {
        is NativeAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is NativeAdLoadResult.Success -> TODO("Show native ad: ${result.ad}")
    }

    // Or with NativeAdOptions
    when(val result = nativeAdLoader.loadAd(nativeAdRequest, NativeAdOptions.Builder().build())) {
        is NativeAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is NativeAdLoadResult.Success -> TODO("Show native ad: ${result.ad}")
    }

    // Slider Ads
    val sliderAdLoader = SliderAdLoader(applicationContext)
    val sliderAdRequest = AdRequest.Builder("R-M-XXXXX-YY").build()
    when(val result = sliderAdLoader.loadAd(sliderAdRequest)) {
        is SliderAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is SliderAdLoadResult.Success -> TODO("Show slider ad: ${result.ad}")
    }

    // Or with NativeAdOptions
    when(val result = sliderAdLoader.loadAd(sliderAdRequest, NativeAdOptions.Builder().build())) {
        is SliderAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is SliderAdLoadResult.Success -> TODO("Show slider ad: ${result.ad}")
    }

    // Native Bulk Ads
    val nativeBulkAdLoader = NativeBulkAdLoader(applicationContext)
    val builkAdRequest = AdRequest.Builder("R-M-XXXXX-YY").build()
    when(val result = nativeBulkAdLoader.loadAds(builkAdRequest, 1)) {
        is NativeBulkAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is NativeBulkAdLoadResult.Success -> TODO("Show bulk ad: ${result.ads}")
    }

    // Or with NativeAdOptions
    when(val result = nativeBulkAdLoader.loadAds(builkAdRequest, 1, NativeAdOptions.Builder().build())) {
        is NativeBulkAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is NativeBulkAdLoadResult.Success -> TODO("Show bulk ad: ${result.ads}")
    }
}
```

### 4. Changes to the Banner API

The `setAdUnitId` method has been removed from `BannerAdView`. The `adUnitId` is now set for each ad load.
Factory methods for creating `BannerAdSize` have been renamed.

#|
|| **Class** | **Method** | **Status** ||
|| `BannerAdView` | `setAdUnitId(String)` | Removed. Pass the `adUnitId` property to the `AdRequest` builder before loading an ad. ||
|| `BannerAdSize` | `stickySize` | Removed. Use `BannerAdSize.sticky`. ||
|| ^ | `inlineSize` | Removed. Use `BannerAdSize.inline`. ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  val banner = findViewById<R.id.banner>(BannerAdView)
  val stickySize = BannerAdSize.stickySize(this, screenWidth)
  val inlineSizeSize = BannerAdSize.inlineSize(this, screenWidth, 300)
  banner.setAdUnitId("R-M-XXXXX-YY")
  banner.setAdSize(stickySize)
  banner.loadAd(AdRequest.Builder().build())
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  val banner = findViewById<R.id.banner>(BannerAdView)
  val stickySize = BannerAdSize.sticky(this, screenWidth)
  val inlineSizeSize = BannerAdSize.inline(this, screenWidth, 300)
  banner.setAdSize(stickySize)
  banner.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadAd() {
      BannerAdView banner = findViewById(R.id.banner);
      BannerAdSize stickySize = BannerAdSize.stickySize(this, screenWidth);
      BannerAdSize inlineSizeSize = BannerAdSize.inlineSize(this, screenWidth, 300);
      banner.setAdUnitId("R-M-XXXXX-YY");
      banner.setAdSize(stickySize);
      banner.loadAd(new AdRequest.Builder().build());
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadAd() {
      BannerAdView banner = findViewById(R.id.banner);
      BannerAdSize stickySize = BannerAdSize.sticky(this, screenWidth);
      BannerAdSize inlineSizeSize = BannerAdSize.inline(this, screenWidth, 300);
      banner.setAdSize(stickySize);
      banner.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build());
  }
  ```
  ||
  |#

{% endlist %}

### 5. Changes to the AdInfo API

We've changed the methods for retrieving data on ad creatives to properties and removed additional information:

#|
|| **Class** | **Method/Field** | **Status** ||
|| `BannerAdView`, `InsterstitialAd`, `RewardedAd`, `AppOpenAd`, `NativeAd` | `info` | Removed. Use `adInfo` ||
|| ^ | `adAttributes` | Removed. Use `adInfo` ||
|| `NativeAd` | `creativeId` | Removed. Use `Creative.creativeId`. ||
|| ^ | `campaignId` | Removed. Use `Creative.campaignId`. ||
|| `AdInfo` | `data` | Removed ||
|| ^ | `adSize` | Removed ||
|| ^ | `creatives` | Added ||
|| ^ | `extraData` | Added ||
|| ^ | `partnerText` | Added ||
|| `Creative` | `placeId` | Added ||
|| ^ | `offerId` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  // BannerAdView
  val extraData = banner.info
  val adUnitId = banner.adInfo.adUnitId
  val extraData2 = banner.adInfo.data
  val width = banner.adInfo.adSize?.width
  val height = banner.adInfo.adSize?.height
  val creativeId = banner.adInfo.creatives.first().creativeId
  val campaignId = banner.adInfo.creatives.first().campaignId
  val creativeId2 = banner.adAttributes.first().bannerId
  val campaignId2 = banner.adAttributes.first().campaignId
  val placeId = banner.adAttributes.first().placeId

  // InterstitialAd, RewardedAd, AppOpenAd
  val extraData = fullscreenAd.info.data
  val adUnitId = fullscreenAd.info.adUnitId
  val width = fullscreenAd.info.adSize?.width
  val height = fullscreenAd.info.adSize?.height
  val creativeId = fullscreenAd.info.creatives.first().creativeId
  val campaignId = fullscreenAd.info.creatives.first().campaignId
  val creativeId2 = fullscreenAd.adAttributes.first().bannerId
  val campaignId2 = fullscreenAd.adAttributes.first().campaignId
  val placeId = fullscreenAd.adAttributes.first().placeId

  // NativeAd
  val extraData = nativeAd.info
  val creativeId = nativeAd.creativeId
  val campaignId = nativeAd.campaignId
  val creativeId2 = nativeAd.adAttributes?.bannerId
  val campaignId2 = nativeAd.adAttributes?.campaignId
  val placeId = nativeAd.adAttributes?.placeId
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  // BannerAdView
  val extraData = banner.adInfo.extraData
  val partnerText = banner.adInfo.partnerText
  val creativeId = banner.adInfo.creatives.first().creativeId
  val campaignId = banner.adInfo.creatives.first().campaignId
  val placeId = banner.adInfo.creatives.first().placeId
  val adUnitId = banner.adInfo.adUnitId
  val width = banner.adSize?.width
  val height = banner.adSize?.height

  // InterstitialAd, RewardedAd, AppOpenAd
  val extraData = fullscreenAd.adInfo.extraData
  val partnerText = fullscreenAd.adInfo.partnerText
  val adUnitId = fullscreenAd.adInfo.adUnitId
  val creativeId = fullscreenAd.adInfo.creatives.first().creativeId
  val campaignId = fullscreenAd.adInfo.creatives.first().campaignId
  val placeId = fullscreenAd.adInfo.creatives.first().placeId

  // NativeAd
  val extraData = nativeAd.adInfo.extraData
  val partnerText = nativeAd.adInfo.partnerText
  val adUnitId = nativeAd.adInfo.adUnitId
  val creativeId = nativeAd.adInfo.creatives.first().creativeId
  val campaignId = nativeAd.adInfo.creatives.first().campaignId
  val placeId = nativeAd.adInfo.creatives.first().placeId
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  // BannerAdView
  String extraData = banner.getInfo();
  String adUnitId = banner.getAdInfo().getAdUnitId();
  String extraData2 = banner.getAdInfo().getData();
  int width = banner.getAdInfo().getAdSize().getWidth();
  int height = banner.getAdInfo().getAdSize().getHeight();
  String creativeId = banner.getAdInfo().getCreatives().get(0).getCreativeId();
  String campaignId = banner.getAdInfo().getCreatives().get(0).getCampaignId();
  String creativeId2 = banner.getAdAttributes().get(0).getBannerId();
  String campaignId2 = banner.getAdAttributes().get(0).getCampaignId();
  String placeId = banner.getAdAttributes().get(0).getPlaceId();

  // InterstitialAd, RewardedAD, AppOpenAd
  String extraData = fullscreenAd.getInfo().getData();
  String adUnitId = fullscreenAd.getInfo().getAdUnitId();
  int width = fullscreenAd.getInfo().getAdSize().getWidth();
  int height = fullscreenAd.getInfo().getAdSize().getHeight();
  String creativeId = fullscreenAd.getInfo().getCreatives().get(0).getCreativeId();
  String campaignId = fullscreenAd.getInfo().getCreatives().get(0).getCampaignId();
  String creativeId2 = fullscreenAd.getAdAttributes().get(0).getBannerId();
  String campaignId2 = fullscreenAd.getAdAttributes().get(0).getCampaignId();
  String placeId = fullscreenAd.getAdAttributes().get(0).getPlaceId();

  // NativeAd
  String extraData = nativeAd.getInfo();
  String creativeId = nativeAd.getCreativeId();
  String campaignId = nativeAd.getCampaignId();
  String creativeId2 = nativeAd.getAdAttributes().getBannerId();
  String campaignId2 = nativeAd.getAdAttributes().getCampaignId();
  String placeId = nativeAd.getAdAttributes().getPlaceId();
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  // BannerAdView
  String extraData = banner.getAdInfo().getExtraData();
  String partnerText = banner.getAdInfo().getPartnerText();
  String creativeId = banner.getAdInfo().getCreatives().get(0).getCreativeId();
  String campaignId = banner.getAdInfo().getCreatives().get(0).getCampaignId();
  String placeId = banner.getAdInfo().getCreatives().get(0).getPlaceId();
  String adUnitId = banner.getAdInfo().getAdUnitId();
  int width = banner.getAdSize().getWidth();
  int height = banner.getAdSize().getHeight();

  // InterstitialAd, RewardedAd, AppOpenAd
  String extraData = fullscreenAd.getAdInfo().getExtraData();
  String partnerText = fullscreenAd.getAdInfo().getPartnerText();
  String adUnitId = fullscreenAd.getAdInfo().getAdUnitId();
  String creativeId = fullscreenAd.getAdInfo().getCreatives().get(0).getCreativeId();
  String campaignId = fullscreenAd.getAdInfo().getCreatives().get(0).getCampaignId();
  String placeId = fullscreenAd.getAdInfo().getCreatives().get(0).getPlaceId();

  // NativeAd
  String extraData = nativeAd.getAdInfo().getExtraData();
  String partnerText = nativeAd.getAdInfo().getPartnerText();
  String adUnitId = nativeAd.getAdInfo().getAdUnitId();
  String creativeId = nativeAd.getAdInfo().getCreatives().get(0).getCreativeId();
  String campaignId = nativeAd.getAdInfo().getCreatives().get(0).getCampaignId();
  String placeId = nativeAd.getAdInfo().getCreatives().get(0).getPlaceId();
  ```
  ||
  |#

{% endlist %}


### 6. Changes to the Native Ads API

- The `NativeAd.bindNativeAd` and `SliderAd.bindSliderAd()` methods now return `AdBindingResult` and no longer throw exceptions.
- The `warning` field type has been changed from `String?` to `NativeAdWarning?`. To comply with the Federal Law "On Advertising", apart from the `warning` asset's content, the new class also contains the `warning` asset's minimum required size as a percentage of the total ad area.
- The `NativeAdMedia` class now contains the `hasVideo` field to indicate whether the selected ad includes a video creative.

#|
|| **Class** | **Status** ||
|| `AdBindingResult` |  Added ||
|| `NativeAdWarning` |  Added ||
|#

#|
|| **Class** | **Method/Field** | **Status** ||
|| `NativeAd` | `bindNativeAd` | The method now returns an `AdBindingResult` value. It no longer throws exceptions. ||
|| `SliderAd` | `bindSliderAd` | The method now returns an `AdBindingResult` value. It no longer throws exceptions. ||
|| `NativeAdAssets` | `warning` | Type changed: `String` -> `NativeAdWarning` ||
|| `NativeAdWarning` | `value` | Added ||
|| ^ | `minimumRequiredArea` | Added ||
|| `NativeAdMedia` | `hasVideo` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  val warning = nativeAd.adAssets.warning
  try {
      nativeAd.bindNativeAd(binder)
  } catch (e: NativeAdException) {
      val message = e.message
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  val warningAsset = nativeAd.adAssets.warning
  val warning = warningAsset?.value
  val warningMinArea = warningAsset?.minimumRequiredArea
  val hasVideo = nativeAd.adAssets.media?.hasVideo
  when (val result = nativeAd.bindNativeAd(binder)) {
      is AdBindingResult.Failure -> {
          val missingAssetName = result.missingAssetName
          val message = result.exception.message
      }
      AdBindingResult.Success -> Unit
  }
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void bindAd(NativeAd nativeAd) {
      String warning = nativeAd.getAdAssets().getWarning();
      try {
          nativeAd.bindNativeAd(binder);
      } catch (NativeAdException e) {
          String message = e.getMessage();
      }
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void bindNativeAd(NativeAd nativeAd) {
      NativeAdWarning warningAsset = nativeAd.getAdAssets().getWarning();
      String warning = warningAsset.getValue();
      float minWarningArea = warningAsset.getMinimumRequiredArea();
      boolean hasVideo = nativeAd.getAdAssets().getMedia().getHasVideo();
      AdBindingResult result = nativeAd.bindNativeAd(binder);
      if (result instanceof AdBindingResult.Failure) {
          String missingAssetName = ((AdBindingResult.Failure) result).getMissingAssetName();
          String message = ((AdBindingResult.Failure) result).getException().getMessage();
      }
  }
  ```
  ||
  |#

{% endlist %}

### 6.1 API for native ad templates

Tools for native ad integration via templates have been removed. Use standard native ad
assets for integration.

#|
|| **Class** | **Status** ||
|| `NativeBannerView` | Removed ||
|| `SizeConstraint` | ^ ||
|| `HorizontalOffset` | ^ ||
|| `NativeTemplateAppearance` | ^ ||
|| `TextAppearance` | ^ ||
|| `BannerAppearance` | ^ ||
|| `ButtonAppearance` | ^ ||
|| `RatingAppearance` | ^ ||
|#

### 7. Some callback methods for ad objects were removed

- The `ClosableBannerAdEventListener` and `ClosableNativeAdEventListener` interfaces have been removed.
- The methods `onLeftApplication` and `onReturnToApplication` have been removed.

#|
|| **Class** | **Status** ||
|| `ClosableBannerAdEventListener` |  Removed ||
|| `ClosableNativeAdEventListener` |  Removed ||
|#

#|
|| **Class** | **Method** | **Status** ||
|| `BannerAdEventListener`, `NativeAdEventListener` | `onLeftApplication` | Removed ||
|| ^ | `onReturnToApplication` | Removed ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  bannerAd?.setBannerAdEventListener(object : ClosableBannerAdEventListener {
      override fun closeBannerAd() { /* ... */ }
      override fun onAdClicked() { /* ... */ }
      override fun onAdFailedToLoad(error: AdRequestError) { /* ... */ }
      override fun onAdLoaded() { /* ... */ }
      override fun onImpression(impressionData: ImpressionData?) { /* ... */ }
      override fun onLeftApplication() { /* ... */ }
      override fun onReturnedToApplication() { /* ... */ }
  })
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  // ClosableAdEventListener as well as
  // onAdClosed callback are not available anymore
  bannerAdView?.setBannerAdEventListener(object : BannerAdEventListener {
      override fun onAdClicked() { /* ... */ }
      override fun onAdFailedToLoad(error: AdRequestError) { /* ... */ }
      override fun onAdLoaded() { /* ... */ }
      override fun onImpression(impressionData: ImpressionData?) { /* ... */ }
  })
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void setEventListener(BannerAdView bannerView) {
      bannerView.setBannerAdEventListener(
      new ClosableBannerAdEventListener() {
              @Override
              public void closeBannerAd() { /* ... */ }
              @Override
              public void onAdLoaded() { /* ... */ }
              @Override
              public void onAdFailedToLoad(@NotNull AdRequestError adRequestError) { /* ... */ }
              @Override
              public void onAdClicked() { /* ... */ }
              @Override
              public void onLeftApplication() { /* ... */ }
              @Override
              public void onReturnedToApplication() { /* ... */ }
              @Override
              public void onImpression(@Nullable ImpressionData impressionData) { /* ... */ }
          }
      );
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void setEventListener(BannerAdView bannerView) {
  // ClosableAdEventListener as well as
  // onAdClosed callback are not available anymore
      bannerView.setBannerAdEventListener(
          new BannerAdEventListener() {
              @Override
              public void onAdLoaded() { /* ... */ }
              @Override
              public void onAdFailedToLoad(@NotNull AdRequestError adRequestError) { /* ... */ }
              @Override
              public void onAdClicked() { /* ... */ }
              @Override
              public void onImpression(@Nullable ImpressionData impressionData) { /* ... */ }
          }
      );
  }
  ```
  ||
  |#

{% endlist %}

### 8. Changes to the main SDK class

- The main SDK class has been renamed to `YandexAds`.
- We've also renamed some methods for configuring privacy settings.

#|
|| **Class** |  **Status** ||
|| `YandexAds` |  Added ||
|| `MobileAds` | Removed. Use `YandexAds`. ||
|#

#|
|| **Class** | **Method** | **Status** ||
|| `MobileAds` | `setAgeRestrictedUser(Boolean)` | Removed. Use `YandexAds.setAgeRestricted(Boolean)`. ||
|| ^ | `setLocationConsent(Boolean)` | Removed. Use `YandexAds.setLocationTracking(Boolean)`. ||
|| `YandexAds` | `setAgeRestricted(Boolean)` | Added ||
|| ^ | `setLocationTracking(Boolean)` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  import com.yandex.mobile.ads.common.MobileAds

  MobileAds.setUserConsent(true)
  MobileAds.setAgeRestrictedUser(false)
  MobileAds.setLocationConsent(true)
  MobileAds.initialize(context) { /* ... */ }
  MobileAds.enableDebugErrorIndicator(true)
  MobileAds.enableLogging(true)
  MobileAds.setAppAdAnalyticsReporting(true)
  MobileAds.showDebugPanel(this)
  MobileAds.libraryVersion
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  import com.yandex.mobile.ads.common.YandexAds

  YandexAds.setUserConsent(true)
  YandexAds.setAgeRestricted(false)
  YandexAds.setLocationTracking(true)
  YandexAds.initialize(context) { /* ... */ }
  YandexAds.enableDebugErrorIndicator(true)
  YandexAds.enableLogging(true)
  YandexAds.setAppAdAnalyticsReporting(true)
  YandexAds.showDebugPanel(this)
  YandexAds.libraryVersion
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  import com.yandex.mobile.ads.common.MobileAds;

  void initSdk() {
      MobileAds.setUserConsent(true);
      MobileAds.setAgeRestrictedUser(false);
      MobileAds.setLocationConsent(true);
      MobileAds.initialize(this, () -> { /* ... */ });
      MobileAds.getLibraryVersion();
      MobileAds.enableDebugErrorIndicator(true);
      MobileAds.enableLogging(true);
      MobileAds.setAppAdAnalyticsReporting(true);
      MobileAds.showDebugPanel(this);
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  import com.yandex.mobile.ads.common.YandexAds;

  void initSdk() {
      YandexAds.setUserConsent(true);
      YandexAds.setAgeRestricted(false);
      YandexAds.setLocationTracking(true);
      YandexAds.initialize(this, () -> { /* ... */ });
      YandexAds.getLibraryVersion();
      YandexAds.enableDebugErrorIndicator(true);
      YandexAds.enableLogging(true);
      YandexAds.setAppAdAnalyticsReporting(true);
      YandexAds.showDebugPanel(this);
  }
  ```
  ||
  |#

{% endlist %}

## Changes to the InStream API

### 1. Changes to the packages and dependency structure

Core classes have been renamed to match the new SDK structure.

#|
|| **Class** | **Status** ||
|| `com.yandex.mobile.ads.instream.InstreamAdBinder` | Moved to `com.yandex.mobile.ads.instream.binder.InstreamAdBinder` ||
|| `com.yandex.mobile.ads.instream.InstreamAdRequestConfiguration` | Renamed to `com.yandex.mobile.ads.instream.InstreamAdRequest` ||
|| `com.yandex.mobile.ads.instream.InstreamAdBreak` | Renamed to `com.yandex.mobile.ads.instream.adbreak.AdBreakData` ||
|| `com.yandex.mobile.ads.instream.inroll.Inroll`, `com.yandex.mobile.ads.instream.pauseroll.Pauseroll` | Replaced with `com.yandex.mobile.ads.instream.adbreak.InstreamAdBreak` ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  import com.yandex.mobile.ads.instream.InstreamAdBinder
  import com.yandex.mobile.ads.instream.InstreamAdRequestConfiguration
  import com.yandex.mobile.ads.instream.InstreamAdBreak
  import com.yandex.mobile.ads.instream.inroll.Inroll
  import com.yandex.mobile.ads.instream.pauseroll.Pauseroll
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  import com.yandex.mobile.ads.instream.binder.InstreamAdBinder
  import com.yandex.mobile.ads.instream.InstreamAdRequest
  import com.yandex.mobile.ads.instream.adbreak.AdBreakData
  import com.yandex.mobile.ads.instream.adbreak.InstreamAdBreak
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  import com.yandex.mobile.ads.instream.InstreamAdBinder;
  import com.yandex.mobile.ads.instream.InstreamAdRequestConfiguration;
  import com.yandex.mobile.ads.instream.InstreamAdBreak;
  import com.yandex.mobile.ads.instream.inroll.Inroll;
  import com.yandex.mobile.ads.instream.pauseroll.Pauseroll;
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  import com.yandex.mobile.ads.instream.binder.InstreamAdBinder;
  import com.yandex.mobile.ads.instream.InstreamAdRequest;
  import com.yandex.mobile.ads.instream.adbreak.AdBreakData;
  import com.yandex.mobile.ads.instream.adbreak.InstreamAdBreak;
  ```
  ||
  |#

{% endlist %}

### 2. Changes to AdRequest

The `InstreamAdRequestConfiguration` class has been renamed to `InstreamAdRequest`.

#|
|| **Class** | **Status** ||
|| `InstreamAdRequestConfiguration` | Removed. Use `InstreamAdRequest`. ||
|| `InstreamAdRequest` | Added ||
|| `InstreamAdBreakRequest` | Added ||
|#


#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  val loader = InstreamAdLoader(this)
  val config = InstreamAdRequestConfiguration.Builder("XXXXXX").build()
  loader.loadInstreamAd(this, config)
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  val loader = InstreamAdLoader(this)
  val config = InstreamAdRequest.Builder("XXXXXX").build()
  loader.loadInstreamAd(this, config)
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadAd() {
      InstreamAdLoader loader = new InstreamAdLoader(this);
      InstreamAdRequestConfiguration config = new InstreamAdRequestConfiguration.Builder("XXXXXX").build();
      loader.loadInstreamAd(this, config);
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadAd() {
      InstreamAdLoader loader = new InstreamAdLoader(this);
      InstreamAdRequest config = new InstreamAdRequest.Builder("XXXXXX").build();
      loader.loadInstreamAd(this, config);
  }
  ```
  ||
  |#

{% endlist %}

### 3. Changes to the ad loading API

- The methods for registering callback and ad load listeners have been updated.
- The API now includes the `InstreamAdBreakLoader` class for loading ad breaks.
- The `onInstreamAdFailedToLoad` method signature has changed: an `InstreamAdRequestError` object is now passed instead of a `reason` string.

#|
|| **Class**  | **Status** ||
|| `InstreamAdBreakLoadListener`  | Added ||
|| `InstreamAdBreakLoader` | Added ||
|#

#|
|| **Class** | **Method** | **Status** ||
|| `InstreamAdLoader` | `setInstreamAdLoadListener(InstreamAdLoadListener)` | Removed. Pass `InstreamAdLoadListener` to the `loadAd` method. ||
|| ^ | `loadAd(InstreamAdRequestConfiguration)` | Removed. Pass `InstreamAdLoadListener` to the `loadAd` method. ||
|| ^ | `loadAd(InstreamAdRequest, InstreamAdLoadListener)` | Removed. Pass `InstreamAdLoadListener` to the `loadAd` method. ||
|| `InstreamAdLoadListener` | `onInstreamAdFailedToLoad(String)` | Removed. Use `onInstreamAdFailedToLoad(InstreamAdRequestError)`. ||
|| ^ | `onInstreamAdFailedToLoad(InstreamAdRequestError)` | Added ||
|| `InstreamAdBreakLoader` | `loadAd(InstreamAdBreakRequest, InstreamAdBreakLoadListener)` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  val instreamAdLoader = InstreamAdLoader(this)
  instreamAdLoader.setInstreamAdLoadListener(object : InstreamAdLoadListener {
      override fun onInstreamAdLoaded(instreamAd: InstreamAd) {
          // ...
      }

      override fun onInstreamAdFailedToLoad(reason: String) {
          println("Instream ad failed to load: $reason")
      }
  })
  val config = InstreamAdRequestConfiguration.Builder("XXXXXX").build()
  instreamAdLoader.loadInstreamAd(this, config)
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  val instreamAdLoader = InstreamAdLoader(this)
  val config = InstreamAdRequest.Builder("XXXXXX").build()
  instreamAdLoader.loadAd(config, object : InstreamAdLoadListener {
      override fun onInstreamAdLoaded(instreamAd: InstreamAd) {
          // ...
      }

      override fun onInstreamAdFailedToLoad(error: InstreamAdRequestError) {
          println("Instream ad failed to load: ${error.reason}")
      }
  })
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadInstreamAd() {
      InstreamAdLoader instreamAdLoader = new InstreamAdLoader(this);
      instreamAdLoader.setInstreamAdLoadListener(new InstreamAdLoadListener() {
          @Override
          public void onInstreamAdLoaded(InstreamAd instreamAd) {
              // ...
          }

          @Override
          public void onInstreamAdFailedToLoad(String reason) {
              System.out.println("Instream ad failed to load: " + reason);
          }
      });
      InstreamAdRequestConfiguration config = new InstreamAdRequestConfiguration.Builder("XXXXXX").build();
      instreamAdLoader.loadInstreamAd(this, config);
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadInstreamAd() {
      InstreamAdLoader instreamAdLoader = new InstreamAdLoader(this);
      InstreamAdRequest config = new InstreamAdRequest.Builder("XXXXXX").build();
      instreamAdLoader.loadAd(config, new InstreamAdLoadListener() {
          @Override
          public void onInstreamAdLoaded(InstreamAd instreamAd) {
              // ...
          }

          @Override
          public void onInstreamAdFailedToLoad(InstreamAdRequestError error) {
              System.out.println("Instream ad failed to load: " + error.getReason());
          }
      });
  }
  ```
  ||
  |#

{% endlist %}

### 3.1 Support for Kotlin Coroutines

We've added `suspend` overloads for ad loading methods to `InstreamAdLoader` and `InstreamAdBreakAdLoader`.

#|
|| **Class** | **Method** | **Status** ||
|| `InstreamAdLoader` | `suspend fun loadAd(InstreamAdRequest): InstreamAdLoadResult` | Added ||
|| `InstreamAdBreakLoader` | `suspend fun loadAd(InstreamAdBreakRequest): InstreamAdBreakLoadResult` | Added||
|#

#### For example:

```kotlin
lifecycleScope.launch {
    val instreamAdLoader = InstreamAdLoader(applicationContext)
    when(val result = instreamAdLoader.loadAd(InstreamAdRequest.Builder("XXXXXX").build())) {
        is InstreamAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is InstreamAdLoadResult.Success -> TODO("Show instream ad: ${result.ad}")
    }

    val adBreakLoader = InstreamAdBreakLoader(applicationContext)
    when (val result = adBreakLoader.loadAd(InstreamAdBreakRequest.Builder("XXXXXX", "YY").build())) {
        is InstreamAdBreakLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is InstreamAdBreakLoadResult.Success -> TODO("Show adBreak : ${result.adBreak}")
    }
}
```

### 4. Using in-roll and pause-roll

- The logic for managing ad breaks has become more flexible.
- The specialized queue providers, `InrollQueueProvider` and `PauserollQueueProvider`, have been removed. Ad breaks are now accessible directly from the `InstreamAd` object and can be filtered by type.

{% note info "" %}

If you're using automatic rendering via `InstreamAdBinder`, select only `INROLL` and `PAUSEROLL` ad breaks from the `instreamAdBreaks` collection.

{% endnote %}

#|
|| **Class** | **Status** ||
|| `InrollQueueProvider` | Removed. Use `instreamAd.instreamAdBreaks` filtered by `InstreamAdBreakType.INROLL`. ||
|| `PauserollQueueProvider` | Removed. Use `instreamAd.instreamAdBreaks` filtered by `InstreamAdBreakType.PAUSEROLL`. ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  // 1. Get In-roll queue from loaded ad
  val inrollQueueProvider = InrollQueueProvider(context, instreamAd)
  val instreamAdBreakQueue = inrollQueueProvider.queue

  // 2. Prepare specific ad break
  val currentInroll = instreamAdBreakQueue.poll()
  currentInroll?.setListener(object : InstreamAdBreakEventListener {
      override fun onInstreamAdBreakPrepared() {
          // 3. Show prepared ad break
          currentInroll.play(instreamAdView)
      }
      // ... other listener methods
  })
  currentInroll?.prepare(instreamAdPlayer)
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  // 1. Get list of all ad breaks directly from InstreamAd
  val inrolls = instreamAd.instreamAdBreaks.filter {
      it.adBreakData.type == InstreamAdBreakType.INROLL
  }

  // 2. Prepare and show
  val inrollIndex = 0 // Manage the index yourself
  val currentInroll = inrolls.getOrNull(inrollIndex)

  currentInroll?.setListener(object : InstreamAdBreakEventListener {
      override fun onInstreamAdBreakPrepared() {
          // 3. Show prepared ad break
          currentInroll.play(instreamAdView)
      }
  })
  currentInroll?.prepare(instreamAdPlayer)
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadAdBreak() {
  // 1. Get In-roll queue from loaded ad
      InrollQueueProvider inrollQueueProvider = new InrollQueueProvider(context, instreamAd);
      Queue<Inroll> instreamAdBreakQueue = inrollQueueProvider.getQueue();

  // 2. Prepare specific ad break
      Inroll currentInroll = instreamAdBreakQueue.poll();
      if (currentInroll != null) {
          currentInroll.setListener(new InstreamAdBreakEventListener() {
              @Override
              public void onInstreamAdBreakPrepared() {
                  // 3. Show prepared ad break
                  currentInroll.play(instreamAdView);
              }
              // ... other listener methods
          });
          currentInroll.prepare(instreamAdPlayer);
      }
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadAdBreak() {
      // 1. Get list of all ad breaks directly from InstreamAd
      List<InstreamAdBreak> inrolls = new ArrayList<>();
      for (InstreamAdBreak adBreak : instreamAd.getInstreamAdBreaks()) {
          if (adBreak.getAdBreakData().getType() == InstreamAdBreakType.INROLL) {
              inrolls.add(adBreak);
          }
      }

      // 2. Prepare and show
      int inrollIndex = 0; // Manage the index yourself
      InstreamAdBreak currentInroll = inrollIndex < inrolls.size() ? inrolls.get(inrollIndex) : null;

      if (currentInroll != null) {
          currentInroll.setListener(new InstreamAdBreakEventListener() {
              @Override
              public void onInstreamAdBreakPrepared() {
                  // 3. Show prepared ad break
                  currentInroll.play(instreamAdView);
              }
          });
          currentInroll.prepare(instreamAdPlayer);
      }
  }
  ```
  ||
  |#

{% endlist %}

### 5. Default player

Passing player info for video rendering is now optional. If `null` is passed, the SDK takes full control over video rendering.

#|
|| **Class** | **Method** | **Status** ||
|| `InstreamAdBinder` | Builder | The `instreamAdPlayer` parameter is now optional and can be set to `null`. ||
|| `InstreamAdBreak` | `prepare(instreamAdPlayer)` | Removed. Use `prepare()` with no parameter. ||
|| ^ | `prepare()` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  // Automatic launch (InstreamAdBinder)
  val instreamAdBinder = InstreamAdBinder(
      context,
      instreamAd,
      instreamAdPlayer, // Player was required
      contentPlayer
  )

  // Manual launch (InstreamAdBreak)
  val adBreak: InstreamAdBreak
  adBreak.prepare(instreamAdPlayer)
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  // Automatic launch (InstreamAdBinder)
  // Default ad player is used when the parameter is omitted
  val instreamAdBinder = InstreamAdBinder(
      context,
      instreamAd,
      contentPlayer
  )

  // Manual launch (InstreamAdBreak)
  val adBreak: InstreamAdBreak
  adBreak.prepare()
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void showAd() {
      // Automatic launch (InstreamAdBinder)
      InstreamAdBinder instreamAdBinder = new InstreamAdBinder(
              context,
              instreamAd,
              instreamAdPlayer, // Player was required
              contentPlayer
      );

      // Manual launch (InstreamAdBreak)
      InstreamAdBreak adBreak;
      adBreak.prepare(instreamAdPlayer);
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void showAd() {
      // Automatic launch (InstreamAdBinder)
      // Default ad player is used when the parameter is omitted
      InstreamAdBinder instreamAdBinder = new InstreamAdBinder(
              context,
              instreamAd,
              contentPlayer
      );

      // Manual launch (InstreamAdBreak)
      InstreamAdBreak adBreak;
      adBreak.prepare();
  }
  ```
  ||
  |#

{% endlist %}

### 6. Changes to the InstreamAdPlayer interface

The `InstreamAdPlayer` interface has been updated to include the `supportedMimeTypes` property for optimized video format selection and the `bindPlayerView` method for correct positioning of ad elements on top of a video.

#|
|| **Class** | **Method** | **Status** ||
|| `InstreamAdPlayer` | `supportedMimeTypes: List<String>` | Added. Allows the SDK to select the most suitable video format, such as DASH instead of MP4. ||
|| ^ | `bindPlayerView(container: FrameLayout)` | Added. The `videoPlayerView` must be placed inside the provided container and set to fill the entire space. ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  class InstreamAdPlayerImpl : InstreamAdPlayer {
      // ... methods (prepareAd, playAd, pauseAd, etc.)
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  class InstreamAdPlayerImpl : InstreamAdPlayer {

      // 1. List of MIME types supported by the player
      override val supportedMimeTypes: List<String>
          get() = listOf(InstreamAdMimeTypes.MP4, InstreamAdMimeTypes.WEBM)

      // 2. The videoPlayerView must be placed inside the container and set to fill the entire space
      override fun bindPlayerView(container: FrameLayout) {
          container.addView(playerView)
      }

      // ... other methods (prepareAd, playAd, pauseAd, etc.)
  }
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  public class InstreamAdPlayerImpl implements InstreamAdPlayer {
      // ... methods (prepareAd, playAd, pauseAd, etc.)
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  public class InstreamAdPlayerImpl implements InstreamAdPlayer {

      // 1. List of MIME types supported by the player
      @Override
      public List<String> getSupportedMimeTypes() {
          return Arrays.asList(InstreamAdMimeTypes.MP4, InstreamAdMimeTypes.WEBM);
      }

      // 2. The videoPlayerView must be placed inside the container and set to fill the entire space
      @Override
      public void bindPlayerView(FrameLayout container) {
          container.addView(playerView);
      }

      // ... other methods (prepareAd, playAd, pauseAd, etc.)
  }
  ```
  ||
  |#

{% endlist %}

## Changes to the mediation networks API.

### 1. New API for passing mediation network data

Identification of mediation adapters is now part of a separate method.

#|
|| **Class** | **Status** ||
|| `AdapterIdentity` | Added ||
|#

#|
|| **Class** | **Method** | **Status** ||
|| `YandexAds` | `setAdapterIdentity(AdapterIdentity)` | Added. Call this method before calling `YandexAds.initialize` instead of passing adapter data as additional parameters in ad requests. ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  YandexAds.initialize(context, listener)

  val parameters = mapOf(
      "adapter_network_name" to "AdNetwork",
      "adapter_network_version" to "1.2.3",
      "adapter_version" to "1.0.0"
  )

  val adRequest = AdRequest.Builder()
      .setParameters(parameters)
      .build()

  bannerAd.loadAd(adRequest)
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  val identity = AdapterIdentity("AdNetwork", "1.0.0", "1.2.3")
  YandexAds.setAdapterIdentity(identity) // Call before initialize()
  YandexAds.initialize(context, listener)

  // No need to pass additional parameters
  val adRequest = AdRequest.Builder("R-M-XXXXX-YY").build()
  bannerAd.loadAd(adRequest)
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadAd() {
      Map<String, String> parameters = new HashMap<>();
      parameters.put("adapter_network_name", "AdNetwork");
      parameters.put("adapter_network_version", "1.2.3");
      parameters.put("adapter_version", "1.0.0");

      AdRequest adRequest = new AdRequest.Builder()
              .setParameters(parameters)
              .build();

      bannerView.loadAd(adRequest);
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadAd() {
      AdapterIdentity adapterIdentity = new AdapterIdentity("AdNetwork", "1.0.0", "1.2.3");
      YandexAds.setAdapterIdentity(adapterIdentity); // Call before initialize()
      YandexAds.initialize(this, () -> { /* ... */ });

      // No need to pass additional parameters
      AdRequest adRequest = new AdRequest.Builder("R-M-XXXXX-YY").build();

      bannerView.loadAd(adRequest);
  }
  ```
  ||
  |#

{% endlist %}

### 2. Renaming and simplifying the BidderTokenRequest class

- The `BidderTokenLoader` class now has a builder, and the `loadBidderToken` static method is now an instance method.
- The `BidderTokenRequestConfiguration` class has been renamed to `BidderTokenRequest` and updated.
- To create an instance, use the `banner`, `interstitial`, `rewarded`, `appOpenAd`, and `native` factory methods instead of `Builder(AdType)`.

#|
|| **Class** | **Status** ||
|| `BidderTokenRequestConfiguration` | Removed. Use `BidderTokenRequest`. ||
|| `BidderTokenRequestConfiguration.Builder` | Removed. Use factory methods in `BidderTokenRequest`. ||
|| `BidderTokenRequest` | Added ||
|#

#|
|| **Class** | **Builder/Method** | **Status** ||
|| `BidderTokenLoader` | `BidderTokenLoader(Context)` | Now has a builder ||
|| ^ | `loadBidderToken` | Updated. The static method is now an instance method of the `BidderTokenLoader` class. ||

|| `BidderTokenRequestConfiguration.Builder` | `setBannerAdSize(BannerAdSize)` | Removed. Pass `BannerAdSize` to the `BidderTokenRequest.banner(BannerAdSize)` method parameters. ||
|| ^ | `setParameters(Map<String, String>)` | Removed. Pass parameters to the arguments of factory methods. ||
|| `BidderTokenRequest` | `banner(BannerAdSize)` | Added ||
|| ^ | `banner(BannerAdSize, AdTargeting)` | Added ||
|| ^ | `banner(BannerAdSize, AdTargeting, Map<String, String>)` | Added ||
|| ^ | `interstitial()` | Added ||
|| ^ | `interstitial(AdTargeting)` | Added ||
|| ^ | `interstitial(AdTargeting, Map<String, String>)` | Added ||
|| ^ | `rewarded()` | Added ||
|| ^ | `rewarded(AdTargeting)` | Added ||
|| ^ | `rewarded(AdTargeting, Map<String, String>)` | Added ||
|| ^ | `appOpenAd()` | Added ||
|| ^ | `appOpenAd(AdTargeting)` | Added ||
|| ^ | `appOpenAd(AdTargeting, Map<String, String>)` | Added ||
|| ^ | `native()` | Added ||
|| ^ | `native(AdTargeting)` | Added ||
|| ^ | `native(AdTargeting, Map<String, String>)` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  val bidderTokenRequest = BidderTokenRequestConfiguration.Builder(AdType.INTERSTITIAL)
      .setBannerAdSize(BannerAdSize.stickySize(this, screenWidth))
      .setParameters(mapOf("a" to "b"))
      .build()

  BidderTokenLoader.loadBidderToken(
      this,
      bidderTokenRequest,
      object : BidderTokenLoadListener { /* ... */ }
  )
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  val bidderTokenLoader = BidderTokenLoader(this);
  bidderTokenLoader.loadBidderToken(
      BidderTokenRequest.banner(BannerAdSize.sticky(this, screenWidth), parameters = mapOf("a" to "b")),
      object : BidderTokenLoadListener { /* ... */ }
  )

  bidderTokenLoader.loadBidderToken(
      BidderTokenRequest.interstitial(),
      object : BidderTokenLoadListener { /* ... */ }
  )
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadToken() {
      Map<String, String> parameters = new HashMap<>();
      parameters.put("a", "b");

      BidderTokenRequestConfiguration bidderTokenRequest =
              new BidderTokenRequestConfiguration.Builder(AdType.INTERSTITIAL)
                      .setBannerAdSize(BannerAdSize.stickySize(this, screenWidth))
                      .setParameters(parameters)
                      .build();

      BidderTokenLoader.loadBidderToken(
              this,
              bidderTokenRequest,
              new BidderTokenLoadListener() { /* ... */ }
      );
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadToken() {
      Map<String, String> parameters = new HashMap<>();
      parameters.put("a", "b");

      BidderTokenLoader bidderTokenLoader = new BidderTokenLoader(this);
      bidderTokenLoader.loadBidderToken(
              BidderTokenRequest.banner(BannerAdSize.inline(this, screenWidth), null, parameters),
              new BidderTokenLoadListener() { /* ... */ }
      );

      bidderTokenLoader.loadBidderToken(BidderTokenRequest.interstitial(),
              new BidderTokenLoadListener() { /* ... */ }
      );
  }
  ```
  ||
  |#

{% endlist %}

## Jetpack Compose integration

We've added support for integration via Jetpack Compose. See the Jetpack Compose section at the end of the Android documentation menu:

Integration examples:
- [App open ads](https://ads.yandex.com/helpcenter/en/dev/android/compose/app-open-ad.md)
- [Interstitial advertising](https://ads.yandex.com/helpcenter/en/dev/android/compose/interstitial.md)
- [Rewarded ads](https://ads.yandex.com/helpcenter/en/dev/android/compose/rewarded.md)
- [Adaptive inline banner](https://ads.yandex.com/helpcenter/en/dev/android/compose/adaptive-inline-banner.md)
- [Adaptive sticky banner](https://ads.yandex.com/helpcenter/en/dev/android/compose/adaptive-sticky-banner.md)

## Migration using AI tools {#ai}

To simplify migration from SDK 7.x to 8.x, you can use AI assistants with a ready-made migration skill.

### How to use

1. **Load the skill**

    The migration skill is available on [GitHub Yandex Ads SDK Android](https://github.com/yandexmobile/yandex-ads-sdk-android/tree/master/YandexMobileAdsExample/skills/migrate-yandex-ads-sdk-from-7-to-8).

    - For Claude Desktop

        Copy the skill folder into your agent's skills directory, for example:

        ```bash
        cp -r Skills/migrate-yandex-ads-sdk-from-7-to-8 .claude/skills/
        ```

    - For Cursor IDE

        Copy the skill folder into your project and reference the `SKILL.md` file via `@`, for example:

        ```
        @migrate-yandex-ads-sdk-from-7-to-8/SKILL.md
        ```

    - Alternative method

        Copy the contents of `SKILL.md` and all related files into the dialog with the AI assistant (however, this may exceed message limits).

2. **Use the prompt**

    After loading the skill, use the following prompt in the dialog with the AI assistant:

    ```
    Migrate my project from Yandex Mobile Ads SDK 7.x to 8.x
    ```

{% note warning "" %}

Always carefully review the changes generated by AI.

Although skills help AI assistants perform tasks correctly, you must personally check and verify all changes made by the agent. AI assistants can make mistakes, so manual code review is necessary.

{% endnote %}

## Requirements

- **Gradle**: 7.0 or later
- **Android Gradle plugin**: 8.3.2 or later
- **Android SDK**: 21 (Android 5.0) or later
- **Kotlin**: 1.9.0 or later
- **Java**: 8 or later


