Intermediary sites and CTV channels
Scenarios 5 and 7 of the supply-chain setup — a site that is itself a reseller (Seller type Intermediary, Confidential), test sites kept out of sellers.json, and a CTV channel whose SSAI stitcher passes its chain on your VAST tag — with the sellers.json entry, the complete or incomplete schain and the RESELLER line each produces.
What it is and why
A site’s Seller type tells buyers whether you sell it as its publisher or as a reseller. An
Intermediary site is paired with RESELLER in ads.txt, and the chain sent for it admits that
a seller before you exists: it stays incomplete until that seller’s chain reaches your tag — the
CTV case, where a stitcher passes it on. The one-time network setup is on
Set up the network as a seller.
Example. The FAST channel Harbor TV reaches smart-TV apps through its inventory partner
Channel Partner, whose stitcher calls your VAST tag with schain=1.0,1!channel-partner.example,cp-42,1.
With the site set to Intermediary, DSPs receive a two-node chain — the partner’s node, then
yours (adnetwork.example, nw-ht-11) — marked complete: 1. Bought by an insertion order with
no chain on the tag, the same site sends your node alone, marked complete: 0.
Typical scenarios
| You sell… | Set | Then read |
|---|---|---|
| A site that is itself a reseller, or a staging site to keep out | Seller type Intermediary (+ Confidential); List in sellers.json off for test sites | Scenario 5 |
| A CTV channel whose stitcher calls your VAST tag | Seller type Intermediary + the stitcher on the video placement, so its schain reaches buyers with your node appended | Scenario 7 |
Step by step
Scenario 5: an intermediary publisher, and sites kept out
Intermediary. A site Harbor Point Exchange is itself a reseller. Set Seller type = Intermediary (or Both if it also owns inventory). To hide its name in sellers.json, tick Confidential:
{ "seller_id": "nw-hp-07", "is_confidential": 1, "seller_type": "INTERMEDIARY" }
The schain node is the same shape as scenario 1 with "sid": "nw-hp-07", but the chain is sent
with "complete": 0, in bid requests and header-bidding tags alike: a seller before you exists
and the request does not name it. Pass that seller’s chain on the ad tag to complete it
(scenario 7); a header-bidding tag cannot carry one.
ads.txt: buyers pair an INTERMEDIARY entry with RESELLER, so the site’s block names you as
a reseller — northwind-ads.example, nw-hp-07, RESELLER — and the live check looks for that line.
A Both site keeps DIRECT, which buyers accept for BOTH as they accept RESELLER.
Test and internal sites. Leave List in sellers.json off. Sites start unlisted, so a staging
site never reaches the file. With the file on and no site listed, sellers.json is still a valid
file with an empty sellers list.
Scenario 7: a CTV channel sold through a stitcher
A FAST channel Harbor TV reaches smart-TV apps through its inventory partner Channel Partner,
whose SSAI stitcher (here SpringServe) calls your VAST tag. Set the site’s Seller type =
Intermediary (a chain on the tag is ignored on a Publisher site). On the video placement set
Server-side ad insertion = SpringServe (Magnite) (see
Video behind server-side ad insertion); the tag then carries
schain={{SCHAIN}}, and SpringServe fills in the chain it received:
schain=1.0,1!channel-partner.example,cp-42,1
DSPs receive that chain with your node appended:
{ "ver": "1.0", "complete": 1,
"nodes": [
{ "asi": "channel-partner.example", "sid": "cp-42", "hp": 1 },
{ "asi": "adnetwork.example", "sid": "nw-ht-11", "hp": 1 }
] }
The app lists the partner in its app-ads.txt (INVENTORYPARTNERDOMAIN=channel-partner.example),
and the partner’s file lists you as its reseller: adnetwork.example, nw-ht-11, RESELLER. That is
also the line the site’s block asks for, since the own line of an Intermediary site is RESELLER
(scenario 5).
Bought by an IO, no chain on the tag. When you buy the channel directly by an insertion order and the tag brings no chain, the same Intermediary seller type makes the request say honestly that the chain is incomplete:
{ "ver": "1.0", "complete": 0,
"nodes": [ { "asi": "adnetwork.example", "sid": "nw-ht-11", "hp": 1 } ] }
Many buyers bid less on an incomplete chain, or not at all. The lasting fix is outside the platform:
the channel lists you in its app-ads.txt as a reseller, or passes its chain on the tag.
Caveats and exceptions
Stitcher macros and schain. MediaTailor and Brightcove fill schain only from what the
player passes to the stitcher’s session, and the IAB and Google DAI macro sets have none. Without
it the request falls back to the chain without upstream nodes.
The caveats that apply to every supply-chain setting — who can do this, what a seller ID change touches, which line the network’s own entry is — are on Supply chain, sellers.json and ads.txt: setup by scenario.
Not working?
- The chain on the tag is not passed on. Where: the site’s Seller type — a chain on the tag is ignored on a Publisher site; set Intermediary.
- Buyers receive
complete: 0. Where: the tag — an Intermediary site sends an incomplete chain until the seller before you passes its chain on the tag (a header-bidding tag cannot carry one), or lists you as a reseller in itsapp-ads.txt. - The site’s block asks for a
RESELLERline, notDIRECT. Where: the Seller type — that is the own line of an Intermediary site; a Both site keepsDIRECT.
The causes of Missing lines: N, File not found and Could not check are on Supply chain, sellers.json and ads.txt: setup by scenario.
Reference
The terms (complete, RESELLER, INVENTORYPARTNERDOMAIN) are in the hub’s
Glossary; every setting and its page in
Where things live. The stitcher settings and
the schain macro: Video behind server-side ad insertion (SSAI).