In-House Mediation

Integration

BidMachine supports Cocoa Pods integration methods. See integration samples

🚧

Requirements:

iOS 10.0+
Xcode: 13.0+
For version above 1.9.2.0
Xcode 13.3+

Network security configuration

Add this code to the info.plist file:
<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

Cocoa Pods

📘

Note

If you haven't used CocoaPods before, please read this guide first.

  1. Go to your project folder.
  2. Add the following lines to your Podfile:
  3. platform :ios, '10.0' 
    workspace 'YourApp.xcworkspace' 
    target 'YourTarget' do 
        project 'YourProject/YourTarget.xcodeproj' 
        pod "BidMachine", "~> 1.9.3.0" 
       pod "BDMIABAdapter", "~> 1.9.3.0" 
    end
    
  4. Run the command:
  5. pod install
    

Troubleshooting

Starting from 1.1.7, iOS Stack Modules (BidMachine SDK Dependencies) has Swift enabled. Refer to points below in order to work through the most common problems of SDK installation & Swift interoperability:

  • XCode emits errors: 'Undefined symbol: __swift_FORCE_LOAD_$_swiftDataDetection' and 'Undefined symbol: __swift_FORCE_LOAD_$_swiftFileProvider . These errors mean that you are using not the latest version of XCode. Update to XCode 13 or newer to fix this errors.

Initialization

You should initialize BidMachine SDK on application launch and provide your publisher id. Also, you can setup SDK configuration that contains targeting, restriction data and any custom data depending on your customized integration.

To initialize BidMachine SDK, override the following method in your AppDelegate file:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    let sellerID = "Your Seller ID"
    BDMSdk.shared().startSession(withSellerID: sellerID, completion: nil)
    /// If you want to setup targeting, restrictions or any additional params
    /// use following integration code:
    /*
    let configuration = BDMSdkConfiguration()
    ...
    Setup configuration parameters 
    ...
    BDMSdk.shared().startSession(withSellerID: sellerID,  configuration: configuration, completion: {
        print("Bid Machine SDK was initialized!")
    })
    */
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  NSString *sellerID = @"Your Seller ID";
  [BDMSdk.sharedSdk startSessionWithSellerID:sellerID completion:nil];
  /// If you want to setup targeting, restrictions or any additional params
  /// use following integration code:
  /*
  BDMSdkConfiguration * configuration = [BDMSdkConfiguration new];
  ...
  Setup configuration parameters
  ...
  [BDMSdk.sharedSdk startSessionWithSellerID:sellerID configuration:configuration completion:^{
        NSLog(@"Bid Machine SDK was initialized!");
    }];
  */
}

Logging

Logging can be enabled or disabled at any moment of app lifecycle:
func setupLogging() {
    BDMSdk.sharedSdk().enableLogging = true
}
- (void)setupLogging {
    BDMSdk.sharedSdk.enableLogging = YES;
}

Test mode

❗️

Don't forget to remove TestMode before releasing to production!

func setupTestMode() {
    let configuration = BDMSdkConfiguration()
    configuration.testMode = true
    BDMSdk.shared().startSession(withSellerID: sellerID,  configuration: configuration, completion: {
        print("Bid Machine SDK was initialized!")
    })
}
- (void)setupTestMode {
    BDMSdkConfiguration * configuration = [BDMSdkConfiguration new];
    configuration.testMode = YES;
    [BDMSdk.sharedSdk startSessionWithSellerID:sellerID configuration:configuration completion:^{
        NSLog(@"Bid Machine SDK was initialized!");
    }];
}

Base URL

❗️

Don't forget to remove BaseURL before releasing to production!

func setupBaseURL() {
    let configuration = BDMSdkConfiguration()
    configuration.baseURL = URL(string:"https://custom.url.com")!
    BDMSdk.shared().startSession(withSellerID: sellerID,  configuration: configuration, completion: {
        print("Bid Machine SDK was initialized!")
    })
}
- (void)setupBaseURL {
    BDMSdkConfiguration * configuration = [BDMSdkConfiguration new];
    configuration.baseURL = [NSURL URLWithString:@"https://custom.url.com"];
    [BDMSdk.sharedSdk startSessionWithSellerID:sellerID configuration:configuration completion:^{
        NSLog(@"Bid Machine SDK was initialized!");
    }];
}

Bid token

With S2S integration, you will need a BidToken that you need to transfer in the request. To get a BidToken, you can use method:

/// Generates bidder token that needs to be included in the server side bid request
@property (copy, nonatomic, readonly, nullable) NSString *biddingToken;

📘

It is recommended to call the method on the background thread

NSString *token = BDMSdk.sharedSdk.biddingToken
let token = BDMSdk.shared().biddingToken

Request Parameters

The following section provides information about all parameters that can be passed to SDK or ad objects.

Configuration

Parameter

Type

Description

Targeting

BDMTargeting

Targeting data.

Extensions

Dictionary

Custom extensions dictionary, where objects are strings and values are any object.

TestMode BOOL Enable test mode.
class SomeClass {
    func setupConfiguration() -> BDMSdkConfiguration {
        let configuration = BDMSdkConfiguration()
        // Configure targeting
        let targeting = BDMTargeting()
        configuration.targeting = targeting
        configuration.testMode = true
        return configuration
    }
}
@implementation SomeConfiguration
 
- (BDMSdkConfiguration *)setupConfiguration {
    BDMSdkConfiguration * configuration = [BDMSdkConfiguration new];
    // Setup targeting
    BDMTargeting * targeting = [BDMTargeting new];
    configuration.targeting = targeting;
    return configuration;
}
@end

Targeting Parameters

Parameter

Type

Description

User Id

String

Vendor-specific ID for the user.

Gender

Enum

Gender, one of following: Female, Male, Omitted.

Birthday Year

Integer

Year of birth as a 4-digit integer (e.g. 1990).

Keywords

Comma separated string

List of keywords, interests, or intents.

Location

CLLocation

Location of the user's home base (i.e., not necessarily their current location).

Country

String

Country of the user's home base (i.e., not necessarily their current location).

City

String

City of the user's home base (i.e., not necessarily their current location).

Zip

String

Zip of the user's home base (i.e., not necessarily their current location).

Store URL

String

App store URL for the installed app; for IQG 2.1 compliance.

Store ID String Application identifier in AppStore

Paid

Bool

Determines, if it is a free or paid version of the app.

Blocked Advertiser IAB Category

Array of strings

Block list of content categories using IDs.

Blocked Advertiser Domain

Array of strings

Block list of advertisers by their domains (e.g. `example.com`).

Blocked Application

Array of strings

Block list of apps where ads are disallowed. These should be bundle or package names (e.g. `com.foo.mygame`) and should NOT be app store IDs (e.g., not iTunes store IDs).

Restrictions

BDMUserRestrictions

User restrictions parameters.

сlass SomeTargeting {
      func setupTargeting() -> BDMTargeting {
          let targeting = BDMTargeting()
          targeting.userId = "Some user ID"
          targeting.gender = kBDMUserGenderMale // kBDMUserGenderFemale, kBDMUserGenderUnknown
          targeting.yearOfBirth = 1996
          targeting.keywords = "Swimming"
          targeting.blockedCategories = ["IAB1", "IAB2", "IAB3"]
          targeting.blockedAdvertisers = ["somesite.com", "someothersite.com"]
          targeting.blockedApps = ["14532", "12345", "some_other_numeric_id"]
          targeting.location = CLLocation() // Current location of user. If location services enabled in applic
          targeting.country = "User_country"
          targeting.city = "User_city"
          targeting.zip = "User_zip_code"
          targeting.storeURL = URL(string: "Users_application_store_URL")
          targeting.storeId = "Numeric_store_id_identifier"
          targeting.paid = .paid // .free, .unknown
          return targeting
    }
}
#import <BidMachine/BidMachine.h>
 
- (BDMTargeting *)setupTargeting {
      BDMTargeting * targeting = [BDMTargeting new];
      targeting.userId = @"Some user ID";
      targeting.gender = kBDMUserGenderMale; // kBDMUserGenderFemale, kBDMUserGenderUnknown
      targeting.yearOfBirth = @1996;
      targeting.keywords = @"Swimming";
      targeting.blockedCategories = @[@"IAB1", @"IAB2", @"IAB3"];
      targeting.blockedAdvertisers = @[@"somesite.com", @"someothersite.com"];
      targeting.blockedApps = @[@"14532", @"12345", @"some_other_numeric_id"];
      targeting.location = [CLLocation new]; // Current location of user. If location services enabled in appli
      targeting.country = @"User_country";
      targeting.city = @"User_city";
      targeting.zip = @"User_zip_code";
      targeting.storeURL = [[NSURL alloc] initWithString :@"Users_application_store_URL"];
      targeting.storeId = @"Numeric_store_id_identifier";
      targeting.paid = true;
      return targeting;
  }

User Restriction Parameters

Parameter

Type

Description

User Id

String

Vendor-specific ID for the user.

Gender

Enum

Gender, one of following: Female, Male, Omitted.

Birthday Year

Integer

Year of birth as a 4-digit integer (e.g - 1990).

class SomeRestrictions {
      func setupRestrictions() {
         let restrictions = BDMSdk.shared().restrictions
         restrictions.coppa = false // or true. Setup that user is under COPPA
         restrictions.subjectToGDPR = false // or true. Setup that user is under GDPR
         restrictions.hasConsent = NO; // or YES. Setup that user given consent
         restrictions.consentString = "Some_consent_string" // The consent string for sending the GDPR consent
         restrictions.USPrivacyString; // CPPA string
      }
}
#import <BidMachine/BidMachine.h>
 
- (void)setupRestrictions {
    BDMUserRestrictions * restrictions = [BDMSdk sharedSdk].restrictions;
    restrictions.coppa = NO; // or YES. Setup that user is under COPPA
    restrictions.subjectToGDPR = NO; // or YES. Setup that user is under GDPR
    restrictions.hasConsent = NO; // or YES. Setup that user given consent
    restrictions.consentString = @"Some_consent_string"; // The consent string for sending the GDPR consent
    restrictions.USPrivacyString; // CPPA string
}

📘

CCPA String

SDK automatically retrieves CCPA string from UserDefaults. If you would like to pass CCPA string according to IAB standards, please add it in UserDefaults. More information here.

Price Floor Parameters

Parameter

Type

Description

ID

String

Unique bid identifier.

value

Decimal number

Bid price

class SomeClass {
    func setupPriceFloor() -> BDMPriceFloor {
        let priceFloor = BDMPriceFloor()
        priceFloor.id = UUID().uuidString // Autogenerated bid ID
        priceFloor.value = 1.6 // Bid price (decimal number)
        return priceFloor 
    }
}
#import <BidMachine/BidMachine.h>
 
- (BDMPriceFloor *)setupPriceFloor {
    BDMPriceFloor * priceFloor = [BDMBid new];
    priceFloor.ID = [[NSUUID UUID] UUIDString]; // Autogenerated bid ID
    priceFloor.value = [[NSDecimalNumber alloc] initWithString:@"1.6"]; // Bid price (decimal number)
    self.priceFloor = priceFloor;
    return self.priceFloor;
}

Auction Results

Parameter

Type

Description

Sample 

Bid ID

String

Unique bid identifier.

"cc5bd14b-aaef-4037-b4f8-879913366e3c"

Creative ID

String

Unique creative identifier.

"123.13579"
CID String Campaign ID or other similar grouping of brand-related ads. "123.13587"
Ad Domains String Array Array of ad domains. ["sample1.com", "sample2.com"]
Demand Source String Name of demand source. "BidMachine Test"
Price Number Bid price. 0.023

Header Bidding

Installation

CocoaPods

Adapters are distributed as sub-specs with external dependencies. Add following lines into your Podfile:
platform :ios, '10.0' 
workspace 'YourApp.xcworkspace' 
target 'YourTarget' do 
    project 'YourProject/YourTarget.xcodeproj' 
    pod "BidMachine", "~> 1.9.3.0"  
    pod "BDMIABAdapter", "~> 1.9.3.0"
    pod "BDMAdColonyAdapter", "~> 1.9.3.0"
    pod "BDMAmazonAdapter", "~> 1.9.3.0"
    pod "BDMCriteoAdapter", "~> 1.9.3.0"
    pod "BDMFacebookAdapter", "~> 1.9.3.0"
    pod "BDMMyTargetAdapter", "~> 1.9.3.0"
    pod "BDMSmaatoAdapter", "~> 1.9.3.0"
    pod "BDMTapjoyAdapter", "~> 1.9.3.0"
    pod "BDMVungleAdapter", "~> 1.9.3.0"
    pod "BDMPangleAdapter", "~> 1.9.3.0"
    pod "BDMNotsyAdapter", "~> 1.9.3.0"
 end

Setup configuration

To enable header bidding support, you should set full configuration before the start of BidMachine SDK session.

  1. Import Header Bidding API into your class. You can use header or module import:
  2. import BidMachine.HeaderBidding
    
    @import BidMachine.HeaderBidding;
    
  3. Build network configuration by using BDMAdNetworkConfiguration class. Required fields are name, networkClass and adUnits. All passed ad units should have unique format, ad units with the same format will be overridden.
  4. let networkConfig = BDMAdNetworkConfiguration.build { builder in let _ = builder
        .appendName("some ad network")
        .appendNetworkClass(NSClassFromString("Some class") as! BDMNetwork.Type)
        .appendParams(["some key": "some value"])
        .appendAdUnit(.banner300x250, ["some key": "some value"], nil)
        .appendAdUnit(.banner728x90, ["another key": "another value"], nil)
    }
    
    BDMAdNetworkConfiguration *networkConfig = [BDMAdNetworkConfiguration buildWithBuilder:^(BDMAdNetworkConfigurationBuilder *builder) {
        builder.appendName(@"vungle");
        builder.appendNetworkClass(NSClassFromString("Some class"));
        builder.appendParams(@{ @"some key": @"some value"} );
        builder.appendAdUnit(BDMAdUnitFormatBanner320x50, @{ @"ad_unit_id": @"XXX" }, nil);
    }];
    

    Method returns nil if some of required fields was not set or was set with invalid values

  5. Pass configuration to SDK
  6. func startBidMachineWithHeaderBidding() {
        let config = BDMSdkConfiguration()
        let networkConfig = getNetworkConfig()   
        config.networkConfigurations = [networkConfig!]
        BDMSdk.shared().startSession(withSellerID: "1", configuration: config, completion: nil)
    }
    
    - (void)startBidMachineWithHeaderBidding {
        BDMSdkConfiguration *config = [BDMSdkConfiguration new];
        BDMAdNetworkConfiguration *networkConfig = [self getNetworkConfig];
        config.networkConfigurations = @[networkConfig];
        [BDMSdk.sharedSdk startSessionWithSellerID:@"1" configuration:config completion:^{
            NSLog(@"Bid Machine SDK was initialized!");
        }];
    }
    
  7. That is it. SDK will init networks using the passed config, and try to bid ad units with a format suitable for current ad type settings.

Ad Networks Configurations Parameters

List of supported ad networks that contains info about its specific unit formats

Vungle

Parameter

Value

name

vungle

networkClass

BDMVungleAdNetwork

Initialization parameters:

Parameter

Type

app_id

string

Ad unit parameters:

Parameter

Type

placement_id

string

Sample:

let vungle = BDMAdNetworkConfiguration.build { builder in let _ = builder
    .appendName("vungle")
    .appendNetworkClass(NSClassFromString("BDMVungleAdNetwork") as! BDMNetwork.Type)
    .appendParams(["app_id": "some value"])
    .appendAdUnit(.interstitialUnknown, ["placement_id": "some value"], nil)
}
BDMAdNetworkConfiguration *vungle = [BDMAdNetworkConfiguration buildWithBuilder:^(BDMAdNetworkConfigurationBuilder *builder) {
    builder.appendName(@"vungle");
    builder.appendNetworkClass(NSClassFromString(@"BDMVungleAdNetwork"));
    builder.appendParams(@{ @"app_id": @"some value"} );
    builder.appendAdUnit(BDMAdUnitFormatInterstitialUnknown, @{ @"placement_id" : @"some value" }, nil);
}];

MyTarget

Parameter

Value

name

my_target

networkClass

BDMMyTargetAdNetwork

Initialization parameters are not required for this integration.

Ad unit parameters:

Parameter

Type

slot_id

string

Sample:

let myTarget = BDMAdNetworkConfiguration.build { builder in let _ = builder
    .appendName("my_target")
    .appendNetworkClass(NSClassFromString("BDMMyTargetAdNetwork") as! BDMNetwork.Type)
    .appendAdUnit(.banner320x50, ["slot_id": "some value"], nil)
}
BDMAdNetworkConfiguration *myTarget = [BDMAdNetworkConfiguration buildWithBuilder:^(BDMAdNetworkConfigurationBuilder *builder) {
    builder.appendName(@"my_target");
    builder.appendNetworkClass(NSClassFromString(@"BDMMyTargetAdNetwork"));
    builder.appendAdUnit(BDMAdUnitFormatBanner320x50, @{ @"slot_id" : @"some value" }, nil);
}];

FBAudienceNetwork

Parameter

Value

name

facebook

networkClass

BDMFacebookAdNetwork

Initialization parameters

Parameter

Type

app_id

string

Ad unit parameters

Parameter

Type

facebook_key

string

Sample:

let facebook = BDMAdNetworkConfiguration.build { builder in let _ = builder
    .appendName("facebook")
    .appendNetworkClass(NSClassFromString("BDMFacebookAdNetwork") as! BDMNetwork.Type)
    .appendAdUnit(.inLineBanner, ["facebook_key": "some value"], nil)
    .appendParams(["app_id": "some value"])
}
BDMAdNetworkConfiguration *facebook = [BDMAdNetworkConfiguration buildWithBuilder:^(BDMAdNetworkConfigurationBuilder *builder) {
    builder.appendName(@"facebook");
    builder.appendNetworkClass(NSClassFromString(@"BDMFacebookAdNetwork"));
    builder.appendAdUnit(BDMAdUnitFormatInterstitialStatic, @{ @"facebook_key" : @"some value" }, nil);
    builder.appendParams(@{ @"app_id": @"some value"} );
}];

Tapjoy

Parameter

Value

name

tapjoy

networkClass

BDMTapjoyAdNetwork

Initialization parameters:

Parameter

Type

sdk_key

string

Ad unit parameters:

Parameter

Type

placement_name

string

Sample:

let tapjoy = BDMAdNetworkConfiguration.build { builder in let _ = builder
    .appendName("tapjoy")
    .appendNetworkClass(NSClassFromString("BDMTapjoyAdNetwork") as! BDMNetwork.Type)
    .appendAdUnit(.interstitialVideo, ["placement_name": "some value"], nil)
    .appendParams(["sdk_key": "some value"])
}
BDMAdNetworkConfiguration *tapjoy = [BDMAdNetworkConfiguration buildWithBuilder:^(BDMAdNetworkConfigurationBuilder *builder) {
    builder.appendName(@"tapjoy");
    builder.appendNetworkClass(NSClassFromString(@"BDMTapjoyAdNetwork"));
    builder.appendAdUnit(BDMAdUnitFormatInterstitialVideo, @{ @"placement_name" : @"some value" }, nil);
    builder.appendParams(@{ @"sdk_key": @"some value"} );
}];

AdColony

Parameter

Value

name

adcolony

networkClass

BDMAdColonyAdNetwork

Initialization parameters:

Parameter

Type

app_id

string

Ad unit parameters

Parameter

Type

zone_id

string

Sample:

let adcolony = BDMAdNetworkConfiguration.build { builder in let _ = builder
    .appendName("adcolony")
    .appendNetworkClass(NSClassFromString("BDMAdColonyAdNetwork") as! BDMNetwork.Type)
    .appendAdUnit(.rewardedVideo, ["zone_id": "some value"], nil)
    .appendParams(["app_id": "some value"])
}
BDMAdNetworkConfiguration *adcolony = [BDMAdNetworkConfiguration buildWithBuilder:^(BDMAdNetworkConfigurationBuilder *builder) {
    builder.appendName(@"adcolony");
    builder.appendNetworkClass(NSClassFromString(@"BDMAdColonyAdNetwork"));
    builder.appendAdUnit(BDMAdUnitFormatInterstitialVideo, @{ @"zone_id" : @"some value" }, nil);;
    builder.appendParams(@{ @"app_id": @"some value" } );
}];

Smaato

Parameter

Value

name

smaato

networkClass

BDMSmaatoAdNetwork

Initialization parameters:

Parameter

Type

publisher_id

string

Ad unit parameters:

Parameter

Type

ad_space_id

string

Sample:

let smaato = BDMAdNetworkConfiguration.build { builder in let _ = builder
    .appendName("smaato")
    .appendNetworkClass(NSClassFromString("BDMSmaatoAdNetwork") as! BDMNetwork.Type)
    .appendAdUnit(.rewardedVideo, ["ad_space_id": "some value"], nil)
    .appendParams(["publisher_id": "some value"])
}
BDMAdNetworkConfiguration *smaato = [BDMAdNetworkConfiguration buildWithBuilder:^(BDMAdNetworkConfigurationBuilder *builder) {
    builder.appendName(@"smaato");
    builder.appendNetworkClass(NSClassFromString(@"BDMSmaatoAdNetwork"));
    builder.appendAdUnit(BDMAdUnitFormatInterstitialVideo, @{ @"ad_space_id" : @"some value" }, nil);
    builder.appendParams(@{ @"publisher_id": @"some value"});
}];

Amazon

Parameter

Value

name

amazon

networkClass

BDMAmazonNetwork

Initialization parameters:

Parameter

Type

app_key

string

Ad unit parameters:

Parameter

Type

slot_uuid

string

Sample:

let amazon = BDMAdNetworkConfiguration.build { builder in let _ = builder
    .appendName("amazon")
    .appendNetworkClass(NSClassFromString("BDMAmazonNetwork") as! BDMNetwork.Type)
    .appendAdUnit(.inLineBanner, ["slot_uuid": "some value"], nil)
    .appendParams(["app_key": "some value"])
}
BDMAdNetworkConfiguration *amazon = [BDMAdNetworkConfiguration buildWithBuilder:^(BDMAdNetworkConfigurationBuilder *builder) {
    builder.appendName(@"amazon");
    builder.appendNetworkClass(NSClassFromString(@"BDMAmazonNetwork"));
    builder.appendAdUnit(BDMAdUnitFormatInLineBanner, @{ @"slot_uuid" : @"some value" }, nil);
    builder.appendParams(@{ @"app_key": @"some value"});
}];

Criteo

Parameter

Value

name

criteo

networkClass

BDMCriteoAdNetwork

Initialisation parameters

Parameter

Type

publisher_id

string

Ad unit parameters

Parameter

Type

ad_unit_id

string

orientation(optional)

portrait or landscape

Sample:

let criteo = BDMAdNetworkConfiguration.build { builder in let _ = builder
    .appendName("criteo")
    .appendNetworkClass(NSClassFromString("BDMCriteoAdNetwork") as! BDMNetwork.Type)
    .appendAdUnit(.inLineBanner, ["ad_unit_id": "some value"], nil)
    .appendParams(["publisher_id": "some value"])
}
BDMAdNetworkConfiguration *criteo = [BDMAdNetworkConfiguration buildWithBuilder:^(BDMAdNetworkConfigurationBuilder *builder) {
    builder.appendName(@"criteo");
    builder.appendNetworkClass(NSClassFromString(@"BDMCriteoAdNetwork"));
    builder.appendAdUnit(BDMAdUnitFormatInLineBanner, @{ @"ad_unit_id" : @"some value" }, nil);
    builder.appendParams(@{ @"publisher_id": @"some value"});
}];

Pangle

Parameter

Value

name

pangle_sdk

networkClass

BDMPangleAdNetwork

Initialisation parameters

Parameter

Type

app_id

string

Ad unit parameters

Parameter

Type

slot_id

string

Sample:

let pangle = BDMAdNetworkConfiguration.build { builder in let _ = builder
    .appendName("pangle_sdk")
    .appendNetworkClass(NSClassFromString("BDMPangleAdNetwork") as! BDMNetwork.Type)
    .appendAdUnit(.inLineBanner, ["slot_id": "some value"], nil)
    .appendParams(["app_id": "some value"])
}
BDMAdNetworkConfiguration *pangle = [BDMAdNetworkConfiguration buildWithBuilder:^(BDMAdNetworkConfigurationBuilder *builder) {
    builder.appendName(@"pangle_sdk");
    builder.appendNetworkClass(NSClassFromString(@"BDMPangleAdNetwork"));
    builder.appendAdUnit(BDMAdUnitFormatInLineBanner, @{ @"slot_id" : @"some value" }, nil);
    builder.appendParams(@{ @"app_id": @"some value"});
}];