Buyers
How to read a supply path
By Stoqlab team · Updated · 6 min read
A supply path is the chain of companies between an app and the buyer of one of its impressions. The declared path is every route the public files allow: the app's app-ads.txt gives the first hop, and each network's sellers.json gives the next. The bid request then reports the route one impression actually took, in the schain. This guide reads a declared path hop by hop.
Hop 1: the app-ads.txt line
Take an app whose developer publishes this file (reserved example domains):
OWNERDOMAIN=examplegames.example
ssp.example, 4821, DIRECT
mediation.example, 300, DIRECT
exchange.example, 7730, RESELLER
Each line is a first hop. Look each account up in its network's sellers.json:
| Line | sellers.json says | Reading |
|---|---|---|
ssp.example, 4821, DIRECT | PUBLISHER, domain examplegames.example | The owner's own account, confirmed both ways (the domain matches OWNERDOMAIN). Shortest possible path. |
mediation.example, 300, DIRECT | PUBLISHER, domain examplegames.example | Also the owner's account, on the mediation company's own network. |
exchange.example, 7730, RESELLER | INTERMEDIARY, domain mediation.example | A reseller account. Its domain is itself a network, so the path continues. |
Hop 2 and beyond
An INTERMEDIARY's domain often belongs to another ad system with its own sellers.json
(the specification asks for the seller's business domain, not
the network's). In the example, exchange.example pays mediation.example under seller 7730, and mediation.example's own
sellers.json shows how it sources the app's inventory. Each step is one more company taking a share and one more place
where a stale or mislabelled entry breaks the chain.
Stoqlab follows these links up to four hops and never visits the same network twice on one branch, which cuts loops. The result is one tree per app-ads.txt file, shared by every app that uses the file.
What to look at
| Signal | Why it matters |
|---|---|
| DIRECT share | How much of the file the owner sells itself. |
| Confirmed both ways | DIRECT lines whose sellers.json domain is the owner's domain: the strongest signal the files can give. |
| Depth | Hops a line reaches before the path ends. One is ideal; four means three intermediaries. |
| Breaks | Accounts missing from sellers.json, relationship mismatches, networks without a sellers.json. Everything after a break is unverifiable. |
| Hidden sellers | Confidential entries along the way. |
| Reseller spread | How many different networks resell the inventory. |
Stoqlab sums these up in a 0 to 100 supply path score per app; the formula is public on the methodology page. It summarises declarations and does not rate inventory quality: a long reseller list can be perfectly legitimate.
Declared path and actual path
A bid request takes one branch of the declared tree, and its schain should match it: first node the app's DIRECT account, later nodes authorised as RESELLER lines in the app's file. A schain that matches no branch is a red flag. A branch that never shows up in your bid stream is a candidate for cleaning up. The schain validator does that comparison for a pasted schain.