> ## 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.

# Unity LevelPlay (ironSource)

<div id="note" />

<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 server-to-server (S2S) and SDK integration with Unity LevelPlay (ironSource). With the integration, you can import the ad revenue into Airbridge.

<div id="recommended-integration-method" />

<Note>
  **Recommended integration method**

  We recommend implementing both S2S integration and SDK integration for more accurate measurement.

  Make sure to check the [version of the SDK](/en/guides/applovin-max#pre-setup) you installed before implementing both S2S integration and SDK integration. You must have a certain version or later of the installed SDK to set up all integrations properly. If your SDK version is earlier than the required version, the user count will not be accurately aggregated after integration.

  Airbridge automatically updates the data received through SDK integration in real-time with the enriched data received through S2S integration. The data received through SDK integration can also be used to set up SKAN conversion values.
</Note>

<h2 id="prerequisite">
  Prerequisite
</h2>

Check the Airbridge SDK version installed in the app. If it is earlier than the versions listed below, proceed with only S2S integration or SDK integration.

<div id="attention" />

<Danger>
  **Attention**

  If you want to proceed with both S2S and SDK integrations, make sure the Airbridge SDK version installed in the app meets the requirements.

  It is advised to proceed with the integrations once a sufficient number of users have updated their app to the version with the required Airbridge SDK version. If most of your users still have the app with the Airbridge SDK version earlier than the required version, the user count may not be accurately aggregated in Airbridge.
</Danger>

* Android SDK 2.25.0
* iOS SDK 1.37.3
* React Native SDK 2.8.6
* Flutter SDK 3.5.6
* Cordova SDK 2.6.6
* Expo SDK 2.6.6
* Unity SDK 1.14.5
* Unreal SDK 1.3.5

<h2 id="sdk-integration">
  SDK Integration
</h2>

Click the link below and install the ironSource SDK.

* [ironSource Android SDK install guide](https://developers.is.com/ironsource-mobile/android/android-sdk/)
* [ironSource iOS SDK install guide](https://developers.is.com/ironsource-mobile/ios/ios-sdk/)
* [ironSource Unity SDK install guide](https://developers.is.com/ironsource-mobile/unity/unity-plugin/)

Configure the ad revenue data callback to send the ad revenue data to the Airbridge SDK.

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

    <CodeGroup>
      ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      override fun onImpressionSuccess(impressionData: ImpressionData) {
          if (impressionData != null) {

              Airbridge.trackEvent(
                  AirbridgeCategory.AD_IMPRESSION,
                  mapOf(
                      AirbridgeAttribute.ACTION to impressionData.adNetwork,
                      AirbridgeAttribute.LABEL to impressionData.placement,
                      AirbridgeAttribute.VALUE to impressionData.revenue,
                      AirbridgeAttribute.AD_PARTNERS to mapOf(
                          // optional fields
                          "ironSource" to mapOf(
                              "auction_id" to impressionData.auctionId,
                              "ad_unit" to impressionData.adUnit,
                              "ad_network" to impressionData.adNetwork,
                              "instance_name" to impressionData.instanceName,
                              "instance_id" to impressionData.instanceId,
                              "country" to impressionData.country,
                              "placement" to impressionData.placement,
                              "revenue" to impressionData.revenue,
                              "precision" to impressionData.precision,
                              "ab" to impressionData.ab,
                              "segment_name" to impressionData.segmentName,
                              "lifetime_revenue" to impressionData.lifetimeRevenue,
                              "encrypted_cpm" to impressionData.encryptedCPM
                          )
                      ),
                      // ironSource has a default currency of USD
                      AirbridgeAttribute.CURRENCY to "USD"
                  )
              )
          }
      }
      ```

      ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      @Override
      public void onImpressionSuccess(ImpressionData impressionData) {
          if (impressionData != null) {

              Airbridge.trackEvent(
                  AirbridgeCategory.AD_IMPRESSION,
                  new HashMap() {{
                      put(AirbridgeAttribute.ACTION, impressionData.getAdNetwork());
                      put(AirbridgeAttribute.LABEL, impressionData.getPlacement());
                      put(AirbridgeAttribute.VALUE, impressionData.getRevenue());
                      put(AirbridgeAttribute.AD_PARTNERS, new HashMap() {{
                          put("ironSource", new HashMap() {{
                              // optional fields
                              put("auction_id", impressionData.getAuctionId());
                              put("ad_unit", impressionData.getAdUnit());
                              put("ad_network", impressionData.getAdNetwork());
                              put("instance_name", impressionData.getInstanceName());
                              put("instance_id", impressionData.getInstanceId());
                              put("country", impressionData.getCountry());
                              put("placement", impressionData.getPlacement());
                              put("revenue", impressionData.getRevenue());
                              put("precision", impressionData.getPrecision());
                              put("ab", impressionData.getAb());
                              put("segment_name", impressionData.getSegmentName());
                              put("lifetime_revenue", impressionData.getLifetimeRevenue());
                              put("encrypted_cpm", impressionData.getEncryptedCPM());
                          }});
                      }});
                      // ironSource has a default currency of USD
                      put(AirbridgeAttribute.CURRENCY, "USD");
                  }}
              );
          }
      }
      ```
    </CodeGroup>

    #### Android SDK (Deprecated)

    <CodeGroup>
      ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      override fun onImpressionSuccess(impressionData: ImpressionData?) {

          if (impressionData != null) {

              val event = Event("airbridge.adImpression")
              val ironSource = mutableMapOf<String, Any?>()

              // optional fields
              ironSource["auction_id"] = impressionData.auctionId
              ironSource["ad_unit"] = impressionData.adUnit
              ironSource["ad_network"] = impressionData.adNetwork
              ironSource["instance_name"] = impressionData.instanceName
              ironSource["instance_id"] = impressionData.instanceId
              ironSource["country"] = impressionData.country
              ironSource["placement"] = impressionData.placement
              ironSource["revenue"] = impressionData.revenue
              ironSource["precision"] = impressionData.precision
              ironSource["ab"] = impressionData.ab
              ironSource["segment_name"] = impressionData.segmentName
              ironSource["lifetime_revenue"] = impressionData.lifetimeRevenue
              ironSource["encrypted_cpm"] = impressionData.encryptedCPM

              val adPartners = mapOf("ironSource" to ironSource)
              event.action = impressionData.adNetwork
              event.label = impressionData.placement
              event.value = impressionData.revenue
              event.semanticAttributes = mutableMapOf(
                  "adPartners" to adPartners,
                  // ironSource has a default currency of USD
                  "currency" to "USD"
              )
              Airbridge.trackEvent(event)
          }
      }

      ```

      ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      @Override
      public void onImpressionSuccess(ImpressionData impressionData) {

          if (impressionData != null) {

              Event event = new Event("airbridge.adImpression");
              Map<String, Object> ironSource = new HashMap<>();

              // optional fields
              ironSource.put("auction_id", impressionData.getAuctionId());
              ironSource.put("ad_unit", impressionData.getAdUnit());
              ironSource.put("ad_network", impressionData.getAdNetwork());
              ironSource.put("instance_name", impressionData.getInstanceName());
              ironSource.put("instance_id", impressionData.getInstanceId());
              ironSource.put("country", impressionData.getCountry());
              ironSource.put("placement", impressionData.getPlacement());
              ironSource.put("revenue", impressionData.getRevenue());
              ironSource.put("precision", impressionData.getPrecision());
              ironSource.put("ab", impressionData.getAb());
              ironSource.put("segment_name", impressionData.getSegmentName());
              ironSource.put("lifetime_revenue", impressionData.getLifetimeRevenue());
              ironSource.put("encrypted_cpm", impressionData.getEncryptedCPM());

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

              // ironSource has a default currency of USD
              semanticAttributes.put("currency", "USD");

              event.setAction(impressionData.getAdNetwork());
              event.setLabel(impressionData.getPlacement());
              event.setValue(impressionData.getRevenue());
              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"}}
      import AirBridge
      import IronSource

      class ISImpressionDataManager: NSObject, ISImpressionDataDelegate {
          func impressionDataDidSucceed(_ impressionData: ISImpressionData!) {
              if let impressionData = impressionData {
                  var ironSource: [String: Any] = [:]

                  Airbridge.trackEvent(
                      category: AirbridgeCategory.AD_IMPRESSION,
                      semanticAttributes: [
                          AirbridgeAttribute.ACTION: impressionData.ad_network,
                          AirbridgeAttribute.LABEL: impressionData.placement,
                          AirbridgeAttribute.VALUE: impressionData.revenue,
                          AirbridgeAttribute.AD_PARTNERS: [
                              "ironSource": [
                                  // optional fields
                                  "auction_id": impressionData.auction_id,
                                  "ad_unit": impressionData.ad_unit,
                                  "ad_network": impressionData.ad_network,
                                  "instance_name": impressionData.instance_name,
                                  "instance_id": impressionData.instance_id,
                                  "country": impressionData.country,
                                  "placement": impressionData.placement,
                                  "revenue": impressionData.revenue,
                                  "precision": impressionData.precision,
                                  "ab": impressionData.ab,
                                  "segment_name": impressionData.segment_name,
                                  "lifetime_revenue": impressionData.lifetime_revenue,
                                  "encrypted_cpm": impressionData.encrypted_cpm
                              ]
                          ],
                          // ironSource has a default currency of USD
                          AirbridgeAttribute.CURRENCY: "USD"
                      ]
                  )
              }
          }
      }
      ```

      ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      #import "AirBridge.h"
      #import "ISImpressionDataManager.h"

      @interface ISImpressionDataManager () <ISImpressionDataDelegate>
      @end

      @implementation ISImpressionDataManager

      - (void)impressionDataDidSucceed:(ISImpressionData *)impressionData {
          if (impressionData) {
              NSMutableDictionary *ironSource = [NSMutableDictionary dictionary];

              [Airbridge trackEventWithCategory:AirbridgeCategory.AD_IMPRESSION semanticAttributes:@{
                  AirbridgeAttribute.ACTION: impressionData.ad_network,
                  AirbridgeAttribute.LABEL: impressionData.placement,
                  AirbridgeAttribute.VALUE: impressionData.revenue,
                  AirbridgeAttribute.AD_PARTNERS: @{
                      @"ironSource": @{
                          // optional fields
                          @"auction_id": impressionData.auction_id;
                          @"ad_unit": impressionData.ad_unit;
                          @"ad_network": impressionData.ad_network;
                          @"instance_name": impressionData.instance_name;
                          @"instance_id": impressionData.instance_id;
                          @"country": impressionData.country;
                          @"placement": impressionData.placement;
                          @"revenue": impressionData.revenue;
                          @"precision": impressionData.precision;
                          @"ab": impressionData.ab;
                          @"segment_name": impressionData.segment_name;
                          @"lifetime_revenue": impressionData.lifetime_revenue;
                          @"encrypted_cpm": impressionData.encrypted_cpm;
                      }
                  },
                  // ironSource has a default currency of USD
                  @"currency": @"USD"
              }];
          }
      }

      @end
      ```
    </CodeGroup>

    #### iOS SDK (Deprecated)

    <CodeGroup>
      ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      import AirBridge
      import IronSource

      class ISImpressionDataManager: NSObject, ISImpressionDataDelegate {
          func impressionDataDidSucceed(_ impressionData: ISImpressionData!) {
              if let impressionData = impressionData {
                  var ironSource: [String: Any] = [:]

                  // optional fields
                  ironSource["auction_id"] = impressionData.auction_id
                  ironSource["ad_unit"] = impressionData.ad_unit
                  ironSource["ad_network"] = impressionData.ad_network
                  ironSource["instance_name"] = impressionData.instance_name
                  ironSource["instance_id"] = impressionData.instance_id
                  ironSource["country"] = impressionData.country
                  ironSource["placement"] = impressionData.placement
                  ironSource["revenue"] = impressionData.revenue
                  ironSource["precision"] = impressionData.precision
                  ironSource["ab"] = impressionData.ab
                  ironSource["segment_name"] = impressionData.segment_name
                  ironSource["lifetime_revenue"] = impressionData.lifetime_revenue
                  ironSource["encrypted_cpm"] = impressionData.encrypted_cpm

                  var adPartners: [String: Any] = [:]
                  adPartners["ironSource"] = ironSource

                  var semanticAttributes: [String: Any] = [:]
                  semanticAttributes["adPartners"] = adPartners

                  // ironSource has a default currency of USD
                  semanticAttributes["currency"] = "USD"

                  guard let event = ABInAppEvent() else { return }
                  event.setCategory("airbridge.adImpression")
                  event.setAction(impressionData.ad_network)
                  event.setLabel(impressionData.placement)
                  event.setValue(impressionData.revenue)
                  event.setSemantics(semanticAttributes)

                  event.send()
              }
          }
      }
      ```

      ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      #import "AirBridge.h"
      #import "ISImpressionDataManager.h"

      @interface ISImpressionDataManager () <ISImpressionDataDelegate>
      @end

      @implementation ISImpressionDataManager

      - (void)impressionDataDidSucceed:(ISImpressionData *)impressionData {
          if (impressionData) {
              NSMutableDictionary *ironSource = [NSMutableDictionary dictionary];

              // optional fields
              ironSource[@"auction_id"] = impressionData.auction_id;
              ironSource[@"ad_unit"] = impressionData.ad_unit;
              ironSource[@"ad_network"] = impressionData.ad_network;
              ironSource[@"instance_name"] = impressionData.instance_name;
              ironSource[@"instance_id"] = impressionData.instance_id;
              ironSource[@"country"] = impressionData.country;
              ironSource[@"placement"] = impressionData.placement;
              ironSource[@"revenue"] = impressionData.revenue;
              ironSource[@"precision"] = impressionData.precision;
              ironSource[@"ab"] = impressionData.ab;
              ironSource[@"segment_name"] = impressionData.segment_name;
              ironSource[@"lifetime_revenue"] = impressionData.lifetime_revenue;
              ironSource[@"encrypted_cpm"] = impressionData.encrypted_cpm;

              NSMutableDictionary *adPartners = [NSMutableDictionary dictionary];
              adPartners[@"ironSource"] = ironSource;

              NSMutableDictionary *semanticAttributes = [NSMutableDictionary dictionary];
              semanticAttributes[@"adPartners"] = adPartners;

              // ironSource has a default currency of USD
              semanticAttributes[@"currency"] = @"USD";

                      ABInAppEvent *event = [[ABInAppEvent alloc] init];
                      [event setCategory:@"airbridge.adImpression"];
                      [event setAction:impressionData.ad_network];
                      [event setLabel:impressionData.placement];
                      [event setValue:impressionData.revenue];
                      [event setSemantics:semanticAttributes];

              [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"}}
      IronSourceEvents.onImpressionDataReadyEvent += ImpressionDataReadyEvent;

      private void ImpressionDataReadyEvent(IronSourceImpressionData impressionData)
      {
          if (impressionData != null)
          {
              Airbridge.TrackEvent(
                  category: AirbridgeCategory.AD_IMPRESSION,
                  semanticAttributes: new Dictionary<string, object>()
                  {
                      { AirbridgeAttribute.ACTION, impressionData.adNetwork },
                      { AirbridgeAttribute.LABEL, impressionData.placement },
                      { AirbridgeAttribute.VALUE, impressionData.revenue ?? 0 },
                      {
                          AirbridgeAttribute.AD_PARTNERS, new Dictionary<string, object>()
                          {
                              {
                                  "ironSource", new Dictionary<string, object>()
                                  {
                                      // optional fields
                                      { "auction_id", impressionData.auctionId },
                                      { "ad_unit", impressionData.adUnit },
                                      { "ad_network", impressionData.adNetwork },
                                      { "instance_name", impressionData.instanceName },
                                      { "instance_id", impressionData.instanceId },
                                      { "country", impressionData.country },
                                      { "placement", impressionData.placement },
                                      { "revenue", impressionData.revenue },
                                      { "precision", impressionData.precision },
                                      { "ab", impressionData.ab },
                                      { "segment_name", impressionData.segmentName },
                                      { "lifetime_revenue", impressionData.lifetimeRevenue },
                                      { "encrypted_cpm", impressionData.encryptedCPM }
                                  }
                              }
                          }
                      },
                      // ironSource has a default currency of USD
                      { AirbridgeAttribute.CURRENCY, "USD" }
                  }
              );
          }
      }
      ```
    </CodeGroup>

    #### Unity SDK (Deprecated)

    <CodeGroup>
      ```c# C# lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      IronSourceEvents.onImpressionDataReadyEvent += ImpressionDataReadyEvent;

      private void ImpressionDataReadyEvent(IronSourceImpressionData impressionData) 
      {
          if (impressionData != null)
          {
              AirbridgeEvent @event = new AirbridgeEvent("airbridge.adImpression");
                  
              var ironSource = new Dictionary<string, object>();

              // optional fields
              ironSource["auction_id"] = impressionData.auctionId;
              ironSource["ad_unit"] = impressionData.adUnit;
              ironSource["ad_network"] = impressionData.adNetwork;
              ironSource["instance_name"] = impressionData.instanceName;
              ironSource["instance_id"] = impressionData.instanceId;
              ironSource["country"] = impressionData.country;
              ironSource["placement"] = impressionData.placement;
              ironSource["revenue"] = impressionData.revenue;
              ironSource["precision"] = impressionData.precision;
              ironSource["ab"] = impressionData.ab;
              ironSource["segment_name"] = impressionData.segmentName;
              ironSource["lifetime_revenue"] = impressionData.lifetimeRevenue;
              ironSource["encrypted_cpm"] = impressionData.encryptedCPM;
                  
              var adPartners = new Dictionary<string, object>();
              adPartners["ironSource"] = ironSource;
                  
              @event.SetAction(impressionData.adNetwork);
              @event.SetLabel(impressionData.placement);
              @event.SetValue(impressionData.revenue ?? 0);
              @event.AddSemanticAttribute("adPartners", adPartners);

              // ironSource has a default currency of USD
              @event.AddSemanticAttribute("currency", "USD");
                  
              AirbridgeUnity.TrackEvent(@event);
          }
      }
      ```
    </CodeGroup>
  </Accordion>
</AccordionGroup>

<h2 id="s2s-integration">
  S2S Integration
</h2>

To implement the S2S integration, you need to enter the Secret Key and Refresh Token provided by Unity LevelPlay into the Airbridge dashboard.

For more detailed instructions, refer to the article below.

* [S2S Integration for Unity LevelPlay (User Guide)](/en/guides/unity-levelplay#server-to-server-integration)

<link rel="alternate" hrefLang="en" href="https://help.airbridge.io/en/developers/unity-levelplay-mediation-ad-revenue-integration" />

<link rel="alternate" hrefLang="ko" href="https://help.airbridge.io/ko/developers/unity-levelplay-mediation-ad-revenue-integration" />
