Migration Guide from Outbrain SDK to Teads Unified SDK
The standalone Outbrain SDK is deprecated. This guide covers the move to the Teads SDK; widget IDs and installation keys stay the same.
Overview of Changes
What's Changing
| Aspect | Outbrain SDK | Teads Unified SDK |
|---|---|---|
| SDK Name | OutbrainSDK | TeadsSDK |
| Import Statement | import OutbrainSDK | import TeadsSDK |
| Initialization | Outbrain.initializeOutbrain() | Teads.configure(applicationContext: Context, appKey: String) |
| Widget Class | SFWebViewWidget / SFWebViewWidgetPolling | TeadsAdPlacementFeed |
| Recommendations | OBRequest | TeadsAdPlacementRecommendations |
| Configuration | Builder pattern | Configuration objects |
What's Preserved
✅ All widget functionality
✅ Content recommendation algorithms
✅ Viewability tracking
✅ User personalization
✅ Dark mode support
✅ Event tracking
What's New
🎁 Access to the Media format
🎁 Unified event system
🎁 Improved performance
🎁 Enhanced privacy controls
Step-by-Step Migration
Step 1: Update Dependencies
project/build.gradle
repositories {
maven { url "https://teads.jfrog.io/artifactory/SDKAndroid-maven-prod" }
maven {
// Mandatory for Huawei device compatibility
url "https://developer.huawei.com/repo/"
}
}
app/build.gradle
dependencies {
// Remove legacy dependency
// implementation "com.outbrain.mobile:obsdk:${version}
// Add new Teads SDK
implementation("tv.teads.sdk.android:sdk:6.2.3@aar") {
transitive = true
}
}
Manual Installation
- Download the latest TeadsSDK .aar file
- Copy it to your app's
libsfolder - Add to your
build.gradle:
dependencies {
implementation files('libs/sdk-6.2.3.aar') {
transitive = true
}
}
Step 2: Update Imports
Replace all Outbrain imports with Teads:
// Before
import com.outbrain.*
// After
import tv.teads.sdk.*
Step 3: Update SDK Initialization
Before (Outbrain SDK)
// App initialization
Outbrain.register(applicationContext, "YOUR_PARTNER_KEY")
// Configuration for testing builds
if (BuildConfig.DEBUG) {
Outbrain.setTestMode(true)
Outbrain.testLocation("us") // Optional: Test specific geolocations
}
After (Teads Unified SDK)
- Kotlin
- Java
// App initialization
TeadsSDK.configure(applicationContext, "YOUR_PARTNER_KEY")
// Configuration for testing builds
if (BuildConfig.DEBUG) {
TeadsSDK.testMode = true
TeadsSDK.testLocation = "us" // Optional: Test specific geolocations
}
// App initialization
try {
TeadsSDK.INSTANCE.configure(applicationContext, "YOUR_PARTNER_KEY");
} catch (OutbrainException e) {
// Handle configuration error
}
// Configuration for testing builds
if (BuildConfig.DEBUG) {
TeadsSDK.INSTANCE.setTestMode(true);
TeadsSDK.INSTANCE.setTestLocation("us"); // Optional: Test specific geolocations
}
Step 4: Migrate Widget Implementation
The widget functionality is now provided through TeadsAdPlacementFeed.
Before (Outbrain SDK)
import android.content.res.Configuration
import android.os.Bundle
import android.os.Handler
import android.util.Log
import android.view.ViewGroup
import android.widget.ScrollView
import androidx.annotation.NonNull
import androidx.appcompat.app.AppCompatActivity
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.outbrain.OBSDK.SFWebView.SFWebViewClickListener
import com.outbrain.OBSDK.SFWebView.SFWebViewHeightDelegate
import com.outbrain.OBSDK.SFWebView.SFWebViewWidget
import com.outbrain.catalog.databinding.ActivitySfwidgetScrollviewBinding
class SFWebViewScrollViewActivity : AppCompatActivity(), SFWebViewClickListener {
private val LOG_TAG = "SFWebViewScrollActivity"
private lateinit var binding: ActivitySfwidgetScrollviewBinding
private lateinit var sfWidget: SFWebViewWidget
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySfwidgetScrollviewBinding.inflate(layoutInflater)
setContentView(binding.root)
// Initialize widget
sfWidget = SFWebViewWidget(
binding.adScrollView,
"http://mobile-demo.outbrain.com",
"MB_2", // Widget ID
0, // Widget Index
"NANOWDGT01", // Installation Key
this, // SFWebViewClickListener
false // Dark Mode
)
// Add widget to layout
binding.adContainerView.addView(sfWidget)
// Optional: Handle clicks on organic urls
sfWidget.setSfWebViewClickListener(this)
// Toggle dark mode at your convenience
sfWidget.toggleDarkMode(true)
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
sfWidget.onActivityConfigurationChanged()
}
override fun onOrganicClick(url: String) {
// Programmatically open browser with the url
}
}
After (Teads Unified SDK)
| Outbrain | Teads |
|---|---|
SFWebViewWidget | TeadsAdPlacementFeed |
Keep the same widget ID, installation key, article URL, and index. Store feedPlacement as an Activity property, not a local variable, so onConfigurationChanged can reach it.
private lateinit var feedPlacement: TeadsAdPlacementFeed
// In onCreate:
val config = TeadsAdPlacementFeedConfig(
articleUrl = Uri.parse("http://mobile-demo.outbrain.com"),
widgetId = "MB_2",
installationKey = "NANOWDGT01",
widgetIndex = 0,
darkMode = false
)
feedPlacement = TeadsAdPlacementFeed(this, config, this)
binding.adContainerView.addView(feedPlacement.loadAd())
// In onConfigurationChanged:
feedPlacement.onActivityConfigurationChanged()
- Feed — full sample, organic clicks, dark mode
- Placement Events — events
Step 5: Migrate Recommendations API
Before (Outbrain SDK)
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.outbrain.OBSDK.Entities.OBRecommendationsResponse
import com.outbrain.OBSDK.FetchRecommendations.OBRequest
import com.outbrain.OBSDK.FetchRecommendations.RecommendationsListener
import com.outbrain.OBSDK.Outbrain
import com.outbrain.catalog.databinding.ActivityRecommendationsScrollviewBinding
class RecommendationsScrollViewActivity : AppCompatActivity(), RecommendationsListener {
private val LOG_TAG = "RecommendationsScrollViewActivity"
private lateinit var binding: ActivityRecommendationsScrollviewBinding
private lateinit var recommendationsList: ArrayList<OBRecommendation>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityClassicWithImageBinding.inflate(layoutInflater)
setContentView(binding.root)
// Request recommendations
loadRecommendations()
}
private fun loadRecommendations() {
val request = OBRequest()
request.setWidgetId("SDK_1")
request.setUrl("http://mobile-demo.outbrain.com/2013/12/15/test-page-2")
request.setWidgetIndex(0)
Outbrain.fetchRecommendations(request, this)
}
override fun onOutbrainRecommendationsSuccess(recommendationsResponse: OBRecommendationsResponse) {
recommendationsResponse.all.forEach { recommendation ->
// Iterate recommendationsResponse list and inflate your views
// Configure viewability tracking
Outbrain.configureViewabilityPerListingFor(recommendationContainerView, recommendation)
}
}
override fun onOutbrainRecommendationsFailure(ex: Exception) {
// Failure callback
ex.printStackTrace()
}
}
After (Teads Unified SDK)
| Outbrain | Teads |
|---|---|
Outbrain.fetchRecommendations | TeadsAdPlacementRecommendations.loadAdSuspend() |
loadAd is the callback equivalent. Keep the same widget ID. Viewability stays configureViewabilityPerListingFor.
- Recommendations — full sample
Configurations migration map
SDK top level configurations
| Legacy Outbrain.java Method | New TeadsSDK.kt Method | Notes |
|---|---|---|
register(Context, String) | configure(Context, String) | Renamed to keep parity with iOS implementation |
SDKInitialized() | isSDKConfigured() | Renamed for better readability |
setIronSourceIntegration() | setIronSourceIntegration() | Direct copy, same signature |
setTestMode(boolean) | testMode property setter | Converted to property with setter |
testLocation(String) | testLocation property setter | Converted to property with setter |
TeadsAdPlacementFeed configurations
| Legacy Outbrain.java Method | New TeadsAdPlacementFeed.kt Method | Notes |
|---|---|---|
setDisplayTest(boolean) | testDisplay field on TeadsAdPlacementFeedConfig | Called internally during Feed placement initialization based on TeadsAdPlacementFeedConfig |
handleExploreMore(Activity, Runnable) | handleExploreMore(Activity, Runnable) | Static companion method, direct copy |
TeadsAdPlacementRecommendations configurations
| Legacy Outbrain.java Method | New TeadsAdPlacementRecommendations.kt Method | Notes |
|---|---|---|
getUrl(OBRecommendation) | getUrl(OBRecommendation) | Static companion method, direct copy |
getOutbrainAboutURL() | getAdChoicesURL() | Static companion method, direct copy |
testRTB(boolean) | setTestRTB(boolean) | Static companion method, renamed for consistency |
configureViewabilityPerListingFor(ViewGroup, OBRecommendation) | configureViewabilityPerListingFor(ViewGroup, OBRecommendation) | Static companion method, direct copy |
configureViewabilityPerListingFor(OBFrameLayout, OBRecommendation) | configureViewabilityPerListingFor(OBFrameLayout, OBRecommendation) | Static companion method, direct copy |
New Opportunities with Teads SDK
Media and Media Native are available alongside Feed.
Common Questions
Q: Will my existing Outbrain widgets stop working?
A: No, but the legacy Outbrain SDK is being deprecated. However, migration to the Teads Unified SDK preserves all functionality with minimal code changes.
Q: Do I need to change my widget IDs or installation keys?
A: No. All your existing Outbrain configuration parameters (widget IDs, installation keys, etc.) remain the same.
Q: Can I still use the same recommendations UI?
A: Yes, you just need to comply with the new ad request using the placement TeadsAdPlacementRecommendations.
Q: Will my analytics and tracking continue to work?
A: Yes. All existing analytics continue to work, and the new unified event system provides additional insights.
Q: Can I add Media format to my existing app?
A: Yes. The unified SDK gives you access to Teads Media placements alongside your content recommendations, but this need to be arranged with your Publisher Manager.
Migration Checklist
Pre-Migration
- Review current Outbrain SDK implementation
- Identify all widgets and API usage
- Plan migration timeline
- Set up test environment
During Migration
- Update dependencies to Teads SDK v6.2.0. See Installation.
- Replace imports throughout codebase
- Update SDK initialization
- Migrate widget implementations
- Update event handling
- Migrate recommendations API usage
- Update dark mode handling
- Update viewability handling for recommendations API usage
- Test each migrated component
Post-Migration
- Remove Outbrain SDK dependency
- Verify all features work correctly
- Update documentation
- Monitor performance metrics
- Consider adding Media placements
Support and Resources
Migration Support
- Integration Guide
- Support: Support
Next Steps
- Learn about Privacy Compliance
We're here to help make your migration smooth and successful. Contact our support team with any questions.