Privacy & Compliance Guide
The Teads SDK reads IAB consent strings and supports GDPR, CCPA, and GPP. Configure TeadsPrivacy yourself only if you are not using a CMP.
Supported Privacy Standards
GDPR (General Data Protection Regulation)
Full support for European privacy requirements including:
- IAB TCF v1.1 and v2.0 consent strings
- Purpose and vendor consent management
- Legitimate interest handling
CCPA (California Consumer Privacy Act)
Complete CCPA compliance with:
- IAB US Privacy String support
- Opt-out mechanism implementation
- Sale of personal information controls
GPP (Global Privacy Platform)
Support for the IAB's Global Privacy Platform:
- Multi-jurisdiction privacy signals
- Section-specific consent handling
- Future-proof privacy framework
Basic Implementation
Automatic Privacy Detection
The SDK automatically detects and respects privacy signals from your CMP (Consent Management Platform).
// The SDK automatically reads consent from SharedPreferences
// No additional configuration needed if using IAB-compliant CMP
Complete Privacy Implementation Example
Example combining all privacy frameworks when you set consent without a CMP:
- Kotlin
- Java
import tv.teads.sdk.combinedsdk.privacy.TeadsPrivacy
import tv.teads.sdk.combinedsdk.privacy.AdvertisingIDCallback
import android.content.Context
object PrivacyConfiguration {
fun configureAllPrivacySettings(context: Context) {
// Set GDPR applies flag
TeadsPrivacy.setGDPRApplies(true)
// Set GDPR TCF v2 consent string
TeadsPrivacy.setGDPRConsentStringV2("YOUR_TCF_V2_CONSENT_STRING")
// Set GDPR TCF v1 consent string (if using legacy CMP)
TeadsPrivacy.setGDPRConsentStringV1("YOUR_TCF_V1_CONSENT_STRING")
// Set US Privacy (CCPA) string
TeadsPrivacy.setUSPrivacyString("1YNN")
// Set GPP consent string
TeadsPrivacy.setGPPString("YOUR_GPP_CONSENT_STRING")
// Set GPP sections
TeadsPrivacy.setGPPSections("1,2,3")
// Request Android Advertising ID
TeadsPrivacy.requestAdvertisingID(
context,
object : AdvertisingIDCallback {
override fun onAdvertisingIDReceived(advertisingId: String?) {
// Handle advertising ID result
}
override fun onAdvertisingIDError(exception: Exception) {
// Handle advertising ID error
}
}
)
// Clear all custom settings (if needed)
TeadsPrivacy.clearAllCustomSettings()
}
}
import tv.teads.sdk.combinedsdk.privacy.TeadsPrivacy;
import tv.teads.sdk.combinedsdk.privacy.AdvertisingIDCallback;
import android.content.Context;
public class PrivacyConfiguration {
public static void configureAllPrivacySettings(Context context) {
// Set GDPR applies flag
TeadsPrivacy.INSTANCE.setGDPRApplies(true);
// Set GDPR TCF v2 consent string
TeadsPrivacy.INSTANCE.setGDPRConsentStringV2("YOUR_TCF_V2_CONSENT_STRING");
// Set GDPR TCF v1 consent string (if using legacy CMP)
TeadsPrivacy.INSTANCE.setGDPRConsentStringV1("YOUR_TCF_V1_CONSENT_STRING");
// Set US Privacy (CCPA) string
TeadsPrivacy.INSTANCE.setUSPrivacyString("1YNN");
// Set GPP consent string
TeadsPrivacy.INSTANCE.setGPPString("YOUR_GPP_CONSENT_STRING");
// Set GPP sections
TeadsPrivacy.INSTANCE.setGPPSections("1,2,3");
// Request Android Advertising ID
TeadsPrivacy.INSTANCE.requestAdvertisingID(
context,
new AdvertisingIDCallback() {
@Override
public void onAdvertisingIDReceived(String advertisingId) {
// Handle advertising ID result
}
@Override
public void onAdvertisingIDError(Exception exception) {
// Handle advertising ID error
}
}
);
// Clear all custom settings (if needed)
TeadsPrivacy.INSTANCE.clearAllCustomSettings();
}
}
Testing Privacy Compliance
Debug Privacy Settings
- Kotlin
- Java
object TeadsPrivacyDebug {
fun debugPrintPrivacyStatus(context: Context) {
Log.d("PrivacyStatus", "=== Privacy Status ===")
Log.d("PrivacyStatus", "GDPR Applies: ${TeadsPrivacy.gdprApplies(context)}")
Log.d("PrivacyStatus", "GDPR Consent V2: ${TeadsPrivacy.gdprConsentStringV2(context) ?: "none"}")
Log.d("PrivacyStatus", "GDPR Consent V1: ${TeadsPrivacy.gdprConsentStringV1(context) ?: "none"}")
Log.d("PrivacyStatus", "US Privacy: ${TeadsPrivacy.usPrivacyString(context) ?: "none"}")
Log.d("PrivacyStatus", "GPP String: ${TeadsPrivacy.gppString(context) ?: "none"}")
Log.d("PrivacyStatus", "GPP Sections: ${TeadsPrivacy.gppSections(context) ?: "none"}")
Log.d("PrivacyStatus", "CMP Present: ${TeadsPrivacy.isCMPPresent(context)}")
Log.d("PrivacyStatus", "Has GDPR Consent for Teads: ${TeadsPrivacy.hasGDPRConsentForTeads(context)}")
Log.d("PrivacyStatus", "US Privacy Opted Out: ${TeadsPrivacy.usPrivacyStringHasOptedOutOfSale(context)}")
Log.d("PrivacyStatus", "===================")
}
}
// Usage
if (BuildConfig.DEBUG) {
TeadsPrivacyDebug.debugPrintPrivacyStatus(context)
}
public class TeadsPrivacyDebug {
public static void debugPrintPrivacyStatus(Context context) {
Log.d("PrivacyStatus", "=== Privacy Status ===");
Log.d("PrivacyStatus", "GDPR Applies: " + TeadsPrivacy.INSTANCE.gdprApplies(context));
Log.d("PrivacyStatus", "GDPR Consent V2: " + (TeadsPrivacy.INSTANCE.gdprConsentStringV2(context) != null ? TeadsPrivacy.INSTANCE.gdprConsentStringV2(context) : "none"));
Log.d("PrivacyStatus", "GDPR Consent V1: " + (TeadsPrivacy.INSTANCE.gdprConsentStringV1(context) != null ? TeadsPrivacy.INSTANCE.gdprConsentStringV1(context) : "none"));
Log.d("PrivacyStatus", "US Privacy: " + (TeadsPrivacy.INSTANCE.usPrivacyString(context) != null ? TeadsPrivacy.INSTANCE.usPrivacyString(context) : "none"));
Log.d("PrivacyStatus", "GPP String: " + (TeadsPrivacy.INSTANCE.gppString(context) != null ? TeadsPrivacy.INSTANCE.gppString(context) : "none"));
Log.d("PrivacyStatus", "GPP Sections: " + (TeadsPrivacy.INSTANCE.gppSections(context) != null ? TeadsPrivacy.INSTANCE.gppSections(context) : "none"));
Log.d("PrivacyStatus", "CMP Present: " + TeadsPrivacy.INSTANCE.isCMPPresent(context));
Log.d("PrivacyStatus", "Has GDPR Consent for Teads: " + TeadsPrivacy.INSTANCE.hasGDPRConsentForTeads(context));
Log.d("PrivacyStatus", "US Privacy Opted Out: " + TeadsPrivacy.INSTANCE.usPrivacyStringHasOptedOutOfSale(context));
Log.d("PrivacyStatus", "===================");
}
}
// Usage
if (BuildConfig.DEBUG) {
TeadsPrivacyDebug.debugPrintPrivacyStatus(context);
}
Privacy Checklist
Implementation Checklist
-
Consent Management
- Request user consent before ad loading
- Implement or integrate CMP
- Handle GDPR consent
- Handle CCPA compliance
- Support GPP if applicable
-
Testing
- Test with consent given
- Test with consent denied
- Test consent changes
- Test different geographic regions
Best Practices
1. Early Initialization
Initialize privacy settings as early as possible:
With CMP (Automatic):
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
// Initialize CMP
// CMP automatically writes to SharedPreferences
// SDK reads consent automatically - no manual setup needed
// Initialize SDK and load the placements
}
}
Manual Configuration:
- Kotlin
- Java
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
// Manual privacy configuration
TeadsPrivacy.setGDPRApplies(true)
TeadsPrivacy.setGDPRConsentStringV2("YOUR_CONSENT_STRING")
TeadsPrivacy.setUSPrivacyString("1YNN")
// Initialize SDK and load the placements
}
}
public class MainApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// Manual privacy configuration
TeadsPrivacy.INSTANCE.setGDPRApplies(true);
TeadsPrivacy.INSTANCE.setGDPRConsentStringV2("YOUR_CONSENT_STRING");
TeadsPrivacy.INSTANCE.setUSPrivacyString("1YNN");
// Initialize SDK and load the placements
}
}
Additional Resources
Support
For privacy-related questions:
- Email: privacy@teads.com
- Legal: legal@teads.com
Privacy is fundamental to building trust with your users. The Teads SDK helps you maintain that trust while maximizing monetization opportunities.