BiddingStack React Native SDK Integration Guide
BiddingStack React Native SDK provides cross-platform header bidding for iOS and Android with Google Ad Manager (GAM) integration. It wraps the native iOS and Android SDKs via native modules. View Changelog.
| Component | Minimum Version |
|---|---|
| React Native | 0.72+ |
| iOS | 15.6+ |
| Android Min SDK | 23 |
npm install ../biddingstack-core-26.7.20.tgz
npm install ../biddingstack-gam-adapter-26.7.20.tgz
import { BiddingStack, BiddingStackBannerAdUnit, BiddingStackAdSize } from 'biddingstack-core';
import { BiddingStackGAMAdapter, BiddingStackGAMBannerView, GAMBannerProvider } from 'biddingstack-gam-adapter';
Add to Info.plist:
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSUserTrackingUsageDescription</key>
<string>This identifier will be used to deliver personalized ads to you.</string>
<key>SKAdNetworkItems</key>
<array>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>22mmun2rn5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>2fnua5tdw4.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>2u9pt9hc89.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>3qcr597p9d.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>3qy4746246.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>3rd42ekr43.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>3sh42y64q3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>4468km3ulz.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>44jx6755aq.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>47vhws6wlr.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>4dzt52r2t5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>4fzdc2evr5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>578prtvx9j.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>7ug5zh24hu.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>8c4e2ghe7u.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>8s468mfl3y.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>97r2b46745.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>9t245vhmpl.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>a2p9lx4jpn.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>c3frkrj4fj.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>c6k4g5qg8m.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>cp8zw746q7.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>cstr6suwn9.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>e5fvkxwrpn.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>f38h382jlk.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>gta9lk7p23.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>hs6bdukanm.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>k674qkevps.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>kbd757ywx3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>kbmxgpxpgc.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>klf5c3l5u5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>ludvb6z3bs.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>mlmmfzh3r3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>n38lu8286q.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>p78axxw29g.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>ppxm28t8ap.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>s39g8k73mm.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>su67r6k2v3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>t38b2kh725.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>tl55sbb4fm.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>uw77j35x4d.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>v4nxqhlyqp.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>v72qych5uu.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>v9wttpbfk9.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>vutu7akeur.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>wg4vff78zm.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>wzmmz9fp6w.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>y5ghdn5j9k.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>yclnxrl5pm.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>ydx93a7ass.skadnetwork</string>
</dict>
</array>
| SKAdNetwork ID | Company |
|---|---|
cstr6suwn9 | |
4fzdc2evr5 | Aarki |
2fnua5tdw4 | AppLovin |
ydx93a7ass | Adikteev |
p78axxw29g | ByteDance (Pangle) |
v72qych5uu | Appier |
c6k4g5qg8m | Beeswax (Freewheel) |
hs6bdukanm | Criteo |
mlmmfzh3r3 | Appreciate |
wzmmz9fp6w | Snap Inc. |
yclnxrl5pm | Jampp |
t38b2kh725 | Lifestreet |
7ug5zh24hu | Liftoff (Vungle) |
9t245vhmpl | Moloco |
44jx6755aq | Persona.ly |
4468km3ulz | Kayzen |
tl55sbb4fm | PubNative (Verve Group) |
2u9pt9hc89 | Remerge |
8s468mfl3y | RTB House |
klf5c3l5u5 | Sift |
ppxm28t8ap | Smadex |
3rd42ekr43 | YouAppi |
| Others | Google (Demand Partners) |
Install pods: cd ios && bundle exec pod install
Update AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application ...>
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX"/>
</application>
Add BiddingStack packages in MainApplication.kt:
PackageList(this).packages.apply {
add(BiddingStackPackage())
add(BiddingStackGAMAdapterPackage())
}
Initialize from TypeScript before rendering any ads. initialize() returns a Promise; await it to ensure the remote config is loaded before rendering ad views:
import { BiddingStack } from 'biddingstack-core';
await BiddingStack.initialize('YOUR_BS_ACCOUNT_ID', '', '', '', 2000, true);
Important: iOS and Android use separate BiddingStack account IDs and config IDs. See Platform-Specific Configuration for how to pass the correct values per platform.
| Parameter | Type | Default | Description |
|---|---|---|---|
accountId | string | required | Your BiddingStack Account ID |
appBundle | string | '' | App bundle ID (auto-detected if empty) |
appName | string | '' | App name (resolved from config if empty) |
appStoreId | string | '' | App Store / Play Store ID (resolved from config if empty) |
timeout | number | 2000 | Bid request timeout in ms |
enableTestMode | boolean | false | Enable debug logging and test mode |
currency | string | 'USD' | Currency code for bid requests |
enableCMP | boolean | true | Auto-read IAB CMP strings from UserDefaults/SharedPreferences |
requestATTPermission | boolean | true | iOS only: prompt for App Tracking Transparency permission during initialization |
Note: App bundle, name, store ID, and GAM ad unit paths are resolved automatically from the remote config.
const bannerAdUnit = new BiddingStackBannerAdUnit(
'YOUR_CONFIG_ID',
'YOUR_GAM_AD_UNIT_ID', // optional fallback if config API is unavailable
[new BiddingStackAdSize(300, 250)],
true // autoRefreshEnabled
);
<BiddingStackGAMBannerView adUnitObj={bannerAdUnit} />
const videoAdUnit = new BiddingStackBannerAdUnit(
'YOUR_CONFIG_ID',
undefined,
[new BiddingStackAdSize(300, 250)],
false, false, true,
[BiddingStackFormat.video]
);
<BiddingStackGAMVideoBannerView adUnitObj={videoAdUnit} />
// Google interstitial size: 320x480 phone, 768x1024 tablet
const interstitialAdUnit = new BiddingStackInterstitialAdUnit(
'YOUR_CONFIG_ID',
undefined,
new BiddingStackAdSize(320, 480),
);
BiddingStackGAMAdapter.loadAndShowInterstitialAdByGAM(interstitialAdUnit);
const gamBannerProvider = new GAMBannerProvider(
'AD_UNIT_ID',
[new BiddingStackAdSize(320, 480)]
);
// Load
BiddingStackGAMAdapter.loadInterstitialAdWithGAMBannerProvider(interstitialAdUnit, gamBannerProvider);
// Show when ready
BiddingStackGAMAdapter.showInterstitialAdWithGAMBannerProvider(interstitialAdUnit);
const rewardedAdUnit = new BiddingStackRewardedAdUnit(
'YOUR_CONFIG_ID',
undefined,
new BiddingStackAdSize(300, 250),
);
BiddingStackGAMAdapter.loadAndShowRewardedAdByGAM(rewardedAdUnit);
const nativeAdUnit = new BiddingStackNativeAdUnit('YOUR_CONFIG_ID');
const ad = await BiddingStack.getNativeAd(nativeAdUnit);
if (ad) {
console.log(ad.title, ad.body, ad.callToAction);
}
| Property | Type | Description |
|---|---|---|
title | string? | Ad headline |
body | string? | Ad body text |
callToAction | string? | CTA button text |
sponsoredBy | string? | Sponsor/advertiser name |
iconURL | string? | Icon image URL |
mainImageURL | string? | Main image URL |
clickURL | string | Click-through URL |
await BiddingStack.preloadBid(bannerAdUnit);
// Later, the ad view uses the cached bid automatically
BiddingStack.setUserId('user-123');
BiddingStack.setUserGender('M');
BiddingStack.setUserYob(1988);
BiddingStack.setUserLatLng(37.7749, -122.4194);
BiddingStack.setAppStoreUrl('https://apps.apple.com/app/id123456');
BiddingStack.setAppCategories(['IAB1', 'IAB4-3']);
BiddingStack.setExternalUserIds({ uid: 'user12345' });
BiddingStack.setSchainObject(JSON.stringify({ ver: '1.0', complete: 1, nodes: [...] }));
BiddingStack.setBuyerUid('buyer-789');
// Custom targeting
BiddingStack.addTargetingKV('interest', 'gaming');
BiddingStack.addTargetingKV('region', ['us-east', 'us-west']);
BiddingStack.removeTargetingKey('interest');
BiddingStack.clearTargetingKV();
Pass the web URL of the content the user is currently viewing so it is included in every bid request as app.content.url. This is important for brand safety and yield: it gives bidders page-level context to verify where their ads run, which increases bid rates and CPMs. Set it before the screen's ad views mount and update it on each screen change; pass null to clear.
BiddingStack.setContentUrl('https://www.example.com/article/12345');
Available since SDK 26.7.1.
BiddingStack.setCoppa(true);
BiddingStack.setUSPrivacy('1YNN');
BiddingStack.setGppConsent('gpp_string', [1, 2]);
BiddingStack.setGDPR('USER_CONSENT_STRING', true);
const bannerAdUnit = new BiddingStackBannerAdUnit(
'YOUR_CONFIG_ID',
undefined,
[new BiddingStackAdSize(300, 250)],
true, true, true,
[BiddingStackFormat.banner],
[new BiddingStackDeal('deal-123', 5.50, 'USD')]
);
If iOS and Android use different account IDs or config IDs:
import { Platform } from 'react-native';
await BiddingStack.initialize(
Platform.OS === 'ios' ? 'IOS_ACCOUNT_ID' : 'ANDROID_ACCOUNT_ID',
'', '', '', 2000, true
);
const bannerAdUnit = new BiddingStackBannerAdUnit(
Platform.OS === 'ios' ? 'ios_config_id' : 'android_config_id',
undefined,
[new BiddingStackAdSize(300, 250)],
);