Prebid vs OpenAds: Inside the Great AdTech Fork of 2025
Prebid vs OpenAds: The Trade Desk forked the industry's auction protocol after Prebid fragmented transaction IDs. A $600B governance crisis—and opportunity.

TL;DR: The Trade Desk just forked Prebid, the open-source auction protocol powering ~70% of online ads, after Prebid fragmented distributed transaction IDs. Now we have two incompatible systems—and a massive opportunity at the semantic layer.
What Actually Happened
If you've been heads-down coding, here's what you missed: a $600B industry just experienced a governance fork that mirrors classic open-source schisms—think Oracle/MySQL → MariaDB, or Elasticsearch → OpenSearch.

August 2025: Prebid.js 10.9.0 shipped a breaking change to how transaction IDs work across distributed auction nodes.
October 2025: The Trade Desk (a major platform contributor and board member) responded by forking Prebid into OpenAds—plus building PubDesk, an analytics dashboard for the supply side.
The conflict: Universal transaction tracking vs. per-node fragmented IDs. Sound familiar? It's essentially a debate about distributed tracing standards, but with billions of dollars riding on it.
"Transaction IDs (TIDs) have been the topic du jour on LinkedIn and Twitter – and for good reason. These OpenRTB identifiers let buyers deduplicate the cluttered bidstream."
— AdExchanger: Transaction IDs can reduce auction duplication
Prebid vs OpenAds: Architecture Comparison
| Component | Prebid (v10.9.0+) | OpenAds (TTD) |
|---|---|---|
| TID Generation | ✗ Unique TID per bidder | ✓ Single universal TID per impression |
| Identity Philosophy | Seller-controlled, fragmented | Buyer-transparent, unified |
| Impression Flow | Same impression → Multiple TIDs → Harder deduplication | Same impression → One TID → Easy deduplication |
| Supply Path Transparency | Limited visibility into hops | Full audit trail required |
| Frequency Capping | Challenging across bidders | Accurate cross-exchange |
| Arbitrage Detection | Difficult to track | Explicit path verification |
| Governance | Open-source community | TTD-led, "integrity-first" |
| Integration Complexity | Lower (established) | Higher (new standard) |
Example: Same impression, different tracking
┌─────────────────────────────┐
│ Single Ad Impression │
└──────────┬──────────────────┘
│
┌──────┴──────┐
│ │
┌───▼───┐ ┌───▼────┐
│Prebid │ │OpenAds │
└───┬───┘ └───┬────┘
│ │
│ └──────────────┐
│ │
┌───▼──────────────┐ ┌──────▼─────────┐
│ TID: abc-bidder1 │ │ TID: xyz-12345 │
│ TID: def-bidder2 │ │ (universal) │
│ TID: ghi-bidder3 │ │ │
└──────────────────┘ └────────────────┘
(3 different IDs) (1 shared ID)
The Transaction ID Problem (Think: Distributed Tracing)
Let's back up. Transaction IDs (TIDs) in ad tech serve the same purpose as trace IDs in distributed systems observability:
- Deduplication across multiple services/exchanges
- Request correlation across different data paths
- Attribution from initial request to final outcome
- Path auditing to detect inefficient routing or arbitrage
The Classic Architecture (Before v10.9.0)
Prebid generated one TID per request that flowed to all bidders—like a single trace ID in OpenTelemetry that every service can log and correlate against.
HTTP Request → TID: abc-123 →
├─ Bidder A sees: abc-123
├─ Bidder B sees: abc-123
├─ Bidder C sees: abc-123
└─ Bidder D sees: abc-123
Universal correlation. Clean deduplication. Standard distributed tracing pattern.
The Breaking Change (v10.9.0+)
Prebid now generates unique TIDs per bidder—as if each microservice in your stack got a different trace ID for the same user request.
HTTP Request →
├─ Bidder A sees: tid-A-12345
├─ Bidder B sees: tid-B-67890
├─ Bidder C sees: tid-C-abcde
└─ Bidder D sees: tid-D-fghij
Correlation nightmare. How do you know these four TIDs represent the same opportunity? You don't.
Before vs After: How TIDs Changed in Prebid
| Scenario | Before (Prebid <10.9.0) | After (Prebid 10.9.0+) |
|---|---|---|
| Single Impression | imp-2024-xyz-789 | imp-2024-xyz-789 |
| Bidder A sees | tid-universal-12345 | tid-bidderA-12345 |
| Bidder B sees | tid-universal-12345 | tid-bidderB-67890 |
| Bidder C sees | tid-universal-12345 | tid-bidderC-abcde |
| Bidder D sees | tid-universal-12345 | tid-bidderD-fghij |
| Total unique TIDs | ✓ 1 (same for all) | ✗ N (one per bidder) |
| Can deduplicate? | ✓ Yes, trivially | ✗ No, IDs don't match |
| Can track frequency? | ✓ Yes, across all paths | ✗ Only within each bidder's silo |
| Can audit supply path? | ✓ Yes, follow the TID | ✗ No shared identifier |
The Impact: With 20 bidders in an auction, you now have 20 different TIDs for the exact same impression opportunity. Good luck reconciling that in your analytics.
Why Did Prebid Do This? (Incentive Alignment)
Think about this like the tension between app developers and platforms:
The supply-side (publishers) perspective:
Universal TIDs let demand-side platforms (DSPs) build complete graphs of inventory across exchanges. Like if AWS customers could see all cloud provider pricing across Google Cloud, Azure, etc., and route around higher-cost paths.
With unique TIDs per bidder, publishers regain information asymmetry:
- Bidders can't easily detect when they're seeing the same impression across multiple paths
- Price discovery becomes harder (harder to compare floor prices)
- Publishers control the routing logic
"Prebid will now generate transaction IDs (TIDs) for each SSP/demand partner, which puts an end to the use of universal IDs across exchanges. This marks a shift from impression-based TIDs in order to protect publishers' revenue & user privacy."
— AdPushup: Prebid's Transaction ID Changes
The demand-side (advertisers) perspective:
This breaks fundamental observability. Without universal IDs, you can't:
- Deduplicate bid requests (you might bid on the same impression 4× through different exchanges)
- Measure true reach/frequency (same user counts multiple times)
- Audit supply quality (can't trace multi-hop reselling)
- Build attribution models (can't link impression → conversion reliably)
The spec conflict:
The IAB Tech Lab said Prebid's change is "materially non-compliant" with OpenRTB, the protocol spec—like shipping a REST API that violates HTTP semantics.
"Prebid.js 10.9.0 (released 27 Aug, 2025) now generates a different Transaction ID (TID) for each Bidder. That breaks the long-standing practice where one TID was shared across exchanges/paths for the same impression, which DSPs used to de-duplicate auctions and power SPO."
— Yieldbird: Transaction IDs in Prebid just changed
"These OpenRTB identifiers let buyers deduplicate the cluttered bidstream. The IAB Tech Lab has challenged Prebid's compliance with the OpenRTB specification over this change."
— IAB Tech Lab challenges Prebid transaction ID changes
Enter OpenAds: The Fork
The Trade Desk's response follows a classic open-source playbook: fork the protocol, establish your own governance.
Think Elasticsearch/OpenSearch, or InfluxDB's licensing drama. When you disagree with the project direction, you fork and compete.
1. OpenAds (The Protocol Fork)
A Prebid-based codebase that restores:
- Universal TID per request (back to standard distributed tracing semantics)
- Audit trail requirements for every routing hop
- Path verification APIs to detect multi-hop arbitrage
- Quality telemetry (from their Sincera acquisition—think Datadog but for ad supply chains)
Key claim: OpenAds is designed to run in parallel with Prebid. Publishers can deploy both wrappers, A/B test results, and route traffic accordingly.
Example integration (conceptual):
// OpenAds config enforcing single-TID integrity
const openAdsConfig = {
tidStrategy: 'universal', // One TID for all bidders
auditTrail: true, // Require path transparency
qualityFilters: {
maxHops: 2, // Penalize long reseller chains
minPathScore: 0.85 // Sincera-derived quality threshold
}
};
// Publishers can run this alongside Prebid
window.openads = window.openads || { que: [] };
openads.que.push(() => {
openads.setConfig(openAdsConfig);
openads.requestBids(adUnits);
});
2. PubDesk (The Analytics Dashboard)
A real-time observability tool for publishers showing:
- Bid density heatmaps by supply path
- Win rate analytics across exchanges
- Signal explainability: which features TTD's AI (Kokai/Koa) uses for decisioning
- Path comparisons: Prebid vs OpenAds performance
Think: Datadog for auctions. Publishers finally see what the demand side sees—latency, quality scores, path efficiency.

3. The Strategic Context
This isn't reactive—it's strategic. TTD has been building toward this for years:
| Year | Move | Purpose |
|---|---|---|
| 2022 | OpenPath | Direct DSP-to-publisher pipes (cut out SSP layers) |
| Jan 2025 | Sincera acquisition | Supply path telemetry & scoring (observability layer) |
| Oct 2025 | OpenAds + PubDesk | Complete stack: wrappers, integrity checks, transparency tools |

TTD is building a vertically integrated supply graph where they control routing, quality definitions, and observability—all under a "buyer-defined standards" narrative.
"The Trade Desk is rewriting what it means to be buy-side. With OpenAds, they're not just participating in the supply chain—they're governing it."
— Digiday: With OpenAds, The Trade Desk is rewriting what it means to be buy-side
Who Wins, Who Loses
Publishers (Content Owners): The API Providers
Wins:
- Finally get observability into demand-side decisioning (what signals buyers use, what they value)
- Can A/B test two auction protocols and route to the higher-performing one
- Potential for better yield if deduplication actually reduces wasted bids
Losses:
- Adopting a buyer-governed standard feels like giving up control
- Vendor lock-in risk if TTD traffic becomes too important
- Operational complexity: two wrappers, two TID regimes, divergent analytics
Analogy: Like running both gRPC and REST APIs for the same service, with different tracing semantics.
Exchanges (SSPs): Middleware Providers
Winners: "Transparent" exchanges (PubMatic, Index Exchange) that emphasize direct, low-hop paths—OpenAds' audit trails prove exactly what they claim.
Losers: Arbitrage/reseller models that profit from opacity. OpenAds explicitly scores and penalizes multi-hop routing.
[GRAPHIC 4: Supply Path Comparison - Side-by-side showing Clean Path (2 hops, score 0.95) vs Arbitrage Path (4 hops, score 0.42)]
DSPs: The Clients
The problem: Every demand-side platform now has to:
- Support Prebid's fragmented TIDs (handle deduplication in userland)
- Integrate with OpenAds' stricter requirements (universal TIDs, audit APIs)
- Or build for both (expensive, divergent code paths)
TTD gets a competitive advantage—they control the OpenAds spec, so their DSP has perfect integration and reporting.
Advertisers: The End Users
The upside: Better deduplication → lower waste, better frequency capping, cleaner attribution.
The downside: You're trusting TTD to define "quality" and "transparency" standards that affect how your budget gets spent.
The Technical Architecture (Reverse-Engineered)
Here's the likely flow based on limited public docs. Think of it as a request pipeline with two parallel protocol implementations:
┌─────────────────────┐
│ Page/CTV Player │ ← Client initiates ad request
└──────────┬──────────┘
│
┌──────▼──────┐
│ Wrappers │ ← Protocol layer (this is where the fork happens)
├─────────────┤
│ • Prebid │ → Generates bidder-specific TIDs (fragmented correlation)
│ • OpenAds │ → Generates universal TID (unified correlation) + audit metadata
└──────┬──────┘
│
┌──────▼────────────────────┐
│ Path Verification Layer │ ← Telemetry & quality scoring
│ (OpenAds + Sincera) │ (like Jaeger span collection + analysis)
└──────┬────────────────────┘
│
┌──────▼──────────────┐
│ DSP Decisioning │ ← ML-based bid optimization
│ (TTD Kokai/Koa AI) │ (like dynamic pricing models)
└──────┬──────────────┘
│
┌──────▼──────────────┐
│ Reporting Back │ ← Analytics aggregation
│ (PubDesk) │ (like Datadog dashboards)
└─────────────────────┘
Key Architectural Differences
| Layer | Prebid | OpenAds |
|---|---|---|
| ID Strategy | Per-bidder TIDs (like per-service trace IDs) | Universal TID (like OpenTelemetry's single trace ID) |
| Audit Trail | Optional, sparse | Required, dense (every hop logged) |
| Path Scoring | None (just routes) | Sincera telemetry scores each path for quality |
| Governance | Community-driven (open-source model) | TTD-led (controlled fork) |
| Reporting | Fragmented (each bidder sees different IDs) | Unified (everyone sees same TID) |
The coexistence problem: Both can run in parallel, but analytics/reporting semantics diverge completely. You can't join Prebid metrics with OpenAds metrics using TIDs—they're measuring the same traffic with incompatible identifiers.
The Systemic Risks
1. Governance Fork Theater
TTD is a Prebid board member and forking contributor and now a competing protocol implementer.

Analogy: Imagine if Google sat on the Node.js Technical Steering Committee while simultaneously forking Node into "OpenNode" with incompatible APIs. The optics are rough. Trade press is using phrases like "bully tactics" and "vertical integration under the guise of openness."
2. Operational Hell for Publishers
Running both wrappers means:
- Dual analytics pipelines with incompatible correlation IDs
- QA complexity: testing auction logic across two systems with different semantics
- Vendor fragmentation: some bidders only support one standard
- Reporting discrepancies between Prebid and OpenAds results (try explaining that to your finance team)
Analogy: Like maintaining both MySQL and PostgreSQL for the same application because different clients require different query semantics.
3. Regulatory Scrutiny Incoming
When demand-side platforms control both the DSP layer and the supply-side protocol, expect questions about:
- Market power and competitive dynamics
- Vertical integration risks (controlling multiple layers of the stack)
- Data access asymmetries (TTD sees more than competitors)
The DOJ is already investigating ad tech consolidation. A buy-side-governed auction protocol will raise flags.
The Real Opportunity: Build the Semantic Layer
Here's what everyone's missing while they fight over transaction IDs:
Transport-layer integrity (TIDs, routing, path audits) is commodity infrastructure—important, but ultimately a solved problem in other domains (distributed tracing, load balancing, service mesh).
The semantic layer is wide open. Neither Prebid nor OpenAds tells you:
- What's actually in the content being monetized (video scenes, audio, text)
- Whether the creative matches the context (semantic alignment)
- If the content is brand-safe for a specific advertiser
- Which content features predict performance
This is the infrastructure gap. And it's protocol-agnostic.
The API Play: Neutral Content Intelligence
Build a multimodal content intelligence API that works with both auction protocols. Be Switzerland.
Think of it as:
- Stripe for payments → YourAPI for content understanding
- Auth0 for identity → YourAPI for semantic classification
- Twilio for messaging → YourAPI for media analysis
What to Build: 3 Core Services
1. Content Intelligence API
Real-time analysis of pages, videos, audio:
# Example API call
response = mixpeek.analyze.content(
url="https://example.com/article",
video_url="https://example.com/video.mp4",
features=[
"scene_classification", # Scene detection in video
"sentiment_analysis", # Content tone/sentiment
"brand_safety", # NSFW/controversial content detection
"iab_taxonomy", # IAB 2.x/3.0 category mapping
"object_detection" # Logos, products, objects
]
)
# Returns compact embeddings + structured metadata
{
"semantic_id": "sem_abc123xyz", # Stable ID across wrappers
"embeddings": [...], # 512-dim vector
"metadata": {
"iab_categories": ["IAB12", "IAB12-3"],
"brand_safety_score": 0.95,
"detected_objects": ["logo:nike", "product:shoes"],
"sentiment": "positive",
"topics": ["sports", "fitness", "running"]
},
"latency_ms": 45
}
2. Creative Intelligence API
Analyze ad creatives (images, videos, audio) for:
# Analyze an ad creative
creative_analysis = mixpeek.analyze.creative(
creative_url="https://ads.example.com/video-ad.mp4",
features=[
"logo_detection", # Extract brand logos
"text_extraction", # OCR + text in video
"claim_verification", # Fact-check claims
"safety_check", # Ad policy compliance
"semantic_hash" # Dedupe via content hashing
]
)
# Returns
{
"creative_id": "cre_xyz789abc", # Stable creative ID
"detected_logos": ["brand:cocacola"],
"text_content": "Summer Sale 50% Off",
"safety_flags": [],
"semantic_hash": "sha256:...",
"category_alignment": {
"sports": 0.85,
"lifestyle": 0.72
}
}
3. Cross-Protocol Join Key
Generate a stable semantic ID that works regardless of TID fragmentation:
Implementation: Use Mixpeek's open-source Prebid connector for plug-and-play integration.
// Pre-bid hook for both Prebid and OpenAds
pbjs.onEvent('beforeRequestBids', async (adUnits) => {
const semantic = await mixpeek.enrich({
url: adUnits[0].url,
video: adUnits[0].mediaTypes.video.context
});
// Append semantic ID + scores to OpenRTB extensions
pbjs.setConfig({
ortb2: {
site: {
content: {
ext: {
semantic_id: semantic.id, // Stable across wrappers
semantic_score: semantic.score,
iab_cats: semantic.categories
}
}
}
}
});
});
Key benefit: Buyers and sellers can join performance data (CPM, CPA, conversions) to content features (topics, sentiment, objects) using semantic_id—even if TID semantics differ between Prebid and OpenAds.
Architecture: How This Plugs In
Publisher-Side Integration (via pre-bid hooks):
Note: Mixpeek provides an open-source Prebid connector for seamless integration with existing Prebid.js implementations.
// Works with BOTH Prebid and OpenAds
const semanticMiddleware = async (adUnits) => {
const analysis = await fetch('https://api.mixpeek.com/v1/analyze', {
method: 'POST',
headers: { 'Authorization': `Bearer ${API_KEY}` },
body: JSON.stringify({
url: window.location.href,
video_url: adUnits[0]?.mediaTypes?.video?.context,
features: ['iab_taxonomy', 'brand_safety', 'sentiment']
})
});
const data = await analysis.json();
// Inject semantic metadata into OpenRTB bid request
return {
ortb2: {
site: {
content: {
ext: {
semantic_id: data.semantic_id,
iab_cats: data.metadata.iab_categories,
safety_score: data.metadata.brand_safety_score
}
}
}
}
};
};
// Register with Prebid
pbjs.onEvent('beforeRequestBids', semanticMiddleware);
// Register with OpenAds (same API, different wrapper)
openads.onEvent('beforeRequestBids', semanticMiddleware);
DSP-Side Integration (query semantic data):
# DSPs can query semantic features to inform bidding
import mixpeek
# Enrich bid request with historical semantic performance
bid_request = {...} # Incoming OpenRTB bid request
semantic_id = bid_request['site']['content']['ext']['semantic_id']
# Lookup past performance for similar content
similar_content = mixpeek.search.similar(
semantic_id=semantic_id,
limit=100,
filters={'performance_threshold': 0.85}
)
# Adjust bid based on semantic alignment
bid_multiplier = calculate_alignment_score(
creative_categories=my_creative.categories,
content_categories=similar_content.avg_categories
)
final_bid = base_bid * bid_multiplier
Analytics Layer (cross-wrapper attribution):
-- Join performance across Prebid and OpenAds using semantic_id
SELECT
semantic_id,
SUM(impressions) as total_impressions,
AVG(cpm) as avg_cpm,
SUM(conversions) as total_conversions,
COUNT(DISTINCT wrapper) as wrapper_count -- Prebid vs OpenAds
FROM ad_events
WHERE date >= '2025-10-01'
GROUP BY semantic_id
HAVING wrapper_count > 1 -- Content served via both wrappers
ORDER BY avg_cpm DESC;
Go-to-Market: Who to Target
Phase 1: Premium Publishers Feeling the Pain
- News publishers (NYTimes, WaPo) losing traffic to social, need yield optimization
- CTV platforms (Roku, Pluto) dealing with deduplication chaos
- Value prop: "Get 15-20% CPM lift via semantic alignment + cross-wrapper analytics"

Phase 2: Exchanges Competing on Quality
- Transparent SSPs (PubMatic, Index Exchange) that want to prove they're "clean paths"
- Value prop: "Add semantic verification to your supply quality narrative"
Phase 3: DSPs Needing Better Signals
- Mid-tier DSPs struggling with TTD's OpenAds advantage
- Value prop: "Level the playing field—get same semantic signals TTD gets via Sincera"
Pricing Model
| Tier | Pricing | Use Case |
|---|---|---|
| Usage-based | 0.001−0.01 per enriched impression | High-volume publishers |
| Subscription | 500−5000/mo + overage | Mid-size publishers, SSPs |
| Rev-share pilots | 10-20% of incremental CPM lift | Premium publishers proving ROI |
| Enterprise | Custom pricing + SLAs | Large platforms, DSPs |
Competitive Moat
- Protocol-agnostic: Works with Prebid, OpenAds, or any future fork
- Multimodal: Video, audio, text, images—most competitors are single-modality
- Real-time: Sub-100ms latency for bid-time enrichment
- Neutral positioning: Not aligned with buy-side or sell-side (unlike TTD's Sincera)
What to Monitor
This governance fork is evolving fast. Track these signals:
| Signal | Why It Matters | Where to Watch |
|---|---|---|
| Publisher adoption | Which wrapper wins market share? | AdExchanger case studies (Q4 2025) |
| Prebid's response | Will they backtrack on TID changes? | Prebid.js GitHub releases + IAB Tech Lab statements |
| TTD earnings (Nov 6, 2025) | How much adoption/revenue from OpenAds? | Investor call transcripts |
| Sincera integration | How does telemetry surface in PubDesk? | TTD blog + press releases |
| Regulatory action | Will DOJ/FTC challenge vertical integration? | Trade press + legal filings |
Developer-focused signals:
- OpenAds SDK releases on GitHub (if/when they open-source)
- Prebid module updates addressing deduplication
- Third-party adapters for OpenAds (measure ecosystem traction)
The Bottom Line
For platform companies:
OpenAds = buy-side-governed transparency
Prebid = sell-side-governed flexibility
This is a governance fork at the protocol layer—like HTTP/2 vs HTTP/3, or REST vs GraphQL. Two incompatible standards with different philosophies about control and observability.
For developers:
While the platforms fight over transport integrity (TIDs, routing, audits), the semantic layer is completely unsolved:
- No standard for content understanding
- No semantic alignment scoring
- No portable intelligence across wrappers
The opportunity: Build the protocol-agnostic semantic API layer. Be the Stripe/Twilio/Auth0 of content intelligence.
Let them fight over transaction IDs. You'll provide the intelligence layer both sides actually need.
Technical Deep Dive Resources
- OpenRTB 2.6 Spec - The protocol both wrappers (supposedly) follow
- Prebid.js GitHub - See the TID changes in v10.9.0+
- The Trade Desk OpenAds Announcement - Official positioning
- IAB Tech Lab TID Challenge - Why Prebid's change violates OpenRTB
