Features that just work.
Unified API. Privacy handled. All networks, one integration.
Copy, paste, ship.
What you get
- Server-side ad insertion for Apple TV, Fire TV, Roku, Android TV
- Live & VOD support with HLS and DASH manifests
- Signed logs for every insertion decision
Architecture
┌──────────────┐ ┌─────────────┐ ┌──────────────┐
│ CTV App │───▶│ Apex SSAI │───▶│ Stitched │
│ (Player) │ │ Server │ │ Stream │
└──────────────┘ └─────────────┘ └──────────────┘
│
┌──────┴──────┐
│ Ad Server │
└─────────────┘Integrate once. Access all networks.
Stop juggling 8 SDKs with 8 different APIs. One integration, every ad network.
Three lines of Kotlin. That's it.
// Application.onCreate()
ApexMediation.initialize(
context = this,
appId = "your-app-id"
)
// That's it. You're live.
// No XML. No manifest edits. No callbacks.// Load an interstitial
val interstitial = ApexInterstitial(placementId)
interstitial.load()
// Show when ready
interstitial.show(activity) { result ->
when (result) {
is AdResult.Shown -> // Ad displayed
is AdResult.Clicked -> // User engaged
is AdResult.Closed -> // Continue app flow
}
}Unified API
Same interface for banners, interstitials, rewarded, native. Learn once, use everywhere.
No boilerplate
No lifecycle callbacks to wire. Minimal manifest wiring. No fragile XML plumbing.
Server-controlled
Change networks, waterfalls, and settings without app updates. OTA configuration.
Consent? Handled.
GDPR, CCPA, COPPA, TCF 2.2, US Privacy—all flow through automatically.
Three ways to pass consent. All of them easy.
// Option 1: One-liner with Google UMP
ApexMediation.requestGoogleConsentForm(activity, callback = object : UmpConsentClient.Callback {
override fun onConsentUpdated() {
// (Optional) read IAB strings and pass to the SDK
val state = ConsentManager.fromIabStorage(activity)
ApexMediation.setConsent(
tcString = state.tcfString,
usPrivacy = state.usPrivacy,
gdprApplies = state.gdprApplies
)
}
override fun onConsentUpdateFailed(error: Throwable) {
// Handle consent error
}
})
// Option 2: Pass your own consent strings
ApexMediation.setConsent(
tcString = "CPXxRfAPXxR...", // IAB TCF v2.2
usPrivacy = "1YNN", // CCPA/CPRA
gdprApplies = true
)
// Option 3: Read from CMP storage
val state = ConsentManager.fromIabStorage(context)
ApexMediation.setConsent(
tcString = state.tcfString,
usPrivacy = state.usPrivacy,
gdprApplies = state.gdprApplies
)
// Consent signals are included in auction metadata and passed to adapters.
// Your app remains the consent source of truth.Google UMP integration
One-liner to show the Google User Messaging Platform consent form. We handle the callbacks and propagate to all networks.
Direct consent strings
Pass TCF v2.2, US Privacy, or custom consent directly. Perfect for apps with existing CMP solutions.
Read IAB-standard consent storage (opt-in)
Use the SDK helper to read IAB-standard consent keys (TCF + US Privacy) from app storage, then pass them into the SDK. There is no background scraping.
Consistent signal plumbing
Set consent once. The SDK includes consent signals in auction metadata and makes them available to adapters. Partner behavior depends on each integration.
Verifiable Revenue Auditor
Cross-reference network reports with SDK events and signed auction receipts. Detect discrepancies automatically. Generate dispute kits with confidence scores.
- Ingest network statements via API, CSV, or SFTP
- Auto-normalize and match against SDK events
- Classify deltas: underpay, IVT, timing, FX
- Monthly Proof-of-Revenue certificates
- Export to BigQuery, S3, or GCS
Network Reports ──┐
├──▶ Normalizer ──▶ Matcher
SDK Paid Events ──┘ │ │
▼ ▼
Crypto Receipts ────▶ Receipts Join ──▶ Reconciler
│
┌─────────────────────┤
▼ ▼
Delta Classifier Proof-of-Revenue
│
▼
Dispute Kit Builder┌──────────────────────────────────────────┐ │ Config v12 → Simulate → Canary → 100% │ │ │ │ │ │ └─ rollback◀┘ │ └──────────────────────────────────────────┘ Shadow Mode: Log without serving Mirror Mode: Test arm + production Guardrails: Latency, errors, eCPM Kill Switch: Instant revert
Migration Studio
Switch mediators without risking revenue. Shadow test, mirror traffic, and validate eCPM parity before cutting over—with automatic rollback if guardrails trigger.
- Shadow mode: log without affecting live serving
- Mirror mode: run test arm alongside production
- Guardrails: latency, error rate, and eCPM thresholds
- Staged rollout: 5% → 25% → 100%
- Kill-switch: instant revert to control
Transparency Engine
Every auction produces a tamper-evident record. Bids received, waterfall order, floor prices, winner selection—all Ed25519-signed and exportable.
- Immutable audit trail for every decision
- Cryptographic proof of what actually ran
- Export logs for third-party verification
- On-device Debug Panel for real-time inspection
- Dispute-ready evidence, not screenshots
Auction #48291 ├─ Timestamp: 2025-01-01T12:00:00Z ├─ Bids: [A: $2.50, B: $2.45, C: $2.10] ├─ Winner: Network A @ $2.50 ├─ Floor: $2.00 ├─ Waterfall: [A, B, C] (ML-optimized) └─ Signature: Ed25519:AbCd...1234 ✓ Verify: canonical → verify → trust Dispute: cryptographic evidence
┌─ Bid Prediction Model ─────────────────┐ │ │ │ Context: [geo, time, device, history] │ │ │ │ │ ▼ │ │ Predict: P(bid > floor | network) │ │ │ │ │ ▼ │ │ Rank: Reorder waterfall by expected │ │ revenue × fill probability │ └─────────────────────────────────────────┘ Training: Continuous from your traffic Shadow ML: Test before activating A/B Test: Statistical significance
ML Waterfall Optimizer
Our models predict bid responses and reorder waterfalls in real-time. Continuously learning from your traffic to maximize fill and eCPM.
- Real-time bid prediction per network
- Contextual ranking: geo, time, device, history
- A/B testing with statistical significance
- Shadow ML: test models before activation
- Publisher-configurable optimization goals
Reliability infrastructure
Protections that keep your ads serving when things go wrong.
Circuit Breakers
Slow networks get isolated. One bad adapter never stalls your auction.
OTA-Safe Rollouts
Staged traffic routing with automatic rollback. Zero app updates needed.
Kill Switches
Disable any adapter instantly from the console. Take back control.
Debug Panel
On-device waterfall tracing. See exactly what happened and why.
Full-stack observability
Monitor every layer. From SDK to network response, see exactly what's happening—and set clear alert thresholds.
Prometheus + Grafana
24/7 monitoring with pre-built dashboards.
Structured Logs
PII-redacted, audit-ready, compliance-friendly.
Smart Alerts
Coverage drops and latency spikes surface quickly via metrics and alerting policies.
Request Tracing
SDK to network response. Debug in minutes.
# VRA reconciliation
vra_coverage_ratio{network="admob"} 0.98
vra_delta_count{kind="underpay"} 3
vra_proof_verified_total 847
# Migration Studio
migration_ecpm_ratio{arm="test"} 1.02
migration_latency_p95_ms 45
migration_guardrail_triggers 0
# Auction health
rtb_auction_p99_ms 38
rtb_fill_rate{placement="rewarded"} 0.94
rtb_errors{code="timeout"} 2Debug Panel
A lightweight, on-device view of what the SDK did during an auction—useful for reproducing issues and sharing a sanitized trace with your team.
- Waterfall order and per-adapter outcomes (shown/filled/timeout)
- Latency breakdowns and time budget visibility
- Consent and policy signals surfaced for debugging (no raw PII)
- Export/share a sanitized trace bundle for support
- Correlate traces with Prometheus/Grafana metrics
Native SDKs, native performance
Built for each platform. Privacy-first. Fully documented.
iOS
Swift- SwiftUI ready
- Privacy Manifest
- SKAdNetwork 4.0
Android
Kotlin- Jetpack Compose
- Privacy Sandbox
- Topics API
Web
TypeScript- Tree-shakeable
- SSR compatible
- TCF 2.2
Unity
C#- Cross-platform
- Rewarded ads
- Callbacks
See the features in action
Schedule a technical deep-dive. We'll walk through SDK integration, consent handling, VRA, and Migration Studio.