Migration Guide from Outbrain SDK to Teads Unified SDK
This guide helps developers currently using the Outbrain SDK transition to Teads SDK. The standalone Outbrain SDK is deprecated; its features are in Teads SDK, and migration is required.
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() |
| Widget Class | SFWidget | TeadsAdPlacementFeed |
| Recommendations | OBRequest | TeadsAdPlacementRecommendations |
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
Remove Outbrain SDK
CocoaPods:
# Remove from Podfile
# pod 'OutbrainSDK'
# Add Teads SDK
pod 'TeadsSDK', '~> 6.2'
Swift Package Manager:
// Remove Outbrain package
// Add Teads package
dependencies: [
.package(url: "https://github.com/teads/TeadsSDK-iOS.git", .upToNextMajor(from: "6.2.1"))
]
Run pod install or update your SPM dependencies.
Step 2: Update Imports
Replace all Outbrain imports with Teads:
// Before
import OutbrainSDK
// After
import TeadsSDK
Step 3: Update SDK Initialization
Before (Outbrain SDK)
// AppDelegate or App initialization
Outbrain.initializeOutbrain(withPartnerKey: "YOUR_PARTNER_KEY")
After (Teads Unified SDK)
- Swift
- Objective-C
// AppDelegate or App initialization
Teads.configure(with: "YOUR_PARTNER_KEY")
// AppDelegate or App initialization
[Teads configureWith:@"YOUR_PARTNER_KEY"];
Step 4: Migrate Widget Implementation
The widget functionality is now provided through TeadsAdPlacementFeed.
Before (Outbrain SDK) - UIKit
class WidgetViewController: UIViewController {
var widget: SFWidget?
override func viewDidLoad() {
super.viewDidLoad()
// Create widget
widget = SFWidget()
widget?.delegate = self
// Configure widget
widget?.configure(
with: self,
url: "https://mobile-demo.outbrain.com",
widgetId: "MB_1",
widgetIndex: 0,
installationKey: "NANOWDGT01",
userId: "user123",
darkMode: false
)
// Add to view
view.addSubview(widget!)
// Setup constraints
widget?.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
widget!.leadingAnchor.constraint(equalTo: view.leadingAnchor),
widget!.trailingAnchor.constraint(equalTo: view.trailingAnchor),
widget!.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)
])
}
}
// Delegate
extension WidgetViewController: SFWidgetDelegate {
func didChangeHeight(_ newHeight: CGFloat) {
// Update height
}
func onRecClick(_ url: URL) {
// Handle click
}
func onOrganicRecClick(_ url: URL) {
// Handle organic click
}
}
After (Teads Unified SDK) - UIKit
| Outbrain | Teads |
|---|---|
SFWidget | TeadsAdPlacementFeed |
Keep the same widgetId, installationKey, article URL, and widgetIndex. Store feedPlacement as a view controller property, not a local, so later steps, like toggling dark mode, can reach the same instance.
var feedPlacement: TeadsAdPlacementFeed?
// In viewDidLoad:
let config = TeadsAdPlacementFeedConfig(
articleUrl: URL(string: "https://mobile-demo.outbrain.com")!,
widgetId: "MB_1",
installationKey: "NANOWDGT01",
widgetIndex: 0,
userId: "user123",
darkMode: false
)
feedPlacement = TeadsAdPlacementFeed(config, delegate: self)
let feedView = try feedPlacement?.loadAd()
Add feedView to the hierarchy the same way you added SFWidget.
- Feed — constraints, dark mode, events
- Objective-C:
getAdView()on the Feed page (FeedloadAd()does not bridge) - Placement Events — event names
Step 5: Migrate SwiftUI Implementation
Before (Outbrain SDK) - SwiftUI
import SwiftUI
import OutbrainSDK
struct ContentView: View {
var body: some View {
VStack {
// Your content
// Outbrain widget
OutbrainWidgetView(
url: "https://mobile-demo.outbrain.com",
widgetId: "MB_1",
widgetIndex: 0,
installationKey: "NANOWDGT01",
userId: "user123",
darkMode: false,
onOrganicRecClick: { url in
// Handle click
}
)
.frame(height: 400)
}
}
}
After (Teads Unified SDK) - SwiftUI
| Outbrain | Teads |
|---|---|
OutbrainWidgetView | TeadsAdPlacementSwiftUIView<TeadsAdPlacementFeed> |
Use .frame(maxWidth: .infinity), not a fixed height.
- Feed — SwiftUI sample
Step 6: Migrate Recommendations API
Before (Outbrain SDK)
// Fetch recommendations programmatically
let request = OBRequest(url: "https://mobile-demo.outbrain.com",
widgetID: "SDK_1")
Outbrain.fetchRecommendations(for: request) { response in
for recommendation in response.recommendations {
print("Title: \(recommendation.content)")
print("URL: \(recommendation.url)")
}
}
After (Teads Unified SDK)
| Outbrain | Teads |
|---|---|
Outbrain.fetchRecommendations | TeadsAdPlacementRecommendations.loadAd |
Keep the same widget ID.
- Recommendations — full sample
Step 7: Update Dark Mode Handling
Before (Outbrain SDK)
// Toggle dark mode
widget?.toggleDarkMode(isDarkMode)
After (Teads Unified SDK)
- Swift
- Objective-C
// For Feed placement
feedPlacement?.toggleDarkMode(isDarkMode)
// Or configure at creation
let config = TeadsAdPlacementFeedConfig(
// ... other parameters
darkMode: true
)
// For Feed placement
[feedPlacement toggleDarkMode:isDarkMode];
// Or configure at creation — TeadsAdPlacementFeedConfig is a Swift struct and doesn't
// bridge to Objective-C; pass darkMode:YES directly to the convenience initializer
// instead (see the Feed placement examples earlier in this guide).
Step 8: Update Viewability Tracking (Regular SDK / TeadsAdPlacementRecommendations)
Before (Outbrain SDK)
// Configure viewability per listing
Outbrain.configureViewabilityPerListing(for: view, withRec: recommendation)
After (Teads Unified SDK)
- Swift
- Objective-C
// Configure viewability per listing
TeadsAdPlacementRecommendations.configureViewabilityPerListing(for: view, withRec: recommendation)
// Configure viewability per listing
[TeadsAdPlacementRecommendations configureViewabilityPerListingFor:view withRec:recommendation];
New Opportunities with Teads SDK
The Media format is available alongside Feed.
- Media — integration
- Placement Events — events
API Mapping Reference
| Outbrain SDK | Teads Unified SDK |
|---|---|
SFWidget | TeadsAdPlacementFeed |
OBRequest | TeadsAdPlacementRecommendationsConfig |
OBRecommendation | OBRecommendation (unchanged) |
OBError | Standard Swift Error |
SFWidgetDelegate | TeadsAdPlacementEventsDelegate |
OBResponseDelegate | Closure/async callbacks |
Outbrain.initializeOutbrain() | Teads.configure() |
Outbrain.fetchRecommendations() | TeadsAdPlacementRecommendations.loadAd() |
Outbrain.setTestMode(value) | Teads.testMode = value |
Support and Resources
Migration Support
- Integration Guide
- Support: Support
Next Steps
- Review the Integration Guide for detailed implementation
- Explore the Media format
- Learn about Privacy Compliance
We're here to help make your migration smooth and successful. See our support page in case you have any questions.