> ## Documentation Index
> Fetch the complete documentation index at: https://help.airbridge.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Yandex Mobile Ads

<Info>
  **Note**

  This feature is currently in beta. If you have any questions or suggestions for improvements, reach out to your Airbridge CSM. If you don't have a dedicated CSM, contact us through the [Airbridge Help Center](https://app.airbridge.io/supports).
</Info>

Airbridge supports SDK integration with Yandex Mobile Ads. With the integration, you can import the ad revenue into Airbridge.

## SDK Integration

Click the link below and install theYandex Mobile Ads SDK.

* [Yandex Mobile Ads SDK Android Install Guide](https://ads.yandex.com/helpcenter/en/dev/android/quick-start)
* [Yandex Mobile Ads SDK iOS Install Guide](https://ads.yandex.com/helpcenter/en/dev/ios/quick-start)
* [Yandex Mobile Ads SDK Unity Install Guide](https://ads.yandex.com/helpcenter/en/dev/unity/quick-start)

### Send Yandex Mobile Ad revenue data to Airbridge

The impression-level ad revenue should be enabled in Yandex Mobile Ads to send ad revenue data to Airbridge. Refer to the following article on enabling impression-level ad revenue.

<AccordionGroup>
  <Accordion title="SDK integration (Android)">
    #### Android SDK

    <CodeGroup>
      ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      data class ImpressionDataModel(
          val ad_unit_id: String,
          val adType: String,
          val currency: String,
          val revenue: String,
          val revenueUSD: String,
          val precision: String,
          val network: NetworkData
      )

      data class NetworkData(
          val name: String,
          val ad_unit_id: String
      )

      class ExampleNativeAdEventListener : NativeAdEventListener {
          // ...
          override fun onImpression(data: ImpressionData?) {
              val impressionData = data?.rawData?.let {
                  try {
                      Gson().fromJson(it, ImpressionDataModel::class.java)
                  } catch (_: Throwable) {
                      null
                  }
              } ?: return

              Airbridge.trackEvent(
                  AirbridgeCategory.AD_IMPRESSION, mutableMapOf(
                      AirbridgeAttribute.ACTION to impressionData.network.name,
                      AirbridgeAttribute.LABEL to impressionData.adType,
                      AirbridgeAttribute.VALUE to impressionData.revenue.toDoubleOrNull(),
                      AirbridgeAttribute.CURRENCY to impressionData.currency,
                      AirbridgeAttribute.AD_PARTNERS to mapOf(
                          "yandex" to mapOf(
                              "revenue" to impressionData.revenue,
                              "revenue_usd" to impressionData.revenueUSD,
                              "precision" to impressionData.precision,
                              "ad_unit_id" to impressionData.ad_unit_id,
                              "ad_network" to impressionData.network.name,
                              "ad_network_ad_unit_id" to impressionData.network.ad_unit_id,
                          )
                      )
                  )
              )
          }
          // ...
      }
      ```

      ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      public class ExampleNativeAdEventListener implements NativeAdEventListener {
          class ImpressionDataModel {
              String ad_unit_id;
              String adType;
              String currency;
              String revenue;
              String revenueUSD;
              String precision;
              NetworkData network;
          }

          class NetworkData {
              String name;
              String ad_unit_id;
          }

          @Override
          public void onImpression(@Nullable ImpressionData data) {
              if (data == null || data.getRawData() == null) {
                  return;
              }
              ImpressionDataModel impressionData;
              try {
                  impressionData = new Gson().fromJson(data.getRawData(), ImpressionDataModel.class);
              } catch (Throwable throwable) {
                  return;
              }

              Airbridge.trackEvent(
                      AirbridgeCategory.AD_IMPRESSION,
                      new HashMap<String, Object>() {{
                          put(AirbridgeAttribute.ACTION, impressionData.network.name);
                          put(AirbridgeAttribute.LABEL, impressionData.adType);
                          try {
                              put(AirbridgeAttribute.VALUE, Double.parseDouble(impressionData.revenue));
                          } catch (NumberFormatException e) {
                              // Handle exception
                          }
                          put(AirbridgeAttribute.CURRENCY, impressionData.currency);
                          put(AirbridgeAttribute.AD_PARTNERS, new HashMap<String, Object>() {{
                              put("yandex", new HashMap<String, Object>() {{
                                  put("revenue", impressionData.revenue);
                                  put("revenue_usd", impressionData.revenueUSD);
                                  put("precision", impressionData.precision);
                                  put("ad_unit_id", impressionData.ad_unit_id);
                                  put("ad_network", impressionData.network.name);
                                  put("ad_network_ad_unit_id", impressionData.network.ad_unit_id);
                              }});
                          }});
                      }});
          }
      }
      ```
    </CodeGroup>

    #### Android SDK (Deprecated)

    <CodeGroup>
      ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      data class ImpressionDataModel(
          val ad_unit_id: String,
          val adType: String,
          val currency: String,
          val revenue: String,
          val revenueUSD: String,
          val precision: String,
          val network: NetworkData
      )

      data class NetworkData(
          val name: String,
          val ad_unit_id: String
      )

      class ExampleNativeAdEventListener : NativeAdEventListener {
          // ...
          override fun onImpression(data: ImpressionData?) {
              val impressionData = data?.rawData?.let {
                  try {
                      Gson().fromJson(it, ImpressionDataModel::class.java)
                  } catch (_: Throwable) {
                      null
                  }
              } ?: return

              val event = Event("airbridge.adImpression")
              val yandex = mutableMapOf<String, Any?>()
              yandex["revenue"] = impressionData.revenue
              yandex["revenue_usd"] = impressionData.revenueUSD
              yandex["precision"] = impressionData.precision
              yandex["ad_unit_id"] = impressionData.ad_unit_id
              yandex["ad_network"] = impressionData.network.name
              yandex["ad_network_ad_unit_id"] = impressionData.network.ad_unit_id

              val adPartners = mapOf("yandex" to yandex)
              event.action = impressionData.network.name
              event.label = impressionData.adType
              impressionData.revenue.toDoubleOrNull()?.let {
                  event.value = it
              }
              event.semanticAttributes = mutableMapOf(
                  "adPartners" to adPartners,
                  "currency" to impressionData.currency
              )

              Airbridge.trackEvent(event)
          }
          // ...
      }
      ```

      ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      public class ExampleNativeAdEventListener implements NativeAdEventListener {
          class ImpressionDataModel {
              String ad_unit_id;
              String adType;
              String currency;
              String revenue;
              String revenueUSD;
              String precision;
              NetworkData network;
          }

          class NetworkData {
              String name;
              String ad_unit_id;
          }

          @Override
          public void onImpression(@Nullable ImpressionData data) {
              if (data == null || data.getRawData() == null) {
                  return;
              }
              ImpressionDataModel impressionData;
              try {
                  impressionData = new Gson().fromJson(data.getRawData(), ImpressionDataModel.class);
              } catch (Throwable throwable) {
                  return;
              }

              Event event = new Event("airbridge.adImpression");
              Map<String, Object> yandex = new HashMap<>();
              yandex.put("revenue", impressionData.revenue);
              yandex.put("revenue_usd", impressionData.revenueUSD);
              yandex.put("precision", impressionData.precision);
              yandex.put("ad_unit_id", impressionData.ad_unit_id);
              yandex.put("ad_network", impressionData.network.name);
              yandex.put("ad_network_ad_unit_id", impressionData.network.ad_unit_id);

              Map<String, Object> adPartners = new HashMap<>();
              adPartners.put("yandex", yandex);

              Map<String, Object> semanticAttributes = new HashMap<>();
              semanticAttributes.put("adPartners", adPartners);
              semanticAttributes.put("currency", impressionData.currency);

              event.setAction(impressionData.network.name);
              event.setLabel(impressionData.adType);
              try {
                  event.setValue(Double.parseDouble(impressionData.revenue));
              } catch (NumberFormatException e) {
                  // Handle exception
              }
              event.setSemanticAttributes(semanticAttributes);
              Airbridge.trackEvent(event);
          }
      }
      ```
    </CodeGroup>
  </Accordion>

  <Accordion title="SDK integration (iOS)">
    #### iOS SDK

    <CodeGroup>
      ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      struct NetworkData: Decodable {
          let name: String
          let ad_unit_id: String
      }
      struct ImpressionDataModel: Decodable {
          let ad_unit_id: String
          let adType: String
          let currency: String
          let revenue: String
          let revenueUSD: String
          let precision: String
          let network: NetworkData
      }

      extension ViewController: AdViewDelegate {
          // ...
          func adView(_ adView: AdView, didTrackImpressionWith impressionData: ImpressionData?) {
              guard
                  let raw = impressionData?.rawData,
                  let jsonData = raw.data(using: .utf8)
              else {
                  return
              }

              do {
                  let parsedData = try JSONDecoder().decode(ImpressionDataModel.self, from: jsonData)

                  var semanticAttributes: [String: Any] = [
                      AirbridgeAttribute.ACTION: parsedData.network.name,
                      AirbridgeAttribute.LABEL: parsedData.adType,
                      AirbridgeAttribute.CURRENCY: parsedData.currency,
                      AirbridgeAttribute.AD_PARTNERS: [
                          "yandex": [
                              "revenue": parsedData.revenue,
                              "revenue_usd": parsedData.revenueUSD,
                              "precision": parsedData.ad_unit_id,
                              "ad_unit_id": parsedData.network.ad_unit_id,
                              "ad_network": parsedData.network.name,
                              "ad_network_ad_unit_id": parsedData.precision
                          ]
                      ]
                  ]
                  if let value = Double(parsedData.revenue) {
                      semanticAttributes[AirbridgeAttribute.VALUE] = value
                  }

                  Airbridge.trackEvent(
                      category: AirbridgeCategory.AD_IMPRESSION,
                      semanticAttributes: semanticAttributes
                  )
              } catch {
                  print("Failed to parse JSON: \(error.localizedDescription)")
              }
          }
      }
      ```

      ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      @interface NetworkData : NSObject
      @property (nonatomic, strong) NSString *name;
      @property (nonatomic, strong) NSString *ad_unit_id;
      @end

      @implementation NetworkData
      @end

      @interface ImpressionDataModel : NSObject
      @property (nonatomic, strong) NSString *ad_unit_id;
      @property (nonatomic, strong) NSString *adType;
      @property (nonatomic, strong) NSString *currency;
      @property (nonatomic, strong) NSString *revenue;
      @property (nonatomic, strong) NSString *revenueUSD;
      @property (nonatomic, strong) NSString *precision;
      @property (nonatomic, strong) NetworkData *network;
      @end

      @implementation ImpressionDataModel
      @end

      @implementation ViewController

      - (void)adView:(AdView *)adView didTrackImpressionWith:(ImpressionData *)impressionData {
          NSString *raw = impressionData.rawData;
          if (!raw) return;
          NSData *jsonData = [raw dataUsingEncoding:NSUTF8StringEncoding];
          if (!jsonData) return;
          NSError *error;
          NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
          if (error) {
              NSLog(@"Failed to parse JSON: %@", error.localizedDescription);
              return;
          }
          ImpressionDataModel *parsedData = [[ImpressionDataModel alloc] init];
          parsedData.ad_unit_id = dict[@"ad_unit_id"];
          parsedData.adType = dict[@"adType"];
          parsedData.currency = dict[@"currency"];
          parsedData.revenue = dict[@"revenue"];
          parsedData.revenueUSD = dict[@"revenueUSD"];
          parsedData.precision = dict[@"precision"];
          NSDictionary *networkDict = dict[@"network"];
          if ([networkDict isKindOfClass:[NSDictionary class]]) {
              NetworkData *network = [[NetworkData alloc] init];
              network.name = networkDict[@"name"];
              network.ad_unit_id = networkDict[@"ad_unit_id"];
              parsedData.network = network;
          }
          NSMutableDictionary *semanticAttributes = [NSMutableDictionary dictionary];
          semanticAttributes[AirbridgeAttribute.ACTION] = parsedData.network.name;
          semanticAttributes[AirbridgeAttribute.LABEL] = parsedData.adType;
          double revenueValue = [parsedData.revenue doubleValue];
          if (revenueValue > 0) {
              semanticAttributes[AirbridgeAttribute.VALUE] = revenueValue;
          }
          semanticAttributes[AirbridgeAttribute.CURRENCY] = parsedData.currency;
          semanticAttributes[AirbridgeAttribute.AD_PARTNERS] = @{
              @"yandex": @{
                  @"revenue": parsedData.revenue,
                  @"revenue_usd": parsedData.revenueUSD,
                  @"precision": parsedData.ad_unit_id,
                  @"ad_unit_id": parsedData.network.ad_unit_id,
                  @"ad_network": parsedData.network.name,
                  @"ad_network_ad_unit_id": parsedData.precision
              }
          }
          [Airbridge trackEventWithCategory:AirbridgeCategory.AD_IMPRESSION 
                     semanticAttributes:semanticAttributes];
      }

      @end
      ```
    </CodeGroup>

    #### iOS SDK (Deprecated)

    <CodeGroup>
      ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      struct NetworkData: Decodable {
          let name: String
          let ad_unit_id: String
      }
      struct ImpressionDataModel: Decodable {
          let ad_unit_id: String
          let adType: String
          let currency: String
          let revenue: String
          let revenueUSD: String
          let precision: String
          let network: NetworkData
      }

      extension ViewController: AdViewDelegate {
          // ...
          func adView(_ adView: AdView, didTrackImpressionWith impressionData: ImpressionData?) {
              guard
                  let raw = impressionData?.rawData,
                  let jsonData = raw.data(using: .utf8)
              else {
                  return
              }

              do {
                  let parsedData = try JSONDecoder().decode(ImpressionDataModel.self, from: jsonData)

                  let event = ABInAppEvent()
                  event?.setCategory("airbridge.adImpression")
                  event?.setAction(parsedData.network.name)
                  event?.setLabel(parsedData.adType)
                  if let value = Double(parsedData.revenue) {
                      event?.setValue(value)
                  }
                  event?.setSemantics([
                      "adPartners": [
                          "yandex": [
                              "revenue": parsedData.revenue,
                              "revenue_usd": parsedData.revenueUSD,
                              "precision": parsedData.ad_unit_id,
                              "ad_unit_id": parsedData.network.ad_unit_id,
                              "ad_network": parsedData.network.name,
                              "ad_network_ad_unit_id": parsedData.precision
                          ]
                      ],
                      "currency": parsedData.currency
                  ])

                  event?.send()
              } catch {
                  print("Failed to parse JSON: \(error.localizedDescription)")
              }
          }
      }
      ```

      ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      @interface NetworkData : NSObject
      @property (nonatomic, strong) NSString *name;
      @property (nonatomic, strong) NSString *ad_unit_id;
      @end

      @implementation NetworkData
      @end

      @interface ImpressionDataModel : NSObject
      @property (nonatomic, strong) NSString *ad_unit_id;
      @property (nonatomic, strong) NSString *adType;
      @property (nonatomic, strong) NSString *currency;
      @property (nonatomic, strong) NSString *revenue;
      @property (nonatomic, strong) NSString *revenueUSD;
      @property (nonatomic, strong) NSString *precision;
      @property (nonatomic, strong) NetworkData *network;
      @end

      @implementation ImpressionDataModel
      @end

      @implementation ViewController

      - (void)adView:(AdView *)adView didTrackImpressionWith:(ImpressionData *)impressionData {
          NSString *raw = impressionData.rawData;
          if (!raw) return;
          NSData *jsonData = [raw dataUsingEncoding:NSUTF8StringEncoding];
          if (!jsonData) return;
          NSError *error;
          NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
          if (error) {
              NSLog(@"Failed to parse JSON: %@", error.localizedDescription);
              return;
          }
          ImpressionDataModel *parsedData = [[ImpressionDataModel alloc] init];
          parsedData.ad_unit_id = dict[@"ad_unit_id"];
          parsedData.adType = dict[@"adType"];
          parsedData.currency = dict[@"currency"];
          parsedData.revenue = dict[@"revenue"];
          parsedData.revenueUSD = dict[@"revenueUSD"];
          parsedData.precision = dict[@"precision"];
          NSDictionary *networkDict = dict[@"network"];
          if ([networkDict isKindOfClass:[NSDictionary class]]) {
              NetworkData *network = [[NetworkData alloc] init];
              network.name = networkDict[@"name"];
              network.ad_unit_id = networkDict[@"ad_unit_id"];
              parsedData.network = network;
          }
          ABInAppEvent* event = [[ABInAppEvent alloc] init];
          [event setCategory:@"airbridge.adImpression"];
          [event setAction:parsedData.network.name];
          [event setLabel:parsedData.adType];
          double revenueValue = [parsedData.revenue doubleValue];
          if (revenueValue > 0) {
              [event setValue:revenueValue];
          }
          [event setSemantics:@{
              @"adPartners": @{
                  @"yandex": @{
                      @"revenue": parsedData.revenue,
                      @"revenue_usd": parsedData.revenueUSD,
                      @"precision": parsedData.ad_unit_id,
                      @"ad_unit_id": parsedData.network.ad_unit_id,
                      @"ad_network": parsedData.network.name,
                      @"ad_network_ad_unit_id": parsedData.precision
                  }
              },
              @"currency": parsedData.currency
          }];
          [event send];
      }

      @end
      ```
    </CodeGroup>
  </Accordion>

  <Accordion title="SDK integration (Unity)">
    #### Unity SDK

    <CodeGroup>
      ```c# C# lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      [Serializable]
      public class ImpressionDataModel
      {
          public string ad_unit_id;
          public string adType;
          public string currency;
          public string revenue;
          public string revenueUSD;
          public string precision;
          public NetworkData network;
      }
      [Serializable]
      public class NetworkData
      {
          public string name;
          public string ad_unit_id;
      }
      class ExampleNativeAdEventListener : NativeAdEventListener
      {
          // ...
          public void HandleImpression(object sender, ImpressionData impressionData)
          {
              var data = impressionData == null ? "null" : impressionData.rawData;
              try
              {
                  var parsedData = Newtonsoft.Json.JsonConvert.DeserializeObject<ImpressionDataModel>(data);
                 
                  var semanticAttributes = new Dictionary<string, object>()
                  {
                      { AirbridgeAttribute.ACTION, parsedData.network.name },
                      { AirbridgeAttribute.LABEL, parsedData.adType },
                      { AirbridgeAttribute.CURRENCY, parsedData.currency },
                      {
                          AirbridgeAttribute.AD_PARTNERS, new Dictionary<string, object>()
                              {
                              "yandex", new Dictionary<string, object>()
                                  {
                                      { "revenue", parsedData.revenue },
                                      { "revenue_usd", parsedData.revenueUSD }
                                      { "precision", parsedData.precision },
                                      { "ad_unit_id", parsedData.ad_unit_id },
                                      { "ad_network", parsedData.network.name },
                                      { "ad_network_ad_unit_id", parsedData.network.ad_unit_id }
                                  }
                              }
                      }
                  }
                  if (double.TryParse(parsedData.revenue, out double result))
                  {
                      semanticAttributes[AirbridgeAttribute.VALUE] = result;
                  }

                  Airbridge.TrackEvent(
                      category: AirbridgeCategory.AD_IMPRESSION,
                      semanticAttributes: semanticAttributes
                  );
              }
              catch (Exception ex)
              {
                  Debug.LogError($"Error parsing impression data: {ex.Message}");
              }
          }
          //..
      }
      ```
    </CodeGroup>

    #### Unity SDK (Deprecated)

    <CodeGroup>
      ```c# C# lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      [Serializable]
      public class ImpressionDataModel
      {
          public string ad_unit_id;
          public string adType;
          public string currency;
          public string revenue;
          public string revenueUSD;
          public string precision;
          public NetworkData network;
      }
      [Serializable]
      public class NetworkData
      {
          public string name;
          public string ad_unit_id;
      }
      class ExampleNativeAdEventListener : NativeAdEventListener
      {
          // ...
          public void HandleImpression(object sender, ImpressionData impressionData)
          {
              var data = impressionData == null ? "null" : impressionData.rawData;
              try
              {
                  var parsedData = Newtonsoft.Json.JsonConvert.DeserializeObject<ImpressionDataModel>(data);
                 
                  AirbridgeEvent @event = new AirbridgeEvent("airbridge.adImpression");
                  var yango = new Dictionary<string, object>();
                  yango["revenue"] = parsedData.revenue;
                  yango["revenue_usd"] = parsedData.revenueUSD;
                  yango["precision"] = parsedData.precision;
                  yango["ad_unit_id"] = parsedData.ad_unit_id;
                  yango["ad_network"] = parsedData.network.name;
                  yango["ad_network_ad_unit_id"] = parsedData.network.ad_unit_id;

                  var adPartners = new Dictionary<string, object>();
                  adPartners["yandex"] = yango;

                  @event.SetAction(parsedData.network.name);
                  @event.SetLabel(parsedData.adType);
                  if (double.TryParse(parsedData.revenue, out double result))
                  {
                      @event.SetValue(result);
                  }
                  @event.AddSemanticAttribute("adPartners", adPartners);
                  @event.AddSemanticAttribute("currency", parsedData.currency);

                  AirbridgeUnity.TrackEvent(@event);
              }
              catch (Exception ex)
              {
                  Debug.LogError($"Error parsing impression data: {ex.Message}");
              }
          }
          //..
      }
      ```
    </CodeGroup>
  </Accordion>
</AccordionGroup>

<link rel="alternate" hrefLang="en" href="https://help.airbridge.io/en/developers/yandex-mobile-ads-sdk-ad-revenue-integration" />

<link rel="alternate" hrefLang="ko" href="https://help.airbridge.io/ko/developers/yandex-mobile-ads-sdk-ad-revenue-integration" />
