Auditing SupplyChain Object Node Breaks in DV360
A SupplyChain object (schain) node break occurs when an entity within a programmatic transaction chain fails to pass a complete, sequential set of OpenRTB node parameters or when passed values fail cross-validation against the SSP’s sellers.json and the publisher’s ads.txt file. In Display & Video 360 (DV360), these node breaks cause inventory quality filters and Supply-Path Optimization (SPO) algorithms to drop bids before auction entry, resulting in lost scale, artificial clearing price spikes, and unspent campaign budgets. Identifying and repairing broken supply chain nodes requires systematic analysis of bid stream data, node array sequences, and seller entity declarations.Key Takeaways
- Node breaks occur when the
completeflag is set to0, node array ordering is corrupted, or theasidomain fails to match the canonical domain insellers.json. - DV360 silently drops or penalizes bid requests containing incomplete supply chains when targeting settings enforce strict inventory quality or direct seller paths.
- Ad ops teams can isolate broken nodes by cross-referencing DV360 Data Transfer logs against raw OpenRTB bid request payloads and publisher
ads.txtdeclarations. - Fixing node breaks requires joint coordination between header bidding wrapper configurations (e.g., Prebid
schainmodule), SSP seller definitions, and reseller mapping.
Anatomy of the OpenRTB SupplyChain Object
Introduced by IAB Tech Lab, the SupplyChain object allows buyers to trace every intermediary handling payment and inventory between the content owner and the DSP. In OpenRTB 2.5 and 3.0 specs, the schain object resides within the extension object of the bid request. A compliant schain contains two root attributes: ver (typically "1.0") and complete (an integer flag of 1 or 0), alongside an ordered nodes array representing each handling party.
Each object in the nodes array must contain four mandatory fields and two optional fields:
asi(Advertising System Identifier): The canonical domain name of the SSP/exchange processing the request (e.g.,rubiconproject.com,appnexus.com).sid(Seller ID): The unique alphanumeric identifier assigned to the seller or publisher within that SSP’ssellers.jsonmanifest.hp(Handles Payment): An integer flag where1indicates the node handles funds directly, and0indicates an intermediary that does not handle cash flow.rid(Request ID): The unique transaction or request identifier generated by the upstream node.name(Optional): Legal name of the business entity operating the node.domain(Optional): The business domain of the seller entity.
A functional node sequence for a direct publisher setup looks as follows: Publisher Wrapper → SSP (Node 0) → DSP. In reseller setups or multi-hop syndication, Node 0 represents the primary SSP, Node 1 represents an intermediary network, and Node 2 represents the downstream exchange delivering the bid request to DV360. If any link in this sequence omits mandatory attributes, transposes node positions, or inserts an unverified entity, DV360 flags the supply path as broken.
Root Causes of Node Breaks in DV360
Node breaks in DV360 manifest through several distinct technical breakdowns within the bid stream:
1. The Incomplete Chain Flag (complete: 0)
The complete flag tells DV360 whether the supply path contains all participating entities from the original seller to the auction endpoint. When set to 0, the node array is explicitly marked as truncated or partial. DSPs treating inventory quality strictly, such as DV360, apply severe bid discounts or drop complete: 0 requests entirely, particularly on high-value Private Marketplace (PMP) inventory. If you observe deals underperforming, you may need to troubleshoot DV360 PMP deals not spending due to hidden schain validation drops.
2. Domain Mismatches Between asi and sellers.json
DV360 continuously crawls sellers.json files published by exchanges. A node break occurs when the asi parameter inside an incoming node string (e.g., magnite.com) does not match the root domain hosting the SSP's public sellers.json file. Truncated domains, subdomains (e.g., ssp.magnite.com), or protocol prefixes (https://) violate the specification and invalidate the node.
3. Mapped Seller ID Discrepancies and ads.txt Misalignment
If Node 0 specifies sid: "1234" for an exchange, DV360 cross-checks 1234 against that exchange's sellers.json. If sellers.json lists seller_id: "1234" as INTERMEDIARY while the publisher's ads.txt lists the account as DIRECT, a validation mismatch occurs. This structural conflict invalidates the chain at the DSP evaluation boundary.
4. Header Bidding Wrapper Misconfigurations
In client-side header bidding setups running Prebid.js, improperly configured schain modules frequently cause node breaks. Common errors include passing the schain object inside individual adapter parameters rather than globally via setConfig, duplicate node injection when multiple adapters read from local storage, or missing hp parameter definitions during custom adapter builds.
Auditing SupplyChain Breaks in DV360
Ad ops professionals must systematically isolate where supply chain validation fails across the bid stream. Use this multi-tier audit workflow:
Step 1: Analyze DV360 Data Transfer Logs
For enterprise advertisers utilizing Google Cloud Storage Data Transfer feeds, pull the Impression and Bid logs. Inspect the raw request fields for custom node verification errors. Filter for low win-rate line items and query fields relating to verification rejection reason codes. Look for high volumes of bids submitted where response codes indicate inventory quality rejection or invalid supply chains.
Step 2: Inspect Raw OpenRTB Payloads via SSP Log Aggregations
Request bid request logs directly from your exchange partner for impacted deal IDs or publisher domains. Locate the ext.schain JSON block in the request body sent to DV360's bidder endpoint:
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "rubiconproject.com",
"sid": "9876",
"hp": 1,
"rid": "req_abc123"
},
{
"asi": "reseller-network.com",
"sid": "4321",
"hp": 1,
"rid": "req_def456"
}
]
}
Verify that:
- The array order strictly follows inventory flow (upstream seller to downstream exchange).
- No optional fields contain malformed types (e.g., passing
hpas a string"1"instead of an integer1). - Every
asidomain matches the exact domain hostingsellers.json.
Step 3: Perform Automated ads.txt and sellers.json Crawl Reconciliation
Using custom scripts or open-source auditing CLI tools, fetch the publisher's ads.txt file and cross-reference each entry with the corresponding exchange sellers.json. Ensure that every seller_id passed in Node 0 and Node 1 maps to an active, non-commented row. If your campaigns involve video inventory, consider combining this analysis with custom bidding frameworks for CTV SPO to automatically deprioritize paths with multi-hop reseller chains.
Remediation Protocols for Ad Operations Teams
Once a node break is identified, execute the following operational steps to restore supply path integrity and recover lost impression volume:
1. Enforce Wrapper-Level Standardisation
Ensure publisher partners update Prebid.js to the latest stable build and configure the schain module centrally. Verify that the pbjs.setConfig({ schain: { ... } }) call is executed before any auction initiation. This prevents individual demand adapters from generating conflicting or partial node objects.
2. Reconcile Reseller Agreements and ads.txt Declarations
When working with syndicated CTV or programmatic video networks, verify that all intermediaries are declared as RESELLER in ads.txt and that their internal sellers.json status matches. If verification failures persist alongside brand safety blockages, review your third-party settings by troubleshooting high IAS and DoubleVerify block rates in DV360 to ensure pre-bid verification settings are not doubly penalizing complex inventory paths.
3. Adjust DV360 Pre-Bid Inventory Quality Targetings
While resolving supply path issues with publishers, prevent campaign delivery failure by evaluating DV360 Brand Safety and Authorized Seller settings. If strict SPO targeting drops legitimate inventory due to minor reseller node errors, temporarily adjust targeting from "Authorized Direct Sellers Only" to "Authorized Direct and Reseller" while SSPs correct their sellers.json files.
Frequently Asked Questions
What is the difference between complete: 0 and complete: 1 in an schain object?
The value complete: 1 signifies that the nodes array contains the full, unabridged sequence of entities involved in the transaction from initial publisher to DSP. The value complete: 0 indicates an incomplete chain where intermediate nodes were excluded or omitted during pass-through, causing DV360 to treat the inventory as non-transparent or risky.
Why does DV360 drop bids even when ads.txt entries are marked DIRECT?
DV360 drops bids if the publisher's ads.txt lists an entry as DIRECT, but the exchange's sellers.json classifies that same seller_id as INTERMEDIARY or BOTH. This data conflict causes DV360's validation engine to mark the supply chain node as broken, suppressing bid submission regardless of line item targeting settings.
How do schain node breaks impact campaign pacing and bid win rates?
Node breaks cause DV360 to filter out bid opportunities before entering the main auction, severely restricting available impression inventory. This manifests as dropped win rates, artificial spikes in average clearing prices on surviving inventory, and under-pacing across PMP and open exchange line items.
Can a node break occur if all variables are populated correctly?
Yes, node breaks occur if variable data types are mismatched—such as passing integer fields like hp as string parameters—or if the node sequence order is inverted. Upstream and downstream exchanges must appear in exact sequential order relative to inventory flow for DV360 to validate the chain.