# Configure Mediation

## Test Mode

The Mediation SDK includes a **Test Mode** method that will allow you to test your partner integrations and get their test ads. To enable **Test Mode**, simply set the `isTestModeEnabled` method to `true`/`TRUE` after starting the Mediation SDK. Remember to remove it or set the method to `false`/`FALSE` before releasing your app.

<ul class="tab" data-tab="caeaae6d-3001-4e50-8581-86f097195c15" data-name="iossetKeyword">
  
      <li class="active">
          <a href="#">swift </a>
      </li>
  
      <li>
          <a href="#">objective-c </a>
      </li>
  
</ul>
<ul class="tab-content" id="caeaae6d-3001-4e50-8581-86f097195c15" data-name="iossetKeyword">
  
      <li class="active">
<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// set to true or false</span>
<span class="kt">ChartboostMediation</span><span class="o">.</span><span class="n">isTestModeEnabled</span> <span class="o">=</span> <span class="kc">true</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-objectivec highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// set to 'TRUE'/'FALSE' or 'YES'/'NO'</span>
<span class="n">ChartboostMediation</span><span class="p">.</span><span class="n">isTestModeEnabled</span> <span class="o">=</span> <span class="n">TRUE</span><span class="p">;</span>
</code></pre></div></div>
</li>
  
</ul>



## Keywords

Keywords are key-value pairs to enable real-time targeting of line items.

### Set Keywords

To set keywords, use the `keywords` method to add key-value keywords pair.

<ul class="tab" data-tab="cf6fe47c-e1c9-4f50-9db9-526eae557e8e" data-name="iOSSetKeywords">
  
      <li class="active">
          <a href="#">swift </a>
      </li>
  
      <li>
          <a href="#">objective-c </a>
      </li>
  
</ul>
<ul class="tab-content" id="cf6fe47c-e1c9-4f50-9db9-526eae557e8e" data-name="iOSSetKeywords">
  
      <li class="active">
<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Banner Ads</span>
<span class="k">let</span> <span class="nv">banner</span> <span class="o">=</span> <span class="kt">BannerAdView</span><span class="p">()</span>
<span class="n">banner</span><span class="o">.</span><span class="n">keywords</span> <span class="o">=</span> <span class="p">[</span><span class="s">"keyword1"</span><span class="p">:</span> <span class="s">"value1"</span><span class="p">]</span>

<span class="c1">// Fullscreen Ads</span>
<span class="kt">FullscreenAd</span><span class="o">.</span><span class="nf">load</span><span class="p">(</span>
    <span class="nv">with</span><span class="p">:</span> <span class="o">.</span><span class="nf">init</span><span class="p">(</span>
        <span class="nv">placement</span><span class="p">:</span> <span class="s">"placement"</span><span class="p">,</span>
        <span class="nv">keywords</span><span class="p">:</span> <span class="p">[</span><span class="s">"keyword1"</span><span class="p">:</span> <span class="s">"value1"</span><span class="p">],</span> <span class="c1">// set the whole dictionary</span>
        <span class="nv">partnerSettings</span><span class="p">:</span> <span class="kc">nil</span>
    <span class="p">)</span>
<span class="p">)</span> <span class="p">{</span> <span class="n">result</span> <span class="k">in</span>
    <span class="c1">// handle result</span>
<span class="p">}</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-objectivec highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Banner Ads</span>
<span class="n">CBMBannerAdView</span> <span class="o">*</span><span class="n">banner</span> <span class="o">=</span> <span class="p">[[</span><span class="n">CBMBannerAdView</span> <span class="nf">alloc</span><span class="p">]</span> <span class="nf">init</span><span class="p">];</span>
<span class="n">banner</span><span class="p">.</span><span class="n">keywords</span> <span class="o">=</span> <span class="p">@{</span><span class="s">@"keyword1"</span><span class="o">:</span> <span class="s">@"value1"</span><span class="p">};</span>

<span class="c1">// Fullscreen Ads</span>
<span class="n">CBMFullscreenAdLoadRequest</span> <span class="o">*</span><span class="n">request</span>
    <span class="o">=</span> <span class="p">[[</span><span class="n">CBMFullscreenAdLoadRequest</span> <span class="nf">alloc</span><span class="p">]</span> <span class="nf">initWithPlacement</span><span class="p">:</span><span class="s">@"placement"</span>
                                                   <span class="nl">keywords:</span><span class="p">@{</span><span class="s">@"keyword1"</span><span class="o">:</span> <span class="s">@"value1"</span><span class="p">}</span>
                                            <span class="nl">partnerSettings:</span><span class="nb">nil</span><span class="p">];</span>
<span class="p">[</span><span class="n">CBMFullscreenAd</span> <span class="nf">loadWith</span><span class="p">:</span><span class="n">request</span> <span class="nf">completion</span><span class="p">:</span><span class="o">^</span><span class="p">(</span><span class="n">CBMFullscreenAdLoadResult</span> <span class="o">*</span> <span class="n">_Nonnull</span> <span class="n">result</span><span class="p">)</span> <span class="p">{</span> <span class="p">}];</span>
</code></pre></div></div>
</li>
  
</ul>


### Remove Keywords

To remove keywords, set `keywords` to `nil`.

<ul class="tab" data-tab="6630971f-349b-431b-8f75-41e6cf9622d1" data-name="iOSSetKeywords">
  
      <li class="active">
          <a href="#">swift </a>
      </li>
  
      <li>
          <a href="#">objective-c </a>
      </li>
  
</ul>
<ul class="tab-content" id="6630971f-349b-431b-8f75-41e6cf9622d1" data-name="iOSSetKeywords">
  
      <li class="active">
<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">banner</span> <span class="o">=</span> <span class="kt">BannerAdView</span><span class="p">()</span>
<span class="n">banner</span><span class="o">.</span><span class="n">keywords</span> <span class="o">=</span> <span class="kc">nil</span> <span class="c1">// remove the whole dictionary</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-objectivec highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">CBMBannerAdView</span> <span class="o">*</span><span class="n">banner</span> <span class="o">=</span> <span class="p">[[</span><span class="n">CBMBannerAdView</span> <span class="nf">alloc</span><span class="p">]</span> <span class="nf">init</span><span class="p">];</span>
<span class="n">banner</span><span class="p">.</span><span class="n">keywords</span> <span class="o">=</span> <span class="nb">nil</span><span class="p">;</span>
</code></pre></div></div>
</li>
  
</ul>



<div class="alert alert-info" role="alert">
  <b>Note:</b> 
  <li>Keywords has restrictions for setting keys and values. The maximum characters allowed for keys is 64 characters. The maximum characters for values is 256 characters.</li>
  <li>Fullscreen ad keywords are determined when <code>load()</code> is called and cannot be updated.</li>
</div>



## Impression Level Revenue Data (ILRD)

Impression Level Revenue Data (ILRD) is data we collect on the server side and store in our database today. This feature allows publishers access to this data.

An ILRD event occurs every time an impression is tracked. The fields that a publisher is interested in are broken down as follows:

| ILRD Key                 |  Value | ILRD Description                                                                                      |
| :----------------------- | :----: | :---------------------------------------------------------------------------------------------------- |
| `"ad_revenue"`           | Double | Double-precision floating point                                                                       |
| `"currency_type"`        | String | Always USD                                                                                            |
| `"country"`              | String | Three-letter country code ISO_3166-1_alpha-3 (ex.: USA)                                               |
| `"impression_id"`        | String | ID                                                                                                    |
| `"line_item_name"`       | String | Mediation line item name                                                                              |
| `"line_item_id"`         | String | Mediation line item id                                                                                |
| `"network_name"`         | String | Network Name                                                                                          |
| `"network_placement_id"` | String | Partner placement name                                                                                |
| `"network_type"`         | String | Either `bidding` or `mediation`                                                                       |
| `"placement_name"`       | String | Mediation placement name                                                                              |
| `"placement_type"`       | String | Ad type: <br/>- `interstitial`<br/>- `rewarded`</br>- `banner`                                        |
| `"precision"`            | String | One of the following: <br/>- `estimated` <br/>- `exact`<br/>- `publisher_defined`<br/>- `undisclosed` |

### Bid Specific ILRD
```json
{
 "network_name": "mintegral",
 "network_type": "bidding",
 "precision": "exact",
 "ad_revenue": 0.02375,
 "network_placement_id": "vz6a00690d16ec4b5ba9"
}
```

### Ad Response ILRD
```json
{
 "impression_id": "2a3a70a8d161ce2942d73436123e7fba04983bd1",
 "currency_type": "USD",
 "country": "USA",
 "placement_name": "ACRewarded",
 "placement_type": "rewarded"
 }
```

### Combined ILRD
```json
{
 "ad_revenue": 0.055,
 "currency_type": "USD",
 "country": "USA",
 "impression_id": "ae112f3dccf90c705f2d3b1324605e9d16687725",
 "line_item_name": "helium_rv_T1_mintegral_high",
 "line_item_id": "33f6b0ca-1b3c-4e69-80dd-b57db13db159",
 "network_name": "mintegral",
 "network_placement_id": "mintegral_RV_0_25",
 "network_type": "mediation",
 "placement_name": "heliumMintegralTest",
 "placement_type": "rewarded",
 "precision": "publisher_defined"
}
```

Publishers will have two ways of receiving this data:

1. On iOS, we provide a global notification that gives publishers access to ILRD data on each impression event shown in real time.
2. For API access, we will provide an ILRD reporting API where publishers can request a custom report (CSV) of all their ILRD data filtered by `appId`, `min_date`, `max_date`.

Publishers will use ILRD data in several ways:

- They can listen to the data via SDK notifications in real time and ship it to their own servers, or to other MMPs such as AppsFlyer & Adjust.
- They can manually request a report via the API endpoint and analyze it whenever they wish to do so.


<div class="alert alert-info" role="alert">
  <b>Note: Meta Audience Network Ad Revenue</b><br>
  <li>Unlike other networks, Meta prohibits Mediation from sharing the real `ad_revenue` value of Meta Audience Network impressions with publishers.</li>
  <li>Instead, Mediation is only allowed to share the average of aggregated eCPMs of Meta Audience Network line items.</li>
</div>


## Rewarded Callbacks

Setting the User ID and Custom Data through the SDK

### Setting User Identifier

The user identifier property is configured with the [Chartboost Core SDK](/en/mediation/integrate/core/ios/).

<ul class="tab" data-tab="6cfa79a4-e811-4a05-ab8b-8078e8f9430b" data-name="ioscustomData">
  
      <li class="active">
          <a href="#">swift </a>
      </li>
  
      <li>
          <a href="#">objectivec </a>
      </li>
  
</ul>
<ul class="tab-content" id="6cfa79a4-e811-4a05-ab8b-8078e8f9430b" data-name="ioscustomData">
  
      <li class="active">
<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">ChartboostCore</span><span class="o">.</span><span class="n">publisherMetadata</span><span class="o">.</span><span class="nf">setPlayerID</span><span class="p">(</span><span class="s">"player_id"</span><span class="p">)</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-objectivec highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span><span class="n">ChartboostCore</span><span class="p">.</span><span class="n">publisherMetadata</span> <span class="nf">setPlayerID</span><span class="p">:</span><span class="s">@"player_id"</span><span class="p">];</span>
</code></pre></div></div>
</li>
  
</ul>


### Setting Custom Data

The custom data property is found on the `FullscreenAd` instance, and has a maximum character limit of 1000 characters. In the event that the limit is exceeded, the value will be ignored.

Custom data may be set at any time before calling `showAdWithViewController:`.

**It is recommended to base 64 encode the custom data!**


<ul class="tab" data-tab="0e8cbb52-cb32-47cc-a597-4149c6f20944" data-name="ioscustomData">
  
      <li class="active">
          <a href="#">swift </a>
      </li>
  
      <li>
          <a href="#">objectivec </a>
      </li>
  
</ul>
<ul class="tab-content" id="0e8cbb52-cb32-47cc-a597-4149c6f20944" data-name="ioscustomData">
  
      <li class="active">
<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">fullscreenAd</span><span class="p">:</span> <span class="kt">FullscreenAd</span> <span class="o">=</span> <span class="o">...</span> <span class="c1">// obtain the ad with a load request</span>
<span class="n">fullscreenAd</span><span class="o">.</span><span class="n">customData</span> <span class="o">=</span> <span class="s">"Y3VzdG9tIGRhdGE="</span> <span class="c1">// base 64 encoded string</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-objectivec highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">CBMFullscreenAd</span> <span class="o">*</span><span class="n">ad</span> <span class="o">=</span> <span class="p">...;</span> <span class="c1">// obtain the ad with a load request</span>
<span class="n">ad</span><span class="p">.</span><span class="n">customData</span> <span class="o">=</span> <span class="s">@"Y3VzdG9tIGRhdGE="</span><span class="p">;</span> <span class="c1">// base 64 encoded string</span>
</code></pre></div></div>
</li>
  
</ul>



**See**: [Mediation SDK: Manage Placement's Rewarded Callbacks](/en/mediation/manage-placements/#rewarded-callbacks) for configuration setup



## Implementation

The iOS SDK will provide a new `NSNotification` event that will be broadcast to all listeners via `NSNotificationCenter`.

The `ImpressionData` class will be specified as follows:


```swift
@objc(CBMImpressionData)
public class ImpressionData: NSObject {
  // The placement associated with Impression Level Revenue Data.
  @objc public let placement: String

  // The Impression Level Revenue Data JSON.
  @objc public let jsonData: [String: Any]
}
```

Usage Example

```swift
NotificationCenter.default.addObserver(
    self,
    selector: #selector(didReceiveILRDNotification),
    name: .chartboostMediationDidReceiveILRD,
    object: nil
)

@objc func didReceiveILRDNotification(notification: Notification) {
    // Extract the ILRD payload.
    guard let ilrd = notification.object as? ImpressionData else {
        return
    }

    // Placement name
    let placement = ilrd.placement

    // JSON
    let json = ilrd.jsonData
}
```


