This guide shows how to configure the InMobi SDK to pass custom signals for ad auction pricing or first-party data. Additionally, you can send custom user or request-level signals to the InMobi SDK with each ad request. This enhances ad relevance, leading to higher fills and eCPMs.
Supported from InMobi SDK 10.7.8 onwards.
For Unity integration —whether directly integrated into Unity or through a mediation platform’s Unity integration, you need to download the Unity Plugin from Download SDK and add it to your project.
Follow the instructions below:
putPublisherSignals method. This method must be called afterthe InMobi SDK is successfully initialized.getPublisherSignals method to check what signals are already set.resetPublisherSignals method if you want to clear all the signal data for the user.
Some signals, such as floor price, impression depth, user ctr, and so on, have different values for each format, while signals such as paying user and retention have the same value across formats.
// Ensure InMobi SDK is initialized
// Create a map with required values
Map<String, Object> publisherSignals = new HashMap<>();
publisherSignals.put("iap", true); // User has made IAP
publisherSignals.put("ua_type", "paid"); // User is acquired via paid medium
publisherSignals.put("iap_type", "minnow"); // User has made low purchases
publisherSignals.put("iaa_type", "whale"); // User has seen high number of ads
publisherSignals.put("s_dep_rew", 4); // User has seen 4 rewarded ads in current session
publisherSignals.put("i_dep_rew", 10); // User has seen 10 rewarded ads in lifetime
publisherSignals.put("ctr_rew", 9.25); // Historical CTR for user is 9.25%
publisherSignals.put("abp_5_rew", 0.01720); // Average winning bid price for last 5 rewarded auctions was $0.01720, eCPM is $17.2
// Set the extras on InMobiSdk
InMobiSdk.PublisherSignals.INSTANCE.putPublisherSignals(publisherSignals);
// ensure InMobi SDK is initialised
// create map with required values
val publisherSignals = mapOf(
"iap" to true, // User has made IAP
"ua_type" to "paid", // User is acquired via paid medium
"iap_type" to "minnow", //User has made low purchases
"iaa_type" to "whale", //User has seen high number of ads
"s_dep_rew" to 4, //User has seen 4 rewarded ads in current session
"i_dep_rew" to 10, //User has seen 10 rewarded ads in lifetime
"ctr_rew" to 9.25, //Historical CTR for user is 9.25%
"abp_5_rew" to 0.01720 //average winning bid price for last 5 rewarded auctions was $0.01720, eCPM is $17.2
)
// Set the extras on InMobiSdk
InMobiSdk.PublisherSignals.putPublisherSignals(publisherSignals)
// ensure InMobi SDK is initialised
// create map with required values
let publisherSignals: [String: Any] = [
"iap": true, // User has made IAP
"ua_type": "paid", // User is acquired via paid medium
"iap_type": "minnow", // User has made low purchases
"iaa_type": "whale", // User has seen high number of ads
"s_dep_rew": 4, // User has seen 4 rewarded ads in current session
"i_dep_rew": 10, // User has seen 10 rewarded ads in lifetime
"ctr_rew": 9.25, // Historical CTR for user is 9.25%
"abp_5_rew": 0.01720 // Average winning bid price for last 5 rewarded auctions was $0.01720, eCPM is $17.2
]
// Set the extras on InMobiSdk
IMSdk.putPublisherSignals(publisherSignals)
// create a dictionary with all required signals and corresponding values
Dictionary<string, object> publisherSignals = new Dictionary<string, object> { };
publisherSignals.Add("iap", "true"); // User has made IAP
publisherSignals.Add("ua_type", "paid"); // User is acquired via paid medium
publisherSignals.Add("iap_type", "minnow"); // User has made low purchases
publisherSignals.Add("iaa_type", "whale"); // User has seen high number of ads
publisherSignals.Add("s_dep_rew", 4); // User has seen 4 rewarded ads in current session
publisherSignals.Add("i_dep_rew", 10); // User has seen 10 rewarded ads in lifetime
publisherSignals.Add("ctr_rew", 9.25); // Historical CTR for user is 9.25%
publisherSignals.Add("abp_5_rew", 0.01720); // Average winning bid price for last 5 rewarded auctions was $0.01720, eCPM is $17.2
// example for passing signals in rewarded requests
InMobiplugin.putPublisherSignals(publisherSignals);
To help optimize monetization and enable more precise ad auction pricing, the InMobi SDK allows publishers to pass bid‑related signals with each ad request. These signals provide granular bid price information programmatically, which can improve yield.
Note: Currently, only AppLovin MAX supports bid signals.
You send bid‑specific signals using the putPublisherSignals method after SDK initialization. The typical keys and values for bid signals are:
| Key | Description | Value |
|---|---|---|
dir_r |
Bid price | Revenue from the MaxAd object (as a double/float, not eCPM) |
dir_nn |
Demand network name | NetworkName from the MaxAd object (e.g., "AppLovin MAX", "InMobi") |
dir_type |
Ad format | Label of the ad format in uppercase (e.g., "INTER", "REWARDED") |
Alternatively, you can pass the entire MaxAd object. The InMobi SDK will automatically extract supported bid signal values.
To go live with this implementation, passing the average clearing price is mandatory.
The SDK can automatically calculate this average once you provide the required inputs.
You must call putPublisherSignals inside the onAdDisplayed callback, grouped by ad format.
You can implement this in any of the following ways:
This approach is for developers who prefer more granular control. You extract and pass individual values such as revenue, network name, and ad format explicitly.
@Override
public void onAdDisplayed(MaxAd maxAd) {
Map<String, Object> signals = new HashMap<>();
signals.put("dir_r", maxAd.getRevenue());
signals.put("dir_nn", maxAd.getNetworkName());
signals.put("dir_type", maxAd.getFormat().getLabel());
InMobiSdk.PublisherSignals.INSTANCE.putPublisherSignals(signals);
}
override fun onAdDisplayed(maxAd: MaxAd) {
InMobiSdk.PublisherSignals.putPublisherSignals(
mapOf(
"dir_r" to maxAd.revenue,
"dir_nn" to maxAd.networkName,
"dir_type" to maxAd.format.label
)
)
}
func onAdDisplayed(_ maxAd: MAAd) {
let signals: [String: Any] = [
"dir_r": maxAd.revenue,
"dir_nn": maxAd.networkName,
"dir_type": maxAd.format.label
]
IMSdk.putPublisherSignals(signals)
}
maxAd objectIn this approach, you pass the complete maxAd object directly to the SDK. The SDK will extract all required values internally, simplifying your integration.
@Override
public void onAdDisplayed(MaxAd maxAd) {
Map<String, Object> signals = new HashMap<>();
signals.put("obj_max", maxAd);
InMobiSdk.PublisherSignals.INSTANCE.putPublisherSignals(signals);
}
override fun onAdDisplayed(maxAd: MaxAd) {
InMobiSdk.PublisherSignals.putPublisherSignals(
mapOf("obj_max" to maxAd)
)
}
func onAdDisplayed(_ maxAd: MAAd) {
let signals: [String: Any] = [
"obj_max": maxAd
]
IMSdk.putPublisherSignals(signals)
}
In Unity, you must extract individual properties from the ad event and add them to a dictionary before passing them to the SDK. Passing the complete ad info object is not supported in Unity.
private void OnAdDisplayed(string adUnitId, MaxSdkBase.AdInfo adInfo)
{
var signals = new Dictionary<string, object>();
signals.Add("dir_r", adInfo.Revenue);
signals.Add("dir_nn", adInfo.NetworkName);
signals.Add("dir_type", adInfo.AdFormat.ToUpper());
this.inmobiPlugin.PutPublisherSignals(signals);
}
Use suffixes as ‘ban’, ‘int’, ‘rew’, ‘nat’ for banner, interstitial, rewarded and native ad placements respectively.
| Signal | Key(case-sensitive) | Data Type Supported | Allowed values |
| Impression depth |
i_dep_(ad_type) e.g. i_dep_ban, i_dep_int, i_dep_rew, etc. |
integer | Total number of ads user has seen in lifetime. |
| Paying user | iap | bool | ‘true’ if user has done IAP, else ‘false’ |
| The average clearing price for the last n auctions |
abp_10_(ad_type) e.g. abp_10_ban, abp_10_int, abp_10_rew, abp_rew, abp_5_ban, abp_5_int, abp_5_rew |
double | value in USD and the bid values(not cpm). |
| Acquisition source | ua_type | string | ‘paid' → if user was acquired using paid advertising, 'organic’ → if user was acquired organically |
| Session depth |
s_dep_(ad_type) e.g. s_dep_ban, s_dep_int, etc |
integer | ‘10’, ‘15’, ‘20’, or any integer value based on number of ads the user has seen in the current session. |
| User average click-through rate |
ctr_(ad_type) e.g. ctr_ban, ctr_int, etc. |
double | ‘0.5’, ‘5.5', '10’, or any double value between 0 to 100 based on the click-through rate for the user. |
| Purchasing user cohort | iap_type | string | Applicable only when iapis set to true and based on in-app purchase value.
'minnow'(<$5), 'dolphin'(>$5 & <=$10), 'shark'(>$10 & <=$50), 'whale'(>$50) |
| Ad user cohort | iaa_type | string |
Based on the number of full-screen or rewarded ads seen by the user. ‘minnow'(<5 ads), ‘dolphin'(>5 & <=10), ‘shark'(>10 & <=25), 'whale'(>25) |
putPublisherSignals method. The setExtras method expects all values to be passed as string only.| Signal | Description | Key(case-sensitive) | Value Type |
|
Content Title |
Content title |
c_title |
string |
|
Content Series |
Content series |
c_series |
string |
|
Content URL |
URL of the content, for buy-side contextualization or review |
c_url |
string |
|
Content Category |
Comma-separated list of IAB content categories that describe the content. |
c_cat |
string |
|
Content Category Taxonomy |
The taxonomy in use. Refer to List: Category Taxonomies |
c_cattax |
integer, default 1 |
|
Content Context |
Type of content (game, video, text, etc.). Refer to List: Content Contexts |
c_context |
String |
|
Content Rating(QAG Media rating) |
Media rating per IQG guidelines. Refer to List: Media Ratings |
c_rating |
integer |
|
Content keywords |
Comma-separated list of keywords about the content |
c_keywords |
String |
|
Content Language |
Content language using ISO-639-1-alpha-2. |
c_lang |
String |
For more information, read our blog, Signal Your Way to Success, Part 1 and Part 2.
If available, you can also signal users age and gender to InMobi SDK. These signals help in campaign targeting and generate better yield. Ensure InMobi SDK is initialized before calling the following functions.
InMobiSdk.setGender(InMobiSdk.Gender.MALE); // or InMobiSdk.Gender.FEMALE
InMobiSdk.setAge(age);
InMobiSdk.setAgeGroup(InMobiSdk.AgeGroup.BELOW_18); // other enums: BETWEEN_18_AND_20, BETWEEN_21_AND_24, BETWEEN_25_AND_34 // BETWEEN_35_AND_5, ABOVE_55
InMobiSdk.setGender(InMobiSdk.Gender.MALE) // or InMobiSdk.Gender.FEMALE
InMobiSdk.setAge(age)
InMobiSdk.setAgeGroup(InMobiSdk.AgeGroup.BELOW_18)
IMSdk.setGender(.female)
IMSdk.setAge(28)
IMSdk.setAgeGroup(.between25And29)
By installing this SDK update, you agree that your Children Privacy Compliance setting remains accurate or that you will update that setting, whenever there is a change in your app's audience. You may update the app's Children Privacy Compliance settings at https://publisher.inmobi.com/my-inventory/app-and-placements.