Skip to main content

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​

AspectOutbrain SDKTeads Unified SDK
SDK NameOutbrainSDKTeadsSDK
Import Statementimport OutbrainSDKimport TeadsSDK
InitializationOutbrain.initializeOutbrain()Teads.configure()
Widget ClassSFWidgetTeadsAdPlacementFeed
RecommendationsOBRequestTeadsAdPlacementRecommendations

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)​

// AppDelegate or App initialization
Teads.configure(with: "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​

OutbrainTeads
SFWidgetTeadsAdPlacementFeed

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 (Feed loadAd() 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​

OutbrainTeads
OutbrainWidgetViewTeadsAdPlacementSwiftUIView<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)​

OutbrainTeads
Outbrain.fetchRecommendationsTeadsAdPlacementRecommendations.loadAd

Keep the same widget ID.

Step 7: Update Dark Mode Handling​

Before (Outbrain SDK)​

// Toggle dark mode
widget?.toggleDarkMode(isDarkMode)

After (Teads Unified SDK)​

// For Feed placement
feedPlacement?.toggleDarkMode(isDarkMode)

// Or configure at creation
let config = TeadsAdPlacementFeedConfig(
// ... other parameters
darkMode: true
)

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)​

// Configure viewability per listing
TeadsAdPlacementRecommendations.configureViewabilityPerListing(for: view, withRec: recommendation)

New Opportunities with Teads SDK​

The Media format is available alongside Feed.

API Mapping Reference​

Outbrain SDKTeads Unified SDK
SFWidgetTeadsAdPlacementFeed
OBRequestTeadsAdPlacementRecommendationsConfig
OBRecommendationOBRecommendation (unchanged)
OBErrorStandard Swift Error
SFWidgetDelegateTeadsAdPlacementEventsDelegate
OBResponseDelegateClosure/async callbacks
Outbrain.initializeOutbrain()Teads.configure()
Outbrain.fetchRecommendations()TeadsAdPlacementRecommendations.loadAd()
Outbrain.setTestMode(value)Teads.testMode = value

Support and Resources​

Migration Support​

Next Steps​

  1. Review the Integration Guide for detailed implementation
  2. Explore the Media format
  3. 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.