For publishers

Monetize your TV apps and games without fighting the remote.

One small SDK in your game. Everything else (which ad, which partner, which price) happens on our server, so you can change it without shipping a new build to four different TV stores.

An SDK that knows it's a guest in your game.

SofAds.init({ appId: "sof_YOUR_APP_ID" });

// Between levels: the call always settles, then your game goes on.
async function onLevelComplete() {
  await SofAds.showInterstitial({ placement: "level_break" });
  startNextLevel();
}

// The user chose to watch for a reward. addCoins is your own function.
function onExtraLifeButton() {
  SofAds.showRewarded({
    placement: "extra_life",
    onReward: (reward) => addCoins(reward.amount),
  });
}

Plus the script include. See the setup guide for your platform and the SDK reference.

Each TV platform has its own rules for ads, payments and IDs. Read the platform guides first: Tizen monetization, LG webOS monetization, Whale TV and Titan OS. Replacing a proxy SDK? See Bright SDK alternatives.

It never breaks your game
Every public call catches its own errors and settles within a fixed timeout as shown, no_fill, error or timeout. Ads off, network down, odd firmware: your game carries on.
It handles the remote
Ads render as overlays with their own D-pad and BACK handling. onPause and onResume hooks let you stop a Lightning or Blits render loop before video plays and pick it up after.
It finds the platform itself
Detects Tizen, webOS, Whale TV and Titan OS, reads the native app ID and the platform's advertising ID where allowed, and reports unknown rather than guessing.
It stays small and dumb
No keys, floors or partner logic in your package. Endpoints and kill switches come from a config the SDK fetches at start-up and caches.
You choose how to ship it
Bundle it in your app package (ESM with TypeScript types, or a UMD sofads.min.js), or hotlink a pinned version from sdk.sofadsrv.com. Never a moving "latest".

Formats that work from the sofa.

Interstitial video
Full-screen VAST video at natural breaks: between levels, after a game over.
Rewarded video
The user opts in to watch and your onReward callback fires once, after completion.
Scan-to-reward TV-native
A QR card the viewer scans with their phone. The reward arrives as soon as the scan is registered, no 30-second wait. Handy for users who would rather not sit through video.
QR card
A static card with an image, headline and QR code, shown for a few seconds with a visible countdown.
HTML interstitial
A full-screen HTML creative for formats that are not video.

Mediation on our server, not in your build.

TV store reviews take time. That's why the waterfall lives on the SofAds ad server. Your game sends one request; our server works through the ladder within the time budget and returns one ad, or a clean no-fill.

  • Price floors per app, per store listing and per placement.
  • Frequency caps per session, hour and day, and a minimum gap between ads.
  • Partners called server-side, ordered by country tier and priority, each with its own timeout. No partner is hard-wired.
  • A house-ad and cross-promo fallback, so a break never shows an empty screen when one of your own games could fill it.
  • New listings get test ads only, until we've verified your store listing and app-ads.txt. Platform setup files are in the integration docs.

Usage analytics, free.

The same SDK sends lightweight session events, so you get the numbers TV stores don't give you, at no cost, whether or not you show ads.

  • Daily and monthly users, new and returning.
  • D1, D7 and D30 retention, session length, sessions per user.
  • Breakdowns by TV model, country, platform and app version.
  • Revenue per daily user and fill rate, next to your usage.

When a user hasn't given consent, analytics run in a cookieless mode without a persistent ID. See the privacy policy.

From sign-up to live.

  1. Create an app

    Just a name. You get an app ID like sof_7Kx3mQ9pL2 in the dashboard.

  2. Add the SDK and ship

    Call SofAds.init({ appId }) and submit your build as usual.

  3. We spot your listing

    When traffic arrives from a new platform, a pending listing appears in your dashboard. It gets test ads only.

  4. Paste the store URL

    We fetch the icon, title and category for you.

  5. Add our app-ads.txt line

    The dashboard shows the exact line for your developer website. Once we find it, the listing goes live. New to it? Read app-ads.txt for Samsung and LG TV apps.

Getting paid.

Earnings are tracked in US dollars. The dashboard shows estimated earnings as they happen and final earnings once the demand partner has reported and paid for the period. We pay out what we have been paid: the revenue share and payout terms are in the publisher terms.

Early days. The terms are still a draft and outside publishers are onboarded by hand for now. If you have a TV game live or close to launch, email hello@sofads.com and tell us about it.

Got a TV app or game? Let's put it on the network.